]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Merge remote-tracking branch 'upstream/pull/1963'
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2   var version = "4.13.0";
3
4   function ascending(a, b) {
5     return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6   }
7
8   function bisector(compare) {
9     if (compare.length === 1) compare = ascendingComparator(compare);
10     return {
11       left: function(a, x, lo, hi) {
12         if (lo == null) lo = 0;
13         if (hi == null) hi = a.length;
14         while (lo < hi) {
15           var mid = lo + hi >>> 1;
16           if (compare(a[mid], x) < 0) lo = mid + 1;
17           else hi = mid;
18         }
19         return lo;
20       },
21       right: function(a, x, lo, hi) {
22         if (lo == null) lo = 0;
23         if (hi == null) hi = a.length;
24         while (lo < hi) {
25           var mid = lo + hi >>> 1;
26           if (compare(a[mid], x) > 0) hi = mid;
27           else lo = mid + 1;
28         }
29         return lo;
30       }
31     };
32   }
33
34   function ascendingComparator(f) {
35     return function(d, x) {
36       return ascending(f(d), x);
37     };
38   }
39
40   var ascendingBisect = bisector(ascending);
41   var bisectRight = ascendingBisect.right;
42   var bisectLeft = ascendingBisect.left;
43
44   function pairs(array, f) {
45     if (f == null) f = pair;
46     var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
47     while (i < n) pairs[i] = f(p, p = array[++i]);
48     return pairs;
49   }
50
51   function pair(a, b) {
52     return [a, b];
53   }
54
55   function cross(values0, values1, reduce) {
56     var n0 = values0.length,
57         n1 = values1.length,
58         values = new Array(n0 * n1),
59         i0,
60         i1,
61         i,
62         value0;
63
64     if (reduce == null) reduce = pair;
65
66     for (i0 = i = 0; i0 < n0; ++i0) {
67       for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
68         values[i] = reduce(value0, values1[i1]);
69       }
70     }
71
72     return values;
73   }
74
75   function d3_descending(a, b) {
76     return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
77   }
78
79   function number(x) {
80     return x === null ? NaN : +x;
81   }
82
83   function variance(values, valueof) {
84     var n = values.length,
85         m = 0,
86         i = -1,
87         mean = 0,
88         value,
89         delta,
90         sum = 0;
91
92     if (valueof == null) {
93       while (++i < n) {
94         if (!isNaN(value = number(values[i]))) {
95           delta = value - mean;
96           mean += delta / ++m;
97           sum += delta * (value - mean);
98         }
99       }
100     }
101
102     else {
103       while (++i < n) {
104         if (!isNaN(value = number(valueof(values[i], i, values)))) {
105           delta = value - mean;
106           mean += delta / ++m;
107           sum += delta * (value - mean);
108         }
109       }
110     }
111
112     if (m > 1) return sum / (m - 1);
113   }
114
115   function deviation(array, f) {
116     var v = variance(array, f);
117     return v ? Math.sqrt(v) : v;
118   }
119
120   function extent(values, valueof) {
121     var n = values.length,
122         i = -1,
123         value,
124         min,
125         max;
126
127     if (valueof == null) {
128       while (++i < n) { // Find the first comparable value.
129         if ((value = values[i]) != null && value >= value) {
130           min = max = value;
131           while (++i < n) { // Compare the remaining values.
132             if ((value = values[i]) != null) {
133               if (min > value) min = value;
134               if (max < value) max = value;
135             }
136           }
137         }
138       }
139     }
140
141     else {
142       while (++i < n) { // Find the first comparable value.
143         if ((value = valueof(values[i], i, values)) != null && value >= value) {
144           min = max = value;
145           while (++i < n) { // Compare the remaining values.
146             if ((value = valueof(values[i], i, values)) != null) {
147               if (min > value) min = value;
148               if (max < value) max = value;
149             }
150           }
151         }
152       }
153     }
154
155     return [min, max];
156   }
157
158   var array = Array.prototype;
159
160   var slice = array.slice;
161   var map = array.map;
162
163   function constant(x) {
164     return function() {
165       return x;
166     };
167   }
168
169   function identity(x) {
170     return x;
171   }
172
173   function range(start, stop, step) {
174     start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
175
176     var i = -1,
177         n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
178         range = new Array(n);
179
180     while (++i < n) {
181       range[i] = start + i * step;
182     }
183
184     return range;
185   }
186
187   var e10 = Math.sqrt(50),
188       e5 = Math.sqrt(10),
189       e2 = Math.sqrt(2);
190
191   function ticks(start, stop, count) {
192     var reverse,
193         i = -1,
194         n,
195         ticks,
196         step;
197
198     stop = +stop, start = +start, count = +count;
199     if (start === stop && count > 0) return [start];
200     if (reverse = stop < start) n = start, start = stop, stop = n;
201     if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
202
203     if (step > 0) {
204       start = Math.ceil(start / step);
205       stop = Math.floor(stop / step);
206       ticks = new Array(n = Math.ceil(stop - start + 1));
207       while (++i < n) ticks[i] = (start + i) * step;
208     } else {
209       start = Math.floor(start * step);
210       stop = Math.ceil(stop * step);
211       ticks = new Array(n = Math.ceil(start - stop + 1));
212       while (++i < n) ticks[i] = (start - i) / step;
213     }
214
215     if (reverse) ticks.reverse();
216
217     return ticks;
218   }
219
220   function tickIncrement(start, stop, count) {
221     var step = (stop - start) / Math.max(0, count),
222         power = Math.floor(Math.log(step) / Math.LN10),
223         error = step / Math.pow(10, power);
224     return power >= 0
225         ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
226         : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
227   }
228
229   function tickStep(start, stop, count) {
230     var step0 = Math.abs(stop - start) / Math.max(0, count),
231         step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
232         error = step0 / step1;
233     if (error >= e10) step1 *= 10;
234     else if (error >= e5) step1 *= 5;
235     else if (error >= e2) step1 *= 2;
236     return stop < start ? -step1 : step1;
237   }
238
239   function sturges(values) {
240     return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
241   }
242
243   function histogram() {
244     var value = identity,
245         domain = extent,
246         threshold = sturges;
247
248     function histogram(data) {
249       var i,
250           n = data.length,
251           x,
252           values = new Array(n);
253
254       for (i = 0; i < n; ++i) {
255         values[i] = value(data[i], i, data);
256       }
257
258       var xz = domain(values),
259           x0 = xz[0],
260           x1 = xz[1],
261           tz = threshold(values, x0, x1);
262
263       // Convert number of thresholds into uniform thresholds.
264       if (!Array.isArray(tz)) {
265         tz = tickStep(x0, x1, tz);
266         tz = range(Math.ceil(x0 / tz) * tz, Math.floor(x1 / tz) * tz, tz); // exclusive
267       }
268
269       // Remove any thresholds outside the domain.
270       var m = tz.length;
271       while (tz[0] <= x0) tz.shift(), --m;
272       while (tz[m - 1] > x1) tz.pop(), --m;
273
274       var bins = new Array(m + 1),
275           bin;
276
277       // Initialize bins.
278       for (i = 0; i <= m; ++i) {
279         bin = bins[i] = [];
280         bin.x0 = i > 0 ? tz[i - 1] : x0;
281         bin.x1 = i < m ? tz[i] : x1;
282       }
283
284       // Assign data to bins by value, ignoring any outside the domain.
285       for (i = 0; i < n; ++i) {
286         x = values[i];
287         if (x0 <= x && x <= x1) {
288           bins[bisectRight(tz, x, 0, m)].push(data[i]);
289         }
290       }
291
292       return bins;
293     }
294
295     histogram.value = function(_) {
296       return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
297     };
298
299     histogram.domain = function(_) {
300       return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
301     };
302
303     histogram.thresholds = function(_) {
304       return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
305     };
306
307     return histogram;
308   }
309
310   function quantile(values, p, valueof) {
311     if (valueof == null) valueof = number;
312     if (!(n = values.length)) return;
313     if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
314     if (p >= 1) return +valueof(values[n - 1], n - 1, values);
315     var n,
316         i = (n - 1) * p,
317         i0 = Math.floor(i),
318         value0 = +valueof(values[i0], i0, values),
319         value1 = +valueof(values[i0 + 1], i0 + 1, values);
320     return value0 + (value1 - value0) * (i - i0);
321   }
322
323   function freedmanDiaconis(values, min, max) {
324     values = map.call(values, number).sort(ascending);
325     return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));
326   }
327
328   function scott(values, min, max) {
329     return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
330   }
331
332   function max(values, valueof) {
333     var n = values.length,
334         i = -1,
335         value,
336         max;
337
338     if (valueof == null) {
339       while (++i < n) { // Find the first comparable value.
340         if ((value = values[i]) != null && value >= value) {
341           max = value;
342           while (++i < n) { // Compare the remaining values.
343             if ((value = values[i]) != null && value > max) {
344               max = value;
345             }
346           }
347         }
348       }
349     }
350
351     else {
352       while (++i < n) { // Find the first comparable value.
353         if ((value = valueof(values[i], i, values)) != null && value >= value) {
354           max = value;
355           while (++i < n) { // Compare the remaining values.
356             if ((value = valueof(values[i], i, values)) != null && value > max) {
357               max = value;
358             }
359           }
360         }
361       }
362     }
363
364     return max;
365   }
366
367   function mean(values, valueof) {
368     var n = values.length,
369         m = n,
370         i = -1,
371         value,
372         sum = 0;
373
374     if (valueof == null) {
375       while (++i < n) {
376         if (!isNaN(value = number(values[i]))) sum += value;
377         else --m;
378       }
379     }
380
381     else {
382       while (++i < n) {
383         if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
384         else --m;
385       }
386     }
387
388     if (m) return sum / m;
389   }
390
391   function d3_median(values, valueof) {
392     var n = values.length,
393         i = -1,
394         value,
395         numbers = [];
396
397     if (valueof == null) {
398       while (++i < n) {
399         if (!isNaN(value = number(values[i]))) {
400           numbers.push(value);
401         }
402       }
403     }
404
405     else {
406       while (++i < n) {
407         if (!isNaN(value = number(valueof(values[i], i, values)))) {
408           numbers.push(value);
409         }
410       }
411     }
412
413     return quantile(numbers.sort(ascending), 0.5);
414   }
415
416   function merge(arrays) {
417     var n = arrays.length,
418         m,
419         i = -1,
420         j = 0,
421         merged,
422         array;
423
424     while (++i < n) j += arrays[i].length;
425     merged = new Array(j);
426
427     while (--n >= 0) {
428       array = arrays[n];
429       m = array.length;
430       while (--m >= 0) {
431         merged[--j] = array[m];
432       }
433     }
434
435     return merged;
436   }
437
438   function min(values, valueof) {
439     var n = values.length,
440         i = -1,
441         value,
442         min;
443
444     if (valueof == null) {
445       while (++i < n) { // Find the first comparable value.
446         if ((value = values[i]) != null && value >= value) {
447           min = value;
448           while (++i < n) { // Compare the remaining values.
449             if ((value = values[i]) != null && min > value) {
450               min = value;
451             }
452           }
453         }
454       }
455     }
456
457     else {
458       while (++i < n) { // Find the first comparable value.
459         if ((value = valueof(values[i], i, values)) != null && value >= value) {
460           min = value;
461           while (++i < n) { // Compare the remaining values.
462             if ((value = valueof(values[i], i, values)) != null && min > value) {
463               min = value;
464             }
465           }
466         }
467       }
468     }
469
470     return min;
471   }
472
473   function permute(array, indexes) {
474     var i = indexes.length, permutes = new Array(i);
475     while (i--) permutes[i] = array[indexes[i]];
476     return permutes;
477   }
478
479   function scan(values, compare) {
480     if (!(n = values.length)) return;
481     var n,
482         i = 0,
483         j = 0,
484         xi,
485         xj = values[j];
486
487     if (compare == null) compare = ascending;
488
489     while (++i < n) {
490       if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
491         xj = xi, j = i;
492       }
493     }
494
495     if (compare(xj, xj) === 0) return j;
496   }
497
498   function shuffle(array, i0, i1) {
499     var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
500         t,
501         i;
502
503     while (m) {
504       i = Math.random() * m-- | 0;
505       t = array[m + i0];
506       array[m + i0] = array[i + i0];
507       array[i + i0] = t;
508     }
509
510     return array;
511   }
512
513   function sum(values, valueof) {
514     var n = values.length,
515         i = -1,
516         value,
517         sum = 0;
518
519     if (valueof == null) {
520       while (++i < n) {
521         if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
522       }
523     }
524
525     else {
526       while (++i < n) {
527         if (value = +valueof(values[i], i, values)) sum += value;
528       }
529     }
530
531     return sum;
532   }
533
534   function transpose(matrix) {
535     if (!(n = matrix.length)) return [];
536     for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
537       for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
538         row[j] = matrix[j][i];
539       }
540     }
541     return transpose;
542   }
543
544   function length(d) {
545     return d.length;
546   }
547
548   function zip() {
549     return transpose(arguments);
550   }
551
552   var slice$1 = Array.prototype.slice;
553
554   function identity$1(x) {
555     return x;
556   }
557
558   var top = 1,
559       right = 2,
560       bottom = 3,
561       left = 4,
562       epsilon = 1e-6;
563
564   function translateX(x) {
565     return "translate(" + (x + 0.5) + ",0)";
566   }
567
568   function translateY(y) {
569     return "translate(0," + (y + 0.5) + ")";
570   }
571
572   function number$1(scale) {
573     return function(d) {
574       return +scale(d);
575     };
576   }
577
578   function center(scale) {
579     var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
580     if (scale.round()) offset = Math.round(offset);
581     return function(d) {
582       return +scale(d) + offset;
583     };
584   }
585
586   function entering() {
587     return !this.__axis;
588   }
589
590   function axis(orient, scale) {
591     var tickArguments = [],
592         tickValues = null,
593         tickFormat = null,
594         tickSizeInner = 6,
595         tickSizeOuter = 6,
596         tickPadding = 3,
597         k = orient === top || orient === left ? -1 : 1,
598         x = orient === left || orient === right ? "x" : "y",
599         transform = orient === top || orient === bottom ? translateX : translateY;
600
601     function axis(context) {
602       var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
603           format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat,
604           spacing = Math.max(tickSizeInner, 0) + tickPadding,
605           range = scale.range(),
606           range0 = +range[0] + 0.5,
607           range1 = +range[range.length - 1] + 0.5,
608           position = (scale.bandwidth ? center : number$1)(scale.copy()),
609           selection = context.selection ? context.selection() : context,
610           path = selection.selectAll(".domain").data([null]),
611           tick = selection.selectAll(".tick").data(values, scale).order(),
612           tickExit = tick.exit(),
613           tickEnter = tick.enter().append("g").attr("class", "tick"),
614           line = tick.select("line"),
615           text = tick.select("text");
616
617       path = path.merge(path.enter().insert("path", ".tick")
618           .attr("class", "domain")
619           .attr("stroke", "#000"));
620
621       tick = tick.merge(tickEnter);
622
623       line = line.merge(tickEnter.append("line")
624           .attr("stroke", "#000")
625           .attr(x + "2", k * tickSizeInner));
626
627       text = text.merge(tickEnter.append("text")
628           .attr("fill", "#000")
629           .attr(x, k * spacing)
630           .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
631
632       if (context !== selection) {
633         path = path.transition(context);
634         tick = tick.transition(context);
635         line = line.transition(context);
636         text = text.transition(context);
637
638         tickExit = tickExit.transition(context)
639             .attr("opacity", epsilon)
640             .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
641
642         tickEnter
643             .attr("opacity", epsilon)
644             .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
645       }
646
647       tickExit.remove();
648
649       path
650           .attr("d", orient === left || orient == right
651               ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter
652               : "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter);
653
654       tick
655           .attr("opacity", 1)
656           .attr("transform", function(d) { return transform(position(d)); });
657
658       line
659           .attr(x + "2", k * tickSizeInner);
660
661       text
662           .attr(x, k * spacing)
663           .text(format);
664
665       selection.filter(entering)
666           .attr("fill", "none")
667           .attr("font-size", 10)
668           .attr("font-family", "sans-serif")
669           .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
670
671       selection
672           .each(function() { this.__axis = position; });
673     }
674
675     axis.scale = function(_) {
676       return arguments.length ? (scale = _, axis) : scale;
677     };
678
679     axis.ticks = function() {
680       return tickArguments = slice$1.call(arguments), axis;
681     };
682
683     axis.tickArguments = function(_) {
684       return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice();
685     };
686
687     axis.tickValues = function(_) {
688       return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice();
689     };
690
691     axis.tickFormat = function(_) {
692       return arguments.length ? (tickFormat = _, axis) : tickFormat;
693     };
694
695     axis.tickSize = function(_) {
696       return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
697     };
698
699     axis.tickSizeInner = function(_) {
700       return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
701     };
702
703     axis.tickSizeOuter = function(_) {
704       return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
705     };
706
707     axis.tickPadding = function(_) {
708       return arguments.length ? (tickPadding = +_, axis) : tickPadding;
709     };
710
711     return axis;
712   }
713
714   function axisTop(scale) {
715     return axis(top, scale);
716   }
717
718   function axisRight(scale) {
719     return axis(right, scale);
720   }
721
722   function axisBottom(scale) {
723     return axis(bottom, scale);
724   }
725
726   function axisLeft(scale) {
727     return axis(left, scale);
728   }
729
730   var noop = {value: function() {}};
731
732   function dispatch() {
733     for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
734       if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
735       _[t] = [];
736     }
737     return new Dispatch(_);
738   }
739
740   function Dispatch(_) {
741     this._ = _;
742   }
743
744   function parseTypenames(typenames, types) {
745     return typenames.trim().split(/^|\s+/).map(function(t) {
746       var name = "", i = t.indexOf(".");
747       if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
748       if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
749       return {type: t, name: name};
750     });
751   }
752
753   Dispatch.prototype = dispatch.prototype = {
754     constructor: Dispatch,
755     on: function(typename, callback) {
756       var _ = this._,
757           T = parseTypenames(typename + "", _),
758           t,
759           i = -1,
760           n = T.length;
761
762       // If no callback was specified, return the callback of the given type and name.
763       if (arguments.length < 2) {
764         while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
765         return;
766       }
767
768       // If a type was specified, set the callback for the given type and name.
769       // Otherwise, if a null callback was specified, remove callbacks of the given name.
770       if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
771       while (++i < n) {
772         if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
773         else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
774       }
775
776       return this;
777     },
778     copy: function() {
779       var copy = {}, _ = this._;
780       for (var t in _) copy[t] = _[t].slice();
781       return new Dispatch(copy);
782     },
783     call: function(type, that) {
784       if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
785       if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
786       for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
787     },
788     apply: function(type, that, args) {
789       if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
790       for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
791     }
792   };
793
794   function get(type, name) {
795     for (var i = 0, n = type.length, c; i < n; ++i) {
796       if ((c = type[i]).name === name) {
797         return c.value;
798       }
799     }
800   }
801
802   function set(type, name, callback) {
803     for (var i = 0, n = type.length; i < n; ++i) {
804       if (type[i].name === name) {
805         type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
806         break;
807       }
808     }
809     if (callback != null) type.push({name: name, value: callback});
810     return type;
811   }
812
813   var xhtml = "http://www.w3.org/1999/xhtml";
814
815   var namespaces = {
816     svg: "http://www.w3.org/2000/svg",
817     xhtml: xhtml,
818     xlink: "http://www.w3.org/1999/xlink",
819     xml: "http://www.w3.org/XML/1998/namespace",
820     xmlns: "http://www.w3.org/2000/xmlns/"
821   };
822
823   function namespace(name) {
824     var prefix = name += "", i = prefix.indexOf(":");
825     if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
826     return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
827   }
828
829   function creatorInherit(name) {
830     return function() {
831       var document = this.ownerDocument,
832           uri = this.namespaceURI;
833       return uri === xhtml && document.documentElement.namespaceURI === xhtml
834           ? document.createElement(name)
835           : document.createElementNS(uri, name);
836     };
837   }
838
839   function creatorFixed(fullname) {
840     return function() {
841       return this.ownerDocument.createElementNS(fullname.space, fullname.local);
842     };
843   }
844
845   function creator(name) {
846     var fullname = namespace(name);
847     return (fullname.local
848         ? creatorFixed
849         : creatorInherit)(fullname);
850   }
851
852   function none() {}
853
854   function selector(selector) {
855     return selector == null ? none : function() {
856       return this.querySelector(selector);
857     };
858   }
859
860   function selection_select(select) {
861     if (typeof select !== "function") select = selector(select);
862
863     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
864       for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
865         if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
866           if ("__data__" in node) subnode.__data__ = node.__data__;
867           subgroup[i] = subnode;
868         }
869       }
870     }
871
872     return new Selection(subgroups, this._parents);
873   }
874
875   function empty() {
876     return [];
877   }
878
879   function selectorAll(selector) {
880     return selector == null ? empty : function() {
881       return this.querySelectorAll(selector);
882     };
883   }
884
885   function selection_selectAll(select) {
886     if (typeof select !== "function") select = selectorAll(select);
887
888     for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
889       for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
890         if (node = group[i]) {
891           subgroups.push(select.call(node, node.__data__, i, group));
892           parents.push(node);
893         }
894       }
895     }
896
897     return new Selection(subgroups, parents);
898   }
899
900   var matcher = function(selector) {
901     return function() {
902       return this.matches(selector);
903     };
904   };
905
906   if (typeof document !== "undefined") {
907     var element = document.documentElement;
908     if (!element.matches) {
909       var vendorMatches = element.webkitMatchesSelector
910           || element.msMatchesSelector
911           || element.mozMatchesSelector
912           || element.oMatchesSelector;
913       matcher = function(selector) {
914         return function() {
915           return vendorMatches.call(this, selector);
916         };
917       };
918     }
919   }
920
921   var matcher$1 = matcher;
922
923   function selection_filter(match) {
924     if (typeof match !== "function") match = matcher$1(match);
925
926     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
927       for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
928         if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
929           subgroup.push(node);
930         }
931       }
932     }
933
934     return new Selection(subgroups, this._parents);
935   }
936
937   function sparse(update) {
938     return new Array(update.length);
939   }
940
941   function selection_enter() {
942     return new Selection(this._enter || this._groups.map(sparse), this._parents);
943   }
944
945   function EnterNode(parent, datum) {
946     this.ownerDocument = parent.ownerDocument;
947     this.namespaceURI = parent.namespaceURI;
948     this._next = null;
949     this._parent = parent;
950     this.__data__ = datum;
951   }
952
953   EnterNode.prototype = {
954     constructor: EnterNode,
955     appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
956     insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
957     querySelector: function(selector) { return this._parent.querySelector(selector); },
958     querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
959   };
960
961   function constant$1(x) {
962     return function() {
963       return x;
964     };
965   }
966
967   var keyPrefix = "$"; // Protect against keys like “__proto__”.
968
969   function bindIndex(parent, group, enter, update, exit, data) {
970     var i = 0,
971         node,
972         groupLength = group.length,
973         dataLength = data.length;
974
975     // Put any non-null nodes that fit into update.
976     // Put any null nodes into enter.
977     // Put any remaining data into enter.
978     for (; i < dataLength; ++i) {
979       if (node = group[i]) {
980         node.__data__ = data[i];
981         update[i] = node;
982       } else {
983         enter[i] = new EnterNode(parent, data[i]);
984       }
985     }
986
987     // Put any non-null nodes that don’t fit into exit.
988     for (; i < groupLength; ++i) {
989       if (node = group[i]) {
990         exit[i] = node;
991       }
992     }
993   }
994
995   function bindKey(parent, group, enter, update, exit, data, key) {
996     var i,
997         node,
998         nodeByKeyValue = {},
999         groupLength = group.length,
1000         dataLength = data.length,
1001         keyValues = new Array(groupLength),
1002         keyValue;
1003
1004     // Compute the key for each node.
1005     // If multiple nodes have the same key, the duplicates are added to exit.
1006     for (i = 0; i < groupLength; ++i) {
1007       if (node = group[i]) {
1008         keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
1009         if (keyValue in nodeByKeyValue) {
1010           exit[i] = node;
1011         } else {
1012           nodeByKeyValue[keyValue] = node;
1013         }
1014       }
1015     }
1016
1017     // Compute the key for each datum.
1018     // If there a node associated with this key, join and add it to update.
1019     // If there is not (or the key is a duplicate), add it to enter.
1020     for (i = 0; i < dataLength; ++i) {
1021       keyValue = keyPrefix + key.call(parent, data[i], i, data);
1022       if (node = nodeByKeyValue[keyValue]) {
1023         update[i] = node;
1024         node.__data__ = data[i];
1025         nodeByKeyValue[keyValue] = null;
1026       } else {
1027         enter[i] = new EnterNode(parent, data[i]);
1028       }
1029     }
1030
1031     // Add any remaining nodes that were not bound to data to exit.
1032     for (i = 0; i < groupLength; ++i) {
1033       if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
1034         exit[i] = node;
1035       }
1036     }
1037   }
1038
1039   function selection_data(value, key) {
1040     if (!value) {
1041       data = new Array(this.size()), j = -1;
1042       this.each(function(d) { data[++j] = d; });
1043       return data;
1044     }
1045
1046     var bind = key ? bindKey : bindIndex,
1047         parents = this._parents,
1048         groups = this._groups;
1049
1050     if (typeof value !== "function") value = constant$1(value);
1051
1052     for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
1053       var parent = parents[j],
1054           group = groups[j],
1055           groupLength = group.length,
1056           data = value.call(parent, parent && parent.__data__, j, parents),
1057           dataLength = data.length,
1058           enterGroup = enter[j] = new Array(dataLength),
1059           updateGroup = update[j] = new Array(dataLength),
1060           exitGroup = exit[j] = new Array(groupLength);
1061
1062       bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
1063
1064       // Now connect the enter nodes to their following update node, such that
1065       // appendChild can insert the materialized enter node before this node,
1066       // rather than at the end of the parent node.
1067       for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
1068         if (previous = enterGroup[i0]) {
1069           if (i0 >= i1) i1 = i0 + 1;
1070           while (!(next = updateGroup[i1]) && ++i1 < dataLength);
1071           previous._next = next || null;
1072         }
1073       }
1074     }
1075
1076     update = new Selection(update, parents);
1077     update._enter = enter;
1078     update._exit = exit;
1079     return update;
1080   }
1081
1082   function selection_exit() {
1083     return new Selection(this._exit || this._groups.map(sparse), this._parents);
1084   }
1085
1086   function selection_merge(selection$$1) {
1087
1088     for (var groups0 = this._groups, groups1 = selection$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
1089       for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
1090         if (node = group0[i] || group1[i]) {
1091           merge[i] = node;
1092         }
1093       }
1094     }
1095
1096     for (; j < m0; ++j) {
1097       merges[j] = groups0[j];
1098     }
1099
1100     return new Selection(merges, this._parents);
1101   }
1102
1103   function selection_order() {
1104
1105     for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
1106       for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
1107         if (node = group[i]) {
1108           if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
1109           next = node;
1110         }
1111       }
1112     }
1113
1114     return this;
1115   }
1116
1117   function selection_sort(compare) {
1118     if (!compare) compare = ascending$1;
1119
1120     function compareNode(a, b) {
1121       return a && b ? compare(a.__data__, b.__data__) : !a - !b;
1122     }
1123
1124     for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
1125       for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
1126         if (node = group[i]) {
1127           sortgroup[i] = node;
1128         }
1129       }
1130       sortgroup.sort(compareNode);
1131     }
1132
1133     return new Selection(sortgroups, this._parents).order();
1134   }
1135
1136   function ascending$1(a, b) {
1137     return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
1138   }
1139
1140   function selection_call() {
1141     var callback = arguments[0];
1142     arguments[0] = this;
1143     callback.apply(null, arguments);
1144     return this;
1145   }
1146
1147   function selection_nodes() {
1148     var nodes = new Array(this.size()), i = -1;
1149     this.each(function() { nodes[++i] = this; });
1150     return nodes;
1151   }
1152
1153   function selection_node() {
1154
1155     for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1156       for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
1157         var node = group[i];
1158         if (node) return node;
1159       }
1160     }
1161
1162     return null;
1163   }
1164
1165   function selection_size() {
1166     var size = 0;
1167     this.each(function() { ++size; });
1168     return size;
1169   }
1170
1171   function selection_empty() {
1172     return !this.node();
1173   }
1174
1175   function selection_each(callback) {
1176
1177     for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1178       for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
1179         if (node = group[i]) callback.call(node, node.__data__, i, group);
1180       }
1181     }
1182
1183     return this;
1184   }
1185
1186   function attrRemove(name) {
1187     return function() {
1188       this.removeAttribute(name);
1189     };
1190   }
1191
1192   function attrRemoveNS(fullname) {
1193     return function() {
1194       this.removeAttributeNS(fullname.space, fullname.local);
1195     };
1196   }
1197
1198   function attrConstant(name, value) {
1199     return function() {
1200       this.setAttribute(name, value);
1201     };
1202   }
1203
1204   function attrConstantNS(fullname, value) {
1205     return function() {
1206       this.setAttributeNS(fullname.space, fullname.local, value);
1207     };
1208   }
1209
1210   function attrFunction(name, value) {
1211     return function() {
1212       var v = value.apply(this, arguments);
1213       if (v == null) this.removeAttribute(name);
1214       else this.setAttribute(name, v);
1215     };
1216   }
1217
1218   function attrFunctionNS(fullname, value) {
1219     return function() {
1220       var v = value.apply(this, arguments);
1221       if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
1222       else this.setAttributeNS(fullname.space, fullname.local, v);
1223     };
1224   }
1225
1226   function selection_attr(name, value) {
1227     var fullname = namespace(name);
1228
1229     if (arguments.length < 2) {
1230       var node = this.node();
1231       return fullname.local
1232           ? node.getAttributeNS(fullname.space, fullname.local)
1233           : node.getAttribute(fullname);
1234     }
1235
1236     return this.each((value == null
1237         ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
1238         ? (fullname.local ? attrFunctionNS : attrFunction)
1239         : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
1240   }
1241
1242   function defaultView(node) {
1243     return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
1244         || (node.document && node) // node is a Window
1245         || node.defaultView; // node is a Document
1246   }
1247
1248   function styleRemove(name) {
1249     return function() {
1250       this.style.removeProperty(name);
1251     };
1252   }
1253
1254   function styleConstant(name, value, priority) {
1255     return function() {
1256       this.style.setProperty(name, value, priority);
1257     };
1258   }
1259
1260   function styleFunction(name, value, priority) {
1261     return function() {
1262       var v = value.apply(this, arguments);
1263       if (v == null) this.style.removeProperty(name);
1264       else this.style.setProperty(name, v, priority);
1265     };
1266   }
1267
1268   function selection_style(name, value, priority) {
1269     return arguments.length > 1
1270         ? this.each((value == null
1271               ? styleRemove : typeof value === "function"
1272               ? styleFunction
1273               : styleConstant)(name, value, priority == null ? "" : priority))
1274         : styleValue(this.node(), name);
1275   }
1276
1277   function styleValue(node, name) {
1278     return node.style.getPropertyValue(name)
1279         || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
1280   }
1281
1282   function propertyRemove(name) {
1283     return function() {
1284       delete this[name];
1285     };
1286   }
1287
1288   function propertyConstant(name, value) {
1289     return function() {
1290       this[name] = value;
1291     };
1292   }
1293
1294   function propertyFunction(name, value) {
1295     return function() {
1296       var v = value.apply(this, arguments);
1297       if (v == null) delete this[name];
1298       else this[name] = v;
1299     };
1300   }
1301
1302   function selection_property(name, value) {
1303     return arguments.length > 1
1304         ? this.each((value == null
1305             ? propertyRemove : typeof value === "function"
1306             ? propertyFunction
1307             : propertyConstant)(name, value))
1308         : this.node()[name];
1309   }
1310
1311   function classArray(string) {
1312     return string.trim().split(/^|\s+/);
1313   }
1314
1315   function classList(node) {
1316     return node.classList || new ClassList(node);
1317   }
1318
1319   function ClassList(node) {
1320     this._node = node;
1321     this._names = classArray(node.getAttribute("class") || "");
1322   }
1323
1324   ClassList.prototype = {
1325     add: function(name) {
1326       var i = this._names.indexOf(name);
1327       if (i < 0) {
1328         this._names.push(name);
1329         this._node.setAttribute("class", this._names.join(" "));
1330       }
1331     },
1332     remove: function(name) {
1333       var i = this._names.indexOf(name);
1334       if (i >= 0) {
1335         this._names.splice(i, 1);
1336         this._node.setAttribute("class", this._names.join(" "));
1337       }
1338     },
1339     contains: function(name) {
1340       return this._names.indexOf(name) >= 0;
1341     }
1342   };
1343
1344   function classedAdd(node, names) {
1345     var list = classList(node), i = -1, n = names.length;
1346     while (++i < n) list.add(names[i]);
1347   }
1348
1349   function classedRemove(node, names) {
1350     var list = classList(node), i = -1, n = names.length;
1351     while (++i < n) list.remove(names[i]);
1352   }
1353
1354   function classedTrue(names) {
1355     return function() {
1356       classedAdd(this, names);
1357     };
1358   }
1359
1360   function classedFalse(names) {
1361     return function() {
1362       classedRemove(this, names);
1363     };
1364   }
1365
1366   function classedFunction(names, value) {
1367     return function() {
1368       (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
1369     };
1370   }
1371
1372   function selection_classed(name, value) {
1373     var names = classArray(name + "");
1374
1375     if (arguments.length < 2) {
1376       var list = classList(this.node()), i = -1, n = names.length;
1377       while (++i < n) if (!list.contains(names[i])) return false;
1378       return true;
1379     }
1380
1381     return this.each((typeof value === "function"
1382         ? classedFunction : value
1383         ? classedTrue
1384         : classedFalse)(names, value));
1385   }
1386
1387   function textRemove() {
1388     this.textContent = "";
1389   }
1390
1391   function textConstant(value) {
1392     return function() {
1393       this.textContent = value;
1394     };
1395   }
1396
1397   function textFunction(value) {
1398     return function() {
1399       var v = value.apply(this, arguments);
1400       this.textContent = v == null ? "" : v;
1401     };
1402   }
1403
1404   function selection_text(value) {
1405     return arguments.length
1406         ? this.each(value == null
1407             ? textRemove : (typeof value === "function"
1408             ? textFunction
1409             : textConstant)(value))
1410         : this.node().textContent;
1411   }
1412
1413   function htmlRemove() {
1414     this.innerHTML = "";
1415   }
1416
1417   function htmlConstant(value) {
1418     return function() {
1419       this.innerHTML = value;
1420     };
1421   }
1422
1423   function htmlFunction(value) {
1424     return function() {
1425       var v = value.apply(this, arguments);
1426       this.innerHTML = v == null ? "" : v;
1427     };
1428   }
1429
1430   function selection_html(value) {
1431     return arguments.length
1432         ? this.each(value == null
1433             ? htmlRemove : (typeof value === "function"
1434             ? htmlFunction
1435             : htmlConstant)(value))
1436         : this.node().innerHTML;
1437   }
1438
1439   function raise() {
1440     if (this.nextSibling) this.parentNode.appendChild(this);
1441   }
1442
1443   function selection_raise() {
1444     return this.each(raise);
1445   }
1446
1447   function lower() {
1448     if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
1449   }
1450
1451   function selection_lower() {
1452     return this.each(lower);
1453   }
1454
1455   function selection_append(name) {
1456     var create = typeof name === "function" ? name : creator(name);
1457     return this.select(function() {
1458       return this.appendChild(create.apply(this, arguments));
1459     });
1460   }
1461
1462   function constantNull() {
1463     return null;
1464   }
1465
1466   function selection_insert(name, before) {
1467     var create = typeof name === "function" ? name : creator(name),
1468         select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
1469     return this.select(function() {
1470       return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
1471     });
1472   }
1473
1474   function remove() {
1475     var parent = this.parentNode;
1476     if (parent) parent.removeChild(this);
1477   }
1478
1479   function selection_remove() {
1480     return this.each(remove);
1481   }
1482
1483   function selection_cloneShallow() {
1484     return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
1485   }
1486
1487   function selection_cloneDeep() {
1488     return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
1489   }
1490
1491   function selection_clone(deep) {
1492     return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
1493   }
1494
1495   function selection_datum(value) {
1496     return arguments.length
1497         ? this.property("__data__", value)
1498         : this.node().__data__;
1499   }
1500
1501   var filterEvents = {};
1502
1503   var event = null;
1504
1505   if (typeof document !== "undefined") {
1506     var element$1 = document.documentElement;
1507     if (!("onmouseenter" in element$1)) {
1508       filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
1509     }
1510   }
1511
1512   function filterContextListener(listener, index, group) {
1513     listener = contextListener(listener, index, group);
1514     return function(event) {
1515       var related = event.relatedTarget;
1516       if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
1517         listener.call(this, event);
1518       }
1519     };
1520   }
1521
1522   function contextListener(listener, index, group) {
1523     return function(event1) {
1524       var event0 = event; // Events can be reentrant (e.g., focus).
1525       event = event1;
1526       try {
1527         listener.call(this, this.__data__, index, group);
1528       } finally {
1529         event = event0;
1530       }
1531     };
1532   }
1533
1534   function parseTypenames$1(typenames) {
1535     return typenames.trim().split(/^|\s+/).map(function(t) {
1536       var name = "", i = t.indexOf(".");
1537       if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
1538       return {type: t, name: name};
1539     });
1540   }
1541
1542   function onRemove(typename) {
1543     return function() {
1544       var on = this.__on;
1545       if (!on) return;
1546       for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
1547         if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
1548           this.removeEventListener(o.type, o.listener, o.capture);
1549         } else {
1550           on[++i] = o;
1551         }
1552       }
1553       if (++i) on.length = i;
1554       else delete this.__on;
1555     };
1556   }
1557
1558   function onAdd(typename, value, capture) {
1559     var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
1560     return function(d, i, group) {
1561       var on = this.__on, o, listener = wrap(value, i, group);
1562       if (on) for (var j = 0, m = on.length; j < m; ++j) {
1563         if ((o = on[j]).type === typename.type && o.name === typename.name) {
1564           this.removeEventListener(o.type, o.listener, o.capture);
1565           this.addEventListener(o.type, o.listener = listener, o.capture = capture);
1566           o.value = value;
1567           return;
1568         }
1569       }
1570       this.addEventListener(typename.type, listener, capture);
1571       o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
1572       if (!on) this.__on = [o];
1573       else on.push(o);
1574     };
1575   }
1576
1577   function selection_on(typename, value, capture) {
1578     var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
1579
1580     if (arguments.length < 2) {
1581       var on = this.node().__on;
1582       if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
1583         for (i = 0, o = on[j]; i < n; ++i) {
1584           if ((t = typenames[i]).type === o.type && t.name === o.name) {
1585             return o.value;
1586           }
1587         }
1588       }
1589       return;
1590     }
1591
1592     on = value ? onAdd : onRemove;
1593     if (capture == null) capture = false;
1594     for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
1595     return this;
1596   }
1597
1598   function customEvent(event1, listener, that, args) {
1599     var event0 = event;
1600     event1.sourceEvent = event;
1601     event = event1;
1602     try {
1603       return listener.apply(that, args);
1604     } finally {
1605       event = event0;
1606     }
1607   }
1608
1609   function dispatchEvent(node, type, params) {
1610     var window = defaultView(node),
1611         event = window.CustomEvent;
1612
1613     if (typeof event === "function") {
1614       event = new event(type, params);
1615     } else {
1616       event = window.document.createEvent("Event");
1617       if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
1618       else event.initEvent(type, false, false);
1619     }
1620
1621     node.dispatchEvent(event);
1622   }
1623
1624   function dispatchConstant(type, params) {
1625     return function() {
1626       return dispatchEvent(this, type, params);
1627     };
1628   }
1629
1630   function dispatchFunction(type, params) {
1631     return function() {
1632       return dispatchEvent(this, type, params.apply(this, arguments));
1633     };
1634   }
1635
1636   function selection_dispatch(type, params) {
1637     return this.each((typeof params === "function"
1638         ? dispatchFunction
1639         : dispatchConstant)(type, params));
1640   }
1641
1642   var root = [null];
1643
1644   function Selection(groups, parents) {
1645     this._groups = groups;
1646     this._parents = parents;
1647   }
1648
1649   function selection() {
1650     return new Selection([[document.documentElement]], root);
1651   }
1652
1653   Selection.prototype = selection.prototype = {
1654     constructor: Selection,
1655     select: selection_select,
1656     selectAll: selection_selectAll,
1657     filter: selection_filter,
1658     data: selection_data,
1659     enter: selection_enter,
1660     exit: selection_exit,
1661     merge: selection_merge,
1662     order: selection_order,
1663     sort: selection_sort,
1664     call: selection_call,
1665     nodes: selection_nodes,
1666     node: selection_node,
1667     size: selection_size,
1668     empty: selection_empty,
1669     each: selection_each,
1670     attr: selection_attr,
1671     style: selection_style,
1672     property: selection_property,
1673     classed: selection_classed,
1674     text: selection_text,
1675     html: selection_html,
1676     raise: selection_raise,
1677     lower: selection_lower,
1678     append: selection_append,
1679     insert: selection_insert,
1680     remove: selection_remove,
1681     clone: selection_clone,
1682     datum: selection_datum,
1683     on: selection_on,
1684     dispatch: selection_dispatch
1685   };
1686
1687   function select(selector) {
1688     return typeof selector === "string"
1689         ? new Selection([[document.querySelector(selector)]], [document.documentElement])
1690         : new Selection([[selector]], root);
1691   }
1692
1693   function create(name) {
1694     return select(creator(name).call(document.documentElement));
1695   }
1696
1697   var nextId = 0;
1698
1699   function local() {
1700     return new Local;
1701   }
1702
1703   function Local() {
1704     this._ = "@" + (++nextId).toString(36);
1705   }
1706
1707   Local.prototype = local.prototype = {
1708     constructor: Local,
1709     get: function(node) {
1710       var id = this._;
1711       while (!(id in node)) if (!(node = node.parentNode)) return;
1712       return node[id];
1713     },
1714     set: function(node, value) {
1715       return node[this._] = value;
1716     },
1717     remove: function(node) {
1718       return this._ in node && delete node[this._];
1719     },
1720     toString: function() {
1721       return this._;
1722     }
1723   };
1724
1725   function sourceEvent() {
1726     var current = event, source;
1727     while (source = current.sourceEvent) current = source;
1728     return current;
1729   }
1730
1731   function point(node, event) {
1732     var svg = node.ownerSVGElement || node;
1733
1734     if (svg.createSVGPoint) {
1735       var point = svg.createSVGPoint();
1736       point.x = event.clientX, point.y = event.clientY;
1737       point = point.matrixTransform(node.getScreenCTM().inverse());
1738       return [point.x, point.y];
1739     }
1740
1741     var rect = node.getBoundingClientRect();
1742     return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
1743   }
1744
1745   function mouse(node) {
1746     var event = sourceEvent();
1747     if (event.changedTouches) event = event.changedTouches[0];
1748     return point(node, event);
1749   }
1750
1751   function d3_selectAll(selector) {
1752     return typeof selector === "string"
1753         ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
1754         : new Selection([selector == null ? [] : selector], root);
1755   }
1756
1757   function touch(node, touches, identifier) {
1758     if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
1759
1760     for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
1761       if ((touch = touches[i]).identifier === identifier) {
1762         return point(node, touch);
1763       }
1764     }
1765
1766     return null;
1767   }
1768
1769   function d3_touches(node, touches) {
1770     if (touches == null) touches = sourceEvent().touches;
1771
1772     for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
1773       points[i] = point(node, touches[i]);
1774     }
1775
1776     return points;
1777   }
1778
1779   function nopropagation() {
1780     event.stopImmediatePropagation();
1781   }
1782
1783   function noevent() {
1784     event.preventDefault();
1785     event.stopImmediatePropagation();
1786   }
1787
1788   function nodrag(view) {
1789     var root = view.document.documentElement,
1790         selection$$1 = select(view).on("dragstart.drag", noevent, true);
1791     if ("onselectstart" in root) {
1792       selection$$1.on("selectstart.drag", noevent, true);
1793     } else {
1794       root.__noselect = root.style.MozUserSelect;
1795       root.style.MozUserSelect = "none";
1796     }
1797   }
1798
1799   function yesdrag(view, noclick) {
1800     var root = view.document.documentElement,
1801         selection$$1 = select(view).on("dragstart.drag", null);
1802     if (noclick) {
1803       selection$$1.on("click.drag", noevent, true);
1804       setTimeout(function() { selection$$1.on("click.drag", null); }, 0);
1805     }
1806     if ("onselectstart" in root) {
1807       selection$$1.on("selectstart.drag", null);
1808     } else {
1809       root.style.MozUserSelect = root.__noselect;
1810       delete root.__noselect;
1811     }
1812   }
1813
1814   function constant$2(x) {
1815     return function() {
1816       return x;
1817     };
1818   }
1819
1820   function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
1821     this.target = target;
1822     this.type = type;
1823     this.subject = subject;
1824     this.identifier = id;
1825     this.active = active;
1826     this.x = x;
1827     this.y = y;
1828     this.dx = dx;
1829     this.dy = dy;
1830     this._ = dispatch;
1831   }
1832
1833   DragEvent.prototype.on = function() {
1834     var value = this._.on.apply(this._, arguments);
1835     return value === this._ ? this : value;
1836   };
1837
1838   // Ignore right-click, since that should open the context menu.
1839   function defaultFilter() {
1840     return !event.button;
1841   }
1842
1843   function defaultContainer() {
1844     return this.parentNode;
1845   }
1846
1847   function defaultSubject(d) {
1848     return d == null ? {x: event.x, y: event.y} : d;
1849   }
1850
1851   function defaultTouchable() {
1852     return "ontouchstart" in this;
1853   }
1854
1855   function drag() {
1856     var filter = defaultFilter,
1857         container = defaultContainer,
1858         subject = defaultSubject,
1859         touchable = defaultTouchable,
1860         gestures = {},
1861         listeners = dispatch("start", "drag", "end"),
1862         active = 0,
1863         mousedownx,
1864         mousedowny,
1865         mousemoving,
1866         touchending,
1867         clickDistance2 = 0;
1868
1869     function drag(selection$$1) {
1870       selection$$1
1871           .on("mousedown.drag", mousedowned)
1872         .filter(touchable)
1873           .on("touchstart.drag", touchstarted)
1874           .on("touchmove.drag", touchmoved)
1875           .on("touchend.drag touchcancel.drag", touchended)
1876           .style("touch-action", "none")
1877           .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
1878     }
1879
1880     function mousedowned() {
1881       if (touchending || !filter.apply(this, arguments)) return;
1882       var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments);
1883       if (!gesture) return;
1884       select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
1885       nodrag(event.view);
1886       nopropagation();
1887       mousemoving = false;
1888       mousedownx = event.clientX;
1889       mousedowny = event.clientY;
1890       gesture("start");
1891     }
1892
1893     function mousemoved() {
1894       noevent();
1895       if (!mousemoving) {
1896         var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
1897         mousemoving = dx * dx + dy * dy > clickDistance2;
1898       }
1899       gestures.mouse("drag");
1900     }
1901
1902     function mouseupped() {
1903       select(event.view).on("mousemove.drag mouseup.drag", null);
1904       yesdrag(event.view, mousemoving);
1905       noevent();
1906       gestures.mouse("end");
1907     }
1908
1909     function touchstarted() {
1910       if (!filter.apply(this, arguments)) return;
1911       var touches = event.changedTouches,
1912           c = container.apply(this, arguments),
1913           n = touches.length, i, gesture;
1914
1915       for (i = 0; i < n; ++i) {
1916         if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
1917           nopropagation();
1918           gesture("start");
1919         }
1920       }
1921     }
1922
1923     function touchmoved() {
1924       var touches = event.changedTouches,
1925           n = touches.length, i, gesture;
1926
1927       for (i = 0; i < n; ++i) {
1928         if (gesture = gestures[touches[i].identifier]) {
1929           noevent();
1930           gesture("drag");
1931         }
1932       }
1933     }
1934
1935     function touchended() {
1936       var touches = event.changedTouches,
1937           n = touches.length, i, gesture;
1938
1939       if (touchending) clearTimeout(touchending);
1940       touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
1941       for (i = 0; i < n; ++i) {
1942         if (gesture = gestures[touches[i].identifier]) {
1943           nopropagation();
1944           gesture("end");
1945         }
1946       }
1947     }
1948
1949     function beforestart(id, container, point$$1, that, args) {
1950       var p = point$$1(container, id), s, dx, dy,
1951           sublisteners = listeners.copy();
1952
1953       if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
1954         if ((event.subject = s = subject.apply(that, args)) == null) return false;
1955         dx = s.x - p[0] || 0;
1956         dy = s.y - p[1] || 0;
1957         return true;
1958       })) return;
1959
1960       return function gesture(type) {
1961         var p0 = p, n;
1962         switch (type) {
1963           case "start": gestures[id] = gesture, n = active++; break;
1964           case "end": delete gestures[id], --active; // nobreak
1965           case "drag": p = point$$1(container, id), n = active; break;
1966         }
1967         customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);
1968       };
1969     }
1970
1971     drag.filter = function(_) {
1972       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
1973     };
1974
1975     drag.container = function(_) {
1976       return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
1977     };
1978
1979     drag.subject = function(_) {
1980       return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
1981     };
1982
1983     drag.touchable = function(_) {
1984       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
1985     };
1986
1987     drag.on = function() {
1988       var value = listeners.on.apply(listeners, arguments);
1989       return value === listeners ? drag : value;
1990     };
1991
1992     drag.clickDistance = function(_) {
1993       return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
1994     };
1995
1996     return drag;
1997   }
1998
1999   function define(constructor, factory, prototype) {
2000     constructor.prototype = factory.prototype = prototype;
2001     prototype.constructor = constructor;
2002   }
2003
2004   function extend(parent, definition) {
2005     var prototype = Object.create(parent.prototype);
2006     for (var key in definition) prototype[key] = definition[key];
2007     return prototype;
2008   }
2009
2010   function Color() {}
2011
2012   var darker = 0.7;
2013   var brighter = 1 / darker;
2014
2015   var reI = "\\s*([+-]?\\d+)\\s*",
2016       reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
2017       reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
2018       reHex3 = /^#([0-9a-f]{3})$/,
2019       reHex6 = /^#([0-9a-f]{6})$/,
2020       reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
2021       reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
2022       reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
2023       reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
2024       reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
2025       reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
2026
2027   var named = {
2028     aliceblue: 0xf0f8ff,
2029     antiquewhite: 0xfaebd7,
2030     aqua: 0x00ffff,
2031     aquamarine: 0x7fffd4,
2032     azure: 0xf0ffff,
2033     beige: 0xf5f5dc,
2034     bisque: 0xffe4c4,
2035     black: 0x000000,
2036     blanchedalmond: 0xffebcd,
2037     blue: 0x0000ff,
2038     blueviolet: 0x8a2be2,
2039     brown: 0xa52a2a,
2040     burlywood: 0xdeb887,
2041     cadetblue: 0x5f9ea0,
2042     chartreuse: 0x7fff00,
2043     chocolate: 0xd2691e,
2044     coral: 0xff7f50,
2045     cornflowerblue: 0x6495ed,
2046     cornsilk: 0xfff8dc,
2047     crimson: 0xdc143c,
2048     cyan: 0x00ffff,
2049     darkblue: 0x00008b,
2050     darkcyan: 0x008b8b,
2051     darkgoldenrod: 0xb8860b,
2052     darkgray: 0xa9a9a9,
2053     darkgreen: 0x006400,
2054     darkgrey: 0xa9a9a9,
2055     darkkhaki: 0xbdb76b,
2056     darkmagenta: 0x8b008b,
2057     darkolivegreen: 0x556b2f,
2058     darkorange: 0xff8c00,
2059     darkorchid: 0x9932cc,
2060     darkred: 0x8b0000,
2061     darksalmon: 0xe9967a,
2062     darkseagreen: 0x8fbc8f,
2063     darkslateblue: 0x483d8b,
2064     darkslategray: 0x2f4f4f,
2065     darkslategrey: 0x2f4f4f,
2066     darkturquoise: 0x00ced1,
2067     darkviolet: 0x9400d3,
2068     deeppink: 0xff1493,
2069     deepskyblue: 0x00bfff,
2070     dimgray: 0x696969,
2071     dimgrey: 0x696969,
2072     dodgerblue: 0x1e90ff,
2073     firebrick: 0xb22222,
2074     floralwhite: 0xfffaf0,
2075     forestgreen: 0x228b22,
2076     fuchsia: 0xff00ff,
2077     gainsboro: 0xdcdcdc,
2078     ghostwhite: 0xf8f8ff,
2079     gold: 0xffd700,
2080     goldenrod: 0xdaa520,
2081     gray: 0x808080,
2082     green: 0x008000,
2083     greenyellow: 0xadff2f,
2084     grey: 0x808080,
2085     honeydew: 0xf0fff0,
2086     hotpink: 0xff69b4,
2087     indianred: 0xcd5c5c,
2088     indigo: 0x4b0082,
2089     ivory: 0xfffff0,
2090     khaki: 0xf0e68c,
2091     lavender: 0xe6e6fa,
2092     lavenderblush: 0xfff0f5,
2093     lawngreen: 0x7cfc00,
2094     lemonchiffon: 0xfffacd,
2095     lightblue: 0xadd8e6,
2096     lightcoral: 0xf08080,
2097     lightcyan: 0xe0ffff,
2098     lightgoldenrodyellow: 0xfafad2,
2099     lightgray: 0xd3d3d3,
2100     lightgreen: 0x90ee90,
2101     lightgrey: 0xd3d3d3,
2102     lightpink: 0xffb6c1,
2103     lightsalmon: 0xffa07a,
2104     lightseagreen: 0x20b2aa,
2105     lightskyblue: 0x87cefa,
2106     lightslategray: 0x778899,
2107     lightslategrey: 0x778899,
2108     lightsteelblue: 0xb0c4de,
2109     lightyellow: 0xffffe0,
2110     lime: 0x00ff00,
2111     limegreen: 0x32cd32,
2112     linen: 0xfaf0e6,
2113     magenta: 0xff00ff,
2114     maroon: 0x800000,
2115     mediumaquamarine: 0x66cdaa,
2116     mediumblue: 0x0000cd,
2117     mediumorchid: 0xba55d3,
2118     mediumpurple: 0x9370db,
2119     mediumseagreen: 0x3cb371,
2120     mediumslateblue: 0x7b68ee,
2121     mediumspringgreen: 0x00fa9a,
2122     mediumturquoise: 0x48d1cc,
2123     mediumvioletred: 0xc71585,
2124     midnightblue: 0x191970,
2125     mintcream: 0xf5fffa,
2126     mistyrose: 0xffe4e1,
2127     moccasin: 0xffe4b5,
2128     navajowhite: 0xffdead,
2129     navy: 0x000080,
2130     oldlace: 0xfdf5e6,
2131     olive: 0x808000,
2132     olivedrab: 0x6b8e23,
2133     orange: 0xffa500,
2134     orangered: 0xff4500,
2135     orchid: 0xda70d6,
2136     palegoldenrod: 0xeee8aa,
2137     palegreen: 0x98fb98,
2138     paleturquoise: 0xafeeee,
2139     palevioletred: 0xdb7093,
2140     papayawhip: 0xffefd5,
2141     peachpuff: 0xffdab9,
2142     peru: 0xcd853f,
2143     pink: 0xffc0cb,
2144     plum: 0xdda0dd,
2145     powderblue: 0xb0e0e6,
2146     purple: 0x800080,
2147     rebeccapurple: 0x663399,
2148     red: 0xff0000,
2149     rosybrown: 0xbc8f8f,
2150     royalblue: 0x4169e1,
2151     saddlebrown: 0x8b4513,
2152     salmon: 0xfa8072,
2153     sandybrown: 0xf4a460,
2154     seagreen: 0x2e8b57,
2155     seashell: 0xfff5ee,
2156     sienna: 0xa0522d,
2157     silver: 0xc0c0c0,
2158     skyblue: 0x87ceeb,
2159     slateblue: 0x6a5acd,
2160     slategray: 0x708090,
2161     slategrey: 0x708090,
2162     snow: 0xfffafa,
2163     springgreen: 0x00ff7f,
2164     steelblue: 0x4682b4,
2165     tan: 0xd2b48c,
2166     teal: 0x008080,
2167     thistle: 0xd8bfd8,
2168     tomato: 0xff6347,
2169     turquoise: 0x40e0d0,
2170     violet: 0xee82ee,
2171     wheat: 0xf5deb3,
2172     white: 0xffffff,
2173     whitesmoke: 0xf5f5f5,
2174     yellow: 0xffff00,
2175     yellowgreen: 0x9acd32
2176   };
2177
2178   define(Color, color, {
2179     displayable: function() {
2180       return this.rgb().displayable();
2181     },
2182     toString: function() {
2183       return this.rgb() + "";
2184     }
2185   });
2186
2187   function color(format) {
2188     var m;
2189     format = (format + "").trim().toLowerCase();
2190     return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00
2191         : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
2192         : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
2193         : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
2194         : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
2195         : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
2196         : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
2197         : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
2198         : named.hasOwnProperty(format) ? rgbn(named[format])
2199         : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
2200         : null;
2201   }
2202
2203   function rgbn(n) {
2204     return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
2205   }
2206
2207   function rgba(r, g, b, a) {
2208     if (a <= 0) r = g = b = NaN;
2209     return new Rgb(r, g, b, a);
2210   }
2211
2212   function rgbConvert(o) {
2213     if (!(o instanceof Color)) o = color(o);
2214     if (!o) return new Rgb;
2215     o = o.rgb();
2216     return new Rgb(o.r, o.g, o.b, o.opacity);
2217   }
2218
2219   function rgb(r, g, b, opacity) {
2220     return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
2221   }
2222
2223   function Rgb(r, g, b, opacity) {
2224     this.r = +r;
2225     this.g = +g;
2226     this.b = +b;
2227     this.opacity = +opacity;
2228   }
2229
2230   define(Rgb, rgb, extend(Color, {
2231     brighter: function(k) {
2232       k = k == null ? brighter : Math.pow(brighter, k);
2233       return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2234     },
2235     darker: function(k) {
2236       k = k == null ? darker : Math.pow(darker, k);
2237       return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2238     },
2239     rgb: function() {
2240       return this;
2241     },
2242     displayable: function() {
2243       return (0 <= this.r && this.r <= 255)
2244           && (0 <= this.g && this.g <= 255)
2245           && (0 <= this.b && this.b <= 255)
2246           && (0 <= this.opacity && this.opacity <= 1);
2247     },
2248     toString: function() {
2249       var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
2250       return (a === 1 ? "rgb(" : "rgba(")
2251           + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
2252           + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
2253           + Math.max(0, Math.min(255, Math.round(this.b) || 0))
2254           + (a === 1 ? ")" : ", " + a + ")");
2255     }
2256   }));
2257
2258   function hsla(h, s, l, a) {
2259     if (a <= 0) h = s = l = NaN;
2260     else if (l <= 0 || l >= 1) h = s = NaN;
2261     else if (s <= 0) h = NaN;
2262     return new Hsl(h, s, l, a);
2263   }
2264
2265   function hslConvert(o) {
2266     if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
2267     if (!(o instanceof Color)) o = color(o);
2268     if (!o) return new Hsl;
2269     if (o instanceof Hsl) return o;
2270     o = o.rgb();
2271     var r = o.r / 255,
2272         g = o.g / 255,
2273         b = o.b / 255,
2274         min = Math.min(r, g, b),
2275         max = Math.max(r, g, b),
2276         h = NaN,
2277         s = max - min,
2278         l = (max + min) / 2;
2279     if (s) {
2280       if (r === max) h = (g - b) / s + (g < b) * 6;
2281       else if (g === max) h = (b - r) / s + 2;
2282       else h = (r - g) / s + 4;
2283       s /= l < 0.5 ? max + min : 2 - max - min;
2284       h *= 60;
2285     } else {
2286       s = l > 0 && l < 1 ? 0 : h;
2287     }
2288     return new Hsl(h, s, l, o.opacity);
2289   }
2290
2291   function hsl(h, s, l, opacity) {
2292     return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
2293   }
2294
2295   function Hsl(h, s, l, opacity) {
2296     this.h = +h;
2297     this.s = +s;
2298     this.l = +l;
2299     this.opacity = +opacity;
2300   }
2301
2302   define(Hsl, hsl, extend(Color, {
2303     brighter: function(k) {
2304       k = k == null ? brighter : Math.pow(brighter, k);
2305       return new Hsl(this.h, this.s, this.l * k, this.opacity);
2306     },
2307     darker: function(k) {
2308       k = k == null ? darker : Math.pow(darker, k);
2309       return new Hsl(this.h, this.s, this.l * k, this.opacity);
2310     },
2311     rgb: function() {
2312       var h = this.h % 360 + (this.h < 0) * 360,
2313           s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
2314           l = this.l,
2315           m2 = l + (l < 0.5 ? l : 1 - l) * s,
2316           m1 = 2 * l - m2;
2317       return new Rgb(
2318         hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
2319         hsl2rgb(h, m1, m2),
2320         hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
2321         this.opacity
2322       );
2323     },
2324     displayable: function() {
2325       return (0 <= this.s && this.s <= 1 || isNaN(this.s))
2326           && (0 <= this.l && this.l <= 1)
2327           && (0 <= this.opacity && this.opacity <= 1);
2328     }
2329   }));
2330
2331   /* From FvD 13.37, CSS Color Module Level 3 */
2332   function hsl2rgb(h, m1, m2) {
2333     return (h < 60 ? m1 + (m2 - m1) * h / 60
2334         : h < 180 ? m2
2335         : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
2336         : m1) * 255;
2337   }
2338
2339   var deg2rad = Math.PI / 180;
2340   var rad2deg = 180 / Math.PI;
2341
2342   var Kn = 18,
2343       Xn = 0.950470, // D65 standard referent
2344       Yn = 1,
2345       Zn = 1.088830,
2346       t0 = 4 / 29,
2347       t1 = 6 / 29,
2348       t2 = 3 * t1 * t1,
2349       t3 = t1 * t1 * t1;
2350
2351   function labConvert(o) {
2352     if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
2353     if (o instanceof Hcl) {
2354       var h = o.h * deg2rad;
2355       return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
2356     }
2357     if (!(o instanceof Rgb)) o = rgbConvert(o);
2358     var b = rgb2xyz(o.r),
2359         a = rgb2xyz(o.g),
2360         l = rgb2xyz(o.b),
2361         x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),
2362         y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),
2363         z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
2364     return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
2365   }
2366
2367   function lab(l, a, b, opacity) {
2368     return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
2369   }
2370
2371   function Lab(l, a, b, opacity) {
2372     this.l = +l;
2373     this.a = +a;
2374     this.b = +b;
2375     this.opacity = +opacity;
2376   }
2377
2378   define(Lab, lab, extend(Color, {
2379     brighter: function(k) {
2380       return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2381     },
2382     darker: function(k) {
2383       return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2384     },
2385     rgb: function() {
2386       var y = (this.l + 16) / 116,
2387           x = isNaN(this.a) ? y : y + this.a / 500,
2388           z = isNaN(this.b) ? y : y - this.b / 200;
2389       y = Yn * lab2xyz(y);
2390       x = Xn * lab2xyz(x);
2391       z = Zn * lab2xyz(z);
2392       return new Rgb(
2393         xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
2394         xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
2395         xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),
2396         this.opacity
2397       );
2398     }
2399   }));
2400
2401   function xyz2lab(t) {
2402     return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
2403   }
2404
2405   function lab2xyz(t) {
2406     return t > t1 ? t * t * t : t2 * (t - t0);
2407   }
2408
2409   function xyz2rgb(x) {
2410     return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
2411   }
2412
2413   function rgb2xyz(x) {
2414     return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
2415   }
2416
2417   function hclConvert(o) {
2418     if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
2419     if (!(o instanceof Lab)) o = labConvert(o);
2420     var h = Math.atan2(o.b, o.a) * rad2deg;
2421     return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
2422   }
2423
2424   function hcl(h, c, l, opacity) {
2425     return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
2426   }
2427
2428   function Hcl(h, c, l, opacity) {
2429     this.h = +h;
2430     this.c = +c;
2431     this.l = +l;
2432     this.opacity = +opacity;
2433   }
2434
2435   define(Hcl, hcl, extend(Color, {
2436     brighter: function(k) {
2437       return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);
2438     },
2439     darker: function(k) {
2440       return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
2441     },
2442     rgb: function() {
2443       return labConvert(this).rgb();
2444     }
2445   }));
2446
2447   var A = -0.14861,
2448       B = +1.78277,
2449       C = -0.29227,
2450       D = -0.90649,
2451       E = +1.97294,
2452       ED = E * D,
2453       EB = E * B,
2454       BC_DA = B * C - D * A;
2455
2456   function cubehelixConvert(o) {
2457     if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
2458     if (!(o instanceof Rgb)) o = rgbConvert(o);
2459     var r = o.r / 255,
2460         g = o.g / 255,
2461         b = o.b / 255,
2462         l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
2463         bl = b - l,
2464         k = (E * (g - l) - C * bl) / D,
2465         s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
2466         h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
2467     return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
2468   }
2469
2470   function cubehelix(h, s, l, opacity) {
2471     return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
2472   }
2473
2474   function Cubehelix(h, s, l, opacity) {
2475     this.h = +h;
2476     this.s = +s;
2477     this.l = +l;
2478     this.opacity = +opacity;
2479   }
2480
2481   define(Cubehelix, cubehelix, extend(Color, {
2482     brighter: function(k) {
2483       k = k == null ? brighter : Math.pow(brighter, k);
2484       return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2485     },
2486     darker: function(k) {
2487       k = k == null ? darker : Math.pow(darker, k);
2488       return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2489     },
2490     rgb: function() {
2491       var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
2492           l = +this.l,
2493           a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
2494           cosh = Math.cos(h),
2495           sinh = Math.sin(h);
2496       return new Rgb(
2497         255 * (l + a * (A * cosh + B * sinh)),
2498         255 * (l + a * (C * cosh + D * sinh)),
2499         255 * (l + a * (E * cosh)),
2500         this.opacity
2501       );
2502     }
2503   }));
2504
2505   function basis(t1, v0, v1, v2, v3) {
2506     var t2 = t1 * t1, t3 = t2 * t1;
2507     return ((1 - 3 * t1 + 3 * t2 - t3) * v0
2508         + (4 - 6 * t2 + 3 * t3) * v1
2509         + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
2510         + t3 * v3) / 6;
2511   }
2512
2513   function basis$1(values) {
2514     var n = values.length - 1;
2515     return function(t) {
2516       var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
2517           v1 = values[i],
2518           v2 = values[i + 1],
2519           v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
2520           v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
2521       return basis((t - i / n) * n, v0, v1, v2, v3);
2522     };
2523   }
2524
2525   function basisClosed(values) {
2526     var n = values.length;
2527     return function(t) {
2528       var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
2529           v0 = values[(i + n - 1) % n],
2530           v1 = values[i % n],
2531           v2 = values[(i + 1) % n],
2532           v3 = values[(i + 2) % n];
2533       return basis((t - i / n) * n, v0, v1, v2, v3);
2534     };
2535   }
2536
2537   function constant$3(x) {
2538     return function() {
2539       return x;
2540     };
2541   }
2542
2543   function linear(a, d) {
2544     return function(t) {
2545       return a + t * d;
2546     };
2547   }
2548
2549   function exponential(a, b, y) {
2550     return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
2551       return Math.pow(a + t * b, y);
2552     };
2553   }
2554
2555   function hue(a, b) {
2556     var d = b - a;
2557     return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
2558   }
2559
2560   function gamma(y) {
2561     return (y = +y) === 1 ? nogamma : function(a, b) {
2562       return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
2563     };
2564   }
2565
2566   function nogamma(a, b) {
2567     var d = b - a;
2568     return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
2569   }
2570
2571   var interpolateRgb = (function rgbGamma(y) {
2572     var color$$1 = gamma(y);
2573
2574     function rgb$$1(start, end) {
2575       var r = color$$1((start = rgb(start)).r, (end = rgb(end)).r),
2576           g = color$$1(start.g, end.g),
2577           b = color$$1(start.b, end.b),
2578           opacity = nogamma(start.opacity, end.opacity);
2579       return function(t) {
2580         start.r = r(t);
2581         start.g = g(t);
2582         start.b = b(t);
2583         start.opacity = opacity(t);
2584         return start + "";
2585       };
2586     }
2587
2588     rgb$$1.gamma = rgbGamma;
2589
2590     return rgb$$1;
2591   })(1);
2592
2593   function rgbSpline(spline) {
2594     return function(colors) {
2595       var n = colors.length,
2596           r = new Array(n),
2597           g = new Array(n),
2598           b = new Array(n),
2599           i, color$$1;
2600       for (i = 0; i < n; ++i) {
2601         color$$1 = rgb(colors[i]);
2602         r[i] = color$$1.r || 0;
2603         g[i] = color$$1.g || 0;
2604         b[i] = color$$1.b || 0;
2605       }
2606       r = spline(r);
2607       g = spline(g);
2608       b = spline(b);
2609       color$$1.opacity = 1;
2610       return function(t) {
2611         color$$1.r = r(t);
2612         color$$1.g = g(t);
2613         color$$1.b = b(t);
2614         return color$$1 + "";
2615       };
2616     };
2617   }
2618
2619   var rgbBasis = rgbSpline(basis$1);
2620   var rgbBasisClosed = rgbSpline(basisClosed);
2621
2622   function array$1(a, b) {
2623     var nb = b ? b.length : 0,
2624         na = a ? Math.min(nb, a.length) : 0,
2625         x = new Array(na),
2626         c = new Array(nb),
2627         i;
2628
2629     for (i = 0; i < na; ++i) x[i] = interpolate(a[i], b[i]);
2630     for (; i < nb; ++i) c[i] = b[i];
2631
2632     return function(t) {
2633       for (i = 0; i < na; ++i) c[i] = x[i](t);
2634       return c;
2635     };
2636   }
2637
2638   function date(a, b) {
2639     var d = new Date;
2640     return a = +a, b -= a, function(t) {
2641       return d.setTime(a + b * t), d;
2642     };
2643   }
2644
2645   function interpolateNumber(a, b) {
2646     return a = +a, b -= a, function(t) {
2647       return a + b * t;
2648     };
2649   }
2650
2651   function object(a, b) {
2652     var i = {},
2653         c = {},
2654         k;
2655
2656     if (a === null || typeof a !== "object") a = {};
2657     if (b === null || typeof b !== "object") b = {};
2658
2659     for (k in b) {
2660       if (k in a) {
2661         i[k] = interpolate(a[k], b[k]);
2662       } else {
2663         c[k] = b[k];
2664       }
2665     }
2666
2667     return function(t) {
2668       for (k in i) c[k] = i[k](t);
2669       return c;
2670     };
2671   }
2672
2673   var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
2674       reB = new RegExp(reA.source, "g");
2675
2676   function zero(b) {
2677     return function() {
2678       return b;
2679     };
2680   }
2681
2682   function one(b) {
2683     return function(t) {
2684       return b(t) + "";
2685     };
2686   }
2687
2688   function interpolateString(a, b) {
2689     var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
2690         am, // current match in a
2691         bm, // current match in b
2692         bs, // string preceding current number in b, if any
2693         i = -1, // index in s
2694         s = [], // string constants and placeholders
2695         q = []; // number interpolators
2696
2697     // Coerce inputs to strings.
2698     a = a + "", b = b + "";
2699
2700     // Interpolate pairs of numbers in a & b.
2701     while ((am = reA.exec(a))
2702         && (bm = reB.exec(b))) {
2703       if ((bs = bm.index) > bi) { // a string precedes the next number in b
2704         bs = b.slice(bi, bs);
2705         if (s[i]) s[i] += bs; // coalesce with previous string
2706         else s[++i] = bs;
2707       }
2708       if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
2709         if (s[i]) s[i] += bm; // coalesce with previous string
2710         else s[++i] = bm;
2711       } else { // interpolate non-matching numbers
2712         s[++i] = null;
2713         q.push({i: i, x: interpolateNumber(am, bm)});
2714       }
2715       bi = reB.lastIndex;
2716     }
2717
2718     // Add remains of b.
2719     if (bi < b.length) {
2720       bs = b.slice(bi);
2721       if (s[i]) s[i] += bs; // coalesce with previous string
2722       else s[++i] = bs;
2723     }
2724
2725     // Special optimization for only a single match.
2726     // Otherwise, interpolate each of the numbers and rejoin the string.
2727     return s.length < 2 ? (q[0]
2728         ? one(q[0].x)
2729         : zero(b))
2730         : (b = q.length, function(t) {
2731             for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
2732             return s.join("");
2733           });
2734   }
2735
2736   function interpolate(a, b) {
2737     var t = typeof b, c;
2738     return b == null || t === "boolean" ? constant$3(b)
2739         : (t === "number" ? interpolateNumber
2740         : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString)
2741         : b instanceof color ? interpolateRgb
2742         : b instanceof Date ? date
2743         : Array.isArray(b) ? array$1
2744         : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
2745         : interpolateNumber)(a, b);
2746   }
2747
2748   function interpolateRound(a, b) {
2749     return a = +a, b -= a, function(t) {
2750       return Math.round(a + b * t);
2751     };
2752   }
2753
2754   var degrees = 180 / Math.PI;
2755
2756   var identity$2 = {
2757     translateX: 0,
2758     translateY: 0,
2759     rotate: 0,
2760     skewX: 0,
2761     scaleX: 1,
2762     scaleY: 1
2763   };
2764
2765   function decompose(a, b, c, d, e, f) {
2766     var scaleX, scaleY, skewX;
2767     if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
2768     if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
2769     if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
2770     if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
2771     return {
2772       translateX: e,
2773       translateY: f,
2774       rotate: Math.atan2(b, a) * degrees,
2775       skewX: Math.atan(skewX) * degrees,
2776       scaleX: scaleX,
2777       scaleY: scaleY
2778     };
2779   }
2780
2781   var cssNode,
2782       cssRoot,
2783       cssView,
2784       svgNode;
2785
2786   function parseCss(value) {
2787     if (value === "none") return identity$2;
2788     if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
2789     cssNode.style.transform = value;
2790     value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
2791     cssRoot.removeChild(cssNode);
2792     value = value.slice(7, -1).split(",");
2793     return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
2794   }
2795
2796   function parseSvg(value) {
2797     if (value == null) return identity$2;
2798     if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
2799     svgNode.setAttribute("transform", value);
2800     if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
2801     value = value.matrix;
2802     return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
2803   }
2804
2805   function interpolateTransform(parse, pxComma, pxParen, degParen) {
2806
2807     function pop(s) {
2808       return s.length ? s.pop() + " " : "";
2809     }
2810
2811     function translate(xa, ya, xb, yb, s, q) {
2812       if (xa !== xb || ya !== yb) {
2813         var i = s.push("translate(", null, pxComma, null, pxParen);
2814         q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
2815       } else if (xb || yb) {
2816         s.push("translate(" + xb + pxComma + yb + pxParen);
2817       }
2818     }
2819
2820     function rotate(a, b, s, q) {
2821       if (a !== b) {
2822         if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
2823         q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)});
2824       } else if (b) {
2825         s.push(pop(s) + "rotate(" + b + degParen);
2826       }
2827     }
2828
2829     function skewX(a, b, s, q) {
2830       if (a !== b) {
2831         q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)});
2832       } else if (b) {
2833         s.push(pop(s) + "skewX(" + b + degParen);
2834       }
2835     }
2836
2837     function scale(xa, ya, xb, yb, s, q) {
2838       if (xa !== xb || ya !== yb) {
2839         var i = s.push(pop(s) + "scale(", null, ",", null, ")");
2840         q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
2841       } else if (xb !== 1 || yb !== 1) {
2842         s.push(pop(s) + "scale(" + xb + "," + yb + ")");
2843       }
2844     }
2845
2846     return function(a, b) {
2847       var s = [], // string constants and placeholders
2848           q = []; // number interpolators
2849       a = parse(a), b = parse(b);
2850       translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
2851       rotate(a.rotate, b.rotate, s, q);
2852       skewX(a.skewX, b.skewX, s, q);
2853       scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
2854       a = b = null; // gc
2855       return function(t) {
2856         var i = -1, n = q.length, o;
2857         while (++i < n) s[(o = q[i]).i] = o.x(t);
2858         return s.join("");
2859       };
2860     };
2861   }
2862
2863   var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
2864   var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
2865
2866   var rho = Math.SQRT2,
2867       rho2 = 2,
2868       rho4 = 4,
2869       epsilon2 = 1e-12;
2870
2871   function cosh(x) {
2872     return ((x = Math.exp(x)) + 1 / x) / 2;
2873   }
2874
2875   function sinh(x) {
2876     return ((x = Math.exp(x)) - 1 / x) / 2;
2877   }
2878
2879   function tanh(x) {
2880     return ((x = Math.exp(2 * x)) - 1) / (x + 1);
2881   }
2882
2883   // p0 = [ux0, uy0, w0]
2884   // p1 = [ux1, uy1, w1]
2885   function interpolateZoom(p0, p1) {
2886     var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
2887         ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
2888         dx = ux1 - ux0,
2889         dy = uy1 - uy0,
2890         d2 = dx * dx + dy * dy,
2891         i,
2892         S;
2893
2894     // Special case for u0 ≅ u1.
2895     if (d2 < epsilon2) {
2896       S = Math.log(w1 / w0) / rho;
2897       i = function(t) {
2898         return [
2899           ux0 + t * dx,
2900           uy0 + t * dy,
2901           w0 * Math.exp(rho * t * S)
2902         ];
2903       };
2904     }
2905
2906     // General case.
2907     else {
2908       var d1 = Math.sqrt(d2),
2909           b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
2910           b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
2911           r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
2912           r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
2913       S = (r1 - r0) / rho;
2914       i = function(t) {
2915         var s = t * S,
2916             coshr0 = cosh(r0),
2917             u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
2918         return [
2919           ux0 + u * dx,
2920           uy0 + u * dy,
2921           w0 * coshr0 / cosh(rho * s + r0)
2922         ];
2923       };
2924     }
2925
2926     i.duration = S * 1000;
2927
2928     return i;
2929   }
2930
2931   function hsl$1(hue$$1) {
2932     return function(start, end) {
2933       var h = hue$$1((start = hsl(start)).h, (end = hsl(end)).h),
2934           s = nogamma(start.s, end.s),
2935           l = nogamma(start.l, end.l),
2936           opacity = nogamma(start.opacity, end.opacity);
2937       return function(t) {
2938         start.h = h(t);
2939         start.s = s(t);
2940         start.l = l(t);
2941         start.opacity = opacity(t);
2942         return start + "";
2943       };
2944     }
2945   }
2946
2947   var hsl$2 = hsl$1(hue);
2948   var hslLong = hsl$1(nogamma);
2949
2950   function lab$1(start, end) {
2951     var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
2952         a = nogamma(start.a, end.a),
2953         b = nogamma(start.b, end.b),
2954         opacity = nogamma(start.opacity, end.opacity);
2955     return function(t) {
2956       start.l = l(t);
2957       start.a = a(t);
2958       start.b = b(t);
2959       start.opacity = opacity(t);
2960       return start + "";
2961     };
2962   }
2963
2964   function hcl$1(hue$$1) {
2965     return function(start, end) {
2966       var h = hue$$1((start = hcl(start)).h, (end = hcl(end)).h),
2967           c = nogamma(start.c, end.c),
2968           l = nogamma(start.l, end.l),
2969           opacity = nogamma(start.opacity, end.opacity);
2970       return function(t) {
2971         start.h = h(t);
2972         start.c = c(t);
2973         start.l = l(t);
2974         start.opacity = opacity(t);
2975         return start + "";
2976       };
2977     }
2978   }
2979
2980   var hcl$2 = hcl$1(hue);
2981   var hclLong = hcl$1(nogamma);
2982
2983   function cubehelix$1(hue$$1) {
2984     return (function cubehelixGamma(y) {
2985       y = +y;
2986
2987       function cubehelix$$1(start, end) {
2988         var h = hue$$1((start = cubehelix(start)).h, (end = cubehelix(end)).h),
2989             s = nogamma(start.s, end.s),
2990             l = nogamma(start.l, end.l),
2991             opacity = nogamma(start.opacity, end.opacity);
2992         return function(t) {
2993           start.h = h(t);
2994           start.s = s(t);
2995           start.l = l(Math.pow(t, y));
2996           start.opacity = opacity(t);
2997           return start + "";
2998         };
2999       }
3000
3001       cubehelix$$1.gamma = cubehelixGamma;
3002
3003       return cubehelix$$1;
3004     })(1);
3005   }
3006
3007   var cubehelix$2 = cubehelix$1(hue);
3008   var cubehelixLong = cubehelix$1(nogamma);
3009
3010   function d3_quantize(interpolator, n) {
3011     var samples = new Array(n);
3012     for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
3013     return samples;
3014   }
3015
3016   var frame = 0, // is an animation frame pending?
3017       timeout = 0, // is a timeout pending?
3018       interval = 0, // are any timers active?
3019       pokeDelay = 1000, // how frequently we check for clock skew
3020       taskHead,
3021       taskTail,
3022       clockLast = 0,
3023       clockNow = 0,
3024       clockSkew = 0,
3025       clock = typeof performance === "object" && performance.now ? performance : Date,
3026       setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
3027
3028   function now() {
3029     return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
3030   }
3031
3032   function clearNow() {
3033     clockNow = 0;
3034   }
3035
3036   function Timer() {
3037     this._call =
3038     this._time =
3039     this._next = null;
3040   }
3041
3042   Timer.prototype = timer.prototype = {
3043     constructor: Timer,
3044     restart: function(callback, delay, time) {
3045       if (typeof callback !== "function") throw new TypeError("callback is not a function");
3046       time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
3047       if (!this._next && taskTail !== this) {
3048         if (taskTail) taskTail._next = this;
3049         else taskHead = this;
3050         taskTail = this;
3051       }
3052       this._call = callback;
3053       this._time = time;
3054       sleep();
3055     },
3056     stop: function() {
3057       if (this._call) {
3058         this._call = null;
3059         this._time = Infinity;
3060         sleep();
3061       }
3062     }
3063   };
3064
3065   function timer(callback, delay, time) {
3066     var t = new Timer;
3067     t.restart(callback, delay, time);
3068     return t;
3069   }
3070
3071   function timerFlush() {
3072     now(); // Get the current time, if not already set.
3073     ++frame; // Pretend we’ve set an alarm, if we haven’t already.
3074     var t = taskHead, e;
3075     while (t) {
3076       if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
3077       t = t._next;
3078     }
3079     --frame;
3080   }
3081
3082   function wake() {
3083     clockNow = (clockLast = clock.now()) + clockSkew;
3084     frame = timeout = 0;
3085     try {
3086       timerFlush();
3087     } finally {
3088       frame = 0;
3089       nap();
3090       clockNow = 0;
3091     }
3092   }
3093
3094   function poke() {
3095     var now = clock.now(), delay = now - clockLast;
3096     if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
3097   }
3098
3099   function nap() {
3100     var t0, t1 = taskHead, t2, time = Infinity;
3101     while (t1) {
3102       if (t1._call) {
3103         if (time > t1._time) time = t1._time;
3104         t0 = t1, t1 = t1._next;
3105       } else {
3106         t2 = t1._next, t1._next = null;
3107         t1 = t0 ? t0._next = t2 : taskHead = t2;
3108       }
3109     }
3110     taskTail = t0;
3111     sleep(time);
3112   }
3113
3114   function sleep(time) {
3115     if (frame) return; // Soonest alarm already set, or will be.
3116     if (timeout) timeout = clearTimeout(timeout);
3117     var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
3118     if (delay > 24) {
3119       if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
3120       if (interval) interval = clearInterval(interval);
3121     } else {
3122       if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
3123       frame = 1, setFrame(wake);
3124     }
3125   }
3126
3127   function timeout$1(callback, delay, time) {
3128     var t = new Timer;
3129     delay = delay == null ? 0 : +delay;
3130     t.restart(function(elapsed) {
3131       t.stop();
3132       callback(elapsed + delay);
3133     }, delay, time);
3134     return t;
3135   }
3136
3137   function interval$1(callback, delay, time) {
3138     var t = new Timer, total = delay;
3139     if (delay == null) return t.restart(callback, delay, time), t;
3140     delay = +delay, time = time == null ? now() : +time;
3141     t.restart(function tick(elapsed) {
3142       elapsed += total;
3143       t.restart(tick, total += delay, time);
3144       callback(elapsed);
3145     }, delay, time);
3146     return t;
3147   }
3148
3149   var emptyOn = dispatch("start", "end", "interrupt");
3150   var emptyTween = [];
3151
3152   var CREATED = 0;
3153   var SCHEDULED = 1;
3154   var STARTING = 2;
3155   var STARTED = 3;
3156   var RUNNING = 4;
3157   var ENDING = 5;
3158   var ENDED = 6;
3159
3160   function schedule(node, name, id, index, group, timing) {
3161     var schedules = node.__transition;
3162     if (!schedules) node.__transition = {};
3163     else if (id in schedules) return;
3164     create$1(node, id, {
3165       name: name,
3166       index: index, // For context during callback.
3167       group: group, // For context during callback.
3168       on: emptyOn,
3169       tween: emptyTween,
3170       time: timing.time,
3171       delay: timing.delay,
3172       duration: timing.duration,
3173       ease: timing.ease,
3174       timer: null,
3175       state: CREATED
3176     });
3177   }
3178
3179   function init(node, id) {
3180     var schedule = get$1(node, id);
3181     if (schedule.state > CREATED) throw new Error("too late; already scheduled");
3182     return schedule;
3183   }
3184
3185   function set$1(node, id) {
3186     var schedule = get$1(node, id);
3187     if (schedule.state > STARTING) throw new Error("too late; already started");
3188     return schedule;
3189   }
3190
3191   function get$1(node, id) {
3192     var schedule = node.__transition;
3193     if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
3194     return schedule;
3195   }
3196
3197   function create$1(node, id, self) {
3198     var schedules = node.__transition,
3199         tween;
3200
3201     // Initialize the self timer when the transition is created.
3202     // Note the actual delay is not known until the first callback!
3203     schedules[id] = self;
3204     self.timer = timer(schedule, 0, self.time);
3205
3206     function schedule(elapsed) {
3207       self.state = SCHEDULED;
3208       self.timer.restart(start, self.delay, self.time);
3209
3210       // If the elapsed delay is less than our first sleep, start immediately.
3211       if (self.delay <= elapsed) start(elapsed - self.delay);
3212     }
3213
3214     function start(elapsed) {
3215       var i, j, n, o;
3216
3217       // If the state is not SCHEDULED, then we previously errored on start.
3218       if (self.state !== SCHEDULED) return stop();
3219
3220       for (i in schedules) {
3221         o = schedules[i];
3222         if (o.name !== self.name) continue;
3223
3224         // While this element already has a starting transition during this frame,
3225         // defer starting an interrupting transition until that transition has a
3226         // chance to tick (and possibly end); see d3/d3-transition#54!
3227         if (o.state === STARTED) return timeout$1(start);
3228
3229         // Interrupt the active transition, if any.
3230         // Dispatch the interrupt event.
3231         if (o.state === RUNNING) {
3232           o.state = ENDED;
3233           o.timer.stop();
3234           o.on.call("interrupt", node, node.__data__, o.index, o.group);
3235           delete schedules[i];
3236         }
3237
3238         // Cancel any pre-empted transitions. No interrupt event is dispatched
3239         // because the cancelled transitions never started. Note that this also
3240         // removes this transition from the pending list!
3241         else if (+i < id) {
3242           o.state = ENDED;
3243           o.timer.stop();
3244           delete schedules[i];
3245         }
3246       }
3247
3248       // Defer the first tick to end of the current frame; see d3/d3#1576.
3249       // Note the transition may be canceled after start and before the first tick!
3250       // Note this must be scheduled before the start event; see d3/d3-transition#16!
3251       // Assuming this is successful, subsequent callbacks go straight to tick.
3252       timeout$1(function() {
3253         if (self.state === STARTED) {
3254           self.state = RUNNING;
3255           self.timer.restart(tick, self.delay, self.time);
3256           tick(elapsed);
3257         }
3258       });
3259
3260       // Dispatch the start event.
3261       // Note this must be done before the tween are initialized.
3262       self.state = STARTING;
3263       self.on.call("start", node, node.__data__, self.index, self.group);
3264       if (self.state !== STARTING) return; // interrupted
3265       self.state = STARTED;
3266
3267       // Initialize the tween, deleting null tween.
3268       tween = new Array(n = self.tween.length);
3269       for (i = 0, j = -1; i < n; ++i) {
3270         if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
3271           tween[++j] = o;
3272         }
3273       }
3274       tween.length = j + 1;
3275     }
3276
3277     function tick(elapsed) {
3278       var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
3279           i = -1,
3280           n = tween.length;
3281
3282       while (++i < n) {
3283         tween[i].call(null, t);
3284       }
3285
3286       // Dispatch the end event.
3287       if (self.state === ENDING) {
3288         self.on.call("end", node, node.__data__, self.index, self.group);
3289         stop();
3290       }
3291     }
3292
3293     function stop() {
3294       self.state = ENDED;
3295       self.timer.stop();
3296       delete schedules[id];
3297       for (var i in schedules) return; // eslint-disable-line no-unused-vars
3298       delete node.__transition;
3299     }
3300   }
3301
3302   function interrupt(node, name) {
3303     var schedules = node.__transition,
3304         schedule$$1,
3305         active,
3306         empty = true,
3307         i;
3308
3309     if (!schedules) return;
3310
3311     name = name == null ? null : name + "";
3312
3313     for (i in schedules) {
3314       if ((schedule$$1 = schedules[i]).name !== name) { empty = false; continue; }
3315       active = schedule$$1.state > STARTING && schedule$$1.state < ENDING;
3316       schedule$$1.state = ENDED;
3317       schedule$$1.timer.stop();
3318       if (active) schedule$$1.on.call("interrupt", node, node.__data__, schedule$$1.index, schedule$$1.group);
3319       delete schedules[i];
3320     }
3321
3322     if (empty) delete node.__transition;
3323   }
3324
3325   function selection_interrupt(name) {
3326     return this.each(function() {
3327       interrupt(this, name);
3328     });
3329   }
3330
3331   function tweenRemove(id, name) {
3332     var tween0, tween1;
3333     return function() {
3334       var schedule$$1 = set$1(this, id),
3335           tween = schedule$$1.tween;
3336
3337       // If this node shared tween with the previous node,
3338       // just assign the updated shared tween and we’re done!
3339       // Otherwise, copy-on-write.
3340       if (tween !== tween0) {
3341         tween1 = tween0 = tween;
3342         for (var i = 0, n = tween1.length; i < n; ++i) {
3343           if (tween1[i].name === name) {
3344             tween1 = tween1.slice();
3345             tween1.splice(i, 1);
3346             break;
3347           }
3348         }
3349       }
3350
3351       schedule$$1.tween = tween1;
3352     };
3353   }
3354
3355   function tweenFunction(id, name, value) {
3356     var tween0, tween1;
3357     if (typeof value !== "function") throw new Error;
3358     return function() {
3359       var schedule$$1 = set$1(this, id),
3360           tween = schedule$$1.tween;
3361
3362       // If this node shared tween with the previous node,
3363       // just assign the updated shared tween and we’re done!
3364       // Otherwise, copy-on-write.
3365       if (tween !== tween0) {
3366         tween1 = (tween0 = tween).slice();
3367         for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
3368           if (tween1[i].name === name) {
3369             tween1[i] = t;
3370             break;
3371           }
3372         }
3373         if (i === n) tween1.push(t);
3374       }
3375
3376       schedule$$1.tween = tween1;
3377     };
3378   }
3379
3380   function transition_tween(name, value) {
3381     var id = this._id;
3382
3383     name += "";
3384
3385     if (arguments.length < 2) {
3386       var tween = get$1(this.node(), id).tween;
3387       for (var i = 0, n = tween.length, t; i < n; ++i) {
3388         if ((t = tween[i]).name === name) {
3389           return t.value;
3390         }
3391       }
3392       return null;
3393     }
3394
3395     return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
3396   }
3397
3398   function tweenValue(transition, name, value) {
3399     var id = transition._id;
3400
3401     transition.each(function() {
3402       var schedule$$1 = set$1(this, id);
3403       (schedule$$1.value || (schedule$$1.value = {}))[name] = value.apply(this, arguments);
3404     });
3405
3406     return function(node) {
3407       return get$1(node, id).value[name];
3408     };
3409   }
3410
3411   function interpolate$1(a, b) {
3412     var c;
3413     return (typeof b === "number" ? interpolateNumber
3414         : b instanceof color ? interpolateRgb
3415         : (c = color(b)) ? (b = c, interpolateRgb)
3416         : interpolateString)(a, b);
3417   }
3418
3419   function attrRemove$1(name) {
3420     return function() {
3421       this.removeAttribute(name);
3422     };
3423   }
3424
3425   function attrRemoveNS$1(fullname) {
3426     return function() {
3427       this.removeAttributeNS(fullname.space, fullname.local);
3428     };
3429   }
3430
3431   function attrConstant$1(name, interpolate$$1, value1) {
3432     var value00,
3433         interpolate0;
3434     return function() {
3435       var value0 = this.getAttribute(name);
3436       return value0 === value1 ? null
3437           : value0 === value00 ? interpolate0
3438           : interpolate0 = interpolate$$1(value00 = value0, value1);
3439     };
3440   }
3441
3442   function attrConstantNS$1(fullname, interpolate$$1, value1) {
3443     var value00,
3444         interpolate0;
3445     return function() {
3446       var value0 = this.getAttributeNS(fullname.space, fullname.local);
3447       return value0 === value1 ? null
3448           : value0 === value00 ? interpolate0
3449           : interpolate0 = interpolate$$1(value00 = value0, value1);
3450     };
3451   }
3452
3453   function attrFunction$1(name, interpolate$$1, value) {
3454     var value00,
3455         value10,
3456         interpolate0;
3457     return function() {
3458       var value0, value1 = value(this);
3459       if (value1 == null) return void this.removeAttribute(name);
3460       value0 = this.getAttribute(name);
3461       return value0 === value1 ? null
3462           : value0 === value00 && value1 === value10 ? interpolate0
3463           : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3464     };
3465   }
3466
3467   function attrFunctionNS$1(fullname, interpolate$$1, value) {
3468     var value00,
3469         value10,
3470         interpolate0;
3471     return function() {
3472       var value0, value1 = value(this);
3473       if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
3474       value0 = this.getAttributeNS(fullname.space, fullname.local);
3475       return value0 === value1 ? null
3476           : value0 === value00 && value1 === value10 ? interpolate0
3477           : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3478     };
3479   }
3480
3481   function transition_attr(name, value) {
3482     var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate$1;
3483     return this.attrTween(name, typeof value === "function"
3484         ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
3485         : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
3486         : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value + ""));
3487   }
3488
3489   function attrTweenNS(fullname, value) {
3490     function tween() {
3491       var node = this, i = value.apply(node, arguments);
3492       return i && function(t) {
3493         node.setAttributeNS(fullname.space, fullname.local, i(t));
3494       };
3495     }
3496     tween._value = value;
3497     return tween;
3498   }
3499
3500   function attrTween(name, value) {
3501     function tween() {
3502       var node = this, i = value.apply(node, arguments);
3503       return i && function(t) {
3504         node.setAttribute(name, i(t));
3505       };
3506     }
3507     tween._value = value;
3508     return tween;
3509   }
3510
3511   function transition_attrTween(name, value) {
3512     var key = "attr." + name;
3513     if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3514     if (value == null) return this.tween(key, null);
3515     if (typeof value !== "function") throw new Error;
3516     var fullname = namespace(name);
3517     return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
3518   }
3519
3520   function delayFunction(id, value) {
3521     return function() {
3522       init(this, id).delay = +value.apply(this, arguments);
3523     };
3524   }
3525
3526   function delayConstant(id, value) {
3527     return value = +value, function() {
3528       init(this, id).delay = value;
3529     };
3530   }
3531
3532   function transition_delay(value) {
3533     var id = this._id;
3534
3535     return arguments.length
3536         ? this.each((typeof value === "function"
3537             ? delayFunction
3538             : delayConstant)(id, value))
3539         : get$1(this.node(), id).delay;
3540   }
3541
3542   function durationFunction(id, value) {
3543     return function() {
3544       set$1(this, id).duration = +value.apply(this, arguments);
3545     };
3546   }
3547
3548   function durationConstant(id, value) {
3549     return value = +value, function() {
3550       set$1(this, id).duration = value;
3551     };
3552   }
3553
3554   function transition_duration(value) {
3555     var id = this._id;
3556
3557     return arguments.length
3558         ? this.each((typeof value === "function"
3559             ? durationFunction
3560             : durationConstant)(id, value))
3561         : get$1(this.node(), id).duration;
3562   }
3563
3564   function easeConstant(id, value) {
3565     if (typeof value !== "function") throw new Error;
3566     return function() {
3567       set$1(this, id).ease = value;
3568     };
3569   }
3570
3571   function transition_ease(value) {
3572     var id = this._id;
3573
3574     return arguments.length
3575         ? this.each(easeConstant(id, value))
3576         : get$1(this.node(), id).ease;
3577   }
3578
3579   function transition_filter(match) {
3580     if (typeof match !== "function") match = matcher$1(match);
3581
3582     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3583       for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
3584         if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
3585           subgroup.push(node);
3586         }
3587       }
3588     }
3589
3590     return new Transition(subgroups, this._parents, this._name, this._id);
3591   }
3592
3593   function transition_merge(transition$$1) {
3594     if (transition$$1._id !== this._id) throw new Error;
3595
3596     for (var groups0 = this._groups, groups1 = transition$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
3597       for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
3598         if (node = group0[i] || group1[i]) {
3599           merge[i] = node;
3600         }
3601       }
3602     }
3603
3604     for (; j < m0; ++j) {
3605       merges[j] = groups0[j];
3606     }
3607
3608     return new Transition(merges, this._parents, this._name, this._id);
3609   }
3610
3611   function start(name) {
3612     return (name + "").trim().split(/^|\s+/).every(function(t) {
3613       var i = t.indexOf(".");
3614       if (i >= 0) t = t.slice(0, i);
3615       return !t || t === "start";
3616     });
3617   }
3618
3619   function onFunction(id, name, listener) {
3620     var on0, on1, sit = start(name) ? init : set$1;
3621     return function() {
3622       var schedule$$1 = sit(this, id),
3623           on = schedule$$1.on;
3624
3625       // If this node shared a dispatch with the previous node,
3626       // just assign the updated shared dispatch and we’re done!
3627       // Otherwise, copy-on-write.
3628       if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
3629
3630       schedule$$1.on = on1;
3631     };
3632   }
3633
3634   function transition_on(name, listener) {
3635     var id = this._id;
3636
3637     return arguments.length < 2
3638         ? get$1(this.node(), id).on.on(name)
3639         : this.each(onFunction(id, name, listener));
3640   }
3641
3642   function removeFunction(id) {
3643     return function() {
3644       var parent = this.parentNode;
3645       for (var i in this.__transition) if (+i !== id) return;
3646       if (parent) parent.removeChild(this);
3647     };
3648   }
3649
3650   function transition_remove() {
3651     return this.on("end.remove", removeFunction(this._id));
3652   }
3653
3654   function transition_select(select$$1) {
3655     var name = this._name,
3656         id = this._id;
3657
3658     if (typeof select$$1 !== "function") select$$1 = selector(select$$1);
3659
3660     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3661       for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
3662         if ((node = group[i]) && (subnode = select$$1.call(node, node.__data__, i, group))) {
3663           if ("__data__" in node) subnode.__data__ = node.__data__;
3664           subgroup[i] = subnode;
3665           schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
3666         }
3667       }
3668     }
3669
3670     return new Transition(subgroups, this._parents, name, id);
3671   }
3672
3673   function transition_selectAll(select$$1) {
3674     var name = this._name,
3675         id = this._id;
3676
3677     if (typeof select$$1 !== "function") select$$1 = selectorAll(select$$1);
3678
3679     for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
3680       for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3681         if (node = group[i]) {
3682           for (var children = select$$1.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
3683             if (child = children[k]) {
3684               schedule(child, name, id, k, children, inherit);
3685             }
3686           }
3687           subgroups.push(children);
3688           parents.push(node);
3689         }
3690       }
3691     }
3692
3693     return new Transition(subgroups, parents, name, id);
3694   }
3695
3696   var Selection$1 = selection.prototype.constructor;
3697
3698   function transition_selection() {
3699     return new Selection$1(this._groups, this._parents);
3700   }
3701
3702   function styleRemove$1(name, interpolate$$1) {
3703     var value00,
3704         value10,
3705         interpolate0;
3706     return function() {
3707       var value0 = styleValue(this, name),
3708           value1 = (this.style.removeProperty(name), styleValue(this, name));
3709       return value0 === value1 ? null
3710           : value0 === value00 && value1 === value10 ? interpolate0
3711           : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3712     };
3713   }
3714
3715   function styleRemoveEnd(name) {
3716     return function() {
3717       this.style.removeProperty(name);
3718     };
3719   }
3720
3721   function styleConstant$1(name, interpolate$$1, value1) {
3722     var value00,
3723         interpolate0;
3724     return function() {
3725       var value0 = styleValue(this, name);
3726       return value0 === value1 ? null
3727           : value0 === value00 ? interpolate0
3728           : interpolate0 = interpolate$$1(value00 = value0, value1);
3729     };
3730   }
3731
3732   function styleFunction$1(name, interpolate$$1, value) {
3733     var value00,
3734         value10,
3735         interpolate0;
3736     return function() {
3737       var value0 = styleValue(this, name),
3738           value1 = value(this);
3739       if (value1 == null) value1 = (this.style.removeProperty(name), styleValue(this, name));
3740       return value0 === value1 ? null
3741           : value0 === value00 && value1 === value10 ? interpolate0
3742           : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3743     };
3744   }
3745
3746   function transition_style(name, value, priority) {
3747     var i = (name += "") === "transform" ? interpolateTransformCss : interpolate$1;
3748     return value == null ? this
3749             .styleTween(name, styleRemove$1(name, i))
3750             .on("end.style." + name, styleRemoveEnd(name))
3751         : this.styleTween(name, typeof value === "function"
3752             ? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
3753             : styleConstant$1(name, i, value + ""), priority);
3754   }
3755
3756   function styleTween(name, value, priority) {
3757     function tween() {
3758       var node = this, i = value.apply(node, arguments);
3759       return i && function(t) {
3760         node.style.setProperty(name, i(t), priority);
3761       };
3762     }
3763     tween._value = value;
3764     return tween;
3765   }
3766
3767   function transition_styleTween(name, value, priority) {
3768     var key = "style." + (name += "");
3769     if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3770     if (value == null) return this.tween(key, null);
3771     if (typeof value !== "function") throw new Error;
3772     return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
3773   }
3774
3775   function textConstant$1(value) {
3776     return function() {
3777       this.textContent = value;
3778     };
3779   }
3780
3781   function textFunction$1(value) {
3782     return function() {
3783       var value1 = value(this);
3784       this.textContent = value1 == null ? "" : value1;
3785     };
3786   }
3787
3788   function transition_text(value) {
3789     return this.tween("text", typeof value === "function"
3790         ? textFunction$1(tweenValue(this, "text", value))
3791         : textConstant$1(value == null ? "" : value + ""));
3792   }
3793
3794   function transition_transition() {
3795     var name = this._name,
3796         id0 = this._id,
3797         id1 = newId();
3798
3799     for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
3800       for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3801         if (node = group[i]) {
3802           var inherit = get$1(node, id0);
3803           schedule(node, name, id1, i, group, {
3804             time: inherit.time + inherit.delay + inherit.duration,
3805             delay: 0,
3806             duration: inherit.duration,
3807             ease: inherit.ease
3808           });
3809         }
3810       }
3811     }
3812
3813     return new Transition(groups, this._parents, name, id1);
3814   }
3815
3816   var id = 0;
3817
3818   function Transition(groups, parents, name, id) {
3819     this._groups = groups;
3820     this._parents = parents;
3821     this._name = name;
3822     this._id = id;
3823   }
3824
3825   function transition(name) {
3826     return selection().transition(name);
3827   }
3828
3829   function newId() {
3830     return ++id;
3831   }
3832
3833   var selection_prototype = selection.prototype;
3834
3835   Transition.prototype = transition.prototype = {
3836     constructor: Transition,
3837     select: transition_select,
3838     selectAll: transition_selectAll,
3839     filter: transition_filter,
3840     merge: transition_merge,
3841     selection: transition_selection,
3842     transition: transition_transition,
3843     call: selection_prototype.call,
3844     nodes: selection_prototype.nodes,
3845     node: selection_prototype.node,
3846     size: selection_prototype.size,
3847     empty: selection_prototype.empty,
3848     each: selection_prototype.each,
3849     on: transition_on,
3850     attr: transition_attr,
3851     attrTween: transition_attrTween,
3852     style: transition_style,
3853     styleTween: transition_styleTween,
3854     text: transition_text,
3855     remove: transition_remove,
3856     tween: transition_tween,
3857     delay: transition_delay,
3858     duration: transition_duration,
3859     ease: transition_ease
3860   };
3861
3862   function linear$1(t) {
3863     return +t;
3864   }
3865
3866   function quadIn(t) {
3867     return t * t;
3868   }
3869
3870   function quadOut(t) {
3871     return t * (2 - t);
3872   }
3873
3874   function quadInOut(t) {
3875     return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
3876   }
3877
3878   function cubicIn(t) {
3879     return t * t * t;
3880   }
3881
3882   function cubicOut(t) {
3883     return --t * t * t + 1;
3884   }
3885
3886   function cubicInOut(t) {
3887     return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
3888   }
3889
3890   var exponent = 3;
3891
3892   var polyIn = (function custom(e) {
3893     e = +e;
3894
3895     function polyIn(t) {
3896       return Math.pow(t, e);
3897     }
3898
3899     polyIn.exponent = custom;
3900
3901     return polyIn;
3902   })(exponent);
3903
3904   var polyOut = (function custom(e) {
3905     e = +e;
3906
3907     function polyOut(t) {
3908       return 1 - Math.pow(1 - t, e);
3909     }
3910
3911     polyOut.exponent = custom;
3912
3913     return polyOut;
3914   })(exponent);
3915
3916   var polyInOut = (function custom(e) {
3917     e = +e;
3918
3919     function polyInOut(t) {
3920       return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
3921     }
3922
3923     polyInOut.exponent = custom;
3924
3925     return polyInOut;
3926   })(exponent);
3927
3928   var pi = Math.PI,
3929       halfPi = pi / 2;
3930
3931   function sinIn(t) {
3932     return 1 - Math.cos(t * halfPi);
3933   }
3934
3935   function sinOut(t) {
3936     return Math.sin(t * halfPi);
3937   }
3938
3939   function sinInOut(t) {
3940     return (1 - Math.cos(pi * t)) / 2;
3941   }
3942
3943   function expIn(t) {
3944     return Math.pow(2, 10 * t - 10);
3945   }
3946
3947   function expOut(t) {
3948     return 1 - Math.pow(2, -10 * t);
3949   }
3950
3951   function expInOut(t) {
3952     return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
3953   }
3954
3955   function circleIn(t) {
3956     return 1 - Math.sqrt(1 - t * t);
3957   }
3958
3959   function circleOut(t) {
3960     return Math.sqrt(1 - --t * t);
3961   }
3962
3963   function circleInOut(t) {
3964     return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
3965   }
3966
3967   var b1 = 4 / 11,
3968       b2 = 6 / 11,
3969       b3 = 8 / 11,
3970       b4 = 3 / 4,
3971       b5 = 9 / 11,
3972       b6 = 10 / 11,
3973       b7 = 15 / 16,
3974       b8 = 21 / 22,
3975       b9 = 63 / 64,
3976       b0 = 1 / b1 / b1;
3977
3978   function bounceIn(t) {
3979     return 1 - bounceOut(1 - t);
3980   }
3981
3982   function bounceOut(t) {
3983     return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;
3984   }
3985
3986   function bounceInOut(t) {
3987     return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
3988   }
3989
3990   var overshoot = 1.70158;
3991
3992   var backIn = (function custom(s) {
3993     s = +s;
3994
3995     function backIn(t) {
3996       return t * t * ((s + 1) * t - s);
3997     }
3998
3999     backIn.overshoot = custom;
4000
4001     return backIn;
4002   })(overshoot);
4003
4004   var backOut = (function custom(s) {
4005     s = +s;
4006
4007     function backOut(t) {
4008       return --t * t * ((s + 1) * t + s) + 1;
4009     }
4010
4011     backOut.overshoot = custom;
4012
4013     return backOut;
4014   })(overshoot);
4015
4016   var backInOut = (function custom(s) {
4017     s = +s;
4018
4019     function backInOut(t) {
4020       return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
4021     }
4022
4023     backInOut.overshoot = custom;
4024
4025     return backInOut;
4026   })(overshoot);
4027
4028   var tau = 2 * Math.PI,
4029       amplitude = 1,
4030       period = 0.3;
4031
4032   var elasticIn = (function custom(a, p) {
4033     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4034
4035     function elasticIn(t) {
4036       return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
4037     }
4038
4039     elasticIn.amplitude = function(a) { return custom(a, p * tau); };
4040     elasticIn.period = function(p) { return custom(a, p); };
4041
4042     return elasticIn;
4043   })(amplitude, period);
4044
4045   var elasticOut = (function custom(a, p) {
4046     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4047
4048     function elasticOut(t) {
4049       return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
4050     }
4051
4052     elasticOut.amplitude = function(a) { return custom(a, p * tau); };
4053     elasticOut.period = function(p) { return custom(a, p); };
4054
4055     return elasticOut;
4056   })(amplitude, period);
4057
4058   var elasticInOut = (function custom(a, p) {
4059     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4060
4061     function elasticInOut(t) {
4062       return ((t = t * 2 - 1) < 0
4063           ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
4064           : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
4065     }
4066
4067     elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
4068     elasticInOut.period = function(p) { return custom(a, p); };
4069
4070     return elasticInOut;
4071   })(amplitude, period);
4072
4073   var defaultTiming = {
4074     time: null, // Set on use.
4075     delay: 0,
4076     duration: 250,
4077     ease: cubicInOut
4078   };
4079
4080   function inherit(node, id) {
4081     var timing;
4082     while (!(timing = node.__transition) || !(timing = timing[id])) {
4083       if (!(node = node.parentNode)) {
4084         return defaultTiming.time = now(), defaultTiming;
4085       }
4086     }
4087     return timing;
4088   }
4089
4090   function selection_transition(name) {
4091     var id,
4092         timing;
4093
4094     if (name instanceof Transition) {
4095       id = name._id, name = name._name;
4096     } else {
4097       id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
4098     }
4099
4100     for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
4101       for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
4102         if (node = group[i]) {
4103           schedule(node, name, id, i, group, timing || inherit(node, id));
4104         }
4105       }
4106     }
4107
4108     return new Transition(groups, this._parents, name, id);
4109   }
4110
4111   selection.prototype.interrupt = selection_interrupt;
4112   selection.prototype.transition = selection_transition;
4113
4114   var root$1 = [null];
4115
4116   function active(node, name) {
4117     var schedules = node.__transition,
4118         schedule$$1,
4119         i;
4120
4121     if (schedules) {
4122       name = name == null ? null : name + "";
4123       for (i in schedules) {
4124         if ((schedule$$1 = schedules[i]).state > SCHEDULED && schedule$$1.name === name) {
4125           return new Transition([[node]], root$1, name, +i);
4126         }
4127       }
4128     }
4129
4130     return null;
4131   }
4132
4133   function constant$4(x) {
4134     return function() {
4135       return x;
4136     };
4137   }
4138
4139   function BrushEvent(target, type, selection) {
4140     this.target = target;
4141     this.type = type;
4142     this.selection = selection;
4143   }
4144
4145   function nopropagation$1() {
4146     event.stopImmediatePropagation();
4147   }
4148
4149   function noevent$1() {
4150     event.preventDefault();
4151     event.stopImmediatePropagation();
4152   }
4153
4154   var MODE_DRAG = {name: "drag"},
4155       MODE_SPACE = {name: "space"},
4156       MODE_HANDLE = {name: "handle"},
4157       MODE_CENTER = {name: "center"};
4158
4159   var X = {
4160     name: "x",
4161     handles: ["e", "w"].map(type),
4162     input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
4163     output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
4164   };
4165
4166   var Y = {
4167     name: "y",
4168     handles: ["n", "s"].map(type),
4169     input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
4170     output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
4171   };
4172
4173   var XY = {
4174     name: "xy",
4175     handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
4176     input: function(xy) { return xy; },
4177     output: function(xy) { return xy; }
4178   };
4179
4180   var cursors = {
4181     overlay: "crosshair",
4182     selection: "move",
4183     n: "ns-resize",
4184     e: "ew-resize",
4185     s: "ns-resize",
4186     w: "ew-resize",
4187     nw: "nwse-resize",
4188     ne: "nesw-resize",
4189     se: "nwse-resize",
4190     sw: "nesw-resize"
4191   };
4192
4193   var flipX = {
4194     e: "w",
4195     w: "e",
4196     nw: "ne",
4197     ne: "nw",
4198     se: "sw",
4199     sw: "se"
4200   };
4201
4202   var flipY = {
4203     n: "s",
4204     s: "n",
4205     nw: "sw",
4206     ne: "se",
4207     se: "ne",
4208     sw: "nw"
4209   };
4210
4211   var signsX = {
4212     overlay: +1,
4213     selection: +1,
4214     n: null,
4215     e: +1,
4216     s: null,
4217     w: -1,
4218     nw: -1,
4219     ne: +1,
4220     se: +1,
4221     sw: -1
4222   };
4223
4224   var signsY = {
4225     overlay: +1,
4226     selection: +1,
4227     n: -1,
4228     e: null,
4229     s: +1,
4230     w: null,
4231     nw: -1,
4232     ne: -1,
4233     se: +1,
4234     sw: +1
4235   };
4236
4237   function type(t) {
4238     return {type: t};
4239   }
4240
4241   // Ignore right-click, since that should open the context menu.
4242   function defaultFilter$1() {
4243     return !event.button;
4244   }
4245
4246   function defaultExtent() {
4247     var svg = this.ownerSVGElement || this;
4248     return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
4249   }
4250
4251   // Like d3.local, but with the name “__brush” rather than auto-generated.
4252   function local$1(node) {
4253     while (!node.__brush) if (!(node = node.parentNode)) return;
4254     return node.__brush;
4255   }
4256
4257   function empty$1(extent) {
4258     return extent[0][0] === extent[1][0]
4259         || extent[0][1] === extent[1][1];
4260   }
4261
4262   function brushSelection(node) {
4263     var state = node.__brush;
4264     return state ? state.dim.output(state.selection) : null;
4265   }
4266
4267   function brushX() {
4268     return brush$1(X);
4269   }
4270
4271   function brushY() {
4272     return brush$1(Y);
4273   }
4274
4275   function brush() {
4276     return brush$1(XY);
4277   }
4278
4279   function brush$1(dim) {
4280     var extent = defaultExtent,
4281         filter = defaultFilter$1,
4282         listeners = dispatch(brush, "start", "brush", "end"),
4283         handleSize = 6,
4284         touchending;
4285
4286     function brush(group) {
4287       var overlay = group
4288           .property("__brush", initialize)
4289         .selectAll(".overlay")
4290         .data([type("overlay")]);
4291
4292       overlay.enter().append("rect")
4293           .attr("class", "overlay")
4294           .attr("pointer-events", "all")
4295           .attr("cursor", cursors.overlay)
4296         .merge(overlay)
4297           .each(function() {
4298             var extent = local$1(this).extent;
4299             select(this)
4300                 .attr("x", extent[0][0])
4301                 .attr("y", extent[0][1])
4302                 .attr("width", extent[1][0] - extent[0][0])
4303                 .attr("height", extent[1][1] - extent[0][1]);
4304           });
4305
4306       group.selectAll(".selection")
4307         .data([type("selection")])
4308         .enter().append("rect")
4309           .attr("class", "selection")
4310           .attr("cursor", cursors.selection)
4311           .attr("fill", "#777")
4312           .attr("fill-opacity", 0.3)
4313           .attr("stroke", "#fff")
4314           .attr("shape-rendering", "crispEdges");
4315
4316       var handle = group.selectAll(".handle")
4317         .data(dim.handles, function(d) { return d.type; });
4318
4319       handle.exit().remove();
4320
4321       handle.enter().append("rect")
4322           .attr("class", function(d) { return "handle handle--" + d.type; })
4323           .attr("cursor", function(d) { return cursors[d.type]; });
4324
4325       group
4326           .each(redraw)
4327           .attr("fill", "none")
4328           .attr("pointer-events", "all")
4329           .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
4330           .on("mousedown.brush touchstart.brush", started);
4331     }
4332
4333     brush.move = function(group, selection$$1) {
4334       if (group.selection) {
4335         group
4336             .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
4337             .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
4338             .tween("brush", function() {
4339               var that = this,
4340                   state = that.__brush,
4341                   emit = emitter(that, arguments),
4342                   selection0 = state.selection,
4343                   selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(this, arguments) : selection$$1, state.extent),
4344                   i = interpolate(selection0, selection1);
4345
4346               function tween(t) {
4347                 state.selection = t === 1 && empty$1(selection1) ? null : i(t);
4348                 redraw.call(that);
4349                 emit.brush();
4350               }
4351
4352               return selection0 && selection1 ? tween : tween(1);
4353             });
4354       } else {
4355         group
4356             .each(function() {
4357               var that = this,
4358                   args = arguments,
4359                   state = that.__brush,
4360                   selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(that, args) : selection$$1, state.extent),
4361                   emit = emitter(that, args).beforestart();
4362
4363               interrupt(that);
4364               state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
4365               redraw.call(that);
4366               emit.start().brush().end();
4367             });
4368       }
4369     };
4370
4371     function redraw() {
4372       var group = select(this),
4373           selection$$1 = local$1(this).selection;
4374
4375       if (selection$$1) {
4376         group.selectAll(".selection")
4377             .style("display", null)
4378             .attr("x", selection$$1[0][0])
4379             .attr("y", selection$$1[0][1])
4380             .attr("width", selection$$1[1][0] - selection$$1[0][0])
4381             .attr("height", selection$$1[1][1] - selection$$1[0][1]);
4382
4383         group.selectAll(".handle")
4384             .style("display", null)
4385             .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection$$1[1][0] - handleSize / 2 : selection$$1[0][0] - handleSize / 2; })
4386             .attr("y", function(d) { return d.type[0] === "s" ? selection$$1[1][1] - handleSize / 2 : selection$$1[0][1] - handleSize / 2; })
4387             .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection$$1[1][0] - selection$$1[0][0] + handleSize : handleSize; })
4388             .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection$$1[1][1] - selection$$1[0][1] + handleSize : handleSize; });
4389       }
4390
4391       else {
4392         group.selectAll(".selection,.handle")
4393             .style("display", "none")
4394             .attr("x", null)
4395             .attr("y", null)
4396             .attr("width", null)
4397             .attr("height", null);
4398       }
4399     }
4400
4401     function emitter(that, args) {
4402       return that.__brush.emitter || new Emitter(that, args);
4403     }
4404
4405     function Emitter(that, args) {
4406       this.that = that;
4407       this.args = args;
4408       this.state = that.__brush;
4409       this.active = 0;
4410     }
4411
4412     Emitter.prototype = {
4413       beforestart: function() {
4414         if (++this.active === 1) this.state.emitter = this, this.starting = true;
4415         return this;
4416       },
4417       start: function() {
4418         if (this.starting) this.starting = false, this.emit("start");
4419         return this;
4420       },
4421       brush: function() {
4422         this.emit("brush");
4423         return this;
4424       },
4425       end: function() {
4426         if (--this.active === 0) delete this.state.emitter, this.emit("end");
4427         return this;
4428       },
4429       emit: function(type) {
4430         customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
4431       }
4432     };
4433
4434     function started() {
4435       if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
4436       else if (touchending) return;
4437       if (!filter.apply(this, arguments)) return;
4438
4439       var that = this,
4440           type = event.target.__data__.type,
4441           mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
4442           signX = dim === Y ? null : signsX[type],
4443           signY = dim === X ? null : signsY[type],
4444           state = local$1(that),
4445           extent = state.extent,
4446           selection$$1 = state.selection,
4447           W = extent[0][0], w0, w1,
4448           N = extent[0][1], n0, n1,
4449           E = extent[1][0], e0, e1,
4450           S = extent[1][1], s0, s1,
4451           dx,
4452           dy,
4453           moving,
4454           shifting = signX && signY && event.shiftKey,
4455           lockX,
4456           lockY,
4457           point0 = mouse(that),
4458           point$$1 = point0,
4459           emit = emitter(that, arguments).beforestart();
4460
4461       if (type === "overlay") {
4462         state.selection = selection$$1 = [
4463           [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
4464           [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
4465         ];
4466       } else {
4467         w0 = selection$$1[0][0];
4468         n0 = selection$$1[0][1];
4469         e0 = selection$$1[1][0];
4470         s0 = selection$$1[1][1];
4471       }
4472
4473       w1 = w0;
4474       n1 = n0;
4475       e1 = e0;
4476       s1 = s0;
4477
4478       var group = select(that)
4479           .attr("pointer-events", "none");
4480
4481       var overlay = group.selectAll(".overlay")
4482           .attr("cursor", cursors[type]);
4483
4484       if (event.touches) {
4485         group
4486             .on("touchmove.brush", moved, true)
4487             .on("touchend.brush touchcancel.brush", ended, true);
4488       } else {
4489         var view = select(event.view)
4490             .on("keydown.brush", keydowned, true)
4491             .on("keyup.brush", keyupped, true)
4492             .on("mousemove.brush", moved, true)
4493             .on("mouseup.brush", ended, true);
4494
4495         nodrag(event.view);
4496       }
4497
4498       nopropagation$1();
4499       interrupt(that);
4500       redraw.call(that);
4501       emit.start();
4502
4503       function moved() {
4504         var point1 = mouse(that);
4505         if (shifting && !lockX && !lockY) {
4506           if (Math.abs(point1[0] - point$$1[0]) > Math.abs(point1[1] - point$$1[1])) lockY = true;
4507           else lockX = true;
4508         }
4509         point$$1 = point1;
4510         moving = true;
4511         noevent$1();
4512         move();
4513       }
4514
4515       function move() {
4516         var t;
4517
4518         dx = point$$1[0] - point0[0];
4519         dy = point$$1[1] - point0[1];
4520
4521         switch (mode) {
4522           case MODE_SPACE:
4523           case MODE_DRAG: {
4524             if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
4525             if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
4526             break;
4527           }
4528           case MODE_HANDLE: {
4529             if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
4530             else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
4531             if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
4532             else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
4533             break;
4534           }
4535           case MODE_CENTER: {
4536             if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
4537             if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
4538             break;
4539           }
4540         }
4541
4542         if (e1 < w1) {
4543           signX *= -1;
4544           t = w0, w0 = e0, e0 = t;
4545           t = w1, w1 = e1, e1 = t;
4546           if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
4547         }
4548
4549         if (s1 < n1) {
4550           signY *= -1;
4551           t = n0, n0 = s0, s0 = t;
4552           t = n1, n1 = s1, s1 = t;
4553           if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
4554         }
4555
4556         if (state.selection) selection$$1 = state.selection; // May be set by brush.move!
4557         if (lockX) w1 = selection$$1[0][0], e1 = selection$$1[1][0];
4558         if (lockY) n1 = selection$$1[0][1], s1 = selection$$1[1][1];
4559
4560         if (selection$$1[0][0] !== w1
4561             || selection$$1[0][1] !== n1
4562             || selection$$1[1][0] !== e1
4563             || selection$$1[1][1] !== s1) {
4564           state.selection = [[w1, n1], [e1, s1]];
4565           redraw.call(that);
4566           emit.brush();
4567         }
4568       }
4569
4570       function ended() {
4571         nopropagation$1();
4572         if (event.touches) {
4573           if (event.touches.length) return;
4574           if (touchending) clearTimeout(touchending);
4575           touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
4576           group.on("touchmove.brush touchend.brush touchcancel.brush", null);
4577         } else {
4578           yesdrag(event.view, moving);
4579           view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
4580         }
4581         group.attr("pointer-events", "all");
4582         overlay.attr("cursor", cursors.overlay);
4583         if (state.selection) selection$$1 = state.selection; // May be set by brush.move (on start)!
4584         if (empty$1(selection$$1)) state.selection = null, redraw.call(that);
4585         emit.end();
4586       }
4587
4588       function keydowned() {
4589         switch (event.keyCode) {
4590           case 16: { // SHIFT
4591             shifting = signX && signY;
4592             break;
4593           }
4594           case 18: { // ALT
4595             if (mode === MODE_HANDLE) {
4596               if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4597               if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4598               mode = MODE_CENTER;
4599               move();
4600             }
4601             break;
4602           }
4603           case 32: { // SPACE; takes priority over ALT
4604             if (mode === MODE_HANDLE || mode === MODE_CENTER) {
4605               if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
4606               if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
4607               mode = MODE_SPACE;
4608               overlay.attr("cursor", cursors.selection);
4609               move();
4610             }
4611             break;
4612           }
4613           default: return;
4614         }
4615         noevent$1();
4616       }
4617
4618       function keyupped() {
4619         switch (event.keyCode) {
4620           case 16: { // SHIFT
4621             if (shifting) {
4622               lockX = lockY = shifting = false;
4623               move();
4624             }
4625             break;
4626           }
4627           case 18: { // ALT
4628             if (mode === MODE_CENTER) {
4629               if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4630               if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4631               mode = MODE_HANDLE;
4632               move();
4633             }
4634             break;
4635           }
4636           case 32: { // SPACE
4637             if (mode === MODE_SPACE) {
4638               if (event.altKey) {
4639                 if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4640                 if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4641                 mode = MODE_CENTER;
4642               } else {
4643                 if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4644                 if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4645                 mode = MODE_HANDLE;
4646               }
4647               overlay.attr("cursor", cursors[type]);
4648               move();
4649             }
4650             break;
4651           }
4652           default: return;
4653         }
4654         noevent$1();
4655       }
4656     }
4657
4658     function initialize() {
4659       var state = this.__brush || {selection: null};
4660       state.extent = extent.apply(this, arguments);
4661       state.dim = dim;
4662       return state;
4663     }
4664
4665     brush.extent = function(_) {
4666       return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
4667     };
4668
4669     brush.filter = function(_) {
4670       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
4671     };
4672
4673     brush.handleSize = function(_) {
4674       return arguments.length ? (handleSize = +_, brush) : handleSize;
4675     };
4676
4677     brush.on = function() {
4678       var value = listeners.on.apply(listeners, arguments);
4679       return value === listeners ? brush : value;
4680     };
4681
4682     return brush;
4683   }
4684
4685   var cos = Math.cos;
4686   var sin = Math.sin;
4687   var pi$1 = Math.PI;
4688   var halfPi$1 = pi$1 / 2;
4689   var tau$1 = pi$1 * 2;
4690   var max$1 = Math.max;
4691
4692   function compareValue(compare) {
4693     return function(a, b) {
4694       return compare(
4695         a.source.value + a.target.value,
4696         b.source.value + b.target.value
4697       );
4698     };
4699   }
4700
4701   function chord() {
4702     var padAngle = 0,
4703         sortGroups = null,
4704         sortSubgroups = null,
4705         sortChords = null;
4706
4707     function chord(matrix) {
4708       var n = matrix.length,
4709           groupSums = [],
4710           groupIndex = range(n),
4711           subgroupIndex = [],
4712           chords = [],
4713           groups = chords.groups = new Array(n),
4714           subgroups = new Array(n * n),
4715           k,
4716           x,
4717           x0,
4718           dx,
4719           i,
4720           j;
4721
4722       // Compute the sum.
4723       k = 0, i = -1; while (++i < n) {
4724         x = 0, j = -1; while (++j < n) {
4725           x += matrix[i][j];
4726         }
4727         groupSums.push(x);
4728         subgroupIndex.push(range(n));
4729         k += x;
4730       }
4731
4732       // Sort groups…
4733       if (sortGroups) groupIndex.sort(function(a, b) {
4734         return sortGroups(groupSums[a], groupSums[b]);
4735       });
4736
4737       // Sort subgroups…
4738       if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
4739         d.sort(function(a, b) {
4740           return sortSubgroups(matrix[i][a], matrix[i][b]);
4741         });
4742       });
4743
4744       // Convert the sum to scaling factor for [0, 2pi].
4745       // TODO Allow start and end angle to be specified?
4746       // TODO Allow padding to be specified as percentage?
4747       k = max$1(0, tau$1 - padAngle * n) / k;
4748       dx = k ? padAngle : tau$1 / n;
4749
4750       // Compute the start and end angle for each group and subgroup.
4751       // Note: Opera has a bug reordering object literal properties!
4752       x = 0, i = -1; while (++i < n) {
4753         x0 = x, j = -1; while (++j < n) {
4754           var di = groupIndex[i],
4755               dj = subgroupIndex[di][j],
4756               v = matrix[di][dj],
4757               a0 = x,
4758               a1 = x += v * k;
4759           subgroups[dj * n + di] = {
4760             index: di,
4761             subindex: dj,
4762             startAngle: a0,
4763             endAngle: a1,
4764             value: v
4765           };
4766         }
4767         groups[di] = {
4768           index: di,
4769           startAngle: x0,
4770           endAngle: x,
4771           value: groupSums[di]
4772         };
4773         x += dx;
4774       }
4775
4776       // Generate chords for each (non-empty) subgroup-subgroup link.
4777       i = -1; while (++i < n) {
4778         j = i - 1; while (++j < n) {
4779           var source = subgroups[j * n + i],
4780               target = subgroups[i * n + j];
4781           if (source.value || target.value) {
4782             chords.push(source.value < target.value
4783                 ? {source: target, target: source}
4784                 : {source: source, target: target});
4785           }
4786         }
4787       }
4788
4789       return sortChords ? chords.sort(sortChords) : chords;
4790     }
4791
4792     chord.padAngle = function(_) {
4793       return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle;
4794     };
4795
4796     chord.sortGroups = function(_) {
4797       return arguments.length ? (sortGroups = _, chord) : sortGroups;
4798     };
4799
4800     chord.sortSubgroups = function(_) {
4801       return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
4802     };
4803
4804     chord.sortChords = function(_) {
4805       return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
4806     };
4807
4808     return chord;
4809   }
4810
4811   var slice$2 = Array.prototype.slice;
4812
4813   function constant$5(x) {
4814     return function() {
4815       return x;
4816     };
4817   }
4818
4819   var pi$2 = Math.PI,
4820       tau$2 = 2 * pi$2,
4821       epsilon$1 = 1e-6,
4822       tauEpsilon = tau$2 - epsilon$1;
4823
4824   function Path() {
4825     this._x0 = this._y0 = // start of current subpath
4826     this._x1 = this._y1 = null; // end of current subpath
4827     this._ = "";
4828   }
4829
4830   function path() {
4831     return new Path;
4832   }
4833
4834   Path.prototype = path.prototype = {
4835     constructor: Path,
4836     moveTo: function(x, y) {
4837       this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
4838     },
4839     closePath: function() {
4840       if (this._x1 !== null) {
4841         this._x1 = this._x0, this._y1 = this._y0;
4842         this._ += "Z";
4843       }
4844     },
4845     lineTo: function(x, y) {
4846       this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
4847     },
4848     quadraticCurveTo: function(x1, y1, x, y) {
4849       this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4850     },
4851     bezierCurveTo: function(x1, y1, x2, y2, x, y) {
4852       this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4853     },
4854     arcTo: function(x1, y1, x2, y2, r) {
4855       x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
4856       var x0 = this._x1,
4857           y0 = this._y1,
4858           x21 = x2 - x1,
4859           y21 = y2 - y1,
4860           x01 = x0 - x1,
4861           y01 = y0 - y1,
4862           l01_2 = x01 * x01 + y01 * y01;
4863
4864       // Is the radius negative? Error.
4865       if (r < 0) throw new Error("negative radius: " + r);
4866
4867       // Is this path empty? Move to (x1,y1).
4868       if (this._x1 === null) {
4869         this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
4870       }
4871
4872       // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
4873       else if (!(l01_2 > epsilon$1)) ;
4874
4875       // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
4876       // Equivalently, is (x1,y1) coincident with (x2,y2)?
4877       // Or, is the radius zero? Line to (x1,y1).
4878       else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
4879         this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
4880       }
4881
4882       // Otherwise, draw an arc!
4883       else {
4884         var x20 = x2 - x0,
4885             y20 = y2 - y0,
4886             l21_2 = x21 * x21 + y21 * y21,
4887             l20_2 = x20 * x20 + y20 * y20,
4888             l21 = Math.sqrt(l21_2),
4889             l01 = Math.sqrt(l01_2),
4890             l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
4891             t01 = l / l01,
4892             t21 = l / l21;
4893
4894         // If the start tangent is not coincident with (x0,y0), line to.
4895         if (Math.abs(t01 - 1) > epsilon$1) {
4896           this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
4897         }
4898
4899         this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
4900       }
4901     },
4902     arc: function(x, y, r, a0, a1, ccw) {
4903       x = +x, y = +y, r = +r;
4904       var dx = r * Math.cos(a0),
4905           dy = r * Math.sin(a0),
4906           x0 = x + dx,
4907           y0 = y + dy,
4908           cw = 1 ^ ccw,
4909           da = ccw ? a0 - a1 : a1 - a0;
4910
4911       // Is the radius negative? Error.
4912       if (r < 0) throw new Error("negative radius: " + r);
4913
4914       // Is this path empty? Move to (x0,y0).
4915       if (this._x1 === null) {
4916         this._ += "M" + x0 + "," + y0;
4917       }
4918
4919       // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
4920       else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
4921         this._ += "L" + x0 + "," + y0;
4922       }
4923
4924       // Is this arc empty? We’re done.
4925       if (!r) return;
4926
4927       // Does the angle go the wrong way? Flip the direction.
4928       if (da < 0) da = da % tau$2 + tau$2;
4929
4930       // Is this a complete circle? Draw two arcs to complete the circle.
4931       if (da > tauEpsilon) {
4932         this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
4933       }
4934
4935       // Is this arc non-empty? Draw an arc!
4936       else if (da > epsilon$1) {
4937         this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
4938       }
4939     },
4940     rect: function(x, y, w, h) {
4941       this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
4942     },
4943     toString: function() {
4944       return this._;
4945     }
4946   };
4947
4948   function defaultSource(d) {
4949     return d.source;
4950   }
4951
4952   function defaultTarget(d) {
4953     return d.target;
4954   }
4955
4956   function defaultRadius(d) {
4957     return d.radius;
4958   }
4959
4960   function defaultStartAngle(d) {
4961     return d.startAngle;
4962   }
4963
4964   function defaultEndAngle(d) {
4965     return d.endAngle;
4966   }
4967
4968   function ribbon() {
4969     var source = defaultSource,
4970         target = defaultTarget,
4971         radius = defaultRadius,
4972         startAngle = defaultStartAngle,
4973         endAngle = defaultEndAngle,
4974         context = null;
4975
4976     function ribbon() {
4977       var buffer,
4978           argv = slice$2.call(arguments),
4979           s = source.apply(this, argv),
4980           t = target.apply(this, argv),
4981           sr = +radius.apply(this, (argv[0] = s, argv)),
4982           sa0 = startAngle.apply(this, argv) - halfPi$1,
4983           sa1 = endAngle.apply(this, argv) - halfPi$1,
4984           sx0 = sr * cos(sa0),
4985           sy0 = sr * sin(sa0),
4986           tr = +radius.apply(this, (argv[0] = t, argv)),
4987           ta0 = startAngle.apply(this, argv) - halfPi$1,
4988           ta1 = endAngle.apply(this, argv) - halfPi$1;
4989
4990       if (!context) context = buffer = path();
4991
4992       context.moveTo(sx0, sy0);
4993       context.arc(0, 0, sr, sa0, sa1);
4994       if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
4995         context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
4996         context.arc(0, 0, tr, ta0, ta1);
4997       }
4998       context.quadraticCurveTo(0, 0, sx0, sy0);
4999       context.closePath();
5000
5001       if (buffer) return context = null, buffer + "" || null;
5002     }
5003
5004     ribbon.radius = function(_) {
5005       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
5006     };
5007
5008     ribbon.startAngle = function(_) {
5009       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
5010     };
5011
5012     ribbon.endAngle = function(_) {
5013       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
5014     };
5015
5016     ribbon.source = function(_) {
5017       return arguments.length ? (source = _, ribbon) : source;
5018     };
5019
5020     ribbon.target = function(_) {
5021       return arguments.length ? (target = _, ribbon) : target;
5022     };
5023
5024     ribbon.context = function(_) {
5025       return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
5026     };
5027
5028     return ribbon;
5029   }
5030
5031   var prefix = "$";
5032
5033   function Map() {}
5034
5035   Map.prototype = map$1.prototype = {
5036     constructor: Map,
5037     has: function(key) {
5038       return (prefix + key) in this;
5039     },
5040     get: function(key) {
5041       return this[prefix + key];
5042     },
5043     set: function(key, value) {
5044       this[prefix + key] = value;
5045       return this;
5046     },
5047     remove: function(key) {
5048       var property = prefix + key;
5049       return property in this && delete this[property];
5050     },
5051     clear: function() {
5052       for (var property in this) if (property[0] === prefix) delete this[property];
5053     },
5054     keys: function() {
5055       var keys = [];
5056       for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
5057       return keys;
5058     },
5059     values: function() {
5060       var values = [];
5061       for (var property in this) if (property[0] === prefix) values.push(this[property]);
5062       return values;
5063     },
5064     entries: function() {
5065       var entries = [];
5066       for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
5067       return entries;
5068     },
5069     size: function() {
5070       var size = 0;
5071       for (var property in this) if (property[0] === prefix) ++size;
5072       return size;
5073     },
5074     empty: function() {
5075       for (var property in this) if (property[0] === prefix) return false;
5076       return true;
5077     },
5078     each: function(f) {
5079       for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
5080     }
5081   };
5082
5083   function map$1(object, f) {
5084     var map = new Map;
5085
5086     // Copy constructor.
5087     if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
5088
5089     // Index array by numeric index or specified key function.
5090     else if (Array.isArray(object)) {
5091       var i = -1,
5092           n = object.length,
5093           o;
5094
5095       if (f == null) while (++i < n) map.set(i, object[i]);
5096       else while (++i < n) map.set(f(o = object[i], i, object), o);
5097     }
5098
5099     // Convert object to map.
5100     else if (object) for (var key in object) map.set(key, object[key]);
5101
5102     return map;
5103   }
5104
5105   function nest() {
5106     var keys = [],
5107         sortKeys = [],
5108         sortValues,
5109         rollup,
5110         nest;
5111
5112     function apply(array, depth, createResult, setResult) {
5113       if (depth >= keys.length) {
5114         if (sortValues != null) array.sort(sortValues);
5115         return rollup != null ? rollup(array) : array;
5116       }
5117
5118       var i = -1,
5119           n = array.length,
5120           key = keys[depth++],
5121           keyValue,
5122           value,
5123           valuesByKey = map$1(),
5124           values,
5125           result = createResult();
5126
5127       while (++i < n) {
5128         if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
5129           values.push(value);
5130         } else {
5131           valuesByKey.set(keyValue, [value]);
5132         }
5133       }
5134
5135       valuesByKey.each(function(values, key) {
5136         setResult(result, key, apply(values, depth, createResult, setResult));
5137       });
5138
5139       return result;
5140     }
5141
5142     function entries(map, depth) {
5143       if (++depth > keys.length) return map;
5144       var array, sortKey = sortKeys[depth - 1];
5145       if (rollup != null && depth >= keys.length) array = map.entries();
5146       else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
5147       return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
5148     }
5149
5150     return nest = {
5151       object: function(array) { return apply(array, 0, createObject, setObject); },
5152       map: function(array) { return apply(array, 0, createMap, setMap); },
5153       entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
5154       key: function(d) { keys.push(d); return nest; },
5155       sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
5156       sortValues: function(order) { sortValues = order; return nest; },
5157       rollup: function(f) { rollup = f; return nest; }
5158     };
5159   }
5160
5161   function createObject() {
5162     return {};
5163   }
5164
5165   function setObject(object, key, value) {
5166     object[key] = value;
5167   }
5168
5169   function createMap() {
5170     return map$1();
5171   }
5172
5173   function setMap(map, key, value) {
5174     map.set(key, value);
5175   }
5176
5177   function Set() {}
5178
5179   var proto = map$1.prototype;
5180
5181   Set.prototype = set$2.prototype = {
5182     constructor: Set,
5183     has: proto.has,
5184     add: function(value) {
5185       value += "";
5186       this[prefix + value] = value;
5187       return this;
5188     },
5189     remove: proto.remove,
5190     clear: proto.clear,
5191     values: proto.keys,
5192     size: proto.size,
5193     empty: proto.empty,
5194     each: proto.each
5195   };
5196
5197   function set$2(object, f) {
5198     var set = new Set;
5199
5200     // Copy constructor.
5201     if (object instanceof Set) object.each(function(value) { set.add(value); });
5202
5203     // Otherwise, assume it’s an array.
5204     else if (object) {
5205       var i = -1, n = object.length;
5206       if (f == null) while (++i < n) set.add(object[i]);
5207       else while (++i < n) set.add(f(object[i], i, object));
5208     }
5209
5210     return set;
5211   }
5212
5213   function keys(map) {
5214     var keys = [];
5215     for (var key in map) keys.push(key);
5216     return keys;
5217   }
5218
5219   function values(map) {
5220     var values = [];
5221     for (var key in map) values.push(map[key]);
5222     return values;
5223   }
5224
5225   function entries(map) {
5226     var entries = [];
5227     for (var key in map) entries.push({key: key, value: map[key]});
5228     return entries;
5229   }
5230
5231   var EOL = {},
5232       EOF = {},
5233       QUOTE = 34,
5234       NEWLINE = 10,
5235       RETURN = 13;
5236
5237   function objectConverter(columns) {
5238     return new Function("d", "return {" + columns.map(function(name, i) {
5239       return JSON.stringify(name) + ": d[" + i + "]";
5240     }).join(",") + "}");
5241   }
5242
5243   function customConverter(columns, f) {
5244     var object = objectConverter(columns);
5245     return function(row, i) {
5246       return f(object(row), i, columns);
5247     };
5248   }
5249
5250   // Compute unique columns in order of discovery.
5251   function inferColumns(rows) {
5252     var columnSet = Object.create(null),
5253         columns = [];
5254
5255     rows.forEach(function(row) {
5256       for (var column in row) {
5257         if (!(column in columnSet)) {
5258           columns.push(columnSet[column] = column);
5259         }
5260       }
5261     });
5262
5263     return columns;
5264   }
5265
5266   function dsv(delimiter) {
5267     var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
5268         DELIMITER = delimiter.charCodeAt(0);
5269
5270     function parse(text, f) {
5271       var convert, columns, rows = parseRows(text, function(row, i) {
5272         if (convert) return convert(row, i - 1);
5273         columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
5274       });
5275       rows.columns = columns || [];
5276       return rows;
5277     }
5278
5279     function parseRows(text, f) {
5280       var rows = [], // output rows
5281           N = text.length,
5282           I = 0, // current character index
5283           n = 0, // current line number
5284           t, // current token
5285           eof = N <= 0, // current token followed by EOF?
5286           eol = false; // current token followed by EOL?
5287
5288       // Strip the trailing newline.
5289       if (text.charCodeAt(N - 1) === NEWLINE) --N;
5290       if (text.charCodeAt(N - 1) === RETURN) --N;
5291
5292       function token() {
5293         if (eof) return EOF;
5294         if (eol) return eol = false, EOL;
5295
5296         // Unescape quotes.
5297         var i, j = I, c;
5298         if (text.charCodeAt(j) === QUOTE) {
5299           while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
5300           if ((i = I) >= N) eof = true;
5301           else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
5302           else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5303           return text.slice(j + 1, i - 1).replace(/""/g, "\"");
5304         }
5305
5306         // Find next delimiter or newline.
5307         while (I < N) {
5308           if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
5309           else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5310           else if (c !== DELIMITER) continue;
5311           return text.slice(j, i);
5312         }
5313
5314         // Return last token before EOF.
5315         return eof = true, text.slice(j, N);
5316       }
5317
5318       while ((t = token()) !== EOF) {
5319         var row = [];
5320         while (t !== EOL && t !== EOF) row.push(t), t = token();
5321         if (f && (row = f(row, n++)) == null) continue;
5322         rows.push(row);
5323       }
5324
5325       return rows;
5326     }
5327
5328     function format(rows, columns) {
5329       if (columns == null) columns = inferColumns(rows);
5330       return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {
5331         return columns.map(function(column) {
5332           return formatValue(row[column]);
5333         }).join(delimiter);
5334       })).join("\n");
5335     }
5336
5337     function formatRows(rows) {
5338       return rows.map(formatRow).join("\n");
5339     }
5340
5341     function formatRow(row) {
5342       return row.map(formatValue).join(delimiter);
5343     }
5344
5345     function formatValue(text) {
5346       return text == null ? ""
5347           : reFormat.test(text += "") ? "\"" + text.replace(/"/g, "\"\"") + "\""
5348           : text;
5349     }
5350
5351     return {
5352       parse: parse,
5353       parseRows: parseRows,
5354       format: format,
5355       formatRows: formatRows
5356     };
5357   }
5358
5359   var csv = dsv(",");
5360
5361   var csvParse = csv.parse;
5362   var csvParseRows = csv.parseRows;
5363   var csvFormat = csv.format;
5364   var csvFormatRows = csv.formatRows;
5365
5366   var tsv = dsv("\t");
5367
5368   var tsvParse = tsv.parse;
5369   var tsvParseRows = tsv.parseRows;
5370   var tsvFormat = tsv.format;
5371   var tsvFormatRows = tsv.formatRows;
5372
5373   function center$1(x, y) {
5374     var nodes;
5375
5376     if (x == null) x = 0;
5377     if (y == null) y = 0;
5378
5379     function force() {
5380       var i,
5381           n = nodes.length,
5382           node,
5383           sx = 0,
5384           sy = 0;
5385
5386       for (i = 0; i < n; ++i) {
5387         node = nodes[i], sx += node.x, sy += node.y;
5388       }
5389
5390       for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
5391         node = nodes[i], node.x -= sx, node.y -= sy;
5392       }
5393     }
5394
5395     force.initialize = function(_) {
5396       nodes = _;
5397     };
5398
5399     force.x = function(_) {
5400       return arguments.length ? (x = +_, force) : x;
5401     };
5402
5403     force.y = function(_) {
5404       return arguments.length ? (y = +_, force) : y;
5405     };
5406
5407     return force;
5408   }
5409
5410   function constant$6(x) {
5411     return function() {
5412       return x;
5413     };
5414   }
5415
5416   function jiggle() {
5417     return (Math.random() - 0.5) * 1e-6;
5418   }
5419
5420   function tree_add(d) {
5421     var x = +this._x.call(null, d),
5422         y = +this._y.call(null, d);
5423     return add(this.cover(x, y), x, y, d);
5424   }
5425
5426   function add(tree, x, y, d) {
5427     if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
5428
5429     var parent,
5430         node = tree._root,
5431         leaf = {data: d},
5432         x0 = tree._x0,
5433         y0 = tree._y0,
5434         x1 = tree._x1,
5435         y1 = tree._y1,
5436         xm,
5437         ym,
5438         xp,
5439         yp,
5440         right,
5441         bottom,
5442         i,
5443         j;
5444
5445     // If the tree is empty, initialize the root as a leaf.
5446     if (!node) return tree._root = leaf, tree;
5447
5448     // Find the existing leaf for the new point, or add it.
5449     while (node.length) {
5450       if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5451       if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5452       if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
5453     }
5454
5455     // Is the new point is exactly coincident with the existing point?
5456     xp = +tree._x.call(null, node.data);
5457     yp = +tree._y.call(null, node.data);
5458     if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
5459
5460     // Otherwise, split the leaf node until the old and new point are separated.
5461     do {
5462       parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
5463       if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5464       if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5465     } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
5466     return parent[j] = node, parent[i] = leaf, tree;
5467   }
5468
5469   function addAll(data) {
5470     var d, i, n = data.length,
5471         x,
5472         y,
5473         xz = new Array(n),
5474         yz = new Array(n),
5475         x0 = Infinity,
5476         y0 = Infinity,
5477         x1 = -Infinity,
5478         y1 = -Infinity;
5479
5480     // Compute the points and their extent.
5481     for (i = 0; i < n; ++i) {
5482       if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
5483       xz[i] = x;
5484       yz[i] = y;
5485       if (x < x0) x0 = x;
5486       if (x > x1) x1 = x;
5487       if (y < y0) y0 = y;
5488       if (y > y1) y1 = y;
5489     }
5490
5491     // If there were no (valid) points, inherit the existing extent.
5492     if (x1 < x0) x0 = this._x0, x1 = this._x1;
5493     if (y1 < y0) y0 = this._y0, y1 = this._y1;
5494
5495     // Expand the tree to cover the new points.
5496     this.cover(x0, y0).cover(x1, y1);
5497
5498     // Add the new points.
5499     for (i = 0; i < n; ++i) {
5500       add(this, xz[i], yz[i], data[i]);
5501     }
5502
5503     return this;
5504   }
5505
5506   function tree_cover(x, y) {
5507     if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
5508
5509     var x0 = this._x0,
5510         y0 = this._y0,
5511         x1 = this._x1,
5512         y1 = this._y1;
5513
5514     // If the quadtree has no extent, initialize them.
5515     // Integer extent are necessary so that if we later double the extent,
5516     // the existing quadrant boundaries don’t change due to floating point error!
5517     if (isNaN(x0)) {
5518       x1 = (x0 = Math.floor(x)) + 1;
5519       y1 = (y0 = Math.floor(y)) + 1;
5520     }
5521
5522     // Otherwise, double repeatedly to cover.
5523     else if (x0 > x || x > x1 || y0 > y || y > y1) {
5524       var z = x1 - x0,
5525           node = this._root,
5526           parent,
5527           i;
5528
5529       switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
5530         case 0: {
5531           do parent = new Array(4), parent[i] = node, node = parent;
5532           while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
5533           break;
5534         }
5535         case 1: {
5536           do parent = new Array(4), parent[i] = node, node = parent;
5537           while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
5538           break;
5539         }
5540         case 2: {
5541           do parent = new Array(4), parent[i] = node, node = parent;
5542           while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
5543           break;
5544         }
5545         case 3: {
5546           do parent = new Array(4), parent[i] = node, node = parent;
5547           while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
5548           break;
5549         }
5550       }
5551
5552       if (this._root && this._root.length) this._root = node;
5553     }
5554
5555     // If the quadtree covers the point already, just return.
5556     else return this;
5557
5558     this._x0 = x0;
5559     this._y0 = y0;
5560     this._x1 = x1;
5561     this._y1 = y1;
5562     return this;
5563   }
5564
5565   function tree_data() {
5566     var data = [];
5567     this.visit(function(node) {
5568       if (!node.length) do data.push(node.data); while (node = node.next)
5569     });
5570     return data;
5571   }
5572
5573   function tree_extent(_) {
5574     return arguments.length
5575         ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
5576         : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
5577   }
5578
5579   function Quad(node, x0, y0, x1, y1) {
5580     this.node = node;
5581     this.x0 = x0;
5582     this.y0 = y0;
5583     this.x1 = x1;
5584     this.y1 = y1;
5585   }
5586
5587   function tree_find(x, y, radius) {
5588     var data,
5589         x0 = this._x0,
5590         y0 = this._y0,
5591         x1,
5592         y1,
5593         x2,
5594         y2,
5595         x3 = this._x1,
5596         y3 = this._y1,
5597         quads = [],
5598         node = this._root,
5599         q,
5600         i;
5601
5602     if (node) quads.push(new Quad(node, x0, y0, x3, y3));
5603     if (radius == null) radius = Infinity;
5604     else {
5605       x0 = x - radius, y0 = y - radius;
5606       x3 = x + radius, y3 = y + radius;
5607       radius *= radius;
5608     }
5609
5610     while (q = quads.pop()) {
5611
5612       // Stop searching if this quadrant can’t contain a closer node.
5613       if (!(node = q.node)
5614           || (x1 = q.x0) > x3
5615           || (y1 = q.y0) > y3
5616           || (x2 = q.x1) < x0
5617           || (y2 = q.y1) < y0) continue;
5618
5619       // Bisect the current quadrant.
5620       if (node.length) {
5621         var xm = (x1 + x2) / 2,
5622             ym = (y1 + y2) / 2;
5623
5624         quads.push(
5625           new Quad(node[3], xm, ym, x2, y2),
5626           new Quad(node[2], x1, ym, xm, y2),
5627           new Quad(node[1], xm, y1, x2, ym),
5628           new Quad(node[0], x1, y1, xm, ym)
5629         );
5630
5631         // Visit the closest quadrant first.
5632         if (i = (y >= ym) << 1 | (x >= xm)) {
5633           q = quads[quads.length - 1];
5634           quads[quads.length - 1] = quads[quads.length - 1 - i];
5635           quads[quads.length - 1 - i] = q;
5636         }
5637       }
5638
5639       // Visit this point. (Visiting coincident points isn’t necessary!)
5640       else {
5641         var dx = x - +this._x.call(null, node.data),
5642             dy = y - +this._y.call(null, node.data),
5643             d2 = dx * dx + dy * dy;
5644         if (d2 < radius) {
5645           var d = Math.sqrt(radius = d2);
5646           x0 = x - d, y0 = y - d;
5647           x3 = x + d, y3 = y + d;
5648           data = node.data;
5649         }
5650       }
5651     }
5652
5653     return data;
5654   }
5655
5656   function tree_remove(d) {
5657     if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
5658
5659     var parent,
5660         node = this._root,
5661         retainer,
5662         previous,
5663         next,
5664         x0 = this._x0,
5665         y0 = this._y0,
5666         x1 = this._x1,
5667         y1 = this._y1,
5668         x,
5669         y,
5670         xm,
5671         ym,
5672         right,
5673         bottom,
5674         i,
5675         j;
5676
5677     // If the tree is empty, initialize the root as a leaf.
5678     if (!node) return this;
5679
5680     // Find the leaf node for the point.
5681     // While descending, also retain the deepest parent with a non-removed sibling.
5682     if (node.length) while (true) {
5683       if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5684       if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5685       if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
5686       if (!node.length) break;
5687       if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
5688     }
5689
5690     // Find the point to remove.
5691     while (node.data !== d) if (!(previous = node, node = node.next)) return this;
5692     if (next = node.next) delete node.next;
5693
5694     // If there are multiple coincident points, remove just the point.
5695     if (previous) return (next ? previous.next = next : delete previous.next), this;
5696
5697     // If this is the root point, remove it.
5698     if (!parent) return this._root = next, this;
5699
5700     // Remove this leaf.
5701     next ? parent[i] = next : delete parent[i];
5702
5703     // If the parent now contains exactly one leaf, collapse superfluous parents.
5704     if ((node = parent[0] || parent[1] || parent[2] || parent[3])
5705         && node === (parent[3] || parent[2] || parent[1] || parent[0])
5706         && !node.length) {
5707       if (retainer) retainer[j] = node;
5708       else this._root = node;
5709     }
5710
5711     return this;
5712   }
5713
5714   function removeAll(data) {
5715     for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
5716     return this;
5717   }
5718
5719   function tree_root() {
5720     return this._root;
5721   }
5722
5723   function tree_size() {
5724     var size = 0;
5725     this.visit(function(node) {
5726       if (!node.length) do ++size; while (node = node.next)
5727     });
5728     return size;
5729   }
5730
5731   function tree_visit(callback) {
5732     var quads = [], q, node = this._root, child, x0, y0, x1, y1;
5733     if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
5734     while (q = quads.pop()) {
5735       if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
5736         var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5737         if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5738         if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5739         if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5740         if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5741       }
5742     }
5743     return this;
5744   }
5745
5746   function tree_visitAfter(callback) {
5747     var quads = [], next = [], q;
5748     if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
5749     while (q = quads.pop()) {
5750       var node = q.node;
5751       if (node.length) {
5752         var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5753         if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5754         if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5755         if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5756         if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5757       }
5758       next.push(q);
5759     }
5760     while (q = next.pop()) {
5761       callback(q.node, q.x0, q.y0, q.x1, q.y1);
5762     }
5763     return this;
5764   }
5765
5766   function defaultX(d) {
5767     return d[0];
5768   }
5769
5770   function tree_x(_) {
5771     return arguments.length ? (this._x = _, this) : this._x;
5772   }
5773
5774   function defaultY(d) {
5775     return d[1];
5776   }
5777
5778   function tree_y(_) {
5779     return arguments.length ? (this._y = _, this) : this._y;
5780   }
5781
5782   function quadtree(nodes, x, y) {
5783     var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
5784     return nodes == null ? tree : tree.addAll(nodes);
5785   }
5786
5787   function Quadtree(x, y, x0, y0, x1, y1) {
5788     this._x = x;
5789     this._y = y;
5790     this._x0 = x0;
5791     this._y0 = y0;
5792     this._x1 = x1;
5793     this._y1 = y1;
5794     this._root = undefined;
5795   }
5796
5797   function leaf_copy(leaf) {
5798     var copy = {data: leaf.data}, next = copy;
5799     while (leaf = leaf.next) next = next.next = {data: leaf.data};
5800     return copy;
5801   }
5802
5803   var treeProto = quadtree.prototype = Quadtree.prototype;
5804
5805   treeProto.copy = function() {
5806     var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
5807         node = this._root,
5808         nodes,
5809         child;
5810
5811     if (!node) return copy;
5812
5813     if (!node.length) return copy._root = leaf_copy(node), copy;
5814
5815     nodes = [{source: node, target: copy._root = new Array(4)}];
5816     while (node = nodes.pop()) {
5817       for (var i = 0; i < 4; ++i) {
5818         if (child = node.source[i]) {
5819           if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
5820           else node.target[i] = leaf_copy(child);
5821         }
5822       }
5823     }
5824
5825     return copy;
5826   };
5827
5828   treeProto.add = tree_add;
5829   treeProto.addAll = addAll;
5830   treeProto.cover = tree_cover;
5831   treeProto.data = tree_data;
5832   treeProto.extent = tree_extent;
5833   treeProto.find = tree_find;
5834   treeProto.remove = tree_remove;
5835   treeProto.removeAll = removeAll;
5836   treeProto.root = tree_root;
5837   treeProto.size = tree_size;
5838   treeProto.visit = tree_visit;
5839   treeProto.visitAfter = tree_visitAfter;
5840   treeProto.x = tree_x;
5841   treeProto.y = tree_y;
5842
5843   function x(d) {
5844     return d.x + d.vx;
5845   }
5846
5847   function y(d) {
5848     return d.y + d.vy;
5849   }
5850
5851   function collide(radius) {
5852     var nodes,
5853         radii,
5854         strength = 1,
5855         iterations = 1;
5856
5857     if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
5858
5859     function force() {
5860       var i, n = nodes.length,
5861           tree,
5862           node,
5863           xi,
5864           yi,
5865           ri,
5866           ri2;
5867
5868       for (var k = 0; k < iterations; ++k) {
5869         tree = quadtree(nodes, x, y).visitAfter(prepare);
5870         for (i = 0; i < n; ++i) {
5871           node = nodes[i];
5872           ri = radii[node.index], ri2 = ri * ri;
5873           xi = node.x + node.vx;
5874           yi = node.y + node.vy;
5875           tree.visit(apply);
5876         }
5877       }
5878
5879       function apply(quad, x0, y0, x1, y1) {
5880         var data = quad.data, rj = quad.r, r = ri + rj;
5881         if (data) {
5882           if (data.index > node.index) {
5883             var x = xi - data.x - data.vx,
5884                 y = yi - data.y - data.vy,
5885                 l = x * x + y * y;
5886             if (l < r * r) {
5887               if (x === 0) x = jiggle(), l += x * x;
5888               if (y === 0) y = jiggle(), l += y * y;
5889               l = (r - (l = Math.sqrt(l))) / l * strength;
5890               node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
5891               node.vy += (y *= l) * r;
5892               data.vx -= x * (r = 1 - r);
5893               data.vy -= y * r;
5894             }
5895           }
5896           return;
5897         }
5898         return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
5899       }
5900     }
5901
5902     function prepare(quad) {
5903       if (quad.data) return quad.r = radii[quad.data.index];
5904       for (var i = quad.r = 0; i < 4; ++i) {
5905         if (quad[i] && quad[i].r > quad.r) {
5906           quad.r = quad[i].r;
5907         }
5908       }
5909     }
5910
5911     function initialize() {
5912       if (!nodes) return;
5913       var i, n = nodes.length, node;
5914       radii = new Array(n);
5915       for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
5916     }
5917
5918     force.initialize = function(_) {
5919       nodes = _;
5920       initialize();
5921     };
5922
5923     force.iterations = function(_) {
5924       return arguments.length ? (iterations = +_, force) : iterations;
5925     };
5926
5927     force.strength = function(_) {
5928       return arguments.length ? (strength = +_, force) : strength;
5929     };
5930
5931     force.radius = function(_) {
5932       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
5933     };
5934
5935     return force;
5936   }
5937
5938   function index(d) {
5939     return d.index;
5940   }
5941
5942   function find(nodeById, nodeId) {
5943     var node = nodeById.get(nodeId);
5944     if (!node) throw new Error("missing: " + nodeId);
5945     return node;
5946   }
5947
5948   function link(links) {
5949     var id = index,
5950         strength = defaultStrength,
5951         strengths,
5952         distance = constant$6(30),
5953         distances,
5954         nodes,
5955         count,
5956         bias,
5957         iterations = 1;
5958
5959     if (links == null) links = [];
5960
5961     function defaultStrength(link) {
5962       return 1 / Math.min(count[link.source.index], count[link.target.index]);
5963     }
5964
5965     function force(alpha) {
5966       for (var k = 0, n = links.length; k < iterations; ++k) {
5967         for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
5968           link = links[i], source = link.source, target = link.target;
5969           x = target.x + target.vx - source.x - source.vx || jiggle();
5970           y = target.y + target.vy - source.y - source.vy || jiggle();
5971           l = Math.sqrt(x * x + y * y);
5972           l = (l - distances[i]) / l * alpha * strengths[i];
5973           x *= l, y *= l;
5974           target.vx -= x * (b = bias[i]);
5975           target.vy -= y * b;
5976           source.vx += x * (b = 1 - b);
5977           source.vy += y * b;
5978         }
5979       }
5980     }
5981
5982     function initialize() {
5983       if (!nodes) return;
5984
5985       var i,
5986           n = nodes.length,
5987           m = links.length,
5988           nodeById = map$1(nodes, id),
5989           link;
5990
5991       for (i = 0, count = new Array(n); i < m; ++i) {
5992         link = links[i], link.index = i;
5993         if (typeof link.source !== "object") link.source = find(nodeById, link.source);
5994         if (typeof link.target !== "object") link.target = find(nodeById, link.target);
5995         count[link.source.index] = (count[link.source.index] || 0) + 1;
5996         count[link.target.index] = (count[link.target.index] || 0) + 1;
5997       }
5998
5999       for (i = 0, bias = new Array(m); i < m; ++i) {
6000         link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
6001       }
6002
6003       strengths = new Array(m), initializeStrength();
6004       distances = new Array(m), initializeDistance();
6005     }
6006
6007     function initializeStrength() {
6008       if (!nodes) return;
6009
6010       for (var i = 0, n = links.length; i < n; ++i) {
6011         strengths[i] = +strength(links[i], i, links);
6012       }
6013     }
6014
6015     function initializeDistance() {
6016       if (!nodes) return;
6017
6018       for (var i = 0, n = links.length; i < n; ++i) {
6019         distances[i] = +distance(links[i], i, links);
6020       }
6021     }
6022
6023     force.initialize = function(_) {
6024       nodes = _;
6025       initialize();
6026     };
6027
6028     force.links = function(_) {
6029       return arguments.length ? (links = _, initialize(), force) : links;
6030     };
6031
6032     force.id = function(_) {
6033       return arguments.length ? (id = _, force) : id;
6034     };
6035
6036     force.iterations = function(_) {
6037       return arguments.length ? (iterations = +_, force) : iterations;
6038     };
6039
6040     force.strength = function(_) {
6041       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
6042     };
6043
6044     force.distance = function(_) {
6045       return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
6046     };
6047
6048     return force;
6049   }
6050
6051   function x$1(d) {
6052     return d.x;
6053   }
6054
6055   function y$1(d) {
6056     return d.y;
6057   }
6058
6059   var initialRadius = 10,
6060       initialAngle = Math.PI * (3 - Math.sqrt(5));
6061
6062   function simulation(nodes) {
6063     var simulation,
6064         alpha = 1,
6065         alphaMin = 0.001,
6066         alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
6067         alphaTarget = 0,
6068         velocityDecay = 0.6,
6069         forces = map$1(),
6070         stepper = timer(step),
6071         event = dispatch("tick", "end");
6072
6073     if (nodes == null) nodes = [];
6074
6075     function step() {
6076       tick();
6077       event.call("tick", simulation);
6078       if (alpha < alphaMin) {
6079         stepper.stop();
6080         event.call("end", simulation);
6081       }
6082     }
6083
6084     function tick() {
6085       var i, n = nodes.length, node;
6086
6087       alpha += (alphaTarget - alpha) * alphaDecay;
6088
6089       forces.each(function(force) {
6090         force(alpha);
6091       });
6092
6093       for (i = 0; i < n; ++i) {
6094         node = nodes[i];
6095         if (node.fx == null) node.x += node.vx *= velocityDecay;
6096         else node.x = node.fx, node.vx = 0;
6097         if (node.fy == null) node.y += node.vy *= velocityDecay;
6098         else node.y = node.fy, node.vy = 0;
6099       }
6100     }
6101
6102     function initializeNodes() {
6103       for (var i = 0, n = nodes.length, node; i < n; ++i) {
6104         node = nodes[i], node.index = i;
6105         if (isNaN(node.x) || isNaN(node.y)) {
6106           var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
6107           node.x = radius * Math.cos(angle);
6108           node.y = radius * Math.sin(angle);
6109         }
6110         if (isNaN(node.vx) || isNaN(node.vy)) {
6111           node.vx = node.vy = 0;
6112         }
6113       }
6114     }
6115
6116     function initializeForce(force) {
6117       if (force.initialize) force.initialize(nodes);
6118       return force;
6119     }
6120
6121     initializeNodes();
6122
6123     return simulation = {
6124       tick: tick,
6125
6126       restart: function() {
6127         return stepper.restart(step), simulation;
6128       },
6129
6130       stop: function() {
6131         return stepper.stop(), simulation;
6132       },
6133
6134       nodes: function(_) {
6135         return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
6136       },
6137
6138       alpha: function(_) {
6139         return arguments.length ? (alpha = +_, simulation) : alpha;
6140       },
6141
6142       alphaMin: function(_) {
6143         return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
6144       },
6145
6146       alphaDecay: function(_) {
6147         return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
6148       },
6149
6150       alphaTarget: function(_) {
6151         return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
6152       },
6153
6154       velocityDecay: function(_) {
6155         return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
6156       },
6157
6158       force: function(name, _) {
6159         return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
6160       },
6161
6162       find: function(x, y, radius) {
6163         var i = 0,
6164             n = nodes.length,
6165             dx,
6166             dy,
6167             d2,
6168             node,
6169             closest;
6170
6171         if (radius == null) radius = Infinity;
6172         else radius *= radius;
6173
6174         for (i = 0; i < n; ++i) {
6175           node = nodes[i];
6176           dx = x - node.x;
6177           dy = y - node.y;
6178           d2 = dx * dx + dy * dy;
6179           if (d2 < radius) closest = node, radius = d2;
6180         }
6181
6182         return closest;
6183       },
6184
6185       on: function(name, _) {
6186         return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
6187       }
6188     };
6189   }
6190
6191   function manyBody() {
6192     var nodes,
6193         node,
6194         alpha,
6195         strength = constant$6(-30),
6196         strengths,
6197         distanceMin2 = 1,
6198         distanceMax2 = Infinity,
6199         theta2 = 0.81;
6200
6201     function force(_) {
6202       var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
6203       for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
6204     }
6205
6206     function initialize() {
6207       if (!nodes) return;
6208       var i, n = nodes.length, node;
6209       strengths = new Array(n);
6210       for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
6211     }
6212
6213     function accumulate(quad) {
6214       var strength = 0, q, c, weight = 0, x, y, i;
6215
6216       // For internal nodes, accumulate forces from child quadrants.
6217       if (quad.length) {
6218         for (x = y = i = 0; i < 4; ++i) {
6219           if ((q = quad[i]) && (c = Math.abs(q.value))) {
6220             strength += q.value, weight += c, x += c * q.x, y += c * q.y;
6221           }
6222         }
6223         quad.x = x / weight;
6224         quad.y = y / weight;
6225       }
6226
6227       // For leaf nodes, accumulate forces from coincident quadrants.
6228       else {
6229         q = quad;
6230         q.x = q.data.x;
6231         q.y = q.data.y;
6232         do strength += strengths[q.data.index];
6233         while (q = q.next);
6234       }
6235
6236       quad.value = strength;
6237     }
6238
6239     function apply(quad, x1, _, x2) {
6240       if (!quad.value) return true;
6241
6242       var x = quad.x - node.x,
6243           y = quad.y - node.y,
6244           w = x2 - x1,
6245           l = x * x + y * y;
6246
6247       // Apply the Barnes-Hut approximation if possible.
6248       // Limit forces for very close nodes; randomize direction if coincident.
6249       if (w * w / theta2 < l) {
6250         if (l < distanceMax2) {
6251           if (x === 0) x = jiggle(), l += x * x;
6252           if (y === 0) y = jiggle(), l += y * y;
6253           if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6254           node.vx += x * quad.value * alpha / l;
6255           node.vy += y * quad.value * alpha / l;
6256         }
6257         return true;
6258       }
6259
6260       // Otherwise, process points directly.
6261       else if (quad.length || l >= distanceMax2) return;
6262
6263       // Limit forces for very close nodes; randomize direction if coincident.
6264       if (quad.data !== node || quad.next) {
6265         if (x === 0) x = jiggle(), l += x * x;
6266         if (y === 0) y = jiggle(), l += y * y;
6267         if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6268       }
6269
6270       do if (quad.data !== node) {
6271         w = strengths[quad.data.index] * alpha / l;
6272         node.vx += x * w;
6273         node.vy += y * w;
6274       } while (quad = quad.next);
6275     }
6276
6277     force.initialize = function(_) {
6278       nodes = _;
6279       initialize();
6280     };
6281
6282     force.strength = function(_) {
6283       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6284     };
6285
6286     force.distanceMin = function(_) {
6287       return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
6288     };
6289
6290     force.distanceMax = function(_) {
6291       return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
6292     };
6293
6294     force.theta = function(_) {
6295       return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
6296     };
6297
6298     return force;
6299   }
6300
6301   function radial(radius, x, y) {
6302     var nodes,
6303         strength = constant$6(0.1),
6304         strengths,
6305         radiuses;
6306
6307     if (typeof radius !== "function") radius = constant$6(+radius);
6308     if (x == null) x = 0;
6309     if (y == null) y = 0;
6310
6311     function force(alpha) {
6312       for (var i = 0, n = nodes.length; i < n; ++i) {
6313         var node = nodes[i],
6314             dx = node.x - x || 1e-6,
6315             dy = node.y - y || 1e-6,
6316             r = Math.sqrt(dx * dx + dy * dy),
6317             k = (radiuses[i] - r) * strengths[i] * alpha / r;
6318         node.vx += dx * k;
6319         node.vy += dy * k;
6320       }
6321     }
6322
6323     function initialize() {
6324       if (!nodes) return;
6325       var i, n = nodes.length;
6326       strengths = new Array(n);
6327       radiuses = new Array(n);
6328       for (i = 0; i < n; ++i) {
6329         radiuses[i] = +radius(nodes[i], i, nodes);
6330         strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
6331       }
6332     }
6333
6334     force.initialize = function(_) {
6335       nodes = _, initialize();
6336     };
6337
6338     force.strength = function(_) {
6339       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6340     };
6341
6342     force.radius = function(_) {
6343       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
6344     };
6345
6346     force.x = function(_) {
6347       return arguments.length ? (x = +_, force) : x;
6348     };
6349
6350     force.y = function(_) {
6351       return arguments.length ? (y = +_, force) : y;
6352     };
6353
6354     return force;
6355   }
6356
6357   function x$2(x) {
6358     var strength = constant$6(0.1),
6359         nodes,
6360         strengths,
6361         xz;
6362
6363     if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
6364
6365     function force(alpha) {
6366       for (var i = 0, n = nodes.length, node; i < n; ++i) {
6367         node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
6368       }
6369     }
6370
6371     function initialize() {
6372       if (!nodes) return;
6373       var i, n = nodes.length;
6374       strengths = new Array(n);
6375       xz = new Array(n);
6376       for (i = 0; i < n; ++i) {
6377         strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6378       }
6379     }
6380
6381     force.initialize = function(_) {
6382       nodes = _;
6383       initialize();
6384     };
6385
6386     force.strength = function(_) {
6387       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6388     };
6389
6390     force.x = function(_) {
6391       return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
6392     };
6393
6394     return force;
6395   }
6396
6397   function y$2(y) {
6398     var strength = constant$6(0.1),
6399         nodes,
6400         strengths,
6401         yz;
6402
6403     if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
6404
6405     function force(alpha) {
6406       for (var i = 0, n = nodes.length, node; i < n; ++i) {
6407         node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
6408       }
6409     }
6410
6411     function initialize() {
6412       if (!nodes) return;
6413       var i, n = nodes.length;
6414       strengths = new Array(n);
6415       yz = new Array(n);
6416       for (i = 0; i < n; ++i) {
6417         strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6418       }
6419     }
6420
6421     force.initialize = function(_) {
6422       nodes = _;
6423       initialize();
6424     };
6425
6426     force.strength = function(_) {
6427       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6428     };
6429
6430     force.y = function(_) {
6431       return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
6432     };
6433
6434     return force;
6435   }
6436
6437   // Computes the decimal coefficient and exponent of the specified number x with
6438   // significant digits p, where x is positive and p is in [1, 21] or undefined.
6439   // For example, formatDecimal(1.23) returns ["123", 0].
6440   function formatDecimal(x, p) {
6441     if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
6442     var i, coefficient = x.slice(0, i);
6443
6444     // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
6445     // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
6446     return [
6447       coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
6448       +x.slice(i + 1)
6449     ];
6450   }
6451
6452   function exponent$1(x) {
6453     return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
6454   }
6455
6456   function formatGroup(grouping, thousands) {
6457     return function(value, width) {
6458       var i = value.length,
6459           t = [],
6460           j = 0,
6461           g = grouping[0],
6462           length = 0;
6463
6464       while (i > 0 && g > 0) {
6465         if (length + g + 1 > width) g = Math.max(1, width - length);
6466         t.push(value.substring(i -= g, i + g));
6467         if ((length += g + 1) > width) break;
6468         g = grouping[j = (j + 1) % grouping.length];
6469       }
6470
6471       return t.reverse().join(thousands);
6472     };
6473   }
6474
6475   function formatNumerals(numerals) {
6476     return function(value) {
6477       return value.replace(/[0-9]/g, function(i) {
6478         return numerals[+i];
6479       });
6480     };
6481   }
6482
6483   function formatDefault(x, p) {
6484     x = x.toPrecision(p);
6485
6486     out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
6487       switch (x[i]) {
6488         case ".": i0 = i1 = i; break;
6489         case "0": if (i0 === 0) i0 = i; i1 = i; break;
6490         case "e": break out;
6491         default: if (i0 > 0) i0 = 0; break;
6492       }
6493     }
6494
6495     return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
6496   }
6497
6498   var prefixExponent;
6499
6500   function formatPrefixAuto(x, p) {
6501     var d = formatDecimal(x, p);
6502     if (!d) return x + "";
6503     var coefficient = d[0],
6504         exponent = d[1],
6505         i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
6506         n = coefficient.length;
6507     return i === n ? coefficient
6508         : i > n ? coefficient + new Array(i - n + 1).join("0")
6509         : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
6510         : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
6511   }
6512
6513   function formatRounded(x, p) {
6514     var d = formatDecimal(x, p);
6515     if (!d) return x + "";
6516     var coefficient = d[0],
6517         exponent = d[1];
6518     return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
6519         : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
6520         : coefficient + new Array(exponent - coefficient.length + 2).join("0");
6521   }
6522
6523   var formatTypes = {
6524     "": formatDefault,
6525     "%": function(x, p) { return (x * 100).toFixed(p); },
6526     "b": function(x) { return Math.round(x).toString(2); },
6527     "c": function(x) { return x + ""; },
6528     "d": function(x) { return Math.round(x).toString(10); },
6529     "e": function(x, p) { return x.toExponential(p); },
6530     "f": function(x, p) { return x.toFixed(p); },
6531     "g": function(x, p) { return x.toPrecision(p); },
6532     "o": function(x) { return Math.round(x).toString(8); },
6533     "p": function(x, p) { return formatRounded(x * 100, p); },
6534     "r": formatRounded,
6535     "s": formatPrefixAuto,
6536     "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
6537     "x": function(x) { return Math.round(x).toString(16); }
6538   };
6539
6540   // [[fill]align][sign][symbol][0][width][,][.precision][type]
6541   var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
6542
6543   function formatSpecifier(specifier) {
6544     return new FormatSpecifier(specifier);
6545   }
6546
6547   formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
6548
6549   function FormatSpecifier(specifier) {
6550     if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
6551
6552     var match,
6553         fill = match[1] || " ",
6554         align = match[2] || ">",
6555         sign = match[3] || "-",
6556         symbol = match[4] || "",
6557         zero = !!match[5],
6558         width = match[6] && +match[6],
6559         comma = !!match[7],
6560         precision = match[8] && +match[8].slice(1),
6561         type = match[9] || "";
6562
6563     // The "n" type is an alias for ",g".
6564     if (type === "n") comma = true, type = "g";
6565
6566     // Map invalid types to the default format.
6567     else if (!formatTypes[type]) type = "";
6568
6569     // If zero fill is specified, padding goes after sign and before digits.
6570     if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
6571
6572     this.fill = fill;
6573     this.align = align;
6574     this.sign = sign;
6575     this.symbol = symbol;
6576     this.zero = zero;
6577     this.width = width;
6578     this.comma = comma;
6579     this.precision = precision;
6580     this.type = type;
6581   }
6582
6583   FormatSpecifier.prototype.toString = function() {
6584     return this.fill
6585         + this.align
6586         + this.sign
6587         + this.symbol
6588         + (this.zero ? "0" : "")
6589         + (this.width == null ? "" : Math.max(1, this.width | 0))
6590         + (this.comma ? "," : "")
6591         + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
6592         + this.type;
6593   };
6594
6595   function identity$3(x) {
6596     return x;
6597   }
6598
6599   var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
6600
6601   function formatLocale(locale) {
6602     var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
6603         currency = locale.currency,
6604         decimal = locale.decimal,
6605         numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
6606         percent = locale.percent || "%";
6607
6608     function newFormat(specifier) {
6609       specifier = formatSpecifier(specifier);
6610
6611       var fill = specifier.fill,
6612           align = specifier.align,
6613           sign = specifier.sign,
6614           symbol = specifier.symbol,
6615           zero = specifier.zero,
6616           width = specifier.width,
6617           comma = specifier.comma,
6618           precision = specifier.precision,
6619           type = specifier.type;
6620
6621       // Compute the prefix and suffix.
6622       // For SI-prefix, the suffix is lazily computed.
6623       var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
6624           suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
6625
6626       // What format function should we use?
6627       // Is this an integer type?
6628       // Can this type generate exponential notation?
6629       var formatType = formatTypes[type],
6630           maybeSuffix = !type || /[defgprs%]/.test(type);
6631
6632       // Set the default precision if not specified,
6633       // or clamp the specified precision to the supported range.
6634       // For significant precision, it must be in [1, 21].
6635       // For fixed precision, it must be in [0, 20].
6636       precision = precision == null ? (type ? 6 : 12)
6637           : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
6638           : Math.max(0, Math.min(20, precision));
6639
6640       function format(value) {
6641         var valuePrefix = prefix,
6642             valueSuffix = suffix,
6643             i, n, c;
6644
6645         if (type === "c") {
6646           valueSuffix = formatType(value) + valueSuffix;
6647           value = "";
6648         } else {
6649           value = +value;
6650
6651           // Perform the initial formatting.
6652           var valueNegative = value < 0;
6653           value = formatType(Math.abs(value), precision);
6654
6655           // If a negative value rounds to zero during formatting, treat as positive.
6656           if (valueNegative && +value === 0) valueNegative = false;
6657
6658           // Compute the prefix and suffix.
6659           valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
6660           valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
6661
6662           // Break the formatted value into the integer “value” part that can be
6663           // grouped, and fractional or exponential “suffix” part that is not.
6664           if (maybeSuffix) {
6665             i = -1, n = value.length;
6666             while (++i < n) {
6667               if (c = value.charCodeAt(i), 48 > c || c > 57) {
6668                 valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
6669                 value = value.slice(0, i);
6670                 break;
6671               }
6672             }
6673           }
6674         }
6675
6676         // If the fill character is not "0", grouping is applied before padding.
6677         if (comma && !zero) value = group(value, Infinity);
6678
6679         // Compute the padding.
6680         var length = valuePrefix.length + value.length + valueSuffix.length,
6681             padding = length < width ? new Array(width - length + 1).join(fill) : "";
6682
6683         // If the fill character is "0", grouping is applied after padding.
6684         if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
6685
6686         // Reconstruct the final output based on the desired alignment.
6687         switch (align) {
6688           case "<": value = valuePrefix + value + valueSuffix + padding; break;
6689           case "=": value = valuePrefix + padding + value + valueSuffix; break;
6690           case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
6691           default: value = padding + valuePrefix + value + valueSuffix; break;
6692         }
6693
6694         return numerals(value);
6695       }
6696
6697       format.toString = function() {
6698         return specifier + "";
6699       };
6700
6701       return format;
6702     }
6703
6704     function formatPrefix(specifier, value) {
6705       var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
6706           e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
6707           k = Math.pow(10, -e),
6708           prefix = prefixes[8 + e / 3];
6709       return function(value) {
6710         return f(k * value) + prefix;
6711       };
6712     }
6713
6714     return {
6715       format: newFormat,
6716       formatPrefix: formatPrefix
6717     };
6718   }
6719
6720   var locale;
6721   var format;
6722   var formatPrefix;
6723
6724   defaultLocale({
6725     decimal: ".",
6726     thousands: ",",
6727     grouping: [3],
6728     currency: ["$", ""]
6729   });
6730
6731   function defaultLocale(definition) {
6732     locale = formatLocale(definition);
6733     format = locale.format;
6734     formatPrefix = locale.formatPrefix;
6735     return locale;
6736   }
6737
6738   function precisionFixed(step) {
6739     return Math.max(0, -exponent$1(Math.abs(step)));
6740   }
6741
6742   function precisionPrefix(step, value) {
6743     return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
6744   }
6745
6746   function precisionRound(step, max) {
6747     step = Math.abs(step), max = Math.abs(max) - step;
6748     return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
6749   }
6750
6751   // Adds floating point numbers with twice the normal precision.
6752   // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
6753   // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
6754   // 305–363 (1997).
6755   // Code adapted from GeographicLib by Charles F. F. Karney,
6756   // http://geographiclib.sourceforge.net/
6757
6758   function adder() {
6759     return new Adder;
6760   }
6761
6762   function Adder() {
6763     this.reset();
6764   }
6765
6766   Adder.prototype = {
6767     constructor: Adder,
6768     reset: function() {
6769       this.s = // rounded value
6770       this.t = 0; // exact error
6771     },
6772     add: function(y) {
6773       add$1(temp, y, this.t);
6774       add$1(this, temp.s, this.s);
6775       if (this.s) this.t += temp.t;
6776       else this.s = temp.t;
6777     },
6778     valueOf: function() {
6779       return this.s;
6780     }
6781   };
6782
6783   var temp = new Adder;
6784
6785   function add$1(adder, a, b) {
6786     var x = adder.s = a + b,
6787         bv = x - a,
6788         av = x - bv;
6789     adder.t = (a - av) + (b - bv);
6790   }
6791
6792   var epsilon$2 = 1e-6;
6793   var epsilon2$1 = 1e-12;
6794   var pi$3 = Math.PI;
6795   var halfPi$2 = pi$3 / 2;
6796   var quarterPi = pi$3 / 4;
6797   var tau$3 = pi$3 * 2;
6798
6799   var degrees$1 = 180 / pi$3;
6800   var radians = pi$3 / 180;
6801
6802   var abs = Math.abs;
6803   var atan = Math.atan;
6804   var atan2 = Math.atan2;
6805   var cos$1 = Math.cos;
6806   var ceil = Math.ceil;
6807   var exp = Math.exp;
6808   var log = Math.log;
6809   var pow = Math.pow;
6810   var sin$1 = Math.sin;
6811   var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
6812   var sqrt = Math.sqrt;
6813   var tan = Math.tan;
6814
6815   function acos(x) {
6816     return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
6817   }
6818
6819   function asin(x) {
6820     return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
6821   }
6822
6823   function haversin(x) {
6824     return (x = sin$1(x / 2)) * x;
6825   }
6826
6827   function noop$1() {}
6828
6829   function streamGeometry(geometry, stream) {
6830     if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
6831       streamGeometryType[geometry.type](geometry, stream);
6832     }
6833   }
6834
6835   var streamObjectType = {
6836     Feature: function(object, stream) {
6837       streamGeometry(object.geometry, stream);
6838     },
6839     FeatureCollection: function(object, stream) {
6840       var features = object.features, i = -1, n = features.length;
6841       while (++i < n) streamGeometry(features[i].geometry, stream);
6842     }
6843   };
6844
6845   var streamGeometryType = {
6846     Sphere: function(object, stream) {
6847       stream.sphere();
6848     },
6849     Point: function(object, stream) {
6850       object = object.coordinates;
6851       stream.point(object[0], object[1], object[2]);
6852     },
6853     MultiPoint: function(object, stream) {
6854       var coordinates = object.coordinates, i = -1, n = coordinates.length;
6855       while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
6856     },
6857     LineString: function(object, stream) {
6858       streamLine(object.coordinates, stream, 0);
6859     },
6860     MultiLineString: function(object, stream) {
6861       var coordinates = object.coordinates, i = -1, n = coordinates.length;
6862       while (++i < n) streamLine(coordinates[i], stream, 0);
6863     },
6864     Polygon: function(object, stream) {
6865       streamPolygon(object.coordinates, stream);
6866     },
6867     MultiPolygon: function(object, stream) {
6868       var coordinates = object.coordinates, i = -1, n = coordinates.length;
6869       while (++i < n) streamPolygon(coordinates[i], stream);
6870     },
6871     GeometryCollection: function(object, stream) {
6872       var geometries = object.geometries, i = -1, n = geometries.length;
6873       while (++i < n) streamGeometry(geometries[i], stream);
6874     }
6875   };
6876
6877   function streamLine(coordinates, stream, closed) {
6878     var i = -1, n = coordinates.length - closed, coordinate;
6879     stream.lineStart();
6880     while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
6881     stream.lineEnd();
6882   }
6883
6884   function streamPolygon(coordinates, stream) {
6885     var i = -1, n = coordinates.length;
6886     stream.polygonStart();
6887     while (++i < n) streamLine(coordinates[i], stream, 1);
6888     stream.polygonEnd();
6889   }
6890
6891   function geoStream(object, stream) {
6892     if (object && streamObjectType.hasOwnProperty(object.type)) {
6893       streamObjectType[object.type](object, stream);
6894     } else {
6895       streamGeometry(object, stream);
6896     }
6897   }
6898
6899   var areaRingSum = adder();
6900
6901   var areaSum = adder(),
6902       lambda00,
6903       phi00,
6904       lambda0,
6905       cosPhi0,
6906       sinPhi0;
6907
6908   var areaStream = {
6909     point: noop$1,
6910     lineStart: noop$1,
6911     lineEnd: noop$1,
6912     polygonStart: function() {
6913       areaRingSum.reset();
6914       areaStream.lineStart = areaRingStart;
6915       areaStream.lineEnd = areaRingEnd;
6916     },
6917     polygonEnd: function() {
6918       var areaRing = +areaRingSum;
6919       areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
6920       this.lineStart = this.lineEnd = this.point = noop$1;
6921     },
6922     sphere: function() {
6923       areaSum.add(tau$3);
6924     }
6925   };
6926
6927   function areaRingStart() {
6928     areaStream.point = areaPointFirst;
6929   }
6930
6931   function areaRingEnd() {
6932     areaPoint(lambda00, phi00);
6933   }
6934
6935   function areaPointFirst(lambda, phi) {
6936     areaStream.point = areaPoint;
6937     lambda00 = lambda, phi00 = phi;
6938     lambda *= radians, phi *= radians;
6939     lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
6940   }
6941
6942   function areaPoint(lambda, phi) {
6943     lambda *= radians, phi *= radians;
6944     phi = phi / 2 + quarterPi; // half the angular distance from south pole
6945
6946     // Spherical excess E for a spherical triangle with vertices: south pole,
6947     // previous point, current point.  Uses a formula derived from Cagnoli’s
6948     // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
6949     var dLambda = lambda - lambda0,
6950         sdLambda = dLambda >= 0 ? 1 : -1,
6951         adLambda = sdLambda * dLambda,
6952         cosPhi = cos$1(phi),
6953         sinPhi = sin$1(phi),
6954         k = sinPhi0 * sinPhi,
6955         u = cosPhi0 * cosPhi + k * cos$1(adLambda),
6956         v = k * sdLambda * sin$1(adLambda);
6957     areaRingSum.add(atan2(v, u));
6958
6959     // Advance the previous points.
6960     lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
6961   }
6962
6963   function d3_geoArea(object) {
6964     areaSum.reset();
6965     geoStream(object, areaStream);
6966     return areaSum * 2;
6967   }
6968
6969   function spherical(cartesian) {
6970     return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
6971   }
6972
6973   function cartesian(spherical) {
6974     var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
6975     return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
6976   }
6977
6978   function cartesianDot(a, b) {
6979     return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
6980   }
6981
6982   function cartesianCross(a, b) {
6983     return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
6984   }
6985
6986   // TODO return a
6987   function cartesianAddInPlace(a, b) {
6988     a[0] += b[0], a[1] += b[1], a[2] += b[2];
6989   }
6990
6991   function cartesianScale(vector, k) {
6992     return [vector[0] * k, vector[1] * k, vector[2] * k];
6993   }
6994
6995   // TODO return d
6996   function cartesianNormalizeInPlace(d) {
6997     var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
6998     d[0] /= l, d[1] /= l, d[2] /= l;
6999   }
7000
7001   var lambda0$1, phi0, lambda1, phi1, // bounds
7002       lambda2, // previous lambda-coordinate
7003       lambda00$1, phi00$1, // first point
7004       p0, // previous 3D point
7005       deltaSum = adder(),
7006       ranges,
7007       range$1;
7008
7009   var boundsStream = {
7010     point: boundsPoint,
7011     lineStart: boundsLineStart,
7012     lineEnd: boundsLineEnd,
7013     polygonStart: function() {
7014       boundsStream.point = boundsRingPoint;
7015       boundsStream.lineStart = boundsRingStart;
7016       boundsStream.lineEnd = boundsRingEnd;
7017       deltaSum.reset();
7018       areaStream.polygonStart();
7019     },
7020     polygonEnd: function() {
7021       areaStream.polygonEnd();
7022       boundsStream.point = boundsPoint;
7023       boundsStream.lineStart = boundsLineStart;
7024       boundsStream.lineEnd = boundsLineEnd;
7025       if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
7026       else if (deltaSum > epsilon$2) phi1 = 90;
7027       else if (deltaSum < -epsilon$2) phi0 = -90;
7028       range$1[0] = lambda0$1, range$1[1] = lambda1;
7029     }
7030   };
7031
7032   function boundsPoint(lambda, phi) {
7033     ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]);
7034     if (phi < phi0) phi0 = phi;
7035     if (phi > phi1) phi1 = phi;
7036   }
7037
7038   function linePoint(lambda, phi) {
7039     var p = cartesian([lambda * radians, phi * radians]);
7040     if (p0) {
7041       var normal = cartesianCross(p0, p),
7042           equatorial = [normal[1], -normal[0], 0],
7043           inflection = cartesianCross(equatorial, normal);
7044       cartesianNormalizeInPlace(inflection);
7045       inflection = spherical(inflection);
7046       var delta = lambda - lambda2,
7047           sign$$1 = delta > 0 ? 1 : -1,
7048           lambdai = inflection[0] * degrees$1 * sign$$1,
7049           phii,
7050           antimeridian = abs(delta) > 180;
7051       if (antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7052         phii = inflection[1] * degrees$1;
7053         if (phii > phi1) phi1 = phii;
7054       } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7055         phii = -inflection[1] * degrees$1;
7056         if (phii < phi0) phi0 = phii;
7057       } else {
7058         if (phi < phi0) phi0 = phi;
7059         if (phi > phi1) phi1 = phi;
7060       }
7061       if (antimeridian) {
7062         if (lambda < lambda2) {
7063           if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7064         } else {
7065           if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7066         }
7067       } else {
7068         if (lambda1 >= lambda0$1) {
7069           if (lambda < lambda0$1) lambda0$1 = lambda;
7070           if (lambda > lambda1) lambda1 = lambda;
7071         } else {
7072           if (lambda > lambda2) {
7073             if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7074           } else {
7075             if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7076           }
7077         }
7078       }
7079     } else {
7080       ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]);
7081     }
7082     if (phi < phi0) phi0 = phi;
7083     if (phi > phi1) phi1 = phi;
7084     p0 = p, lambda2 = lambda;
7085   }
7086
7087   function boundsLineStart() {
7088     boundsStream.point = linePoint;
7089   }
7090
7091   function boundsLineEnd() {
7092     range$1[0] = lambda0$1, range$1[1] = lambda1;
7093     boundsStream.point = boundsPoint;
7094     p0 = null;
7095   }
7096
7097   function boundsRingPoint(lambda, phi) {
7098     if (p0) {
7099       var delta = lambda - lambda2;
7100       deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
7101     } else {
7102       lambda00$1 = lambda, phi00$1 = phi;
7103     }
7104     areaStream.point(lambda, phi);
7105     linePoint(lambda, phi);
7106   }
7107
7108   function boundsRingStart() {
7109     areaStream.lineStart();
7110   }
7111
7112   function boundsRingEnd() {
7113     boundsRingPoint(lambda00$1, phi00$1);
7114     areaStream.lineEnd();
7115     if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
7116     range$1[0] = lambda0$1, range$1[1] = lambda1;
7117     p0 = null;
7118   }
7119
7120   // Finds the left-right distance between two longitudes.
7121   // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
7122   // the distance between ±180° to be 360°.
7123   function angle(lambda0, lambda1) {
7124     return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
7125   }
7126
7127   function rangeCompare(a, b) {
7128     return a[0] - b[0];
7129   }
7130
7131   function rangeContains(range, x) {
7132     return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
7133   }
7134
7135   function d3_geoBounds(feature) {
7136     var i, n, a, b, merged, deltaMax, delta;
7137
7138     phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
7139     ranges = [];
7140     geoStream(feature, boundsStream);
7141
7142     // First, sort ranges by their minimum longitudes.
7143     if (n = ranges.length) {
7144       ranges.sort(rangeCompare);
7145
7146       // Then, merge any ranges that overlap.
7147       for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
7148         b = ranges[i];
7149         if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
7150           if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
7151           if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
7152         } else {
7153           merged.push(a = b);
7154         }
7155       }
7156
7157       // Finally, find the largest gap between the merged ranges.
7158       // The final bounding box will be the inverse of this gap.
7159       for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
7160         b = merged[i];
7161         if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
7162       }
7163     }
7164
7165     ranges = range$1 = null;
7166
7167     return lambda0$1 === Infinity || phi0 === Infinity
7168         ? [[NaN, NaN], [NaN, NaN]]
7169         : [[lambda0$1, phi0], [lambda1, phi1]];
7170   }
7171
7172   var W0, W1,
7173       X0, Y0, Z0,
7174       X1, Y1, Z1,
7175       X2, Y2, Z2,
7176       lambda00$2, phi00$2, // first point
7177       x0, y0, z0; // previous point
7178
7179   var centroidStream = {
7180     sphere: noop$1,
7181     point: centroidPoint,
7182     lineStart: centroidLineStart,
7183     lineEnd: centroidLineEnd,
7184     polygonStart: function() {
7185       centroidStream.lineStart = centroidRingStart;
7186       centroidStream.lineEnd = centroidRingEnd;
7187     },
7188     polygonEnd: function() {
7189       centroidStream.lineStart = centroidLineStart;
7190       centroidStream.lineEnd = centroidLineEnd;
7191     }
7192   };
7193
7194   // Arithmetic mean of Cartesian vectors.
7195   function centroidPoint(lambda, phi) {
7196     lambda *= radians, phi *= radians;
7197     var cosPhi = cos$1(phi);
7198     centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
7199   }
7200
7201   function centroidPointCartesian(x, y, z) {
7202     ++W0;
7203     X0 += (x - X0) / W0;
7204     Y0 += (y - Y0) / W0;
7205     Z0 += (z - Z0) / W0;
7206   }
7207
7208   function centroidLineStart() {
7209     centroidStream.point = centroidLinePointFirst;
7210   }
7211
7212   function centroidLinePointFirst(lambda, phi) {
7213     lambda *= radians, phi *= radians;
7214     var cosPhi = cos$1(phi);
7215     x0 = cosPhi * cos$1(lambda);
7216     y0 = cosPhi * sin$1(lambda);
7217     z0 = sin$1(phi);
7218     centroidStream.point = centroidLinePoint;
7219     centroidPointCartesian(x0, y0, z0);
7220   }
7221
7222   function centroidLinePoint(lambda, phi) {
7223     lambda *= radians, phi *= radians;
7224     var cosPhi = cos$1(phi),
7225         x = cosPhi * cos$1(lambda),
7226         y = cosPhi * sin$1(lambda),
7227         z = sin$1(phi),
7228         w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
7229     W1 += w;
7230     X1 += w * (x0 + (x0 = x));
7231     Y1 += w * (y0 + (y0 = y));
7232     Z1 += w * (z0 + (z0 = z));
7233     centroidPointCartesian(x0, y0, z0);
7234   }
7235
7236   function centroidLineEnd() {
7237     centroidStream.point = centroidPoint;
7238   }
7239
7240   // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
7241   // J. Applied Mechanics 42, 239 (1975).
7242   function centroidRingStart() {
7243     centroidStream.point = centroidRingPointFirst;
7244   }
7245
7246   function centroidRingEnd() {
7247     centroidRingPoint(lambda00$2, phi00$2);
7248     centroidStream.point = centroidPoint;
7249   }
7250
7251   function centroidRingPointFirst(lambda, phi) {
7252     lambda00$2 = lambda, phi00$2 = phi;
7253     lambda *= radians, phi *= radians;
7254     centroidStream.point = centroidRingPoint;
7255     var cosPhi = cos$1(phi);
7256     x0 = cosPhi * cos$1(lambda);
7257     y0 = cosPhi * sin$1(lambda);
7258     z0 = sin$1(phi);
7259     centroidPointCartesian(x0, y0, z0);
7260   }
7261
7262   function centroidRingPoint(lambda, phi) {
7263     lambda *= radians, phi *= radians;
7264     var cosPhi = cos$1(phi),
7265         x = cosPhi * cos$1(lambda),
7266         y = cosPhi * sin$1(lambda),
7267         z = sin$1(phi),
7268         cx = y0 * z - z0 * y,
7269         cy = z0 * x - x0 * z,
7270         cz = x0 * y - y0 * x,
7271         m = sqrt(cx * cx + cy * cy + cz * cz),
7272         w = asin(m), // line weight = angle
7273         v = m && -w / m; // area weight multiplier
7274     X2 += v * cx;
7275     Y2 += v * cy;
7276     Z2 += v * cz;
7277     W1 += w;
7278     X1 += w * (x0 + (x0 = x));
7279     Y1 += w * (y0 + (y0 = y));
7280     Z1 += w * (z0 + (z0 = z));
7281     centroidPointCartesian(x0, y0, z0);
7282   }
7283
7284   function d3_geoCentroid(object) {
7285     W0 = W1 =
7286     X0 = Y0 = Z0 =
7287     X1 = Y1 = Z1 =
7288     X2 = Y2 = Z2 = 0;
7289     geoStream(object, centroidStream);
7290
7291     var x = X2,
7292         y = Y2,
7293         z = Z2,
7294         m = x * x + y * y + z * z;
7295
7296     // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
7297     if (m < epsilon2$1) {
7298       x = X1, y = Y1, z = Z1;
7299       // If the feature has zero length, fall back to arithmetic mean of point vectors.
7300       if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
7301       m = x * x + y * y + z * z;
7302       // If the feature still has an undefined ccentroid, then return.
7303       if (m < epsilon2$1) return [NaN, NaN];
7304     }
7305
7306     return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
7307   }
7308
7309   function constant$7(x) {
7310     return function() {
7311       return x;
7312     };
7313   }
7314
7315   function compose(a, b) {
7316
7317     function compose(x, y) {
7318       return x = a(x, y), b(x[0], x[1]);
7319     }
7320
7321     if (a.invert && b.invert) compose.invert = function(x, y) {
7322       return x = b.invert(x, y), x && a.invert(x[0], x[1]);
7323     };
7324
7325     return compose;
7326   }
7327
7328   function rotationIdentity(lambda, phi) {
7329     return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7330   }
7331
7332   rotationIdentity.invert = rotationIdentity;
7333
7334   function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
7335     return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
7336       : rotationLambda(deltaLambda))
7337       : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
7338       : rotationIdentity);
7339   }
7340
7341   function forwardRotationLambda(deltaLambda) {
7342     return function(lambda, phi) {
7343       return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7344     };
7345   }
7346
7347   function rotationLambda(deltaLambda) {
7348     var rotation = forwardRotationLambda(deltaLambda);
7349     rotation.invert = forwardRotationLambda(-deltaLambda);
7350     return rotation;
7351   }
7352
7353   function rotationPhiGamma(deltaPhi, deltaGamma) {
7354     var cosDeltaPhi = cos$1(deltaPhi),
7355         sinDeltaPhi = sin$1(deltaPhi),
7356         cosDeltaGamma = cos$1(deltaGamma),
7357         sinDeltaGamma = sin$1(deltaGamma);
7358
7359     function rotation(lambda, phi) {
7360       var cosPhi = cos$1(phi),
7361           x = cos$1(lambda) * cosPhi,
7362           y = sin$1(lambda) * cosPhi,
7363           z = sin$1(phi),
7364           k = z * cosDeltaPhi + x * sinDeltaPhi;
7365       return [
7366         atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
7367         asin(k * cosDeltaGamma + y * sinDeltaGamma)
7368       ];
7369     }
7370
7371     rotation.invert = function(lambda, phi) {
7372       var cosPhi = cos$1(phi),
7373           x = cos$1(lambda) * cosPhi,
7374           y = sin$1(lambda) * cosPhi,
7375           z = sin$1(phi),
7376           k = z * cosDeltaGamma - y * sinDeltaGamma;
7377       return [
7378         atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
7379         asin(k * cosDeltaPhi - x * sinDeltaPhi)
7380       ];
7381     };
7382
7383     return rotation;
7384   }
7385
7386   function rotation(rotate) {
7387     rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
7388
7389     function forward(coordinates) {
7390       coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
7391       return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7392     }
7393
7394     forward.invert = function(coordinates) {
7395       coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
7396       return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7397     };
7398
7399     return forward;
7400   }
7401
7402   // Generates a circle centered at [0°, 0°], with a given radius and precision.
7403   function circleStream(stream, radius, delta, direction, t0, t1) {
7404     if (!delta) return;
7405     var cosRadius = cos$1(radius),
7406         sinRadius = sin$1(radius),
7407         step = direction * delta;
7408     if (t0 == null) {
7409       t0 = radius + direction * tau$3;
7410       t1 = radius - step / 2;
7411     } else {
7412       t0 = circleRadius(cosRadius, t0);
7413       t1 = circleRadius(cosRadius, t1);
7414       if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
7415     }
7416     for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
7417       point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
7418       stream.point(point[0], point[1]);
7419     }
7420   }
7421
7422   // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
7423   function circleRadius(cosRadius, point) {
7424     point = cartesian(point), point[0] -= cosRadius;
7425     cartesianNormalizeInPlace(point);
7426     var radius = acos(-point[1]);
7427     return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
7428   }
7429
7430   function circle() {
7431     var center = constant$7([0, 0]),
7432         radius = constant$7(90),
7433         precision = constant$7(6),
7434         ring,
7435         rotate,
7436         stream = {point: point};
7437
7438     function point(x, y) {
7439       ring.push(x = rotate(x, y));
7440       x[0] *= degrees$1, x[1] *= degrees$1;
7441     }
7442
7443     function circle() {
7444       var c = center.apply(this, arguments),
7445           r = radius.apply(this, arguments) * radians,
7446           p = precision.apply(this, arguments) * radians;
7447       ring = [];
7448       rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
7449       circleStream(stream, r, p, 1);
7450       c = {type: "Polygon", coordinates: [ring]};
7451       ring = rotate = null;
7452       return c;
7453     }
7454
7455     circle.center = function(_) {
7456       return arguments.length ? (center = typeof _ === "function" ? _ : constant$7([+_[0], +_[1]]), circle) : center;
7457     };
7458
7459     circle.radius = function(_) {
7460       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), circle) : radius;
7461     };
7462
7463     circle.precision = function(_) {
7464       return arguments.length ? (precision = typeof _ === "function" ? _ : constant$7(+_), circle) : precision;
7465     };
7466
7467     return circle;
7468   }
7469
7470   function clipBuffer() {
7471     var lines = [],
7472         line;
7473     return {
7474       point: function(x, y) {
7475         line.push([x, y]);
7476       },
7477       lineStart: function() {
7478         lines.push(line = []);
7479       },
7480       lineEnd: noop$1,
7481       rejoin: function() {
7482         if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
7483       },
7484       result: function() {
7485         var result = lines;
7486         lines = [];
7487         line = null;
7488         return result;
7489       }
7490     };
7491   }
7492
7493   function pointEqual(a, b) {
7494     return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2;
7495   }
7496
7497   function Intersection(point, points, other, entry) {
7498     this.x = point;
7499     this.z = points;
7500     this.o = other; // another intersection
7501     this.e = entry; // is an entry?
7502     this.v = false; // visited
7503     this.n = this.p = null; // next & previous
7504   }
7505
7506   // A generalized polygon clipping algorithm: given a polygon that has been cut
7507   // into its visible line segments, and rejoins the segments by interpolating
7508   // along the clip edge.
7509   function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
7510     var subject = [],
7511         clip = [],
7512         i,
7513         n;
7514
7515     segments.forEach(function(segment) {
7516       if ((n = segment.length - 1) <= 0) return;
7517       var n, p0 = segment[0], p1 = segment[n], x;
7518
7519       // If the first and last points of a segment are coincident, then treat as a
7520       // closed ring. TODO if all rings are closed, then the winding order of the
7521       // exterior ring should be checked.
7522       if (pointEqual(p0, p1)) {
7523         stream.lineStart();
7524         for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
7525         stream.lineEnd();
7526         return;
7527       }
7528
7529       subject.push(x = new Intersection(p0, segment, null, true));
7530       clip.push(x.o = new Intersection(p0, null, x, false));
7531       subject.push(x = new Intersection(p1, segment, null, false));
7532       clip.push(x.o = new Intersection(p1, null, x, true));
7533     });
7534
7535     if (!subject.length) return;
7536
7537     clip.sort(compareIntersection);
7538     link$1(subject);
7539     link$1(clip);
7540
7541     for (i = 0, n = clip.length; i < n; ++i) {
7542       clip[i].e = startInside = !startInside;
7543     }
7544
7545     var start = subject[0],
7546         points,
7547         point;
7548
7549     while (1) {
7550       // Find first unvisited intersection.
7551       var current = start,
7552           isSubject = true;
7553       while (current.v) if ((current = current.n) === start) return;
7554       points = current.z;
7555       stream.lineStart();
7556       do {
7557         current.v = current.o.v = true;
7558         if (current.e) {
7559           if (isSubject) {
7560             for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
7561           } else {
7562             interpolate(current.x, current.n.x, 1, stream);
7563           }
7564           current = current.n;
7565         } else {
7566           if (isSubject) {
7567             points = current.p.z;
7568             for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
7569           } else {
7570             interpolate(current.x, current.p.x, -1, stream);
7571           }
7572           current = current.p;
7573         }
7574         current = current.o;
7575         points = current.z;
7576         isSubject = !isSubject;
7577       } while (!current.v);
7578       stream.lineEnd();
7579     }
7580   }
7581
7582   function link$1(array) {
7583     if (!(n = array.length)) return;
7584     var n,
7585         i = 0,
7586         a = array[0],
7587         b;
7588     while (++i < n) {
7589       a.n = b = array[i];
7590       b.p = a;
7591       a = b;
7592     }
7593     a.n = b = array[0];
7594     b.p = a;
7595   }
7596
7597   var sum$1 = adder();
7598
7599   function polygonContains(polygon, point) {
7600     var lambda = point[0],
7601         phi = point[1],
7602         normal = [sin$1(lambda), -cos$1(lambda), 0],
7603         angle = 0,
7604         winding = 0;
7605
7606     sum$1.reset();
7607
7608     for (var i = 0, n = polygon.length; i < n; ++i) {
7609       if (!(m = (ring = polygon[i]).length)) continue;
7610       var ring,
7611           m,
7612           point0 = ring[m - 1],
7613           lambda0 = point0[0],
7614           phi0 = point0[1] / 2 + quarterPi,
7615           sinPhi0 = sin$1(phi0),
7616           cosPhi0 = cos$1(phi0);
7617
7618       for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
7619         var point1 = ring[j],
7620             lambda1 = point1[0],
7621             phi1 = point1[1] / 2 + quarterPi,
7622             sinPhi1 = sin$1(phi1),
7623             cosPhi1 = cos$1(phi1),
7624             delta = lambda1 - lambda0,
7625             sign$$1 = delta >= 0 ? 1 : -1,
7626             absDelta = sign$$1 * delta,
7627             antimeridian = absDelta > pi$3,
7628             k = sinPhi0 * sinPhi1;
7629
7630         sum$1.add(atan2(k * sign$$1 * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
7631         angle += antimeridian ? delta + sign$$1 * tau$3 : delta;
7632
7633         // Are the longitudes either side of the point’s meridian (lambda),
7634         // and are the latitudes smaller than the parallel (phi)?
7635         if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
7636           var arc = cartesianCross(cartesian(point0), cartesian(point1));
7637           cartesianNormalizeInPlace(arc);
7638           var intersection = cartesianCross(normal, arc);
7639           cartesianNormalizeInPlace(intersection);
7640           var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
7641           if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
7642             winding += antimeridian ^ delta >= 0 ? 1 : -1;
7643           }
7644         }
7645       }
7646     }
7647
7648     // First, determine whether the South pole is inside or outside:
7649     //
7650     // It is inside if:
7651     // * the polygon winds around it in a clockwise direction.
7652     // * the polygon does not (cumulatively) wind around it, but has a negative
7653     //   (counter-clockwise) area.
7654     //
7655     // Second, count the (signed) number of times a segment crosses a lambda
7656     // from the point to the South pole.  If it is zero, then the point is the
7657     // same side as the South pole.
7658
7659     return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
7660   }
7661
7662   function clip(pointVisible, clipLine, interpolate, start) {
7663     return function(sink) {
7664       var line = clipLine(sink),
7665           ringBuffer = clipBuffer(),
7666           ringSink = clipLine(ringBuffer),
7667           polygonStarted = false,
7668           polygon,
7669           segments,
7670           ring;
7671
7672       var clip = {
7673         point: point,
7674         lineStart: lineStart,
7675         lineEnd: lineEnd,
7676         polygonStart: function() {
7677           clip.point = pointRing;
7678           clip.lineStart = ringStart;
7679           clip.lineEnd = ringEnd;
7680           segments = [];
7681           polygon = [];
7682         },
7683         polygonEnd: function() {
7684           clip.point = point;
7685           clip.lineStart = lineStart;
7686           clip.lineEnd = lineEnd;
7687           segments = merge(segments);
7688           var startInside = polygonContains(polygon, start);
7689           if (segments.length) {
7690             if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7691             clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
7692           } else if (startInside) {
7693             if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7694             sink.lineStart();
7695             interpolate(null, null, 1, sink);
7696             sink.lineEnd();
7697           }
7698           if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
7699           segments = polygon = null;
7700         },
7701         sphere: function() {
7702           sink.polygonStart();
7703           sink.lineStart();
7704           interpolate(null, null, 1, sink);
7705           sink.lineEnd();
7706           sink.polygonEnd();
7707         }
7708       };
7709
7710       function point(lambda, phi) {
7711         if (pointVisible(lambda, phi)) sink.point(lambda, phi);
7712       }
7713
7714       function pointLine(lambda, phi) {
7715         line.point(lambda, phi);
7716       }
7717
7718       function lineStart() {
7719         clip.point = pointLine;
7720         line.lineStart();
7721       }
7722
7723       function lineEnd() {
7724         clip.point = point;
7725         line.lineEnd();
7726       }
7727
7728       function pointRing(lambda, phi) {
7729         ring.push([lambda, phi]);
7730         ringSink.point(lambda, phi);
7731       }
7732
7733       function ringStart() {
7734         ringSink.lineStart();
7735         ring = [];
7736       }
7737
7738       function ringEnd() {
7739         pointRing(ring[0][0], ring[0][1]);
7740         ringSink.lineEnd();
7741
7742         var clean = ringSink.clean(),
7743             ringSegments = ringBuffer.result(),
7744             i, n = ringSegments.length, m,
7745             segment,
7746             point;
7747
7748         ring.pop();
7749         polygon.push(ring);
7750         ring = null;
7751
7752         if (!n) return;
7753
7754         // No intersections.
7755         if (clean & 1) {
7756           segment = ringSegments[0];
7757           if ((m = segment.length - 1) > 0) {
7758             if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7759             sink.lineStart();
7760             for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
7761             sink.lineEnd();
7762           }
7763           return;
7764         }
7765
7766         // Rejoin connected segments.
7767         // TODO reuse ringBuffer.rejoin()?
7768         if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
7769
7770         segments.push(ringSegments.filter(validSegment));
7771       }
7772
7773       return clip;
7774     };
7775   }
7776
7777   function validSegment(segment) {
7778     return segment.length > 1;
7779   }
7780
7781   // Intersections are sorted along the clip edge. For both antimeridian cutting
7782   // and circle clipping, the same comparison is used.
7783   function compareIntersection(a, b) {
7784     return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
7785          - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
7786   }
7787
7788   var clipAntimeridian = clip(
7789     function() { return true; },
7790     clipAntimeridianLine,
7791     clipAntimeridianInterpolate,
7792     [-pi$3, -halfPi$2]
7793   );
7794
7795   // Takes a line and cuts into visible segments. Return values: 0 - there were
7796   // intersections or the line was empty; 1 - no intersections; 2 - there were
7797   // intersections, and the first and last segments should be rejoined.
7798   function clipAntimeridianLine(stream) {
7799     var lambda0 = NaN,
7800         phi0 = NaN,
7801         sign0 = NaN,
7802         clean; // no intersections
7803
7804     return {
7805       lineStart: function() {
7806         stream.lineStart();
7807         clean = 1;
7808       },
7809       point: function(lambda1, phi1) {
7810         var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
7811             delta = abs(lambda1 - lambda0);
7812         if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole
7813           stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
7814           stream.point(sign0, phi0);
7815           stream.lineEnd();
7816           stream.lineStart();
7817           stream.point(sign1, phi0);
7818           stream.point(lambda1, phi0);
7819           clean = 0;
7820         } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
7821           if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
7822           if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
7823           phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
7824           stream.point(sign0, phi0);
7825           stream.lineEnd();
7826           stream.lineStart();
7827           stream.point(sign1, phi0);
7828           clean = 0;
7829         }
7830         stream.point(lambda0 = lambda1, phi0 = phi1);
7831         sign0 = sign1;
7832       },
7833       lineEnd: function() {
7834         stream.lineEnd();
7835         lambda0 = phi0 = NaN;
7836       },
7837       clean: function() {
7838         return 2 - clean; // if intersections, rejoin first and last segments
7839       }
7840     };
7841   }
7842
7843   function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
7844     var cosPhi0,
7845         cosPhi1,
7846         sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
7847     return abs(sinLambda0Lambda1) > epsilon$2
7848         ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
7849             - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
7850             / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
7851         : (phi0 + phi1) / 2;
7852   }
7853
7854   function clipAntimeridianInterpolate(from, to, direction, stream) {
7855     var phi;
7856     if (from == null) {
7857       phi = direction * halfPi$2;
7858       stream.point(-pi$3, phi);
7859       stream.point(0, phi);
7860       stream.point(pi$3, phi);
7861       stream.point(pi$3, 0);
7862       stream.point(pi$3, -phi);
7863       stream.point(0, -phi);
7864       stream.point(-pi$3, -phi);
7865       stream.point(-pi$3, 0);
7866       stream.point(-pi$3, phi);
7867     } else if (abs(from[0] - to[0]) > epsilon$2) {
7868       var lambda = from[0] < to[0] ? pi$3 : -pi$3;
7869       phi = direction * lambda / 2;
7870       stream.point(-lambda, phi);
7871       stream.point(0, phi);
7872       stream.point(lambda, phi);
7873     } else {
7874       stream.point(to[0], to[1]);
7875     }
7876   }
7877
7878   function clipCircle(radius) {
7879     var cr = cos$1(radius),
7880         delta = 6 * radians,
7881         smallRadius = cr > 0,
7882         notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case
7883
7884     function interpolate(from, to, direction, stream) {
7885       circleStream(stream, radius, delta, direction, from, to);
7886     }
7887
7888     function visible(lambda, phi) {
7889       return cos$1(lambda) * cos$1(phi) > cr;
7890     }
7891
7892     // Takes a line and cuts into visible segments. Return values used for polygon
7893     // clipping: 0 - there were intersections or the line was empty; 1 - no
7894     // intersections 2 - there were intersections, and the first and last segments
7895     // should be rejoined.
7896     function clipLine(stream) {
7897       var point0, // previous point
7898           c0, // code for previous point
7899           v0, // visibility of previous point
7900           v00, // visibility of first point
7901           clean; // no intersections
7902       return {
7903         lineStart: function() {
7904           v00 = v0 = false;
7905           clean = 1;
7906         },
7907         point: function(lambda, phi) {
7908           var point1 = [lambda, phi],
7909               point2,
7910               v = visible(lambda, phi),
7911               c = smallRadius
7912                 ? v ? 0 : code(lambda, phi)
7913                 : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
7914           if (!point0 && (v00 = v0 = v)) stream.lineStart();
7915           // Handle degeneracies.
7916           // TODO ignore if not clipping polygons.
7917           if (v !== v0) {
7918             point2 = intersect(point0, point1);
7919             if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
7920               point1[0] += epsilon$2;
7921               point1[1] += epsilon$2;
7922               v = visible(point1[0], point1[1]);
7923             }
7924           }
7925           if (v !== v0) {
7926             clean = 0;
7927             if (v) {
7928               // outside going in
7929               stream.lineStart();
7930               point2 = intersect(point1, point0);
7931               stream.point(point2[0], point2[1]);
7932             } else {
7933               // inside going out
7934               point2 = intersect(point0, point1);
7935               stream.point(point2[0], point2[1]);
7936               stream.lineEnd();
7937             }
7938             point0 = point2;
7939           } else if (notHemisphere && point0 && smallRadius ^ v) {
7940             var t;
7941             // If the codes for two points are different, or are both zero,
7942             // and there this segment intersects with the small circle.
7943             if (!(c & c0) && (t = intersect(point1, point0, true))) {
7944               clean = 0;
7945               if (smallRadius) {
7946                 stream.lineStart();
7947                 stream.point(t[0][0], t[0][1]);
7948                 stream.point(t[1][0], t[1][1]);
7949                 stream.lineEnd();
7950               } else {
7951                 stream.point(t[1][0], t[1][1]);
7952                 stream.lineEnd();
7953                 stream.lineStart();
7954                 stream.point(t[0][0], t[0][1]);
7955               }
7956             }
7957           }
7958           if (v && (!point0 || !pointEqual(point0, point1))) {
7959             stream.point(point1[0], point1[1]);
7960           }
7961           point0 = point1, v0 = v, c0 = c;
7962         },
7963         lineEnd: function() {
7964           if (v0) stream.lineEnd();
7965           point0 = null;
7966         },
7967         // Rejoin first and last segments if there were intersections and the first
7968         // and last points were visible.
7969         clean: function() {
7970           return clean | ((v00 && v0) << 1);
7971         }
7972       };
7973     }
7974
7975     // Intersects the great circle between a and b with the clip circle.
7976     function intersect(a, b, two) {
7977       var pa = cartesian(a),
7978           pb = cartesian(b);
7979
7980       // We have two planes, n1.p = d1 and n2.p = d2.
7981       // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
7982       var n1 = [1, 0, 0], // normal
7983           n2 = cartesianCross(pa, pb),
7984           n2n2 = cartesianDot(n2, n2),
7985           n1n2 = n2[0], // cartesianDot(n1, n2),
7986           determinant = n2n2 - n1n2 * n1n2;
7987
7988       // Two polar points.
7989       if (!determinant) return !two && a;
7990
7991       var c1 =  cr * n2n2 / determinant,
7992           c2 = -cr * n1n2 / determinant,
7993           n1xn2 = cartesianCross(n1, n2),
7994           A = cartesianScale(n1, c1),
7995           B = cartesianScale(n2, c2);
7996       cartesianAddInPlace(A, B);
7997
7998       // Solve |p(t)|^2 = 1.
7999       var u = n1xn2,
8000           w = cartesianDot(A, u),
8001           uu = cartesianDot(u, u),
8002           t2 = w * w - uu * (cartesianDot(A, A) - 1);
8003
8004       if (t2 < 0) return;
8005
8006       var t = sqrt(t2),
8007           q = cartesianScale(u, (-w - t) / uu);
8008       cartesianAddInPlace(q, A);
8009       q = spherical(q);
8010
8011       if (!two) return q;
8012
8013       // Two intersection points.
8014       var lambda0 = a[0],
8015           lambda1 = b[0],
8016           phi0 = a[1],
8017           phi1 = b[1],
8018           z;
8019
8020       if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
8021
8022       var delta = lambda1 - lambda0,
8023           polar = abs(delta - pi$3) < epsilon$2,
8024           meridian = polar || delta < epsilon$2;
8025
8026       if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
8027
8028       // Check that the first point is between a and b.
8029       if (meridian
8030           ? polar
8031             ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
8032             : phi0 <= q[1] && q[1] <= phi1
8033           : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
8034         var q1 = cartesianScale(u, (-w + t) / uu);
8035         cartesianAddInPlace(q1, A);
8036         return [q, spherical(q1)];
8037       }
8038     }
8039
8040     // Generates a 4-bit vector representing the location of a point relative to
8041     // the small circle's bounding box.
8042     function code(lambda, phi) {
8043       var r = smallRadius ? radius : pi$3 - radius,
8044           code = 0;
8045       if (lambda < -r) code |= 1; // left
8046       else if (lambda > r) code |= 2; // right
8047       if (phi < -r) code |= 4; // below
8048       else if (phi > r) code |= 8; // above
8049       return code;
8050     }
8051
8052     return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
8053   }
8054
8055   function clipLine(a, b, x0, y0, x1, y1) {
8056     var ax = a[0],
8057         ay = a[1],
8058         bx = b[0],
8059         by = b[1],
8060         t0 = 0,
8061         t1 = 1,
8062         dx = bx - ax,
8063         dy = by - ay,
8064         r;
8065
8066     r = x0 - ax;
8067     if (!dx && r > 0) return;
8068     r /= dx;
8069     if (dx < 0) {
8070       if (r < t0) return;
8071       if (r < t1) t1 = r;
8072     } else if (dx > 0) {
8073       if (r > t1) return;
8074       if (r > t0) t0 = r;
8075     }
8076
8077     r = x1 - ax;
8078     if (!dx && r < 0) return;
8079     r /= dx;
8080     if (dx < 0) {
8081       if (r > t1) return;
8082       if (r > t0) t0 = r;
8083     } else if (dx > 0) {
8084       if (r < t0) return;
8085       if (r < t1) t1 = r;
8086     }
8087
8088     r = y0 - ay;
8089     if (!dy && r > 0) return;
8090     r /= dy;
8091     if (dy < 0) {
8092       if (r < t0) return;
8093       if (r < t1) t1 = r;
8094     } else if (dy > 0) {
8095       if (r > t1) return;
8096       if (r > t0) t0 = r;
8097     }
8098
8099     r = y1 - ay;
8100     if (!dy && r < 0) return;
8101     r /= dy;
8102     if (dy < 0) {
8103       if (r > t1) return;
8104       if (r > t0) t0 = r;
8105     } else if (dy > 0) {
8106       if (r < t0) return;
8107       if (r < t1) t1 = r;
8108     }
8109
8110     if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
8111     if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
8112     return true;
8113   }
8114
8115   var clipMax = 1e9, clipMin = -clipMax;
8116
8117   // TODO Use d3-polygon’s polygonContains here for the ring check?
8118   // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
8119
8120   function clipRectangle(x0, y0, x1, y1) {
8121
8122     function visible(x, y) {
8123       return x0 <= x && x <= x1 && y0 <= y && y <= y1;
8124     }
8125
8126     function interpolate(from, to, direction, stream) {
8127       var a = 0, a1 = 0;
8128       if (from == null
8129           || (a = corner(from, direction)) !== (a1 = corner(to, direction))
8130           || comparePoint(from, to) < 0 ^ direction > 0) {
8131         do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
8132         while ((a = (a + direction + 4) % 4) !== a1);
8133       } else {
8134         stream.point(to[0], to[1]);
8135       }
8136     }
8137
8138     function corner(p, direction) {
8139       return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
8140           : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
8141           : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
8142           : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
8143     }
8144
8145     function compareIntersection(a, b) {
8146       return comparePoint(a.x, b.x);
8147     }
8148
8149     function comparePoint(a, b) {
8150       var ca = corner(a, 1),
8151           cb = corner(b, 1);
8152       return ca !== cb ? ca - cb
8153           : ca === 0 ? b[1] - a[1]
8154           : ca === 1 ? a[0] - b[0]
8155           : ca === 2 ? a[1] - b[1]
8156           : b[0] - a[0];
8157     }
8158
8159     return function(stream) {
8160       var activeStream = stream,
8161           bufferStream = clipBuffer(),
8162           segments,
8163           polygon,
8164           ring,
8165           x__, y__, v__, // first point
8166           x_, y_, v_, // previous point
8167           first,
8168           clean;
8169
8170       var clipStream = {
8171         point: point,
8172         lineStart: lineStart,
8173         lineEnd: lineEnd,
8174         polygonStart: polygonStart,
8175         polygonEnd: polygonEnd
8176       };
8177
8178       function point(x, y) {
8179         if (visible(x, y)) activeStream.point(x, y);
8180       }
8181
8182       function polygonInside() {
8183         var winding = 0;
8184
8185         for (var i = 0, n = polygon.length; i < n; ++i) {
8186           for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
8187             a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
8188             if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
8189             else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
8190           }
8191         }
8192
8193         return winding;
8194       }
8195
8196       // Buffer geometry within a polygon and then clip it en masse.
8197       function polygonStart() {
8198         activeStream = bufferStream, segments = [], polygon = [], clean = true;
8199       }
8200
8201       function polygonEnd() {
8202         var startInside = polygonInside(),
8203             cleanInside = clean && startInside,
8204             visible = (segments = merge(segments)).length;
8205         if (cleanInside || visible) {
8206           stream.polygonStart();
8207           if (cleanInside) {
8208             stream.lineStart();
8209             interpolate(null, null, 1, stream);
8210             stream.lineEnd();
8211           }
8212           if (visible) {
8213             clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
8214           }
8215           stream.polygonEnd();
8216         }
8217         activeStream = stream, segments = polygon = ring = null;
8218       }
8219
8220       function lineStart() {
8221         clipStream.point = linePoint;
8222         if (polygon) polygon.push(ring = []);
8223         first = true;
8224         v_ = false;
8225         x_ = y_ = NaN;
8226       }
8227
8228       // TODO rather than special-case polygons, simply handle them separately.
8229       // Ideally, coincident intersection points should be jittered to avoid
8230       // clipping issues.
8231       function lineEnd() {
8232         if (segments) {
8233           linePoint(x__, y__);
8234           if (v__ && v_) bufferStream.rejoin();
8235           segments.push(bufferStream.result());
8236         }
8237         clipStream.point = point;
8238         if (v_) activeStream.lineEnd();
8239       }
8240
8241       function linePoint(x, y) {
8242         var v = visible(x, y);
8243         if (polygon) ring.push([x, y]);
8244         if (first) {
8245           x__ = x, y__ = y, v__ = v;
8246           first = false;
8247           if (v) {
8248             activeStream.lineStart();
8249             activeStream.point(x, y);
8250           }
8251         } else {
8252           if (v && v_) activeStream.point(x, y);
8253           else {
8254             var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
8255                 b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
8256             if (clipLine(a, b, x0, y0, x1, y1)) {
8257               if (!v_) {
8258                 activeStream.lineStart();
8259                 activeStream.point(a[0], a[1]);
8260               }
8261               activeStream.point(b[0], b[1]);
8262               if (!v) activeStream.lineEnd();
8263               clean = false;
8264             } else if (v) {
8265               activeStream.lineStart();
8266               activeStream.point(x, y);
8267               clean = false;
8268             }
8269           }
8270         }
8271         x_ = x, y_ = y, v_ = v;
8272       }
8273
8274       return clipStream;
8275     };
8276   }
8277
8278   function extent$1() {
8279     var x0 = 0,
8280         y0 = 0,
8281         x1 = 960,
8282         y1 = 500,
8283         cache,
8284         cacheStream,
8285         clip;
8286
8287     return clip = {
8288       stream: function(stream) {
8289         return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
8290       },
8291       extent: function(_) {
8292         return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
8293       }
8294     };
8295   }
8296
8297   var lengthSum = adder(),
8298       lambda0$2,
8299       sinPhi0$1,
8300       cosPhi0$1;
8301
8302   var lengthStream = {
8303     sphere: noop$1,
8304     point: noop$1,
8305     lineStart: lengthLineStart,
8306     lineEnd: noop$1,
8307     polygonStart: noop$1,
8308     polygonEnd: noop$1
8309   };
8310
8311   function lengthLineStart() {
8312     lengthStream.point = lengthPointFirst;
8313     lengthStream.lineEnd = lengthLineEnd;
8314   }
8315
8316   function lengthLineEnd() {
8317     lengthStream.point = lengthStream.lineEnd = noop$1;
8318   }
8319
8320   function lengthPointFirst(lambda, phi) {
8321     lambda *= radians, phi *= radians;
8322     lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
8323     lengthStream.point = lengthPoint;
8324   }
8325
8326   function lengthPoint(lambda, phi) {
8327     lambda *= radians, phi *= radians;
8328     var sinPhi = sin$1(phi),
8329         cosPhi = cos$1(phi),
8330         delta = abs(lambda - lambda0$2),
8331         cosDelta = cos$1(delta),
8332         sinDelta = sin$1(delta),
8333         x = cosPhi * sinDelta,
8334         y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
8335         z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
8336     lengthSum.add(atan2(sqrt(x * x + y * y), z));
8337     lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
8338   }
8339
8340   function length$1(object) {
8341     lengthSum.reset();
8342     geoStream(object, lengthStream);
8343     return +lengthSum;
8344   }
8345
8346   var coordinates = [null, null],
8347       object$1 = {type: "LineString", coordinates: coordinates};
8348
8349   function distance(a, b) {
8350     coordinates[0] = a;
8351     coordinates[1] = b;
8352     return length$1(object$1);
8353   }
8354
8355   var containsObjectType = {
8356     Feature: function(object, point) {
8357       return containsGeometry(object.geometry, point);
8358     },
8359     FeatureCollection: function(object, point) {
8360       var features = object.features, i = -1, n = features.length;
8361       while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
8362       return false;
8363     }
8364   };
8365
8366   var containsGeometryType = {
8367     Sphere: function() {
8368       return true;
8369     },
8370     Point: function(object, point) {
8371       return containsPoint(object.coordinates, point);
8372     },
8373     MultiPoint: function(object, point) {
8374       var coordinates = object.coordinates, i = -1, n = coordinates.length;
8375       while (++i < n) if (containsPoint(coordinates[i], point)) return true;
8376       return false;
8377     },
8378     LineString: function(object, point) {
8379       return containsLine(object.coordinates, point);
8380     },
8381     MultiLineString: function(object, point) {
8382       var coordinates = object.coordinates, i = -1, n = coordinates.length;
8383       while (++i < n) if (containsLine(coordinates[i], point)) return true;
8384       return false;
8385     },
8386     Polygon: function(object, point) {
8387       return containsPolygon(object.coordinates, point);
8388     },
8389     MultiPolygon: function(object, point) {
8390       var coordinates = object.coordinates, i = -1, n = coordinates.length;
8391       while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
8392       return false;
8393     },
8394     GeometryCollection: function(object, point) {
8395       var geometries = object.geometries, i = -1, n = geometries.length;
8396       while (++i < n) if (containsGeometry(geometries[i], point)) return true;
8397       return false;
8398     }
8399   };
8400
8401   function containsGeometry(geometry, point) {
8402     return geometry && containsGeometryType.hasOwnProperty(geometry.type)
8403         ? containsGeometryType[geometry.type](geometry, point)
8404         : false;
8405   }
8406
8407   function containsPoint(coordinates, point) {
8408     return distance(coordinates, point) === 0;
8409   }
8410
8411   function containsLine(coordinates, point) {
8412     var ab = distance(coordinates[0], coordinates[1]),
8413         ao = distance(coordinates[0], point),
8414         ob = distance(point, coordinates[1]);
8415     return ao + ob <= ab + epsilon$2;
8416   }
8417
8418   function containsPolygon(coordinates, point) {
8419     return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
8420   }
8421
8422   function ringRadians(ring) {
8423     return ring = ring.map(pointRadians), ring.pop(), ring;
8424   }
8425
8426   function pointRadians(point) {
8427     return [point[0] * radians, point[1] * radians];
8428   }
8429
8430   function contains(object, point) {
8431     return (object && containsObjectType.hasOwnProperty(object.type)
8432         ? containsObjectType[object.type]
8433         : containsGeometry)(object, point);
8434   }
8435
8436   function graticuleX(y0, y1, dy) {
8437     var y = range(y0, y1 - epsilon$2, dy).concat(y1);
8438     return function(x) { return y.map(function(y) { return [x, y]; }); };
8439   }
8440
8441   function graticuleY(x0, x1, dx) {
8442     var x = range(x0, x1 - epsilon$2, dx).concat(x1);
8443     return function(y) { return x.map(function(x) { return [x, y]; }); };
8444   }
8445
8446   function graticule() {
8447     var x1, x0, X1, X0,
8448         y1, y0, Y1, Y0,
8449         dx = 10, dy = dx, DX = 90, DY = 360,
8450         x, y, X, Y,
8451         precision = 2.5;
8452
8453     function graticule() {
8454       return {type: "MultiLineString", coordinates: lines()};
8455     }
8456
8457     function lines() {
8458       return range(ceil(X0 / DX) * DX, X1, DX).map(X)
8459           .concat(range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
8460           .concat(range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x))
8461           .concat(range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y));
8462     }
8463
8464     graticule.lines = function() {
8465       return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
8466     };
8467
8468     graticule.outline = function() {
8469       return {
8470         type: "Polygon",
8471         coordinates: [
8472           X(X0).concat(
8473           Y(Y1).slice(1),
8474           X(X1).reverse().slice(1),
8475           Y(Y0).reverse().slice(1))
8476         ]
8477       };
8478     };
8479
8480     graticule.extent = function(_) {
8481       if (!arguments.length) return graticule.extentMinor();
8482       return graticule.extentMajor(_).extentMinor(_);
8483     };
8484
8485     graticule.extentMajor = function(_) {
8486       if (!arguments.length) return [[X0, Y0], [X1, Y1]];
8487       X0 = +_[0][0], X1 = +_[1][0];
8488       Y0 = +_[0][1], Y1 = +_[1][1];
8489       if (X0 > X1) _ = X0, X0 = X1, X1 = _;
8490       if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
8491       return graticule.precision(precision);
8492     };
8493
8494     graticule.extentMinor = function(_) {
8495       if (!arguments.length) return [[x0, y0], [x1, y1]];
8496       x0 = +_[0][0], x1 = +_[1][0];
8497       y0 = +_[0][1], y1 = +_[1][1];
8498       if (x0 > x1) _ = x0, x0 = x1, x1 = _;
8499       if (y0 > y1) _ = y0, y0 = y1, y1 = _;
8500       return graticule.precision(precision);
8501     };
8502
8503     graticule.step = function(_) {
8504       if (!arguments.length) return graticule.stepMinor();
8505       return graticule.stepMajor(_).stepMinor(_);
8506     };
8507
8508     graticule.stepMajor = function(_) {
8509       if (!arguments.length) return [DX, DY];
8510       DX = +_[0], DY = +_[1];
8511       return graticule;
8512     };
8513
8514     graticule.stepMinor = function(_) {
8515       if (!arguments.length) return [dx, dy];
8516       dx = +_[0], dy = +_[1];
8517       return graticule;
8518     };
8519
8520     graticule.precision = function(_) {
8521       if (!arguments.length) return precision;
8522       precision = +_;
8523       x = graticuleX(y0, y1, 90);
8524       y = graticuleY(x0, x1, precision);
8525       X = graticuleX(Y0, Y1, 90);
8526       Y = graticuleY(X0, X1, precision);
8527       return graticule;
8528     };
8529
8530     return graticule
8531         .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
8532         .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
8533   }
8534
8535   function graticule10() {
8536     return graticule()();
8537   }
8538
8539   function interpolate$2(a, b) {
8540     var x0 = a[0] * radians,
8541         y0 = a[1] * radians,
8542         x1 = b[0] * radians,
8543         y1 = b[1] * radians,
8544         cy0 = cos$1(y0),
8545         sy0 = sin$1(y0),
8546         cy1 = cos$1(y1),
8547         sy1 = sin$1(y1),
8548         kx0 = cy0 * cos$1(x0),
8549         ky0 = cy0 * sin$1(x0),
8550         kx1 = cy1 * cos$1(x1),
8551         ky1 = cy1 * sin$1(x1),
8552         d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
8553         k = sin$1(d);
8554
8555     var interpolate = d ? function(t) {
8556       var B = sin$1(t *= d) / k,
8557           A = sin$1(d - t) / k,
8558           x = A * kx0 + B * kx1,
8559           y = A * ky0 + B * ky1,
8560           z = A * sy0 + B * sy1;
8561       return [
8562         atan2(y, x) * degrees$1,
8563         atan2(z, sqrt(x * x + y * y)) * degrees$1
8564       ];
8565     } : function() {
8566       return [x0 * degrees$1, y0 * degrees$1];
8567     };
8568
8569     interpolate.distance = d;
8570
8571     return interpolate;
8572   }
8573
8574   function identity$4(x) {
8575     return x;
8576   }
8577
8578   var areaSum$1 = adder(),
8579       areaRingSum$1 = adder(),
8580       x00,
8581       y00,
8582       x0$1,
8583       y0$1;
8584
8585   var areaStream$1 = {
8586     point: noop$1,
8587     lineStart: noop$1,
8588     lineEnd: noop$1,
8589     polygonStart: function() {
8590       areaStream$1.lineStart = areaRingStart$1;
8591       areaStream$1.lineEnd = areaRingEnd$1;
8592     },
8593     polygonEnd: function() {
8594       areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$1;
8595       areaSum$1.add(abs(areaRingSum$1));
8596       areaRingSum$1.reset();
8597     },
8598     result: function() {
8599       var area = areaSum$1 / 2;
8600       areaSum$1.reset();
8601       return area;
8602     }
8603   };
8604
8605   function areaRingStart$1() {
8606     areaStream$1.point = areaPointFirst$1;
8607   }
8608
8609   function areaPointFirst$1(x, y) {
8610     areaStream$1.point = areaPoint$1;
8611     x00 = x0$1 = x, y00 = y0$1 = y;
8612   }
8613
8614   function areaPoint$1(x, y) {
8615     areaRingSum$1.add(y0$1 * x - x0$1 * y);
8616     x0$1 = x, y0$1 = y;
8617   }
8618
8619   function areaRingEnd$1() {
8620     areaPoint$1(x00, y00);
8621   }
8622
8623   var x0$2 = Infinity,
8624       y0$2 = x0$2,
8625       x1 = -x0$2,
8626       y1 = x1;
8627
8628   var boundsStream$1 = {
8629     point: boundsPoint$1,
8630     lineStart: noop$1,
8631     lineEnd: noop$1,
8632     polygonStart: noop$1,
8633     polygonEnd: noop$1,
8634     result: function() {
8635       var bounds = [[x0$2, y0$2], [x1, y1]];
8636       x1 = y1 = -(y0$2 = x0$2 = Infinity);
8637       return bounds;
8638     }
8639   };
8640
8641   function boundsPoint$1(x, y) {
8642     if (x < x0$2) x0$2 = x;
8643     if (x > x1) x1 = x;
8644     if (y < y0$2) y0$2 = y;
8645     if (y > y1) y1 = y;
8646   }
8647
8648   // TODO Enforce positive area for exterior, negative area for interior?
8649
8650   var X0$1 = 0,
8651       Y0$1 = 0,
8652       Z0$1 = 0,
8653       X1$1 = 0,
8654       Y1$1 = 0,
8655       Z1$1 = 0,
8656       X2$1 = 0,
8657       Y2$1 = 0,
8658       Z2$1 = 0,
8659       x00$1,
8660       y00$1,
8661       x0$3,
8662       y0$3;
8663
8664   var centroidStream$1 = {
8665     point: centroidPoint$1,
8666     lineStart: centroidLineStart$1,
8667     lineEnd: centroidLineEnd$1,
8668     polygonStart: function() {
8669       centroidStream$1.lineStart = centroidRingStart$1;
8670       centroidStream$1.lineEnd = centroidRingEnd$1;
8671     },
8672     polygonEnd: function() {
8673       centroidStream$1.point = centroidPoint$1;
8674       centroidStream$1.lineStart = centroidLineStart$1;
8675       centroidStream$1.lineEnd = centroidLineEnd$1;
8676     },
8677     result: function() {
8678       var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
8679           : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
8680           : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
8681           : [NaN, NaN];
8682       X0$1 = Y0$1 = Z0$1 =
8683       X1$1 = Y1$1 = Z1$1 =
8684       X2$1 = Y2$1 = Z2$1 = 0;
8685       return centroid;
8686     }
8687   };
8688
8689   function centroidPoint$1(x, y) {
8690     X0$1 += x;
8691     Y0$1 += y;
8692     ++Z0$1;
8693   }
8694
8695   function centroidLineStart$1() {
8696     centroidStream$1.point = centroidPointFirstLine;
8697   }
8698
8699   function centroidPointFirstLine(x, y) {
8700     centroidStream$1.point = centroidPointLine;
8701     centroidPoint$1(x0$3 = x, y0$3 = y);
8702   }
8703
8704   function centroidPointLine(x, y) {
8705     var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
8706     X1$1 += z * (x0$3 + x) / 2;
8707     Y1$1 += z * (y0$3 + y) / 2;
8708     Z1$1 += z;
8709     centroidPoint$1(x0$3 = x, y0$3 = y);
8710   }
8711
8712   function centroidLineEnd$1() {
8713     centroidStream$1.point = centroidPoint$1;
8714   }
8715
8716   function centroidRingStart$1() {
8717     centroidStream$1.point = centroidPointFirstRing;
8718   }
8719
8720   function centroidRingEnd$1() {
8721     centroidPointRing(x00$1, y00$1);
8722   }
8723
8724   function centroidPointFirstRing(x, y) {
8725     centroidStream$1.point = centroidPointRing;
8726     centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
8727   }
8728
8729   function centroidPointRing(x, y) {
8730     var dx = x - x0$3,
8731         dy = y - y0$3,
8732         z = sqrt(dx * dx + dy * dy);
8733
8734     X1$1 += z * (x0$3 + x) / 2;
8735     Y1$1 += z * (y0$3 + y) / 2;
8736     Z1$1 += z;
8737
8738     z = y0$3 * x - x0$3 * y;
8739     X2$1 += z * (x0$3 + x);
8740     Y2$1 += z * (y0$3 + y);
8741     Z2$1 += z * 3;
8742     centroidPoint$1(x0$3 = x, y0$3 = y);
8743   }
8744
8745   function PathContext(context) {
8746     this._context = context;
8747   }
8748
8749   PathContext.prototype = {
8750     _radius: 4.5,
8751     pointRadius: function(_) {
8752       return this._radius = _, this;
8753     },
8754     polygonStart: function() {
8755       this._line = 0;
8756     },
8757     polygonEnd: function() {
8758       this._line = NaN;
8759     },
8760     lineStart: function() {
8761       this._point = 0;
8762     },
8763     lineEnd: function() {
8764       if (this._line === 0) this._context.closePath();
8765       this._point = NaN;
8766     },
8767     point: function(x, y) {
8768       switch (this._point) {
8769         case 0: {
8770           this._context.moveTo(x, y);
8771           this._point = 1;
8772           break;
8773         }
8774         case 1: {
8775           this._context.lineTo(x, y);
8776           break;
8777         }
8778         default: {
8779           this._context.moveTo(x + this._radius, y);
8780           this._context.arc(x, y, this._radius, 0, tau$3);
8781           break;
8782         }
8783       }
8784     },
8785     result: noop$1
8786   };
8787
8788   var lengthSum$1 = adder(),
8789       lengthRing,
8790       x00$2,
8791       y00$2,
8792       x0$4,
8793       y0$4;
8794
8795   var lengthStream$1 = {
8796     point: noop$1,
8797     lineStart: function() {
8798       lengthStream$1.point = lengthPointFirst$1;
8799     },
8800     lineEnd: function() {
8801       if (lengthRing) lengthPoint$1(x00$2, y00$2);
8802       lengthStream$1.point = noop$1;
8803     },
8804     polygonStart: function() {
8805       lengthRing = true;
8806     },
8807     polygonEnd: function() {
8808       lengthRing = null;
8809     },
8810     result: function() {
8811       var length = +lengthSum$1;
8812       lengthSum$1.reset();
8813       return length;
8814     }
8815   };
8816
8817   function lengthPointFirst$1(x, y) {
8818     lengthStream$1.point = lengthPoint$1;
8819     x00$2 = x0$4 = x, y00$2 = y0$4 = y;
8820   }
8821
8822   function lengthPoint$1(x, y) {
8823     x0$4 -= x, y0$4 -= y;
8824     lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
8825     x0$4 = x, y0$4 = y;
8826   }
8827
8828   function PathString() {
8829     this._string = [];
8830   }
8831
8832   PathString.prototype = {
8833     _radius: 4.5,
8834     _circle: circle$1(4.5),
8835     pointRadius: function(_) {
8836       if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
8837       return this;
8838     },
8839     polygonStart: function() {
8840       this._line = 0;
8841     },
8842     polygonEnd: function() {
8843       this._line = NaN;
8844     },
8845     lineStart: function() {
8846       this._point = 0;
8847     },
8848     lineEnd: function() {
8849       if (this._line === 0) this._string.push("Z");
8850       this._point = NaN;
8851     },
8852     point: function(x, y) {
8853       switch (this._point) {
8854         case 0: {
8855           this._string.push("M", x, ",", y);
8856           this._point = 1;
8857           break;
8858         }
8859         case 1: {
8860           this._string.push("L", x, ",", y);
8861           break;
8862         }
8863         default: {
8864           if (this._circle == null) this._circle = circle$1(this._radius);
8865           this._string.push("M", x, ",", y, this._circle);
8866           break;
8867         }
8868       }
8869     },
8870     result: function() {
8871       if (this._string.length) {
8872         var result = this._string.join("");
8873         this._string = [];
8874         return result;
8875       } else {
8876         return null;
8877       }
8878     }
8879   };
8880
8881   function circle$1(radius) {
8882     return "m0," + radius
8883         + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
8884         + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
8885         + "z";
8886   }
8887
8888   function d3_geoPath(projection, context) {
8889     var pointRadius = 4.5,
8890         projectionStream,
8891         contextStream;
8892
8893     function path(object) {
8894       if (object) {
8895         if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
8896         geoStream(object, projectionStream(contextStream));
8897       }
8898       return contextStream.result();
8899     }
8900
8901     path.area = function(object) {
8902       geoStream(object, projectionStream(areaStream$1));
8903       return areaStream$1.result();
8904     };
8905
8906     path.measure = function(object) {
8907       geoStream(object, projectionStream(lengthStream$1));
8908       return lengthStream$1.result();
8909     };
8910
8911     path.bounds = function(object) {
8912       geoStream(object, projectionStream(boundsStream$1));
8913       return boundsStream$1.result();
8914     };
8915
8916     path.centroid = function(object) {
8917       geoStream(object, projectionStream(centroidStream$1));
8918       return centroidStream$1.result();
8919     };
8920
8921     path.projection = function(_) {
8922       return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
8923     };
8924
8925     path.context = function(_) {
8926       if (!arguments.length) return context;
8927       contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
8928       if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
8929       return path;
8930     };
8931
8932     path.pointRadius = function(_) {
8933       if (!arguments.length) return pointRadius;
8934       pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
8935       return path;
8936     };
8937
8938     return path.projection(projection).context(context);
8939   }
8940
8941   function d3_geoTransform(methods) {
8942     return {
8943       stream: transformer(methods)
8944     };
8945   }
8946
8947   function transformer(methods) {
8948     return function(stream) {
8949       var s = new TransformStream;
8950       for (var key in methods) s[key] = methods[key];
8951       s.stream = stream;
8952       return s;
8953     };
8954   }
8955
8956   function TransformStream() {}
8957
8958   TransformStream.prototype = {
8959     constructor: TransformStream,
8960     point: function(x, y) { this.stream.point(x, y); },
8961     sphere: function() { this.stream.sphere(); },
8962     lineStart: function() { this.stream.lineStart(); },
8963     lineEnd: function() { this.stream.lineEnd(); },
8964     polygonStart: function() { this.stream.polygonStart(); },
8965     polygonEnd: function() { this.stream.polygonEnd(); }
8966   };
8967
8968   function fit(projection, fitBounds, object) {
8969     var clip = projection.clipExtent && projection.clipExtent();
8970     projection.scale(150).translate([0, 0]);
8971     if (clip != null) projection.clipExtent(null);
8972     geoStream(object, projection.stream(boundsStream$1));
8973     fitBounds(boundsStream$1.result());
8974     if (clip != null) projection.clipExtent(clip);
8975     return projection;
8976   }
8977
8978   function fitExtent(projection, extent, object) {
8979     return fit(projection, function(b) {
8980       var w = extent[1][0] - extent[0][0],
8981           h = extent[1][1] - extent[0][1],
8982           k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
8983           x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
8984           y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
8985       projection.scale(150 * k).translate([x, y]);
8986     }, object);
8987   }
8988
8989   function fitSize(projection, size, object) {
8990     return fitExtent(projection, [[0, 0], size], object);
8991   }
8992
8993   function fitWidth(projection, width, object) {
8994     return fit(projection, function(b) {
8995       var w = +width,
8996           k = w / (b[1][0] - b[0][0]),
8997           x = (w - k * (b[1][0] + b[0][0])) / 2,
8998           y = -k * b[0][1];
8999       projection.scale(150 * k).translate([x, y]);
9000     }, object);
9001   }
9002
9003   function fitHeight(projection, height, object) {
9004     return fit(projection, function(b) {
9005       var h = +height,
9006           k = h / (b[1][1] - b[0][1]),
9007           x = -k * b[0][0],
9008           y = (h - k * (b[1][1] + b[0][1])) / 2;
9009       projection.scale(150 * k).translate([x, y]);
9010     }, object);
9011   }
9012
9013   var maxDepth = 16, // maximum depth of subdivision
9014       cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
9015
9016   function resample(project, delta2) {
9017     return +delta2 ? resample$1(project, delta2) : resampleNone(project);
9018   }
9019
9020   function resampleNone(project) {
9021     return transformer({
9022       point: function(x, y) {
9023         x = project(x, y);
9024         this.stream.point(x[0], x[1]);
9025       }
9026     });
9027   }
9028
9029   function resample$1(project, delta2) {
9030
9031     function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
9032       var dx = x1 - x0,
9033           dy = y1 - y0,
9034           d2 = dx * dx + dy * dy;
9035       if (d2 > 4 * delta2 && depth--) {
9036         var a = a0 + a1,
9037             b = b0 + b1,
9038             c = c0 + c1,
9039             m = sqrt(a * a + b * b + c * c),
9040             phi2 = asin(c /= m),
9041             lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
9042             p = project(lambda2, phi2),
9043             x2 = p[0],
9044             y2 = p[1],
9045             dx2 = x2 - x0,
9046             dy2 = y2 - y0,
9047             dz = dy * dx2 - dx * dy2;
9048         if (dz * dz / d2 > delta2 // perpendicular projected distance
9049             || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
9050             || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
9051           resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
9052           stream.point(x2, y2);
9053           resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
9054         }
9055       }
9056     }
9057     return function(stream) {
9058       var lambda00, x00, y00, a00, b00, c00, // first point
9059           lambda0, x0, y0, a0, b0, c0; // previous point
9060
9061       var resampleStream = {
9062         point: point,
9063         lineStart: lineStart,
9064         lineEnd: lineEnd,
9065         polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
9066         polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
9067       };
9068
9069       function point(x, y) {
9070         x = project(x, y);
9071         stream.point(x[0], x[1]);
9072       }
9073
9074       function lineStart() {
9075         x0 = NaN;
9076         resampleStream.point = linePoint;
9077         stream.lineStart();
9078       }
9079
9080       function linePoint(lambda, phi) {
9081         var c = cartesian([lambda, phi]), p = project(lambda, phi);
9082         resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
9083         stream.point(x0, y0);
9084       }
9085
9086       function lineEnd() {
9087         resampleStream.point = point;
9088         stream.lineEnd();
9089       }
9090
9091       function ringStart() {
9092         lineStart();
9093         resampleStream.point = ringPoint;
9094         resampleStream.lineEnd = ringEnd;
9095       }
9096
9097       function ringPoint(lambda, phi) {
9098         linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
9099         resampleStream.point = linePoint;
9100       }
9101
9102       function ringEnd() {
9103         resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
9104         resampleStream.lineEnd = lineEnd;
9105         lineEnd();
9106       }
9107
9108       return resampleStream;
9109     };
9110   }
9111
9112   var transformRadians = transformer({
9113     point: function(x, y) {
9114       this.stream.point(x * radians, y * radians);
9115     }
9116   });
9117
9118   function transformRotate(rotate) {
9119     return transformer({
9120       point: function(x, y) {
9121         var r = rotate(x, y);
9122         return this.stream.point(r[0], r[1]);
9123       }
9124     });
9125   }
9126
9127   function projection(project) {
9128     return projectionMutator(function() { return project; })();
9129   }
9130
9131   function projectionMutator(projectAt) {
9132     var project,
9133         k = 150, // scale
9134         x = 480, y = 250, // translate
9135         dx, dy, lambda = 0, phi = 0, // center
9136         deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, projectRotate, // rotate
9137         theta = null, preclip = clipAntimeridian, // clip angle
9138         x0 = null, y0, x1, y1, postclip = identity$4, // clip extent
9139         delta2 = 0.5, projectResample = resample(projectTransform, delta2), // precision
9140         cache,
9141         cacheStream;
9142
9143     function projection(point) {
9144       point = projectRotate(point[0] * radians, point[1] * radians);
9145       return [point[0] * k + dx, dy - point[1] * k];
9146     }
9147
9148     function invert(point) {
9149       point = projectRotate.invert((point[0] - dx) / k, (dy - point[1]) / k);
9150       return point && [point[0] * degrees$1, point[1] * degrees$1];
9151     }
9152
9153     function projectTransform(x, y) {
9154       return x = project(x, y), [x[0] * k + dx, dy - x[1] * k];
9155     }
9156
9157     projection.stream = function(stream) {
9158       return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
9159     };
9160
9161     projection.preclip = function(_) {
9162       return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
9163     };
9164
9165     projection.postclip = function(_) {
9166       return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9167     };
9168
9169     projection.clipAngle = function(_) {
9170       return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
9171     };
9172
9173     projection.clipExtent = function(_) {
9174       return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9175     };
9176
9177     projection.scale = function(_) {
9178       return arguments.length ? (k = +_, recenter()) : k;
9179     };
9180
9181     projection.translate = function(_) {
9182       return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
9183     };
9184
9185     projection.center = function(_) {
9186       return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
9187     };
9188
9189     projection.rotate = function(_) {
9190       return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1];
9191     };
9192
9193     projection.precision = function(_) {
9194       return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
9195     };
9196
9197     projection.fitExtent = function(extent, object) {
9198       return fitExtent(projection, extent, object);
9199     };
9200
9201     projection.fitSize = function(size, object) {
9202       return fitSize(projection, size, object);
9203     };
9204
9205     projection.fitWidth = function(width, object) {
9206       return fitWidth(projection, width, object);
9207     };
9208
9209     projection.fitHeight = function(height, object) {
9210       return fitHeight(projection, height, object);
9211     };
9212
9213     function recenter() {
9214       projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project);
9215       var center = project(lambda, phi);
9216       dx = x - center[0] * k;
9217       dy = y + center[1] * k;
9218       return reset();
9219     }
9220
9221     function reset() {
9222       cache = cacheStream = null;
9223       return projection;
9224     }
9225
9226     return function() {
9227       project = projectAt.apply(this, arguments);
9228       projection.invert = project.invert && invert;
9229       return recenter();
9230     };
9231   }
9232
9233   function conicProjection(projectAt) {
9234     var phi0 = 0,
9235         phi1 = pi$3 / 3,
9236         m = projectionMutator(projectAt),
9237         p = m(phi0, phi1);
9238
9239     p.parallels = function(_) {
9240       return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
9241     };
9242
9243     return p;
9244   }
9245
9246   function cylindricalEqualAreaRaw(phi0) {
9247     var cosPhi0 = cos$1(phi0);
9248
9249     function forward(lambda, phi) {
9250       return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
9251     }
9252
9253     forward.invert = function(x, y) {
9254       return [x / cosPhi0, asin(y * cosPhi0)];
9255     };
9256
9257     return forward;
9258   }
9259
9260   function conicEqualAreaRaw(y0, y1) {
9261     var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
9262
9263     // Are the parallels symmetrical around the Equator?
9264     if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
9265
9266     var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
9267
9268     function project(x, y) {
9269       var r = sqrt(c - 2 * n * sin$1(y)) / n;
9270       return [r * sin$1(x *= n), r0 - r * cos$1(x)];
9271     }
9272
9273     project.invert = function(x, y) {
9274       var r0y = r0 - y;
9275       return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
9276     };
9277
9278     return project;
9279   }
9280
9281   function conicEqualArea() {
9282     return conicProjection(conicEqualAreaRaw)
9283         .scale(155.424)
9284         .center([0, 33.6442]);
9285   }
9286
9287   function albers() {
9288     return conicEqualArea()
9289         .parallels([29.5, 45.5])
9290         .scale(1070)
9291         .translate([480, 250])
9292         .rotate([96, 0])
9293         .center([-0.6, 38.7]);
9294   }
9295
9296   // The projections must have mutually exclusive clip regions on the sphere,
9297   // as this will avoid emitting interleaving lines and polygons.
9298   function multiplex(streams) {
9299     var n = streams.length;
9300     return {
9301       point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
9302       sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
9303       lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
9304       lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
9305       polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
9306       polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
9307     };
9308   }
9309
9310   // A composite projection for the United States, configured by default for
9311   // 960×500. The projection also works quite well at 960×600 if you change the
9312   // scale to 1285 and adjust the translate accordingly. The set of standard
9313   // parallels for each region comes from USGS, which is published here:
9314   // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
9315   function albersUsa() {
9316     var cache,
9317         cacheStream,
9318         lower48 = albers(), lower48Point,
9319         alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
9320         hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
9321         point, pointStream = {point: function(x, y) { point = [x, y]; }};
9322
9323     function albersUsa(coordinates) {
9324       var x = coordinates[0], y = coordinates[1];
9325       return point = null,
9326           (lower48Point.point(x, y), point)
9327           || (alaskaPoint.point(x, y), point)
9328           || (hawaiiPoint.point(x, y), point);
9329     }
9330
9331     albersUsa.invert = function(coordinates) {
9332       var k = lower48.scale(),
9333           t = lower48.translate(),
9334           x = (coordinates[0] - t[0]) / k,
9335           y = (coordinates[1] - t[1]) / k;
9336       return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
9337           : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
9338           : lower48).invert(coordinates);
9339     };
9340
9341     albersUsa.stream = function(stream) {
9342       return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9343     };
9344
9345     albersUsa.precision = function(_) {
9346       if (!arguments.length) return lower48.precision();
9347       lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9348       return reset();
9349     };
9350
9351     albersUsa.scale = function(_) {
9352       if (!arguments.length) return lower48.scale();
9353       lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
9354       return albersUsa.translate(lower48.translate());
9355     };
9356
9357     albersUsa.translate = function(_) {
9358       if (!arguments.length) return lower48.translate();
9359       var k = lower48.scale(), x = +_[0], y = +_[1];
9360
9361       lower48Point = lower48
9362           .translate(_)
9363           .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9364           .stream(pointStream);
9365
9366       alaskaPoint = alaska
9367           .translate([x - 0.307 * k, y + 0.201 * k])
9368           .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2], [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
9369           .stream(pointStream);
9370
9371       hawaiiPoint = hawaii
9372           .translate([x - 0.205 * k, y + 0.212 * k])
9373           .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2], [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
9374           .stream(pointStream);
9375
9376       return reset();
9377     };
9378
9379     albersUsa.fitExtent = function(extent, object) {
9380       return fitExtent(albersUsa, extent, object);
9381     };
9382
9383     albersUsa.fitSize = function(size, object) {
9384       return fitSize(albersUsa, size, object);
9385     };
9386
9387     albersUsa.fitWidth = function(width, object) {
9388       return fitWidth(albersUsa, width, object);
9389     };
9390
9391     albersUsa.fitHeight = function(height, object) {
9392       return fitHeight(albersUsa, height, object);
9393     };
9394
9395     function reset() {
9396       cache = cacheStream = null;
9397       return albersUsa;
9398     }
9399
9400     return albersUsa.scale(1070);
9401   }
9402
9403   function azimuthalRaw(scale) {
9404     return function(x, y) {
9405       var cx = cos$1(x),
9406           cy = cos$1(y),
9407           k = scale(cx * cy);
9408       return [
9409         k * cy * sin$1(x),
9410         k * sin$1(y)
9411       ];
9412     }
9413   }
9414
9415   function azimuthalInvert(angle) {
9416     return function(x, y) {
9417       var z = sqrt(x * x + y * y),
9418           c = angle(z),
9419           sc = sin$1(c),
9420           cc = cos$1(c);
9421       return [
9422         atan2(x * sc, z * cc),
9423         asin(z && y * sc / z)
9424       ];
9425     }
9426   }
9427
9428   var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9429     return sqrt(2 / (1 + cxcy));
9430   });
9431
9432   azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9433     return 2 * asin(z / 2);
9434   });
9435
9436   function azimuthalEqualArea() {
9437     return projection(azimuthalEqualAreaRaw)
9438         .scale(124.75)
9439         .clipAngle(180 - 1e-3);
9440   }
9441
9442   var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9443     return (c = acos(c)) && c / sin$1(c);
9444   });
9445
9446   azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9447     return z;
9448   });
9449
9450   function azimuthalEquidistant() {
9451     return projection(azimuthalEquidistantRaw)
9452         .scale(79.4188)
9453         .clipAngle(180 - 1e-3);
9454   }
9455
9456   function mercatorRaw(lambda, phi) {
9457     return [lambda, log(tan((halfPi$2 + phi) / 2))];
9458   }
9459
9460   mercatorRaw.invert = function(x, y) {
9461     return [x, 2 * atan(exp(y)) - halfPi$2];
9462   };
9463
9464   function mercator() {
9465     return mercatorProjection(mercatorRaw)
9466         .scale(961 / tau$3);
9467   }
9468
9469   function mercatorProjection(project) {
9470     var m = projection(project),
9471         center = m.center,
9472         scale = m.scale,
9473         translate = m.translate,
9474         clipExtent = m.clipExtent,
9475         x0 = null, y0, x1, y1; // clip extent
9476
9477     m.scale = function(_) {
9478       return arguments.length ? (scale(_), reclip()) : scale();
9479     };
9480
9481     m.translate = function(_) {
9482       return arguments.length ? (translate(_), reclip()) : translate();
9483     };
9484
9485     m.center = function(_) {
9486       return arguments.length ? (center(_), reclip()) : center();
9487     };
9488
9489     m.clipExtent = function(_) {
9490       return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9491     };
9492
9493     function reclip() {
9494       var k = pi$3 * scale(),
9495           t = m(rotation(m.rotate()).invert([0, 0]));
9496       return clipExtent(x0 == null
9497           ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
9498           ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
9499           : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
9500     }
9501
9502     return reclip();
9503   }
9504
9505   function tany(y) {
9506     return tan((halfPi$2 + y) / 2);
9507   }
9508
9509   function conicConformalRaw(y0, y1) {
9510     var cy0 = cos$1(y0),
9511         n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
9512         f = cy0 * pow(tany(y0), n) / n;
9513
9514     if (!n) return mercatorRaw;
9515
9516     function project(x, y) {
9517       if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
9518       else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
9519       var r = f / pow(tany(y), n);
9520       return [r * sin$1(n * x), f - r * cos$1(n * x)];
9521     }
9522
9523     project.invert = function(x, y) {
9524       var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);
9525       return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
9526     };
9527
9528     return project;
9529   }
9530
9531   function conicConformal() {
9532     return conicProjection(conicConformalRaw)
9533         .scale(109.5)
9534         .parallels([30, 30]);
9535   }
9536
9537   function equirectangularRaw(lambda, phi) {
9538     return [lambda, phi];
9539   }
9540
9541   equirectangularRaw.invert = equirectangularRaw;
9542
9543   function equirectangular() {
9544     return projection(equirectangularRaw)
9545         .scale(152.63);
9546   }
9547
9548   function conicEquidistantRaw(y0, y1) {
9549     var cy0 = cos$1(y0),
9550         n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9551         g = cy0 / n + y0;
9552
9553     if (abs(n) < epsilon$2) return equirectangularRaw;
9554
9555     function project(x, y) {
9556       var gy = g - y, nx = n * x;
9557       return [gy * sin$1(nx), g - gy * cos$1(nx)];
9558     }
9559
9560     project.invert = function(x, y) {
9561       var gy = g - y;
9562       return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9563     };
9564
9565     return project;
9566   }
9567
9568   function conicEquidistant() {
9569     return conicProjection(conicEquidistantRaw)
9570         .scale(131.154)
9571         .center([0, 13.9389]);
9572   }
9573
9574   function gnomonicRaw(x, y) {
9575     var cy = cos$1(y), k = cos$1(x) * cy;
9576     return [cy * sin$1(x) / k, sin$1(y) / k];
9577   }
9578
9579   gnomonicRaw.invert = azimuthalInvert(atan);
9580
9581   function gnomonic() {
9582     return projection(gnomonicRaw)
9583         .scale(144.049)
9584         .clipAngle(60);
9585   }
9586
9587   function scaleTranslate(kx, ky, tx, ty) {
9588     return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
9589       point: function(x, y) {
9590         this.stream.point(x * kx + tx, y * ky + ty);
9591       }
9592     });
9593   }
9594
9595   function d3_geoIdentity() {
9596     var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
9597         x0 = null, y0, x1, y1, // clip extent
9598         postclip = identity$4,
9599         cache,
9600         cacheStream,
9601         projection;
9602
9603     function reset() {
9604       cache = cacheStream = null;
9605       return projection;
9606     }
9607
9608     return projection = {
9609       stream: function(stream) {
9610         return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9611       },
9612       postclip: function(_) {
9613         return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9614       },
9615       clipExtent: function(_) {
9616         return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9617       },
9618       scale: function(_) {
9619         return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9620       },
9621       translate: function(_) {
9622         return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9623       },
9624       reflectX: function(_) {
9625         return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9626       },
9627       reflectY: function(_) {
9628         return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9629       },
9630       fitExtent: function(extent, object) {
9631         return fitExtent(projection, extent, object);
9632       },
9633       fitSize: function(size, object) {
9634         return fitSize(projection, size, object);
9635       },
9636       fitWidth: function(width, object) {
9637         return fitWidth(projection, width, object);
9638       },
9639       fitHeight: function(height, object) {
9640         return fitHeight(projection, height, object);
9641       }
9642     };
9643   }
9644
9645   function naturalEarth1Raw(lambda, phi) {
9646     var phi2 = phi * phi, phi4 = phi2 * phi2;
9647     return [
9648       lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
9649       phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
9650     ];
9651   }
9652
9653   naturalEarth1Raw.invert = function(x, y) {
9654     var phi = y, i = 25, delta;
9655     do {
9656       var phi2 = phi * phi, phi4 = phi2 * phi2;
9657       phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
9658           (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
9659     } while (abs(delta) > epsilon$2 && --i > 0);
9660     return [
9661       x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9662       phi
9663     ];
9664   };
9665
9666   function naturalEarth1() {
9667     return projection(naturalEarth1Raw)
9668         .scale(175.295);
9669   }
9670
9671   function orthographicRaw(x, y) {
9672     return [cos$1(y) * sin$1(x), sin$1(y)];
9673   }
9674
9675   orthographicRaw.invert = azimuthalInvert(asin);
9676
9677   function orthographic() {
9678     return projection(orthographicRaw)
9679         .scale(249.5)
9680         .clipAngle(90 + epsilon$2);
9681   }
9682
9683   function stereographicRaw(x, y) {
9684     var cy = cos$1(y), k = 1 + cos$1(x) * cy;
9685     return [cy * sin$1(x) / k, sin$1(y) / k];
9686   }
9687
9688   stereographicRaw.invert = azimuthalInvert(function(z) {
9689     return 2 * atan(z);
9690   });
9691
9692   function stereographic() {
9693     return projection(stereographicRaw)
9694         .scale(250)
9695         .clipAngle(142);
9696   }
9697
9698   function transverseMercatorRaw(lambda, phi) {
9699     return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9700   }
9701
9702   transverseMercatorRaw.invert = function(x, y) {
9703     return [-y, 2 * atan(exp(x)) - halfPi$2];
9704   };
9705
9706   function transverseMercator() {
9707     var m = mercatorProjection(transverseMercatorRaw),
9708         center = m.center,
9709         rotate = m.rotate;
9710
9711     m.center = function(_) {
9712       return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9713     };
9714
9715     m.rotate = function(_) {
9716       return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9717     };
9718
9719     return rotate([0, 0, 90])
9720         .scale(159.155);
9721   }
9722
9723   function defaultSeparation(a, b) {
9724     return a.parent === b.parent ? 1 : 2;
9725   }
9726
9727   function meanX(children) {
9728     return children.reduce(meanXReduce, 0) / children.length;
9729   }
9730
9731   function meanXReduce(x, c) {
9732     return x + c.x;
9733   }
9734
9735   function maxY(children) {
9736     return 1 + children.reduce(maxYReduce, 0);
9737   }
9738
9739   function maxYReduce(y, c) {
9740     return Math.max(y, c.y);
9741   }
9742
9743   function leafLeft(node) {
9744     var children;
9745     while (children = node.children) node = children[0];
9746     return node;
9747   }
9748
9749   function leafRight(node) {
9750     var children;
9751     while (children = node.children) node = children[children.length - 1];
9752     return node;
9753   }
9754
9755   function cluster() {
9756     var separation = defaultSeparation,
9757         dx = 1,
9758         dy = 1,
9759         nodeSize = false;
9760
9761     function cluster(root) {
9762       var previousNode,
9763           x = 0;
9764
9765       // First walk, computing the initial x & y values.
9766       root.eachAfter(function(node) {
9767         var children = node.children;
9768         if (children) {
9769           node.x = meanX(children);
9770           node.y = maxY(children);
9771         } else {
9772           node.x = previousNode ? x += separation(node, previousNode) : 0;
9773           node.y = 0;
9774           previousNode = node;
9775         }
9776       });
9777
9778       var left = leafLeft(root),
9779           right = leafRight(root),
9780           x0 = left.x - separation(left, right) / 2,
9781           x1 = right.x + separation(right, left) / 2;
9782
9783       // Second walk, normalizing x & y to the desired size.
9784       return root.eachAfter(nodeSize ? function(node) {
9785         node.x = (node.x - root.x) * dx;
9786         node.y = (root.y - node.y) * dy;
9787       } : function(node) {
9788         node.x = (node.x - x0) / (x1 - x0) * dx;
9789         node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
9790       });
9791     }
9792
9793     cluster.separation = function(x) {
9794       return arguments.length ? (separation = x, cluster) : separation;
9795     };
9796
9797     cluster.size = function(x) {
9798       return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9799     };
9800
9801     cluster.nodeSize = function(x) {
9802       return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9803     };
9804
9805     return cluster;
9806   }
9807
9808   function count(node) {
9809     var sum = 0,
9810         children = node.children,
9811         i = children && children.length;
9812     if (!i) sum = 1;
9813     else while (--i >= 0) sum += children[i].value;
9814     node.value = sum;
9815   }
9816
9817   function node_count() {
9818     return this.eachAfter(count);
9819   }
9820
9821   function node_each(callback) {
9822     var node = this, current, next = [node], children, i, n;
9823     do {
9824       current = next.reverse(), next = [];
9825       while (node = current.pop()) {
9826         callback(node), children = node.children;
9827         if (children) for (i = 0, n = children.length; i < n; ++i) {
9828           next.push(children[i]);
9829         }
9830       }
9831     } while (next.length);
9832     return this;
9833   }
9834
9835   function node_eachBefore(callback) {
9836     var node = this, nodes = [node], children, i;
9837     while (node = nodes.pop()) {
9838       callback(node), children = node.children;
9839       if (children) for (i = children.length - 1; i >= 0; --i) {
9840         nodes.push(children[i]);
9841       }
9842     }
9843     return this;
9844   }
9845
9846   function node_eachAfter(callback) {
9847     var node = this, nodes = [node], next = [], children, i, n;
9848     while (node = nodes.pop()) {
9849       next.push(node), children = node.children;
9850       if (children) for (i = 0, n = children.length; i < n; ++i) {
9851         nodes.push(children[i]);
9852       }
9853     }
9854     while (node = next.pop()) {
9855       callback(node);
9856     }
9857     return this;
9858   }
9859
9860   function node_sum(value) {
9861     return this.eachAfter(function(node) {
9862       var sum = +value(node.data) || 0,
9863           children = node.children,
9864           i = children && children.length;
9865       while (--i >= 0) sum += children[i].value;
9866       node.value = sum;
9867     });
9868   }
9869
9870   function node_sort(compare) {
9871     return this.eachBefore(function(node) {
9872       if (node.children) {
9873         node.children.sort(compare);
9874       }
9875     });
9876   }
9877
9878   function node_path(end) {
9879     var start = this,
9880         ancestor = leastCommonAncestor(start, end),
9881         nodes = [start];
9882     while (start !== ancestor) {
9883       start = start.parent;
9884       nodes.push(start);
9885     }
9886     var k = nodes.length;
9887     while (end !== ancestor) {
9888       nodes.splice(k, 0, end);
9889       end = end.parent;
9890     }
9891     return nodes;
9892   }
9893
9894   function leastCommonAncestor(a, b) {
9895     if (a === b) return a;
9896     var aNodes = a.ancestors(),
9897         bNodes = b.ancestors(),
9898         c = null;
9899     a = aNodes.pop();
9900     b = bNodes.pop();
9901     while (a === b) {
9902       c = a;
9903       a = aNodes.pop();
9904       b = bNodes.pop();
9905     }
9906     return c;
9907   }
9908
9909   function node_ancestors() {
9910     var node = this, nodes = [node];
9911     while (node = node.parent) {
9912       nodes.push(node);
9913     }
9914     return nodes;
9915   }
9916
9917   function node_descendants() {
9918     var nodes = [];
9919     this.each(function(node) {
9920       nodes.push(node);
9921     });
9922     return nodes;
9923   }
9924
9925   function node_leaves() {
9926     var leaves = [];
9927     this.eachBefore(function(node) {
9928       if (!node.children) {
9929         leaves.push(node);
9930       }
9931     });
9932     return leaves;
9933   }
9934
9935   function node_links() {
9936     var root = this, links = [];
9937     root.each(function(node) {
9938       if (node !== root) { // Don’t include the root’s parent, if any.
9939         links.push({source: node.parent, target: node});
9940       }
9941     });
9942     return links;
9943   }
9944
9945   function hierarchy(data, children) {
9946     var root = new Node(data),
9947         valued = +data.value && (root.value = data.value),
9948         node,
9949         nodes = [root],
9950         child,
9951         childs,
9952         i,
9953         n;
9954
9955     if (children == null) children = defaultChildren;
9956
9957     while (node = nodes.pop()) {
9958       if (valued) node.value = +node.data.value;
9959       if ((childs = children(node.data)) && (n = childs.length)) {
9960         node.children = new Array(n);
9961         for (i = n - 1; i >= 0; --i) {
9962           nodes.push(child = node.children[i] = new Node(childs[i]));
9963           child.parent = node;
9964           child.depth = node.depth + 1;
9965         }
9966       }
9967     }
9968
9969     return root.eachBefore(computeHeight);
9970   }
9971
9972   function node_copy() {
9973     return hierarchy(this).eachBefore(copyData);
9974   }
9975
9976   function defaultChildren(d) {
9977     return d.children;
9978   }
9979
9980   function copyData(node) {
9981     node.data = node.data.data;
9982   }
9983
9984   function computeHeight(node) {
9985     var height = 0;
9986     do node.height = height;
9987     while ((node = node.parent) && (node.height < ++height));
9988   }
9989
9990   function Node(data) {
9991     this.data = data;
9992     this.depth =
9993     this.height = 0;
9994     this.parent = null;
9995   }
9996
9997   Node.prototype = hierarchy.prototype = {
9998     constructor: Node,
9999     count: node_count,
10000     each: node_each,
10001     eachAfter: node_eachAfter,
10002     eachBefore: node_eachBefore,
10003     sum: node_sum,
10004     sort: node_sort,
10005     path: node_path,
10006     ancestors: node_ancestors,
10007     descendants: node_descendants,
10008     leaves: node_leaves,
10009     links: node_links,
10010     copy: node_copy
10011   };
10012
10013   var slice$3 = Array.prototype.slice;
10014
10015   function shuffle$1(array) {
10016     var m = array.length,
10017         t,
10018         i;
10019
10020     while (m) {
10021       i = Math.random() * m-- | 0;
10022       t = array[m];
10023       array[m] = array[i];
10024       array[i] = t;
10025     }
10026
10027     return array;
10028   }
10029
10030   function enclose(circles) {
10031     var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
10032
10033     while (i < n) {
10034       p = circles[i];
10035       if (e && enclosesWeak(e, p)) ++i;
10036       else e = encloseBasis(B = extendBasis(B, p)), i = 0;
10037     }
10038
10039     return e;
10040   }
10041
10042   function extendBasis(B, p) {
10043     var i, j;
10044
10045     if (enclosesWeakAll(p, B)) return [p];
10046
10047     // If we get here then B must have at least one element.
10048     for (i = 0; i < B.length; ++i) {
10049       if (enclosesNot(p, B[i])
10050           && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
10051         return [B[i], p];
10052       }
10053     }
10054
10055     // If we get here then B must have at least two elements.
10056     for (i = 0; i < B.length - 1; ++i) {
10057       for (j = i + 1; j < B.length; ++j) {
10058         if (enclosesNot(encloseBasis2(B[i], B[j]), p)
10059             && enclosesNot(encloseBasis2(B[i], p), B[j])
10060             && enclosesNot(encloseBasis2(B[j], p), B[i])
10061             && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
10062           return [B[i], B[j], p];
10063         }
10064       }
10065     }
10066
10067     // If we get here then something is very wrong.
10068     throw new Error;
10069   }
10070
10071   function enclosesNot(a, b) {
10072     var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
10073     return dr < 0 || dr * dr < dx * dx + dy * dy;
10074   }
10075
10076   function enclosesWeak(a, b) {
10077     var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
10078     return dr > 0 && dr * dr > dx * dx + dy * dy;
10079   }
10080
10081   function enclosesWeakAll(a, B) {
10082     for (var i = 0; i < B.length; ++i) {
10083       if (!enclosesWeak(a, B[i])) {
10084         return false;
10085       }
10086     }
10087     return true;
10088   }
10089
10090   function encloseBasis(B) {
10091     switch (B.length) {
10092       case 1: return encloseBasis1(B[0]);
10093       case 2: return encloseBasis2(B[0], B[1]);
10094       case 3: return encloseBasis3(B[0], B[1], B[2]);
10095     }
10096   }
10097
10098   function encloseBasis1(a) {
10099     return {
10100       x: a.x,
10101       y: a.y,
10102       r: a.r
10103     };
10104   }
10105
10106   function encloseBasis2(a, b) {
10107     var x1 = a.x, y1 = a.y, r1 = a.r,
10108         x2 = b.x, y2 = b.y, r2 = b.r,
10109         x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
10110         l = Math.sqrt(x21 * x21 + y21 * y21);
10111     return {
10112       x: (x1 + x2 + x21 / l * r21) / 2,
10113       y: (y1 + y2 + y21 / l * r21) / 2,
10114       r: (l + r1 + r2) / 2
10115     };
10116   }
10117
10118   function encloseBasis3(a, b, c) {
10119     var x1 = a.x, y1 = a.y, r1 = a.r,
10120         x2 = b.x, y2 = b.y, r2 = b.r,
10121         x3 = c.x, y3 = c.y, r3 = c.r,
10122         a2 = x1 - x2,
10123         a3 = x1 - x3,
10124         b2 = y1 - y2,
10125         b3 = y1 - y3,
10126         c2 = r2 - r1,
10127         c3 = r3 - r1,
10128         d1 = x1 * x1 + y1 * y1 - r1 * r1,
10129         d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
10130         d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
10131         ab = a3 * b2 - a2 * b3,
10132         xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
10133         xb = (b3 * c2 - b2 * c3) / ab,
10134         ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
10135         yb = (a2 * c3 - a3 * c2) / ab,
10136         A = xb * xb + yb * yb - 1,
10137         B = 2 * (r1 + xa * xb + ya * yb),
10138         C = xa * xa + ya * ya - r1 * r1,
10139         r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
10140     return {
10141       x: x1 + xa + xb * r,
10142       y: y1 + ya + yb * r,
10143       r: r
10144     };
10145   }
10146
10147   function place(a, b, c) {
10148     var ax = a.x,
10149         ay = a.y,
10150         da = b.r + c.r,
10151         db = a.r + c.r,
10152         dx = b.x - ax,
10153         dy = b.y - ay,
10154         dc = dx * dx + dy * dy;
10155     if (dc) {
10156       var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
10157           y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
10158       c.x = ax + x * dx + y * dy;
10159       c.y = ay + x * dy - y * dx;
10160     } else {
10161       c.x = ax + db;
10162       c.y = ay;
10163     }
10164   }
10165
10166   function intersects(a, b) {
10167     var dx = b.x - a.x,
10168         dy = b.y - a.y,
10169         dr = a.r + b.r;
10170     return dr * dr - 1e-6 > dx * dx + dy * dy;
10171   }
10172
10173   function score(node) {
10174     var a = node._,
10175         b = node.next._,
10176         ab = a.r + b.r,
10177         dx = (a.x * b.r + b.x * a.r) / ab,
10178         dy = (a.y * b.r + b.y * a.r) / ab;
10179     return dx * dx + dy * dy;
10180   }
10181
10182   function Node$1(circle) {
10183     this._ = circle;
10184     this.next = null;
10185     this.previous = null;
10186   }
10187
10188   function packEnclose(circles) {
10189     if (!(n = circles.length)) return 0;
10190
10191     var a, b, c, n, aa, ca, i, j, k, sj, sk;
10192
10193     // Place the first circle.
10194     a = circles[0], a.x = 0, a.y = 0;
10195     if (!(n > 1)) return a.r;
10196
10197     // Place the second circle.
10198     b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
10199     if (!(n > 2)) return a.r + b.r;
10200
10201     // Place the third circle.
10202     place(b, a, c = circles[2]);
10203
10204     // Initialize the front-chain using the first three circles a, b and c.
10205     a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
10206     a.next = c.previous = b;
10207     b.next = a.previous = c;
10208     c.next = b.previous = a;
10209
10210     // Attempt to place each remaining circle…
10211     pack: for (i = 3; i < n; ++i) {
10212       place(a._, b._, c = circles[i]), c = new Node$1(c);
10213
10214       // Find the closest intersecting circle on the front-chain, if any.
10215       // “Closeness” is determined by linear distance along the front-chain.
10216       // “Ahead” or “behind” is likewise determined by linear distance.
10217       j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
10218       do {
10219         if (sj <= sk) {
10220           if (intersects(j._, c._)) {
10221             b = j, a.next = b, b.previous = a, --i;
10222             continue pack;
10223           }
10224           sj += j._.r, j = j.next;
10225         } else {
10226           if (intersects(k._, c._)) {
10227             a = k, a.next = b, b.previous = a, --i;
10228             continue pack;
10229           }
10230           sk += k._.r, k = k.previous;
10231         }
10232       } while (j !== k.next);
10233
10234       // Success! Insert the new circle c between a and b.
10235       c.previous = a, c.next = b, a.next = b.previous = b = c;
10236
10237       // Compute the new closest circle pair to the centroid.
10238       aa = score(a);
10239       while ((c = c.next) !== b) {
10240         if ((ca = score(c)) < aa) {
10241           a = c, aa = ca;
10242         }
10243       }
10244       b = a.next;
10245     }
10246
10247     // Compute the enclosing circle of the front chain.
10248     a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
10249
10250     // Translate the circles to put the enclosing circle around the origin.
10251     for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
10252
10253     return c.r;
10254   }
10255
10256   function siblings(circles) {
10257     packEnclose(circles);
10258     return circles;
10259   }
10260
10261   function optional(f) {
10262     return f == null ? null : required(f);
10263   }
10264
10265   function required(f) {
10266     if (typeof f !== "function") throw new Error;
10267     return f;
10268   }
10269
10270   function constantZero() {
10271     return 0;
10272   }
10273
10274   function constant$8(x) {
10275     return function() {
10276       return x;
10277     };
10278   }
10279
10280   function defaultRadius$1(d) {
10281     return Math.sqrt(d.value);
10282   }
10283
10284   function index$1() {
10285     var radius = null,
10286         dx = 1,
10287         dy = 1,
10288         padding = constantZero;
10289
10290     function pack(root) {
10291       root.x = dx / 2, root.y = dy / 2;
10292       if (radius) {
10293         root.eachBefore(radiusLeaf(radius))
10294             .eachAfter(packChildren(padding, 0.5))
10295             .eachBefore(translateChild(1));
10296       } else {
10297         root.eachBefore(radiusLeaf(defaultRadius$1))
10298             .eachAfter(packChildren(constantZero, 1))
10299             .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
10300             .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
10301       }
10302       return root;
10303     }
10304
10305     pack.radius = function(x) {
10306       return arguments.length ? (radius = optional(x), pack) : radius;
10307     };
10308
10309     pack.size = function(x) {
10310       return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10311     };
10312
10313     pack.padding = function(x) {
10314       return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10315     };
10316
10317     return pack;
10318   }
10319
10320   function radiusLeaf(radius) {
10321     return function(node) {
10322       if (!node.children) {
10323         node.r = Math.max(0, +radius(node) || 0);
10324       }
10325     };
10326   }
10327
10328   function packChildren(padding, k) {
10329     return function(node) {
10330       if (children = node.children) {
10331         var children,
10332             i,
10333             n = children.length,
10334             r = padding(node) * k || 0,
10335             e;
10336
10337         if (r) for (i = 0; i < n; ++i) children[i].r += r;
10338         e = packEnclose(children);
10339         if (r) for (i = 0; i < n; ++i) children[i].r -= r;
10340         node.r = e + r;
10341       }
10342     };
10343   }
10344
10345   function translateChild(k) {
10346     return function(node) {
10347       var parent = node.parent;
10348       node.r *= k;
10349       if (parent) {
10350         node.x = parent.x + k * node.x;
10351         node.y = parent.y + k * node.y;
10352       }
10353     };
10354   }
10355
10356   function roundNode(node) {
10357     node.x0 = Math.round(node.x0);
10358     node.y0 = Math.round(node.y0);
10359     node.x1 = Math.round(node.x1);
10360     node.y1 = Math.round(node.y1);
10361   }
10362
10363   function treemapDice(parent, x0, y0, x1, y1) {
10364     var nodes = parent.children,
10365         node,
10366         i = -1,
10367         n = nodes.length,
10368         k = parent.value && (x1 - x0) / parent.value;
10369
10370     while (++i < n) {
10371       node = nodes[i], node.y0 = y0, node.y1 = y1;
10372       node.x0 = x0, node.x1 = x0 += node.value * k;
10373     }
10374   }
10375
10376   function partition() {
10377     var dx = 1,
10378         dy = 1,
10379         padding = 0,
10380         round = false;
10381
10382     function partition(root) {
10383       var n = root.height + 1;
10384       root.x0 =
10385       root.y0 = padding;
10386       root.x1 = dx;
10387       root.y1 = dy / n;
10388       root.eachBefore(positionNode(dy, n));
10389       if (round) root.eachBefore(roundNode);
10390       return root;
10391     }
10392
10393     function positionNode(dy, n) {
10394       return function(node) {
10395         if (node.children) {
10396           treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
10397         }
10398         var x0 = node.x0,
10399             y0 = node.y0,
10400             x1 = node.x1 - padding,
10401             y1 = node.y1 - padding;
10402         if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10403         if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10404         node.x0 = x0;
10405         node.y0 = y0;
10406         node.x1 = x1;
10407         node.y1 = y1;
10408       };
10409     }
10410
10411     partition.round = function(x) {
10412       return arguments.length ? (round = !!x, partition) : round;
10413     };
10414
10415     partition.size = function(x) {
10416       return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10417     };
10418
10419     partition.padding = function(x) {
10420       return arguments.length ? (padding = +x, partition) : padding;
10421     };
10422
10423     return partition;
10424   }
10425
10426   var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
10427       preroot = {depth: -1},
10428       ambiguous = {};
10429
10430   function defaultId(d) {
10431     return d.id;
10432   }
10433
10434   function defaultParentId(d) {
10435     return d.parentId;
10436   }
10437
10438   function stratify() {
10439     var id = defaultId,
10440         parentId = defaultParentId;
10441
10442     function stratify(data) {
10443       var d,
10444           i,
10445           n = data.length,
10446           root,
10447           parent,
10448           node,
10449           nodes = new Array(n),
10450           nodeId,
10451           nodeKey,
10452           nodeByKey = {};
10453
10454       for (i = 0; i < n; ++i) {
10455         d = data[i], node = nodes[i] = new Node(d);
10456         if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
10457           nodeKey = keyPrefix$1 + (node.id = nodeId);
10458           nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
10459         }
10460       }
10461
10462       for (i = 0; i < n; ++i) {
10463         node = nodes[i], nodeId = parentId(data[i], i, data);
10464         if (nodeId == null || !(nodeId += "")) {
10465           if (root) throw new Error("multiple roots");
10466           root = node;
10467         } else {
10468           parent = nodeByKey[keyPrefix$1 + nodeId];
10469           if (!parent) throw new Error("missing: " + nodeId);
10470           if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
10471           if (parent.children) parent.children.push(node);
10472           else parent.children = [node];
10473           node.parent = parent;
10474         }
10475       }
10476
10477       if (!root) throw new Error("no root");
10478       root.parent = preroot;
10479       root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
10480       root.parent = null;
10481       if (n > 0) throw new Error("cycle");
10482
10483       return root;
10484     }
10485
10486     stratify.id = function(x) {
10487       return arguments.length ? (id = required(x), stratify) : id;
10488     };
10489
10490     stratify.parentId = function(x) {
10491       return arguments.length ? (parentId = required(x), stratify) : parentId;
10492     };
10493
10494     return stratify;
10495   }
10496
10497   function defaultSeparation$1(a, b) {
10498     return a.parent === b.parent ? 1 : 2;
10499   }
10500
10501   // function radialSeparation(a, b) {
10502   //   return (a.parent === b.parent ? 1 : 2) / a.depth;
10503   // }
10504
10505   // This function is used to traverse the left contour of a subtree (or
10506   // subforest). It returns the successor of v on this contour. This successor is
10507   // either given by the leftmost child of v or by the thread of v. The function
10508   // returns null if and only if v is on the highest level of its subtree.
10509   function nextLeft(v) {
10510     var children = v.children;
10511     return children ? children[0] : v.t;
10512   }
10513
10514   // This function works analogously to nextLeft.
10515   function nextRight(v) {
10516     var children = v.children;
10517     return children ? children[children.length - 1] : v.t;
10518   }
10519
10520   // Shifts the current subtree rooted at w+. This is done by increasing
10521   // prelim(w+) and mod(w+) by shift.
10522   function moveSubtree(wm, wp, shift) {
10523     var change = shift / (wp.i - wm.i);
10524     wp.c -= change;
10525     wp.s += shift;
10526     wm.c += change;
10527     wp.z += shift;
10528     wp.m += shift;
10529   }
10530
10531   // All other shifts, applied to the smaller subtrees between w- and w+, are
10532   // performed by this function. To prepare the shifts, we have to adjust
10533   // change(w+), shift(w+), and change(w-).
10534   function executeShifts(v) {
10535     var shift = 0,
10536         change = 0,
10537         children = v.children,
10538         i = children.length,
10539         w;
10540     while (--i >= 0) {
10541       w = children[i];
10542       w.z += shift;
10543       w.m += shift;
10544       shift += w.s + (change += w.c);
10545     }
10546   }
10547
10548   // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
10549   // returns the specified (default) ancestor.
10550   function nextAncestor(vim, v, ancestor) {
10551     return vim.a.parent === v.parent ? vim.a : ancestor;
10552   }
10553
10554   function TreeNode(node, i) {
10555     this._ = node;
10556     this.parent = null;
10557     this.children = null;
10558     this.A = null; // default ancestor
10559     this.a = this; // ancestor
10560     this.z = 0; // prelim
10561     this.m = 0; // mod
10562     this.c = 0; // change
10563     this.s = 0; // shift
10564     this.t = null; // thread
10565     this.i = i; // number
10566   }
10567
10568   TreeNode.prototype = Object.create(Node.prototype);
10569
10570   function treeRoot(root) {
10571     var tree = new TreeNode(root, 0),
10572         node,
10573         nodes = [tree],
10574         child,
10575         children,
10576         i,
10577         n;
10578
10579     while (node = nodes.pop()) {
10580       if (children = node._.children) {
10581         node.children = new Array(n = children.length);
10582         for (i = n - 1; i >= 0; --i) {
10583           nodes.push(child = node.children[i] = new TreeNode(children[i], i));
10584           child.parent = node;
10585         }
10586       }
10587     }
10588
10589     (tree.parent = new TreeNode(null, 0)).children = [tree];
10590     return tree;
10591   }
10592
10593   // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10594   function tree() {
10595     var separation = defaultSeparation$1,
10596         dx = 1,
10597         dy = 1,
10598         nodeSize = null;
10599
10600     function tree(root) {
10601       var t = treeRoot(root);
10602
10603       // Compute the layout using Buchheim et al.’s algorithm.
10604       t.eachAfter(firstWalk), t.parent.m = -t.z;
10605       t.eachBefore(secondWalk);
10606
10607       // If a fixed node size is specified, scale x and y.
10608       if (nodeSize) root.eachBefore(sizeNode);
10609
10610       // If a fixed tree size is specified, scale x and y based on the extent.
10611       // Compute the left-most, right-most, and depth-most nodes for extents.
10612       else {
10613         var left = root,
10614             right = root,
10615             bottom = root;
10616         root.eachBefore(function(node) {
10617           if (node.x < left.x) left = node;
10618           if (node.x > right.x) right = node;
10619           if (node.depth > bottom.depth) bottom = node;
10620         });
10621         var s = left === right ? 1 : separation(left, right) / 2,
10622             tx = s - left.x,
10623             kx = dx / (right.x + s + tx),
10624             ky = dy / (bottom.depth || 1);
10625         root.eachBefore(function(node) {
10626           node.x = (node.x + tx) * kx;
10627           node.y = node.depth * ky;
10628         });
10629       }
10630
10631       return root;
10632     }
10633
10634     // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
10635     // applied recursively to the children of v, as well as the function
10636     // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
10637     // node v is placed to the midpoint of its outermost children.
10638     function firstWalk(v) {
10639       var children = v.children,
10640           siblings = v.parent.children,
10641           w = v.i ? siblings[v.i - 1] : null;
10642       if (children) {
10643         executeShifts(v);
10644         var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10645         if (w) {
10646           v.z = w.z + separation(v._, w._);
10647           v.m = v.z - midpoint;
10648         } else {
10649           v.z = midpoint;
10650         }
10651       } else if (w) {
10652         v.z = w.z + separation(v._, w._);
10653       }
10654       v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10655     }
10656
10657     // Computes all real x-coordinates by summing up the modifiers recursively.
10658     function secondWalk(v) {
10659       v._.x = v.z + v.parent.m;
10660       v.m += v.parent.m;
10661     }
10662
10663     // The core of the algorithm. Here, a new subtree is combined with the
10664     // previous subtrees. Threads are used to traverse the inside and outside
10665     // contours of the left and right subtree up to the highest common level. The
10666     // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
10667     // superscript o means outside and i means inside, the subscript - means left
10668     // subtree and + means right subtree. For summing up the modifiers along the
10669     // contour, we use respective variables si+, si-, so-, and so+. Whenever two
10670     // nodes of the inside contours conflict, we compute the left one of the
10671     // greatest uncommon ancestors using the function ANCESTOR and call MOVE
10672     // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
10673     // Finally, we add a new thread (if necessary).
10674     function apportion(v, w, ancestor) {
10675       if (w) {
10676         var vip = v,
10677             vop = v,
10678             vim = w,
10679             vom = vip.parent.children[0],
10680             sip = vip.m,
10681             sop = vop.m,
10682             sim = vim.m,
10683             som = vom.m,
10684             shift;
10685         while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10686           vom = nextLeft(vom);
10687           vop = nextRight(vop);
10688           vop.a = v;
10689           shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10690           if (shift > 0) {
10691             moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10692             sip += shift;
10693             sop += shift;
10694           }
10695           sim += vim.m;
10696           sip += vip.m;
10697           som += vom.m;
10698           sop += vop.m;
10699         }
10700         if (vim && !nextRight(vop)) {
10701           vop.t = vim;
10702           vop.m += sim - sop;
10703         }
10704         if (vip && !nextLeft(vom)) {
10705           vom.t = vip;
10706           vom.m += sip - som;
10707           ancestor = v;
10708         }
10709       }
10710       return ancestor;
10711     }
10712
10713     function sizeNode(node) {
10714       node.x *= dx;
10715       node.y = node.depth * dy;
10716     }
10717
10718     tree.separation = function(x) {
10719       return arguments.length ? (separation = x, tree) : separation;
10720     };
10721
10722     tree.size = function(x) {
10723       return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10724     };
10725
10726     tree.nodeSize = function(x) {
10727       return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10728     };
10729
10730     return tree;
10731   }
10732
10733   function treemapSlice(parent, x0, y0, x1, y1) {
10734     var nodes = parent.children,
10735         node,
10736         i = -1,
10737         n = nodes.length,
10738         k = parent.value && (y1 - y0) / parent.value;
10739
10740     while (++i < n) {
10741       node = nodes[i], node.x0 = x0, node.x1 = x1;
10742       node.y0 = y0, node.y1 = y0 += node.value * k;
10743     }
10744   }
10745
10746   var phi = (1 + Math.sqrt(5)) / 2;
10747
10748   function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10749     var rows = [],
10750         nodes = parent.children,
10751         row,
10752         nodeValue,
10753         i0 = 0,
10754         i1 = 0,
10755         n = nodes.length,
10756         dx, dy,
10757         value = parent.value,
10758         sumValue,
10759         minValue,
10760         maxValue,
10761         newRatio,
10762         minRatio,
10763         alpha,
10764         beta;
10765
10766     while (i0 < n) {
10767       dx = x1 - x0, dy = y1 - y0;
10768
10769       // Find the next non-empty node.
10770       do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
10771       minValue = maxValue = sumValue;
10772       alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
10773       beta = sumValue * sumValue * alpha;
10774       minRatio = Math.max(maxValue / beta, beta / minValue);
10775
10776       // Keep adding nodes while the aspect ratio maintains or improves.
10777       for (; i1 < n; ++i1) {
10778         sumValue += nodeValue = nodes[i1].value;
10779         if (nodeValue < minValue) minValue = nodeValue;
10780         if (nodeValue > maxValue) maxValue = nodeValue;
10781         beta = sumValue * sumValue * alpha;
10782         newRatio = Math.max(maxValue / beta, beta / minValue);
10783         if (newRatio > minRatio) { sumValue -= nodeValue; break; }
10784         minRatio = newRatio;
10785       }
10786
10787       // Position and record the row orientation.
10788       rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
10789       if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
10790       else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
10791       value -= sumValue, i0 = i1;
10792     }
10793
10794     return rows;
10795   }
10796
10797   var squarify = (function custom(ratio) {
10798
10799     function squarify(parent, x0, y0, x1, y1) {
10800       squarifyRatio(ratio, parent, x0, y0, x1, y1);
10801     }
10802
10803     squarify.ratio = function(x) {
10804       return custom((x = +x) > 1 ? x : 1);
10805     };
10806
10807     return squarify;
10808   })(phi);
10809
10810   function index$2() {
10811     var tile = squarify,
10812         round = false,
10813         dx = 1,
10814         dy = 1,
10815         paddingStack = [0],
10816         paddingInner = constantZero,
10817         paddingTop = constantZero,
10818         paddingRight = constantZero,
10819         paddingBottom = constantZero,
10820         paddingLeft = constantZero;
10821
10822     function treemap(root) {
10823       root.x0 =
10824       root.y0 = 0;
10825       root.x1 = dx;
10826       root.y1 = dy;
10827       root.eachBefore(positionNode);
10828       paddingStack = [0];
10829       if (round) root.eachBefore(roundNode);
10830       return root;
10831     }
10832
10833     function positionNode(node) {
10834       var p = paddingStack[node.depth],
10835           x0 = node.x0 + p,
10836           y0 = node.y0 + p,
10837           x1 = node.x1 - p,
10838           y1 = node.y1 - p;
10839       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10840       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10841       node.x0 = x0;
10842       node.y0 = y0;
10843       node.x1 = x1;
10844       node.y1 = y1;
10845       if (node.children) {
10846         p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
10847         x0 += paddingLeft(node) - p;
10848         y0 += paddingTop(node) - p;
10849         x1 -= paddingRight(node) - p;
10850         y1 -= paddingBottom(node) - p;
10851         if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10852         if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10853         tile(node, x0, y0, x1, y1);
10854       }
10855     }
10856
10857     treemap.round = function(x) {
10858       return arguments.length ? (round = !!x, treemap) : round;
10859     };
10860
10861     treemap.size = function(x) {
10862       return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10863     };
10864
10865     treemap.tile = function(x) {
10866       return arguments.length ? (tile = required(x), treemap) : tile;
10867     };
10868
10869     treemap.padding = function(x) {
10870       return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10871     };
10872
10873     treemap.paddingInner = function(x) {
10874       return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10875     };
10876
10877     treemap.paddingOuter = function(x) {
10878       return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10879     };
10880
10881     treemap.paddingTop = function(x) {
10882       return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10883     };
10884
10885     treemap.paddingRight = function(x) {
10886       return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10887     };
10888
10889     treemap.paddingBottom = function(x) {
10890       return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10891     };
10892
10893     treemap.paddingLeft = function(x) {
10894       return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10895     };
10896
10897     return treemap;
10898   }
10899
10900   function binary(parent, x0, y0, x1, y1) {
10901     var nodes = parent.children,
10902         i, n = nodes.length,
10903         sum, sums = new Array(n + 1);
10904
10905     for (sums[0] = sum = i = 0; i < n; ++i) {
10906       sums[i + 1] = sum += nodes[i].value;
10907     }
10908
10909     partition(0, n, parent.value, x0, y0, x1, y1);
10910
10911     function partition(i, j, value, x0, y0, x1, y1) {
10912       if (i >= j - 1) {
10913         var node = nodes[i];
10914         node.x0 = x0, node.y0 = y0;
10915         node.x1 = x1, node.y1 = y1;
10916         return;
10917       }
10918
10919       var valueOffset = sums[i],
10920           valueTarget = (value / 2) + valueOffset,
10921           k = i + 1,
10922           hi = j - 1;
10923
10924       while (k < hi) {
10925         var mid = k + hi >>> 1;
10926         if (sums[mid] < valueTarget) k = mid + 1;
10927         else hi = mid;
10928       }
10929
10930       if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10931
10932       var valueLeft = sums[k] - valueOffset,
10933           valueRight = value - valueLeft;
10934
10935       if ((x1 - x0) > (y1 - y0)) {
10936         var xk = (x0 * valueRight + x1 * valueLeft) / value;
10937         partition(i, k, valueLeft, x0, y0, xk, y1);
10938         partition(k, j, valueRight, xk, y0, x1, y1);
10939       } else {
10940         var yk = (y0 * valueRight + y1 * valueLeft) / value;
10941         partition(i, k, valueLeft, x0, y0, x1, yk);
10942         partition(k, j, valueRight, x0, yk, x1, y1);
10943       }
10944     }
10945   }
10946
10947   function sliceDice(parent, x0, y0, x1, y1) {
10948     (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10949   }
10950
10951   var resquarify = (function custom(ratio) {
10952
10953     function resquarify(parent, x0, y0, x1, y1) {
10954       if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10955         var rows,
10956             row,
10957             nodes,
10958             i,
10959             j = -1,
10960             n,
10961             m = rows.length,
10962             value = parent.value;
10963
10964         while (++j < m) {
10965           row = rows[j], nodes = row.children;
10966           for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
10967           if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
10968           else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
10969           value -= row.value;
10970         }
10971       } else {
10972         parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10973         rows.ratio = ratio;
10974       }
10975     }
10976
10977     resquarify.ratio = function(x) {
10978       return custom((x = +x) > 1 ? x : 1);
10979     };
10980
10981     return resquarify;
10982   })(phi);
10983
10984   function d3_polygonArea(polygon) {
10985     var i = -1,
10986         n = polygon.length,
10987         a,
10988         b = polygon[n - 1],
10989         area = 0;
10990
10991     while (++i < n) {
10992       a = b;
10993       b = polygon[i];
10994       area += a[1] * b[0] - a[0] * b[1];
10995     }
10996
10997     return area / 2;
10998   }
10999
11000   function d3_polygonCentroid(polygon) {
11001     var i = -1,
11002         n = polygon.length,
11003         x = 0,
11004         y = 0,
11005         a,
11006         b = polygon[n - 1],
11007         c,
11008         k = 0;
11009
11010     while (++i < n) {
11011       a = b;
11012       b = polygon[i];
11013       k += c = a[0] * b[1] - b[0] * a[1];
11014       x += (a[0] + b[0]) * c;
11015       y += (a[1] + b[1]) * c;
11016     }
11017
11018     return k *= 3, [x / k, y / k];
11019   }
11020
11021   // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
11022   // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
11023   // right, +y is up). Returns a positive value if ABC is counter-clockwise,
11024   // negative if clockwise, and zero if the points are collinear.
11025   function cross$1(a, b, c) {
11026     return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
11027   }
11028
11029   function lexicographicOrder(a, b) {
11030     return a[0] - b[0] || a[1] - b[1];
11031   }
11032
11033   // Computes the upper convex hull per the monotone chain algorithm.
11034   // Assumes points.length >= 3, is sorted by x, unique in y.
11035   // Returns an array of indices into points in left-to-right order.
11036   function computeUpperHullIndexes(points) {
11037     var n = points.length,
11038         indexes = [0, 1],
11039         size = 2;
11040
11041     for (var i = 2; i < n; ++i) {
11042       while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
11043       indexes[size++] = i;
11044     }
11045
11046     return indexes.slice(0, size); // remove popped points
11047   }
11048
11049   function d3_polygonHull(points) {
11050     if ((n = points.length) < 3) return null;
11051
11052     var i,
11053         n,
11054         sortedPoints = new Array(n),
11055         flippedPoints = new Array(n);
11056
11057     for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
11058     sortedPoints.sort(lexicographicOrder);
11059     for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
11060
11061     var upperIndexes = computeUpperHullIndexes(sortedPoints),
11062         lowerIndexes = computeUpperHullIndexes(flippedPoints);
11063
11064     // Construct the hull polygon, removing possible duplicate endpoints.
11065     var skipLeft = lowerIndexes[0] === upperIndexes[0],
11066         skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
11067         hull = [];
11068
11069     // Add upper hull in right-to-l order.
11070     // Then add lower hull in left-to-right order.
11071     for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
11072     for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
11073
11074     return hull;
11075   }
11076
11077   function contains$1(polygon, point) {
11078     var n = polygon.length,
11079         p = polygon[n - 1],
11080         x = point[0], y = point[1],
11081         x0 = p[0], y0 = p[1],
11082         x1, y1,
11083         inside = false;
11084
11085     for (var i = 0; i < n; ++i) {
11086       p = polygon[i], x1 = p[0], y1 = p[1];
11087       if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
11088       x0 = x1, y0 = y1;
11089     }
11090
11091     return inside;
11092   }
11093
11094   function length$2(polygon) {
11095     var i = -1,
11096         n = polygon.length,
11097         b = polygon[n - 1],
11098         xa,
11099         ya,
11100         xb = b[0],
11101         yb = b[1],
11102         perimeter = 0;
11103
11104     while (++i < n) {
11105       xa = xb;
11106       ya = yb;
11107       b = polygon[i];
11108       xb = b[0];
11109       yb = b[1];
11110       xa -= xb;
11111       ya -= yb;
11112       perimeter += Math.sqrt(xa * xa + ya * ya);
11113     }
11114
11115     return perimeter;
11116   }
11117
11118   var slice$4 = [].slice;
11119
11120   var noabort = {};
11121
11122   function Queue(size) {
11123     this._size = size;
11124     this._call =
11125     this._error = null;
11126     this._tasks = [];
11127     this._data = [];
11128     this._waiting =
11129     this._active =
11130     this._ended =
11131     this._start = 0; // inside a synchronous task callback?
11132   }
11133
11134   Queue.prototype = queue.prototype = {
11135     constructor: Queue,
11136     defer: function(callback) {
11137       if (typeof callback !== "function") throw new Error("invalid callback");
11138       if (this._call) throw new Error("defer after await");
11139       if (this._error != null) return this;
11140       var t = slice$4.call(arguments, 1);
11141       t.push(callback);
11142       ++this._waiting, this._tasks.push(t);
11143       poke$1(this);
11144       return this;
11145     },
11146     abort: function() {
11147       if (this._error == null) abort(this, new Error("abort"));
11148       return this;
11149     },
11150     await: function(callback) {
11151       if (typeof callback !== "function") throw new Error("invalid callback");
11152       if (this._call) throw new Error("multiple await");
11153       this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
11154       maybeNotify(this);
11155       return this;
11156     },
11157     awaitAll: function(callback) {
11158       if (typeof callback !== "function") throw new Error("invalid callback");
11159       if (this._call) throw new Error("multiple await");
11160       this._call = callback;
11161       maybeNotify(this);
11162       return this;
11163     }
11164   };
11165
11166   function poke$1(q) {
11167     if (!q._start) {
11168       try { start$1(q); } // let the current task complete
11169       catch (e) {
11170         if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
11171         else if (!q._data) throw e; // await callback errored synchronously
11172       }
11173     }
11174   }
11175
11176   function start$1(q) {
11177     while (q._start = q._waiting && q._active < q._size) {
11178       var i = q._ended + q._active,
11179           t = q._tasks[i],
11180           j = t.length - 1,
11181           c = t[j];
11182       t[j] = end(q, i);
11183       --q._waiting, ++q._active;
11184       t = c.apply(null, t);
11185       if (!q._tasks[i]) continue; // task finished synchronously
11186       q._tasks[i] = t || noabort;
11187     }
11188   }
11189
11190   function end(q, i) {
11191     return function(e, r) {
11192       if (!q._tasks[i]) return; // ignore multiple callbacks
11193       --q._active, ++q._ended;
11194       q._tasks[i] = null;
11195       if (q._error != null) return; // ignore secondary errors
11196       if (e != null) {
11197         abort(q, e);
11198       } else {
11199         q._data[i] = r;
11200         if (q._waiting) poke$1(q);
11201         else maybeNotify(q);
11202       }
11203     };
11204   }
11205
11206   function abort(q, e) {
11207     var i = q._tasks.length, t;
11208     q._error = e; // ignore active callbacks
11209     q._data = undefined; // allow gc
11210     q._waiting = NaN; // prevent starting
11211
11212     while (--i >= 0) {
11213       if (t = q._tasks[i]) {
11214         q._tasks[i] = null;
11215         if (t.abort) {
11216           try { t.abort(); }
11217           catch (e) { /* ignore */ }
11218         }
11219       }
11220     }
11221
11222     q._active = NaN; // allow notification
11223     maybeNotify(q);
11224   }
11225
11226   function maybeNotify(q) {
11227     if (!q._active && q._call) {
11228       var d = q._data;
11229       q._data = undefined; // allow gc
11230       q._call(q._error, d);
11231     }
11232   }
11233
11234   function queue(concurrency) {
11235     if (concurrency == null) concurrency = Infinity;
11236     else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency");
11237     return new Queue(concurrency);
11238   }
11239
11240   function defaultSource$1() {
11241     return Math.random();
11242   }
11243
11244   var uniform = (function sourceRandomUniform(source) {
11245     function randomUniform(min, max) {
11246       min = min == null ? 0 : +min;
11247       max = max == null ? 1 : +max;
11248       if (arguments.length === 1) max = min, min = 0;
11249       else max -= min;
11250       return function() {
11251         return source() * max + min;
11252       };
11253     }
11254
11255     randomUniform.source = sourceRandomUniform;
11256
11257     return randomUniform;
11258   })(defaultSource$1);
11259
11260   var normal = (function sourceRandomNormal(source) {
11261     function randomNormal(mu, sigma) {
11262       var x, r;
11263       mu = mu == null ? 0 : +mu;
11264       sigma = sigma == null ? 1 : +sigma;
11265       return function() {
11266         var y;
11267
11268         // If available, use the second previously-generated uniform random.
11269         if (x != null) y = x, x = null;
11270
11271         // Otherwise, generate a new x and y.
11272         else do {
11273           x = source() * 2 - 1;
11274           y = source() * 2 - 1;
11275           r = x * x + y * y;
11276         } while (!r || r > 1);
11277
11278         return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11279       };
11280     }
11281
11282     randomNormal.source = sourceRandomNormal;
11283
11284     return randomNormal;
11285   })(defaultSource$1);
11286
11287   var logNormal = (function sourceRandomLogNormal(source) {
11288     function randomLogNormal() {
11289       var randomNormal = normal.source(source).apply(this, arguments);
11290       return function() {
11291         return Math.exp(randomNormal());
11292       };
11293     }
11294
11295     randomLogNormal.source = sourceRandomLogNormal;
11296
11297     return randomLogNormal;
11298   })(defaultSource$1);
11299
11300   var irwinHall = (function sourceRandomIrwinHall(source) {
11301     function randomIrwinHall(n) {
11302       return function() {
11303         for (var sum = 0, i = 0; i < n; ++i) sum += source();
11304         return sum;
11305       };
11306     }
11307
11308     randomIrwinHall.source = sourceRandomIrwinHall;
11309
11310     return randomIrwinHall;
11311   })(defaultSource$1);
11312
11313   var bates = (function sourceRandomBates(source) {
11314     function randomBates(n) {
11315       var randomIrwinHall = irwinHall.source(source)(n);
11316       return function() {
11317         return randomIrwinHall() / n;
11318       };
11319     }
11320
11321     randomBates.source = sourceRandomBates;
11322
11323     return randomBates;
11324   })(defaultSource$1);
11325
11326   var exponential$1 = (function sourceRandomExponential(source) {
11327     function randomExponential(lambda) {
11328       return function() {
11329         return -Math.log(1 - source()) / lambda;
11330       };
11331     }
11332
11333     randomExponential.source = sourceRandomExponential;
11334
11335     return randomExponential;
11336   })(defaultSource$1);
11337
11338   function request(url, callback) {
11339     var request,
11340         event = dispatch("beforesend", "progress", "load", "error"),
11341         mimeType,
11342         headers = map$1(),
11343         xhr = new XMLHttpRequest,
11344         user = null,
11345         password = null,
11346         response,
11347         responseType,
11348         timeout = 0;
11349
11350     // If IE does not support CORS, use XDomainRequest.
11351     if (typeof XDomainRequest !== "undefined"
11352         && !("withCredentials" in xhr)
11353         && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
11354
11355     "onload" in xhr
11356         ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11357         : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11358
11359     function respond(o) {
11360       var status = xhr.status, result;
11361       if (!status && hasResponse(xhr)
11362           || status >= 200 && status < 300
11363           || status === 304) {
11364         if (response) {
11365           try {
11366             result = response.call(request, xhr);
11367           } catch (e) {
11368             event.call("error", request, e);
11369             return;
11370           }
11371         } else {
11372           result = xhr;
11373         }
11374         event.call("load", request, result);
11375       } else {
11376         event.call("error", request, o);
11377       }
11378     }
11379
11380     xhr.onprogress = function(e) {
11381       event.call("progress", request, e);
11382     };
11383
11384     request = {
11385       header: function(name, value) {
11386         name = (name + "").toLowerCase();
11387         if (arguments.length < 2) return headers.get(name);
11388         if (value == null) headers.remove(name);
11389         else headers.set(name, value + "");
11390         return request;
11391       },
11392
11393       // If mimeType is non-null and no Accept header is set, a default is used.
11394       mimeType: function(value) {
11395         if (!arguments.length) return mimeType;
11396         mimeType = value == null ? null : value + "";
11397         return request;
11398       },
11399
11400       // Specifies what type the response value should take;
11401       // for instance, arraybuffer, blob, document, or text.
11402       responseType: function(value) {
11403         if (!arguments.length) return responseType;
11404         responseType = value;
11405         return request;
11406       },
11407
11408       timeout: function(value) {
11409         if (!arguments.length) return timeout;
11410         timeout = +value;
11411         return request;
11412       },
11413
11414       user: function(value) {
11415         return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11416       },
11417
11418       password: function(value) {
11419         return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11420       },
11421
11422       // Specify how to convert the response content to a specific type;
11423       // changes the callback value on "load" events.
11424       response: function(value) {
11425         response = value;
11426         return request;
11427       },
11428
11429       // Alias for send("GET", …).
11430       get: function(data, callback) {
11431         return request.send("GET", data, callback);
11432       },
11433
11434       // Alias for send("POST", …).
11435       post: function(data, callback) {
11436         return request.send("POST", data, callback);
11437       },
11438
11439       // If callback is non-null, it will be used for error and load events.
11440       send: function(method, data, callback) {
11441         xhr.open(method, url, true, user, password);
11442         if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
11443         if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
11444         if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
11445         if (responseType != null) xhr.responseType = responseType;
11446         if (timeout > 0) xhr.timeout = timeout;
11447         if (callback == null && typeof data === "function") callback = data, data = null;
11448         if (callback != null && callback.length === 1) callback = fixCallback(callback);
11449         if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
11450         event.call("beforesend", request, xhr);
11451         xhr.send(data == null ? null : data);
11452         return request;
11453       },
11454
11455       abort: function() {
11456         xhr.abort();
11457         return request;
11458       },
11459
11460       on: function() {
11461         var value = event.on.apply(event, arguments);
11462         return value === event ? request : value;
11463       }
11464     };
11465
11466     if (callback != null) {
11467       if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11468       return request.get(callback);
11469     }
11470
11471     return request;
11472   }
11473
11474   function fixCallback(callback) {
11475     return function(error, xhr) {
11476       callback(error == null ? xhr : null);
11477     };
11478   }
11479
11480   function hasResponse(xhr) {
11481     var type = xhr.responseType;
11482     return type && type !== "text"
11483         ? xhr.response // null on error
11484         : xhr.responseText; // "" on error
11485   }
11486
11487   function type$1(defaultMimeType, response) {
11488     return function(url, callback) {
11489       var r = request(url).mimeType(defaultMimeType).response(response);
11490       if (callback != null) {
11491         if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11492         return r.get(callback);
11493       }
11494       return r;
11495     };
11496   }
11497
11498   var html = type$1("text/html", function(xhr) {
11499     return document.createRange().createContextualFragment(xhr.responseText);
11500   });
11501
11502   var d3_json = type$1("application/json", function(xhr) {
11503     return JSON.parse(xhr.responseText);
11504   });
11505
11506   var d3_text = type$1("text/plain", function(xhr) {
11507     return xhr.responseText;
11508   });
11509
11510   var d3_xml = type$1("application/xml", function(xhr) {
11511     var xml = xhr.responseXML;
11512     if (!xml) throw new Error("parse error");
11513     return xml;
11514   });
11515
11516   function dsv$1(defaultMimeType, parse) {
11517     return function(url, row, callback) {
11518       if (arguments.length < 3) callback = row, row = null;
11519       var r = request(url).mimeType(defaultMimeType);
11520       r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
11521       r.row(row);
11522       return callback ? r.get(callback) : r;
11523     };
11524   }
11525
11526   function responseOf(parse, row) {
11527     return function(request$$1) {
11528       return parse(request$$1.responseText, row);
11529     };
11530   }
11531
11532   var csv$1 = dsv$1("text/csv", csvParse);
11533
11534   var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11535
11536   var array$2 = Array.prototype;
11537
11538   var map$2 = array$2.map;
11539   var slice$5 = array$2.slice;
11540
11541   var implicit = {name: "implicit"};
11542
11543   function ordinal(range) {
11544     var index = map$1(),
11545         domain = [],
11546         unknown = implicit;
11547
11548     range = range == null ? [] : slice$5.call(range);
11549
11550     function scale(d) {
11551       var key = d + "", i = index.get(key);
11552       if (!i) {
11553         if (unknown !== implicit) return unknown;
11554         index.set(key, i = domain.push(d));
11555       }
11556       return range[(i - 1) % range.length];
11557     }
11558
11559     scale.domain = function(_) {
11560       if (!arguments.length) return domain.slice();
11561       domain = [], index = map$1();
11562       var i = -1, n = _.length, d, key;
11563       while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
11564       return scale;
11565     };
11566
11567     scale.range = function(_) {
11568       return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11569     };
11570
11571     scale.unknown = function(_) {
11572       return arguments.length ? (unknown = _, scale) : unknown;
11573     };
11574
11575     scale.copy = function() {
11576       return ordinal()
11577           .domain(domain)
11578           .range(range)
11579           .unknown(unknown);
11580     };
11581
11582     return scale;
11583   }
11584
11585   function band() {
11586     var scale = ordinal().unknown(undefined),
11587         domain = scale.domain,
11588         ordinalRange = scale.range,
11589         range$$1 = [0, 1],
11590         step,
11591         bandwidth,
11592         round = false,
11593         paddingInner = 0,
11594         paddingOuter = 0,
11595         align = 0.5;
11596
11597     delete scale.unknown;
11598
11599     function rescale() {
11600       var n = domain().length,
11601           reverse = range$$1[1] < range$$1[0],
11602           start = range$$1[reverse - 0],
11603           stop = range$$1[1 - reverse];
11604       step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
11605       if (round) step = Math.floor(step);
11606       start += (stop - start - step * (n - paddingInner)) * align;
11607       bandwidth = step * (1 - paddingInner);
11608       if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
11609       var values = range(n).map(function(i) { return start + step * i; });
11610       return ordinalRange(reverse ? values.reverse() : values);
11611     }
11612
11613     scale.domain = function(_) {
11614       return arguments.length ? (domain(_), rescale()) : domain();
11615     };
11616
11617     scale.range = function(_) {
11618       return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice();
11619     };
11620
11621     scale.rangeRound = function(_) {
11622       return range$$1 = [+_[0], +_[1]], round = true, rescale();
11623     };
11624
11625     scale.bandwidth = function() {
11626       return bandwidth;
11627     };
11628
11629     scale.step = function() {
11630       return step;
11631     };
11632
11633     scale.round = function(_) {
11634       return arguments.length ? (round = !!_, rescale()) : round;
11635     };
11636
11637     scale.padding = function(_) {
11638       return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11639     };
11640
11641     scale.paddingInner = function(_) {
11642       return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11643     };
11644
11645     scale.paddingOuter = function(_) {
11646       return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11647     };
11648
11649     scale.align = function(_) {
11650       return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11651     };
11652
11653     scale.copy = function() {
11654       return band()
11655           .domain(domain())
11656           .range(range$$1)
11657           .round(round)
11658           .paddingInner(paddingInner)
11659           .paddingOuter(paddingOuter)
11660           .align(align);
11661     };
11662
11663     return rescale();
11664   }
11665
11666   function pointish(scale) {
11667     var copy = scale.copy;
11668
11669     scale.padding = scale.paddingOuter;
11670     delete scale.paddingInner;
11671     delete scale.paddingOuter;
11672
11673     scale.copy = function() {
11674       return pointish(copy());
11675     };
11676
11677     return scale;
11678   }
11679
11680   function point$1() {
11681     return pointish(band().paddingInner(1));
11682   }
11683
11684   function constant$9(x) {
11685     return function() {
11686       return x;
11687     };
11688   }
11689
11690   function number$2(x) {
11691     return +x;
11692   }
11693
11694   var unit = [0, 1];
11695
11696   function deinterpolateLinear(a, b) {
11697     return (b -= (a = +a))
11698         ? function(x) { return (x - a) / b; }
11699         : constant$9(b);
11700   }
11701
11702   function deinterpolateClamp(deinterpolate) {
11703     return function(a, b) {
11704       var d = deinterpolate(a = +a, b = +b);
11705       return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
11706     };
11707   }
11708
11709   function reinterpolateClamp(reinterpolate) {
11710     return function(a, b) {
11711       var r = reinterpolate(a = +a, b = +b);
11712       return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
11713     };
11714   }
11715
11716   function bimap(domain, range$$1, deinterpolate, reinterpolate) {
11717     var d0 = domain[0], d1 = domain[1], r0 = range$$1[0], r1 = range$$1[1];
11718     if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
11719     else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
11720     return function(x) { return r0(d0(x)); };
11721   }
11722
11723   function polymap(domain, range$$1, deinterpolate, reinterpolate) {
11724     var j = Math.min(domain.length, range$$1.length) - 1,
11725         d = new Array(j),
11726         r = new Array(j),
11727         i = -1;
11728
11729     // Reverse descending domains.
11730     if (domain[j] < domain[0]) {
11731       domain = domain.slice().reverse();
11732       range$$1 = range$$1.slice().reverse();
11733     }
11734
11735     while (++i < j) {
11736       d[i] = deinterpolate(domain[i], domain[i + 1]);
11737       r[i] = reinterpolate(range$$1[i], range$$1[i + 1]);
11738     }
11739
11740     return function(x) {
11741       var i = bisectRight(domain, x, 1, j) - 1;
11742       return r[i](d[i](x));
11743     };
11744   }
11745
11746   function copy(source, target) {
11747     return target
11748         .domain(source.domain())
11749         .range(source.range())
11750         .interpolate(source.interpolate())
11751         .clamp(source.clamp());
11752   }
11753
11754   // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
11755   // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
11756   function continuous(deinterpolate, reinterpolate) {
11757     var domain = unit,
11758         range$$1 = unit,
11759         interpolate$$1 = interpolate,
11760         clamp = false,
11761         piecewise,
11762         output,
11763         input;
11764
11765     function rescale() {
11766       piecewise = Math.min(domain.length, range$$1.length) > 2 ? polymap : bimap;
11767       output = input = null;
11768       return scale;
11769     }
11770
11771     function scale(x) {
11772       return (output || (output = piecewise(domain, range$$1, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x);
11773     }
11774
11775     scale.invert = function(y) {
11776       return (input || (input = piecewise(range$$1, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11777     };
11778
11779     scale.domain = function(_) {
11780       return arguments.length ? (domain = map$2.call(_, number$2), rescale()) : domain.slice();
11781     };
11782
11783     scale.range = function(_) {
11784       return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
11785     };
11786
11787     scale.rangeRound = function(_) {
11788       return range$$1 = slice$5.call(_), interpolate$$1 = interpolateRound, rescale();
11789     };
11790
11791     scale.clamp = function(_) {
11792       return arguments.length ? (clamp = !!_, rescale()) : clamp;
11793     };
11794
11795     scale.interpolate = function(_) {
11796       return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1;
11797     };
11798
11799     return rescale();
11800   }
11801
11802   function tickFormat(domain, count, specifier) {
11803     var start = domain[0],
11804         stop = domain[domain.length - 1],
11805         step = tickStep(start, stop, count == null ? 10 : count),
11806         precision;
11807     specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11808     switch (specifier.type) {
11809       case "s": {
11810         var value = Math.max(Math.abs(start), Math.abs(stop));
11811         if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
11812         return formatPrefix(specifier, value);
11813       }
11814       case "":
11815       case "e":
11816       case "g":
11817       case "p":
11818       case "r": {
11819         if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11820         break;
11821       }
11822       case "f":
11823       case "%": {
11824         if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11825         break;
11826       }
11827     }
11828     return format(specifier);
11829   }
11830
11831   function linearish(scale) {
11832     var domain = scale.domain;
11833
11834     scale.ticks = function(count) {
11835       var d = domain();
11836       return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11837     };
11838
11839     scale.tickFormat = function(count, specifier) {
11840       return tickFormat(domain(), count, specifier);
11841     };
11842
11843     scale.nice = function(count) {
11844       if (count == null) count = 10;
11845
11846       var d = domain(),
11847           i0 = 0,
11848           i1 = d.length - 1,
11849           start = d[i0],
11850           stop = d[i1],
11851           step;
11852
11853       if (stop < start) {
11854         step = start, start = stop, stop = step;
11855         step = i0, i0 = i1, i1 = step;
11856       }
11857
11858       step = tickIncrement(start, stop, count);
11859
11860       if (step > 0) {
11861         start = Math.floor(start / step) * step;
11862         stop = Math.ceil(stop / step) * step;
11863         step = tickIncrement(start, stop, count);
11864       } else if (step < 0) {
11865         start = Math.ceil(start * step) / step;
11866         stop = Math.floor(stop * step) / step;
11867         step = tickIncrement(start, stop, count);
11868       }
11869
11870       if (step > 0) {
11871         d[i0] = Math.floor(start / step) * step;
11872         d[i1] = Math.ceil(stop / step) * step;
11873         domain(d);
11874       } else if (step < 0) {
11875         d[i0] = Math.ceil(start * step) / step;
11876         d[i1] = Math.floor(stop * step) / step;
11877         domain(d);
11878       }
11879
11880       return scale;
11881     };
11882
11883     return scale;
11884   }
11885
11886   function linear$2() {
11887     var scale = continuous(deinterpolateLinear, interpolateNumber);
11888
11889     scale.copy = function() {
11890       return copy(scale, linear$2());
11891     };
11892
11893     return linearish(scale);
11894   }
11895
11896   function identity$5() {
11897     var domain = [0, 1];
11898
11899     function scale(x) {
11900       return +x;
11901     }
11902
11903     scale.invert = scale;
11904
11905     scale.domain = scale.range = function(_) {
11906       return arguments.length ? (domain = map$2.call(_, number$2), scale) : domain.slice();
11907     };
11908
11909     scale.copy = function() {
11910       return identity$5().domain(domain);
11911     };
11912
11913     return linearish(scale);
11914   }
11915
11916   function nice(domain, interval) {
11917     domain = domain.slice();
11918
11919     var i0 = 0,
11920         i1 = domain.length - 1,
11921         x0 = domain[i0],
11922         x1 = domain[i1],
11923         t;
11924
11925     if (x1 < x0) {
11926       t = i0, i0 = i1, i1 = t;
11927       t = x0, x0 = x1, x1 = t;
11928     }
11929
11930     domain[i0] = interval.floor(x0);
11931     domain[i1] = interval.ceil(x1);
11932     return domain;
11933   }
11934
11935   function deinterpolate(a, b) {
11936     return (b = Math.log(b / a))
11937         ? function(x) { return Math.log(x / a) / b; }
11938         : constant$9(b);
11939   }
11940
11941   function reinterpolate(a, b) {
11942     return a < 0
11943         ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
11944         : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
11945   }
11946
11947   function pow10(x) {
11948     return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11949   }
11950
11951   function powp(base) {
11952     return base === 10 ? pow10
11953         : base === Math.E ? Math.exp
11954         : function(x) { return Math.pow(base, x); };
11955   }
11956
11957   function logp(base) {
11958     return base === Math.E ? Math.log
11959         : base === 10 && Math.log10
11960         || base === 2 && Math.log2
11961         || (base = Math.log(base), function(x) { return Math.log(x) / base; });
11962   }
11963
11964   function reflect(f) {
11965     return function(x) {
11966       return -f(-x);
11967     };
11968   }
11969
11970   function log$1() {
11971     var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11972         domain = scale.domain,
11973         base = 10,
11974         logs = logp(10),
11975         pows = powp(10);
11976
11977     function rescale() {
11978       logs = logp(base), pows = powp(base);
11979       if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11980       return scale;
11981     }
11982
11983     scale.base = function(_) {
11984       return arguments.length ? (base = +_, rescale()) : base;
11985     };
11986
11987     scale.domain = function(_) {
11988       return arguments.length ? (domain(_), rescale()) : domain();
11989     };
11990
11991     scale.ticks = function(count) {
11992       var d = domain(),
11993           u = d[0],
11994           v = d[d.length - 1],
11995           r;
11996
11997       if (r = v < u) i = u, u = v, v = i;
11998
11999       var i = logs(u),
12000           j = logs(v),
12001           p,
12002           k,
12003           t,
12004           n = count == null ? 10 : +count,
12005           z = [];
12006
12007       if (!(base % 1) && j - i < n) {
12008         i = Math.round(i) - 1, j = Math.round(j) + 1;
12009         if (u > 0) for (; i < j; ++i) {
12010           for (k = 1, p = pows(i); k < base; ++k) {
12011             t = p * k;
12012             if (t < u) continue;
12013             if (t > v) break;
12014             z.push(t);
12015           }
12016         } else for (; i < j; ++i) {
12017           for (k = base - 1, p = pows(i); k >= 1; --k) {
12018             t = p * k;
12019             if (t < u) continue;
12020             if (t > v) break;
12021             z.push(t);
12022           }
12023         }
12024       } else {
12025         z = ticks(i, j, Math.min(j - i, n)).map(pows);
12026       }
12027
12028       return r ? z.reverse() : z;
12029     };
12030
12031     scale.tickFormat = function(count, specifier) {
12032       if (specifier == null) specifier = base === 10 ? ".0e" : ",";
12033       if (typeof specifier !== "function") specifier = format(specifier);
12034       if (count === Infinity) return specifier;
12035       if (count == null) count = 10;
12036       var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
12037       return function(d) {
12038         var i = d / pows(Math.round(logs(d)));
12039         if (i * base < base - 0.5) i *= base;
12040         return i <= k ? specifier(d) : "";
12041       };
12042     };
12043
12044     scale.nice = function() {
12045       return domain(nice(domain(), {
12046         floor: function(x) { return pows(Math.floor(logs(x))); },
12047         ceil: function(x) { return pows(Math.ceil(logs(x))); }
12048       }));
12049     };
12050
12051     scale.copy = function() {
12052       return copy(scale, log$1().base(base));
12053     };
12054
12055     return scale;
12056   }
12057
12058   function raise$1(x, exponent) {
12059     return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12060   }
12061
12062   function pow$1() {
12063     var exponent = 1,
12064         scale = continuous(deinterpolate, reinterpolate),
12065         domain = scale.domain;
12066
12067     function deinterpolate(a, b) {
12068       return (b = raise$1(b, exponent) - (a = raise$1(a, exponent)))
12069           ? function(x) { return (raise$1(x, exponent) - a) / b; }
12070           : constant$9(b);
12071     }
12072
12073     function reinterpolate(a, b) {
12074       b = raise$1(b, exponent) - (a = raise$1(a, exponent));
12075       return function(t) { return raise$1(a + b * t, 1 / exponent); };
12076     }
12077
12078     scale.exponent = function(_) {
12079       return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12080     };
12081
12082     scale.copy = function() {
12083       return copy(scale, pow$1().exponent(exponent));
12084     };
12085
12086     return linearish(scale);
12087   }
12088
12089   function sqrt$1() {
12090     return pow$1().exponent(0.5);
12091   }
12092
12093   function quantile$1() {
12094     var domain = [],
12095         range$$1 = [],
12096         thresholds = [];
12097
12098     function rescale() {
12099       var i = 0, n = Math.max(1, range$$1.length);
12100       thresholds = new Array(n - 1);
12101       while (++i < n) thresholds[i - 1] = quantile(domain, i / n);
12102       return scale;
12103     }
12104
12105     function scale(x) {
12106       if (!isNaN(x = +x)) return range$$1[bisectRight(thresholds, x)];
12107     }
12108
12109     scale.invertExtent = function(y) {
12110       var i = range$$1.indexOf(y);
12111       return i < 0 ? [NaN, NaN] : [
12112         i > 0 ? thresholds[i - 1] : domain[0],
12113         i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
12114       ];
12115     };
12116
12117     scale.domain = function(_) {
12118       if (!arguments.length) return domain.slice();
12119       domain = [];
12120       for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
12121       domain.sort(ascending);
12122       return rescale();
12123     };
12124
12125     scale.range = function(_) {
12126       return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
12127     };
12128
12129     scale.quantiles = function() {
12130       return thresholds.slice();
12131     };
12132
12133     scale.copy = function() {
12134       return quantile$1()
12135           .domain(domain)
12136           .range(range$$1);
12137     };
12138
12139     return scale;
12140   }
12141
12142   function quantize() {
12143     var x0 = 0,
12144         x1 = 1,
12145         n = 1,
12146         domain = [0.5],
12147         range$$1 = [0, 1];
12148
12149     function scale(x) {
12150       if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12151     }
12152
12153     function rescale() {
12154       var i = -1;
12155       domain = new Array(n);
12156       while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12157       return scale;
12158     }
12159
12160     scale.domain = function(_) {
12161       return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12162     };
12163
12164     scale.range = function(_) {
12165       return arguments.length ? (n = (range$$1 = slice$5.call(_)).length - 1, rescale()) : range$$1.slice();
12166     };
12167
12168     scale.invertExtent = function(y) {
12169       var i = range$$1.indexOf(y);
12170       return i < 0 ? [NaN, NaN]
12171           : i < 1 ? [x0, domain[0]]
12172           : i >= n ? [domain[n - 1], x1]
12173           : [domain[i - 1], domain[i]];
12174     };
12175
12176     scale.copy = function() {
12177       return quantize()
12178           .domain([x0, x1])
12179           .range(range$$1);
12180     };
12181
12182     return linearish(scale);
12183   }
12184
12185   function threshold() {
12186     var domain = [0.5],
12187         range$$1 = [0, 1],
12188         n = 1;
12189
12190     function scale(x) {
12191       if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12192     }
12193
12194     scale.domain = function(_) {
12195       return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : domain.slice();
12196     };
12197
12198     scale.range = function(_) {
12199       return arguments.length ? (range$$1 = slice$5.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : range$$1.slice();
12200     };
12201
12202     scale.invertExtent = function(y) {
12203       var i = range$$1.indexOf(y);
12204       return [domain[i - 1], domain[i]];
12205     };
12206
12207     scale.copy = function() {
12208       return threshold()
12209           .domain(domain)
12210           .range(range$$1);
12211     };
12212
12213     return scale;
12214   }
12215
12216   var t0$1 = new Date,
12217       t1$1 = new Date;
12218
12219   function newInterval(floori, offseti, count, field) {
12220
12221     function interval(date) {
12222       return floori(date = new Date(+date)), date;
12223     }
12224
12225     interval.floor = interval;
12226
12227     interval.ceil = function(date) {
12228       return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12229     };
12230
12231     interval.round = function(date) {
12232       var d0 = interval(date),
12233           d1 = interval.ceil(date);
12234       return date - d0 < d1 - date ? d0 : d1;
12235     };
12236
12237     interval.offset = function(date, step) {
12238       return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12239     };
12240
12241     interval.range = function(start, stop, step) {
12242       var range = [], previous;
12243       start = interval.ceil(start);
12244       step = step == null ? 1 : Math.floor(step);
12245       if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
12246       do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
12247       while (previous < start && start < stop);
12248       return range;
12249     };
12250
12251     interval.filter = function(test) {
12252       return newInterval(function(date) {
12253         if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
12254       }, function(date, step) {
12255         if (date >= date) {
12256           if (step < 0) while (++step <= 0) {
12257             while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
12258           } else while (--step >= 0) {
12259             while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
12260           }
12261         }
12262       });
12263     };
12264
12265     if (count) {
12266       interval.count = function(start, end) {
12267         t0$1.setTime(+start), t1$1.setTime(+end);
12268         floori(t0$1), floori(t1$1);
12269         return Math.floor(count(t0$1, t1$1));
12270       };
12271
12272       interval.every = function(step) {
12273         step = Math.floor(step);
12274         return !isFinite(step) || !(step > 0) ? null
12275             : !(step > 1) ? interval
12276             : interval.filter(field
12277                 ? function(d) { return field(d) % step === 0; }
12278                 : function(d) { return interval.count(0, d) % step === 0; });
12279       };
12280     }
12281
12282     return interval;
12283   }
12284
12285   var millisecond = newInterval(function() {
12286     // noop
12287   }, function(date, step) {
12288     date.setTime(+date + step);
12289   }, function(start, end) {
12290     return end - start;
12291   });
12292
12293   // An optimized implementation for this simple case.
12294   millisecond.every = function(k) {
12295     k = Math.floor(k);
12296     if (!isFinite(k) || !(k > 0)) return null;
12297     if (!(k > 1)) return millisecond;
12298     return newInterval(function(date) {
12299       date.setTime(Math.floor(date / k) * k);
12300     }, function(date, step) {
12301       date.setTime(+date + step * k);
12302     }, function(start, end) {
12303       return (end - start) / k;
12304     });
12305   };
12306   var milliseconds = millisecond.range;
12307
12308   var durationSecond = 1e3;
12309   var durationMinute = 6e4;
12310   var durationHour = 36e5;
12311   var durationDay = 864e5;
12312   var durationWeek = 6048e5;
12313
12314   var second = newInterval(function(date) {
12315     date.setTime(Math.floor(date / durationSecond) * durationSecond);
12316   }, function(date, step) {
12317     date.setTime(+date + step * durationSecond);
12318   }, function(start, end) {
12319     return (end - start) / durationSecond;
12320   }, function(date) {
12321     return date.getUTCSeconds();
12322   });
12323   var seconds = second.range;
12324
12325   var minute = newInterval(function(date) {
12326     date.setTime(Math.floor(date / durationMinute) * durationMinute);
12327   }, function(date, step) {
12328     date.setTime(+date + step * durationMinute);
12329   }, function(start, end) {
12330     return (end - start) / durationMinute;
12331   }, function(date) {
12332     return date.getMinutes();
12333   });
12334   var minutes = minute.range;
12335
12336   var hour = newInterval(function(date) {
12337     var offset = date.getTimezoneOffset() * durationMinute % durationHour;
12338     if (offset < 0) offset += durationHour;
12339     date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);
12340   }, function(date, step) {
12341     date.setTime(+date + step * durationHour);
12342   }, function(start, end) {
12343     return (end - start) / durationHour;
12344   }, function(date) {
12345     return date.getHours();
12346   });
12347   var hours = hour.range;
12348
12349   var day = newInterval(function(date) {
12350     date.setHours(0, 0, 0, 0);
12351   }, function(date, step) {
12352     date.setDate(date.getDate() + step);
12353   }, function(start, end) {
12354     return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
12355   }, function(date) {
12356     return date.getDate() - 1;
12357   });
12358   var days = day.range;
12359
12360   function weekday(i) {
12361     return newInterval(function(date) {
12362       date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
12363       date.setHours(0, 0, 0, 0);
12364     }, function(date, step) {
12365       date.setDate(date.getDate() + step * 7);
12366     }, function(start, end) {
12367       return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
12368     });
12369   }
12370
12371   var sunday = weekday(0);
12372   var monday = weekday(1);
12373   var tuesday = weekday(2);
12374   var wednesday = weekday(3);
12375   var thursday = weekday(4);
12376   var friday = weekday(5);
12377   var saturday = weekday(6);
12378
12379   var sundays = sunday.range;
12380   var mondays = monday.range;
12381   var tuesdays = tuesday.range;
12382   var wednesdays = wednesday.range;
12383   var thursdays = thursday.range;
12384   var fridays = friday.range;
12385   var saturdays = saturday.range;
12386
12387   var month = newInterval(function(date) {
12388     date.setDate(1);
12389     date.setHours(0, 0, 0, 0);
12390   }, function(date, step) {
12391     date.setMonth(date.getMonth() + step);
12392   }, function(start, end) {
12393     return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
12394   }, function(date) {
12395     return date.getMonth();
12396   });
12397   var months = month.range;
12398
12399   var year = newInterval(function(date) {
12400     date.setMonth(0, 1);
12401     date.setHours(0, 0, 0, 0);
12402   }, function(date, step) {
12403     date.setFullYear(date.getFullYear() + step);
12404   }, function(start, end) {
12405     return end.getFullYear() - start.getFullYear();
12406   }, function(date) {
12407     return date.getFullYear();
12408   });
12409
12410   // An optimized implementation for this simple case.
12411   year.every = function(k) {
12412     return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12413       date.setFullYear(Math.floor(date.getFullYear() / k) * k);
12414       date.setMonth(0, 1);
12415       date.setHours(0, 0, 0, 0);
12416     }, function(date, step) {
12417       date.setFullYear(date.getFullYear() + step * k);
12418     });
12419   };
12420   var years = year.range;
12421
12422   var utcMinute = newInterval(function(date) {
12423     date.setUTCSeconds(0, 0);
12424   }, function(date, step) {
12425     date.setTime(+date + step * durationMinute);
12426   }, function(start, end) {
12427     return (end - start) / durationMinute;
12428   }, function(date) {
12429     return date.getUTCMinutes();
12430   });
12431   var utcMinutes = utcMinute.range;
12432
12433   var utcHour = newInterval(function(date) {
12434     date.setUTCMinutes(0, 0, 0);
12435   }, function(date, step) {
12436     date.setTime(+date + step * durationHour);
12437   }, function(start, end) {
12438     return (end - start) / durationHour;
12439   }, function(date) {
12440     return date.getUTCHours();
12441   });
12442   var utcHours = utcHour.range;
12443
12444   var utcDay = newInterval(function(date) {
12445     date.setUTCHours(0, 0, 0, 0);
12446   }, function(date, step) {
12447     date.setUTCDate(date.getUTCDate() + step);
12448   }, function(start, end) {
12449     return (end - start) / durationDay;
12450   }, function(date) {
12451     return date.getUTCDate() - 1;
12452   });
12453   var utcDays = utcDay.range;
12454
12455   function utcWeekday(i) {
12456     return newInterval(function(date) {
12457       date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
12458       date.setUTCHours(0, 0, 0, 0);
12459     }, function(date, step) {
12460       date.setUTCDate(date.getUTCDate() + step * 7);
12461     }, function(start, end) {
12462       return (end - start) / durationWeek;
12463     });
12464   }
12465
12466   var utcSunday = utcWeekday(0);
12467   var utcMonday = utcWeekday(1);
12468   var utcTuesday = utcWeekday(2);
12469   var utcWednesday = utcWeekday(3);
12470   var utcThursday = utcWeekday(4);
12471   var utcFriday = utcWeekday(5);
12472   var utcSaturday = utcWeekday(6);
12473
12474   var utcSundays = utcSunday.range;
12475   var utcMondays = utcMonday.range;
12476   var utcTuesdays = utcTuesday.range;
12477   var utcWednesdays = utcWednesday.range;
12478   var utcThursdays = utcThursday.range;
12479   var utcFridays = utcFriday.range;
12480   var utcSaturdays = utcSaturday.range;
12481
12482   var utcMonth = newInterval(function(date) {
12483     date.setUTCDate(1);
12484     date.setUTCHours(0, 0, 0, 0);
12485   }, function(date, step) {
12486     date.setUTCMonth(date.getUTCMonth() + step);
12487   }, function(start, end) {
12488     return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
12489   }, function(date) {
12490     return date.getUTCMonth();
12491   });
12492   var utcMonths = utcMonth.range;
12493
12494   var utcYear = newInterval(function(date) {
12495     date.setUTCMonth(0, 1);
12496     date.setUTCHours(0, 0, 0, 0);
12497   }, function(date, step) {
12498     date.setUTCFullYear(date.getUTCFullYear() + step);
12499   }, function(start, end) {
12500     return end.getUTCFullYear() - start.getUTCFullYear();
12501   }, function(date) {
12502     return date.getUTCFullYear();
12503   });
12504
12505   // An optimized implementation for this simple case.
12506   utcYear.every = function(k) {
12507     return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12508       date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
12509       date.setUTCMonth(0, 1);
12510       date.setUTCHours(0, 0, 0, 0);
12511     }, function(date, step) {
12512       date.setUTCFullYear(date.getUTCFullYear() + step * k);
12513     });
12514   };
12515   var utcYears = utcYear.range;
12516
12517   function localDate(d) {
12518     if (0 <= d.y && d.y < 100) {
12519       var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
12520       date.setFullYear(d.y);
12521       return date;
12522     }
12523     return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12524   }
12525
12526   function utcDate(d) {
12527     if (0 <= d.y && d.y < 100) {
12528       var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
12529       date.setUTCFullYear(d.y);
12530       return date;
12531     }
12532     return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12533   }
12534
12535   function newYear(y) {
12536     return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12537   }
12538
12539   function formatLocale$1(locale) {
12540     var locale_dateTime = locale.dateTime,
12541         locale_date = locale.date,
12542         locale_time = locale.time,
12543         locale_periods = locale.periods,
12544         locale_weekdays = locale.days,
12545         locale_shortWeekdays = locale.shortDays,
12546         locale_months = locale.months,
12547         locale_shortMonths = locale.shortMonths;
12548
12549     var periodRe = formatRe(locale_periods),
12550         periodLookup = formatLookup(locale_periods),
12551         weekdayRe = formatRe(locale_weekdays),
12552         weekdayLookup = formatLookup(locale_weekdays),
12553         shortWeekdayRe = formatRe(locale_shortWeekdays),
12554         shortWeekdayLookup = formatLookup(locale_shortWeekdays),
12555         monthRe = formatRe(locale_months),
12556         monthLookup = formatLookup(locale_months),
12557         shortMonthRe = formatRe(locale_shortMonths),
12558         shortMonthLookup = formatLookup(locale_shortMonths);
12559
12560     var formats = {
12561       "a": formatShortWeekday,
12562       "A": formatWeekday,
12563       "b": formatShortMonth,
12564       "B": formatMonth,
12565       "c": null,
12566       "d": formatDayOfMonth,
12567       "e": formatDayOfMonth,
12568       "f": formatMicroseconds,
12569       "H": formatHour24,
12570       "I": formatHour12,
12571       "j": formatDayOfYear,
12572       "L": formatMilliseconds,
12573       "m": formatMonthNumber,
12574       "M": formatMinutes,
12575       "p": formatPeriod,
12576       "Q": formatUnixTimestamp,
12577       "s": formatUnixTimestampSeconds,
12578       "S": formatSeconds,
12579       "u": formatWeekdayNumberMonday,
12580       "U": formatWeekNumberSunday,
12581       "V": formatWeekNumberISO,
12582       "w": formatWeekdayNumberSunday,
12583       "W": formatWeekNumberMonday,
12584       "x": null,
12585       "X": null,
12586       "y": formatYear,
12587       "Y": formatFullYear,
12588       "Z": formatZone,
12589       "%": formatLiteralPercent
12590     };
12591
12592     var utcFormats = {
12593       "a": formatUTCShortWeekday,
12594       "A": formatUTCWeekday,
12595       "b": formatUTCShortMonth,
12596       "B": formatUTCMonth,
12597       "c": null,
12598       "d": formatUTCDayOfMonth,
12599       "e": formatUTCDayOfMonth,
12600       "f": formatUTCMicroseconds,
12601       "H": formatUTCHour24,
12602       "I": formatUTCHour12,
12603       "j": formatUTCDayOfYear,
12604       "L": formatUTCMilliseconds,
12605       "m": formatUTCMonthNumber,
12606       "M": formatUTCMinutes,
12607       "p": formatUTCPeriod,
12608       "Q": formatUnixTimestamp,
12609       "s": formatUnixTimestampSeconds,
12610       "S": formatUTCSeconds,
12611       "u": formatUTCWeekdayNumberMonday,
12612       "U": formatUTCWeekNumberSunday,
12613       "V": formatUTCWeekNumberISO,
12614       "w": formatUTCWeekdayNumberSunday,
12615       "W": formatUTCWeekNumberMonday,
12616       "x": null,
12617       "X": null,
12618       "y": formatUTCYear,
12619       "Y": formatUTCFullYear,
12620       "Z": formatUTCZone,
12621       "%": formatLiteralPercent
12622     };
12623
12624     var parses = {
12625       "a": parseShortWeekday,
12626       "A": parseWeekday,
12627       "b": parseShortMonth,
12628       "B": parseMonth,
12629       "c": parseLocaleDateTime,
12630       "d": parseDayOfMonth,
12631       "e": parseDayOfMonth,
12632       "f": parseMicroseconds,
12633       "H": parseHour24,
12634       "I": parseHour24,
12635       "j": parseDayOfYear,
12636       "L": parseMilliseconds,
12637       "m": parseMonthNumber,
12638       "M": parseMinutes,
12639       "p": parsePeriod,
12640       "Q": parseUnixTimestamp,
12641       "s": parseUnixTimestampSeconds,
12642       "S": parseSeconds,
12643       "u": parseWeekdayNumberMonday,
12644       "U": parseWeekNumberSunday,
12645       "V": parseWeekNumberISO,
12646       "w": parseWeekdayNumberSunday,
12647       "W": parseWeekNumberMonday,
12648       "x": parseLocaleDate,
12649       "X": parseLocaleTime,
12650       "y": parseYear,
12651       "Y": parseFullYear,
12652       "Z": parseZone,
12653       "%": parseLiteralPercent
12654     };
12655
12656     // These recursive directive definitions must be deferred.
12657     formats.x = newFormat(locale_date, formats);
12658     formats.X = newFormat(locale_time, formats);
12659     formats.c = newFormat(locale_dateTime, formats);
12660     utcFormats.x = newFormat(locale_date, utcFormats);
12661     utcFormats.X = newFormat(locale_time, utcFormats);
12662     utcFormats.c = newFormat(locale_dateTime, utcFormats);
12663
12664     function newFormat(specifier, formats) {
12665       return function(date) {
12666         var string = [],
12667             i = -1,
12668             j = 0,
12669             n = specifier.length,
12670             c,
12671             pad,
12672             format;
12673
12674         if (!(date instanceof Date)) date = new Date(+date);
12675
12676         while (++i < n) {
12677           if (specifier.charCodeAt(i) === 37) {
12678             string.push(specifier.slice(j, i));
12679             if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
12680             else pad = c === "e" ? " " : "0";
12681             if (format = formats[c]) c = format(date, pad);
12682             string.push(c);
12683             j = i + 1;
12684           }
12685         }
12686
12687         string.push(specifier.slice(j, i));
12688         return string.join("");
12689       };
12690     }
12691
12692     function newParse(specifier, newDate) {
12693       return function(string) {
12694         var d = newYear(1900),
12695             i = parseSpecifier(d, specifier, string += "", 0),
12696             week, day$$1;
12697         if (i != string.length) return null;
12698
12699         // If a UNIX timestamp is specified, return it.
12700         if ("Q" in d) return new Date(d.Q);
12701
12702         // The am-pm flag is 0 for AM, and 1 for PM.
12703         if ("p" in d) d.H = d.H % 12 + d.p * 12;
12704
12705         // Convert day-of-week and week-of-year to day-of-year.
12706         if ("V" in d) {
12707           if (d.V < 1 || d.V > 53) return null;
12708           if (!("w" in d)) d.w = 1;
12709           if ("Z" in d) {
12710             week = utcDate(newYear(d.y)), day$$1 = week.getUTCDay();
12711             week = day$$1 > 4 || day$$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
12712             week = utcDay.offset(week, (d.V - 1) * 7);
12713             d.y = week.getUTCFullYear();
12714             d.m = week.getUTCMonth();
12715             d.d = week.getUTCDate() + (d.w + 6) % 7;
12716           } else {
12717             week = newDate(newYear(d.y)), day$$1 = week.getDay();
12718             week = day$$1 > 4 || day$$1 === 0 ? monday.ceil(week) : monday(week);
12719             week = day.offset(week, (d.V - 1) * 7);
12720             d.y = week.getFullYear();
12721             d.m = week.getMonth();
12722             d.d = week.getDate() + (d.w + 6) % 7;
12723           }
12724         } else if ("W" in d || "U" in d) {
12725           if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
12726           day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
12727           d.m = 0;
12728           d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$$1 + 5) % 7 : d.w + d.U * 7 - (day$$1 + 6) % 7;
12729         }
12730
12731         // If a time zone is specified, all fields are interpreted as UTC and then
12732         // offset according to the specified time zone.
12733         if ("Z" in d) {
12734           d.H += d.Z / 100 | 0;
12735           d.M += d.Z % 100;
12736           return utcDate(d);
12737         }
12738
12739         // Otherwise, all fields are in local time.
12740         return newDate(d);
12741       };
12742     }
12743
12744     function parseSpecifier(d, specifier, string, j) {
12745       var i = 0,
12746           n = specifier.length,
12747           m = string.length,
12748           c,
12749           parse;
12750
12751       while (i < n) {
12752         if (j >= m) return -1;
12753         c = specifier.charCodeAt(i++);
12754         if (c === 37) {
12755           c = specifier.charAt(i++);
12756           parse = parses[c in pads ? specifier.charAt(i++) : c];
12757           if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
12758         } else if (c != string.charCodeAt(j++)) {
12759           return -1;
12760         }
12761       }
12762
12763       return j;
12764     }
12765
12766     function parsePeriod(d, string, i) {
12767       var n = periodRe.exec(string.slice(i));
12768       return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12769     }
12770
12771     function parseShortWeekday(d, string, i) {
12772       var n = shortWeekdayRe.exec(string.slice(i));
12773       return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12774     }
12775
12776     function parseWeekday(d, string, i) {
12777       var n = weekdayRe.exec(string.slice(i));
12778       return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12779     }
12780
12781     function parseShortMonth(d, string, i) {
12782       var n = shortMonthRe.exec(string.slice(i));
12783       return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12784     }
12785
12786     function parseMonth(d, string, i) {
12787       var n = monthRe.exec(string.slice(i));
12788       return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12789     }
12790
12791     function parseLocaleDateTime(d, string, i) {
12792       return parseSpecifier(d, locale_dateTime, string, i);
12793     }
12794
12795     function parseLocaleDate(d, string, i) {
12796       return parseSpecifier(d, locale_date, string, i);
12797     }
12798
12799     function parseLocaleTime(d, string, i) {
12800       return parseSpecifier(d, locale_time, string, i);
12801     }
12802
12803     function formatShortWeekday(d) {
12804       return locale_shortWeekdays[d.getDay()];
12805     }
12806
12807     function formatWeekday(d) {
12808       return locale_weekdays[d.getDay()];
12809     }
12810
12811     function formatShortMonth(d) {
12812       return locale_shortMonths[d.getMonth()];
12813     }
12814
12815     function formatMonth(d) {
12816       return locale_months[d.getMonth()];
12817     }
12818
12819     function formatPeriod(d) {
12820       return locale_periods[+(d.getHours() >= 12)];
12821     }
12822
12823     function formatUTCShortWeekday(d) {
12824       return locale_shortWeekdays[d.getUTCDay()];
12825     }
12826
12827     function formatUTCWeekday(d) {
12828       return locale_weekdays[d.getUTCDay()];
12829     }
12830
12831     function formatUTCShortMonth(d) {
12832       return locale_shortMonths[d.getUTCMonth()];
12833     }
12834
12835     function formatUTCMonth(d) {
12836       return locale_months[d.getUTCMonth()];
12837     }
12838
12839     function formatUTCPeriod(d) {
12840       return locale_periods[+(d.getUTCHours() >= 12)];
12841     }
12842
12843     return {
12844       format: function(specifier) {
12845         var f = newFormat(specifier += "", formats);
12846         f.toString = function() { return specifier; };
12847         return f;
12848       },
12849       parse: function(specifier) {
12850         var p = newParse(specifier += "", localDate);
12851         p.toString = function() { return specifier; };
12852         return p;
12853       },
12854       utcFormat: function(specifier) {
12855         var f = newFormat(specifier += "", utcFormats);
12856         f.toString = function() { return specifier; };
12857         return f;
12858       },
12859       utcParse: function(specifier) {
12860         var p = newParse(specifier, utcDate);
12861         p.toString = function() { return specifier; };
12862         return p;
12863       }
12864     };
12865   }
12866
12867   var pads = {"-": "", "_": " ", "0": "0"},
12868       numberRe = /^\s*\d+/, // note: ignores next directive
12869       percentRe = /^%/,
12870       requoteRe = /[\\^$*+?|[\]().{}]/g;
12871
12872   function pad(value, fill, width) {
12873     var sign = value < 0 ? "-" : "",
12874         string = (sign ? -value : value) + "",
12875         length = string.length;
12876     return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
12877   }
12878
12879   function requote(s) {
12880     return s.replace(requoteRe, "\\$&");
12881   }
12882
12883   function formatRe(names) {
12884     return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12885   }
12886
12887   function formatLookup(names) {
12888     var map = {}, i = -1, n = names.length;
12889     while (++i < n) map[names[i].toLowerCase()] = i;
12890     return map;
12891   }
12892
12893   function parseWeekdayNumberSunday(d, string, i) {
12894     var n = numberRe.exec(string.slice(i, i + 1));
12895     return n ? (d.w = +n[0], i + n[0].length) : -1;
12896   }
12897
12898   function parseWeekdayNumberMonday(d, string, i) {
12899     var n = numberRe.exec(string.slice(i, i + 1));
12900     return n ? (d.u = +n[0], i + n[0].length) : -1;
12901   }
12902
12903   function parseWeekNumberSunday(d, string, i) {
12904     var n = numberRe.exec(string.slice(i, i + 2));
12905     return n ? (d.U = +n[0], i + n[0].length) : -1;
12906   }
12907
12908   function parseWeekNumberISO(d, string, i) {
12909     var n = numberRe.exec(string.slice(i, i + 2));
12910     return n ? (d.V = +n[0], i + n[0].length) : -1;
12911   }
12912
12913   function parseWeekNumberMonday(d, string, i) {
12914     var n = numberRe.exec(string.slice(i, i + 2));
12915     return n ? (d.W = +n[0], i + n[0].length) : -1;
12916   }
12917
12918   function parseFullYear(d, string, i) {
12919     var n = numberRe.exec(string.slice(i, i + 4));
12920     return n ? (d.y = +n[0], i + n[0].length) : -1;
12921   }
12922
12923   function parseYear(d, string, i) {
12924     var n = numberRe.exec(string.slice(i, i + 2));
12925     return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
12926   }
12927
12928   function parseZone(d, string, i) {
12929     var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
12930     return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
12931   }
12932
12933   function parseMonthNumber(d, string, i) {
12934     var n = numberRe.exec(string.slice(i, i + 2));
12935     return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
12936   }
12937
12938   function parseDayOfMonth(d, string, i) {
12939     var n = numberRe.exec(string.slice(i, i + 2));
12940     return n ? (d.d = +n[0], i + n[0].length) : -1;
12941   }
12942
12943   function parseDayOfYear(d, string, i) {
12944     var n = numberRe.exec(string.slice(i, i + 3));
12945     return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
12946   }
12947
12948   function parseHour24(d, string, i) {
12949     var n = numberRe.exec(string.slice(i, i + 2));
12950     return n ? (d.H = +n[0], i + n[0].length) : -1;
12951   }
12952
12953   function parseMinutes(d, string, i) {
12954     var n = numberRe.exec(string.slice(i, i + 2));
12955     return n ? (d.M = +n[0], i + n[0].length) : -1;
12956   }
12957
12958   function parseSeconds(d, string, i) {
12959     var n = numberRe.exec(string.slice(i, i + 2));
12960     return n ? (d.S = +n[0], i + n[0].length) : -1;
12961   }
12962
12963   function parseMilliseconds(d, string, i) {
12964     var n = numberRe.exec(string.slice(i, i + 3));
12965     return n ? (d.L = +n[0], i + n[0].length) : -1;
12966   }
12967
12968   function parseMicroseconds(d, string, i) {
12969     var n = numberRe.exec(string.slice(i, i + 6));
12970     return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
12971   }
12972
12973   function parseLiteralPercent(d, string, i) {
12974     var n = percentRe.exec(string.slice(i, i + 1));
12975     return n ? i + n[0].length : -1;
12976   }
12977
12978   function parseUnixTimestamp(d, string, i) {
12979     var n = numberRe.exec(string.slice(i));
12980     return n ? (d.Q = +n[0], i + n[0].length) : -1;
12981   }
12982
12983   function parseUnixTimestampSeconds(d, string, i) {
12984     var n = numberRe.exec(string.slice(i));
12985     return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
12986   }
12987
12988   function formatDayOfMonth(d, p) {
12989     return pad(d.getDate(), p, 2);
12990   }
12991
12992   function formatHour24(d, p) {
12993     return pad(d.getHours(), p, 2);
12994   }
12995
12996   function formatHour12(d, p) {
12997     return pad(d.getHours() % 12 || 12, p, 2);
12998   }
12999
13000   function formatDayOfYear(d, p) {
13001     return pad(1 + day.count(year(d), d), p, 3);
13002   }
13003
13004   function formatMilliseconds(d, p) {
13005     return pad(d.getMilliseconds(), p, 3);
13006   }
13007
13008   function formatMicroseconds(d, p) {
13009     return formatMilliseconds(d, p) + "000";
13010   }
13011
13012   function formatMonthNumber(d, p) {
13013     return pad(d.getMonth() + 1, p, 2);
13014   }
13015
13016   function formatMinutes(d, p) {
13017     return pad(d.getMinutes(), p, 2);
13018   }
13019
13020   function formatSeconds(d, p) {
13021     return pad(d.getSeconds(), p, 2);
13022   }
13023
13024   function formatWeekdayNumberMonday(d) {
13025     var day$$1 = d.getDay();
13026     return day$$1 === 0 ? 7 : day$$1;
13027   }
13028
13029   function formatWeekNumberSunday(d, p) {
13030     return pad(sunday.count(year(d), d), p, 2);
13031   }
13032
13033   function formatWeekNumberISO(d, p) {
13034     var day$$1 = d.getDay();
13035     d = (day$$1 >= 4 || day$$1 === 0) ? thursday(d) : thursday.ceil(d);
13036     return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
13037   }
13038
13039   function formatWeekdayNumberSunday(d) {
13040     return d.getDay();
13041   }
13042
13043   function formatWeekNumberMonday(d, p) {
13044     return pad(monday.count(year(d), d), p, 2);
13045   }
13046
13047   function formatYear(d, p) {
13048     return pad(d.getFullYear() % 100, p, 2);
13049   }
13050
13051   function formatFullYear(d, p) {
13052     return pad(d.getFullYear() % 10000, p, 4);
13053   }
13054
13055   function formatZone(d) {
13056     var z = d.getTimezoneOffset();
13057     return (z > 0 ? "-" : (z *= -1, "+"))
13058         + pad(z / 60 | 0, "0", 2)
13059         + pad(z % 60, "0", 2);
13060   }
13061
13062   function formatUTCDayOfMonth(d, p) {
13063     return pad(d.getUTCDate(), p, 2);
13064   }
13065
13066   function formatUTCHour24(d, p) {
13067     return pad(d.getUTCHours(), p, 2);
13068   }
13069
13070   function formatUTCHour12(d, p) {
13071     return pad(d.getUTCHours() % 12 || 12, p, 2);
13072   }
13073
13074   function formatUTCDayOfYear(d, p) {
13075     return pad(1 + utcDay.count(utcYear(d), d), p, 3);
13076   }
13077
13078   function formatUTCMilliseconds(d, p) {
13079     return pad(d.getUTCMilliseconds(), p, 3);
13080   }
13081
13082   function formatUTCMicroseconds(d, p) {
13083     return formatUTCMilliseconds(d, p) + "000";
13084   }
13085
13086   function formatUTCMonthNumber(d, p) {
13087     return pad(d.getUTCMonth() + 1, p, 2);
13088   }
13089
13090   function formatUTCMinutes(d, p) {
13091     return pad(d.getUTCMinutes(), p, 2);
13092   }
13093
13094   function formatUTCSeconds(d, p) {
13095     return pad(d.getUTCSeconds(), p, 2);
13096   }
13097
13098   function formatUTCWeekdayNumberMonday(d) {
13099     var dow = d.getUTCDay();
13100     return dow === 0 ? 7 : dow;
13101   }
13102
13103   function formatUTCWeekNumberSunday(d, p) {
13104     return pad(utcSunday.count(utcYear(d), d), p, 2);
13105   }
13106
13107   function formatUTCWeekNumberISO(d, p) {
13108     var day$$1 = d.getUTCDay();
13109     d = (day$$1 >= 4 || day$$1 === 0) ? utcThursday(d) : utcThursday.ceil(d);
13110     return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
13111   }
13112
13113   function formatUTCWeekdayNumberSunday(d) {
13114     return d.getUTCDay();
13115   }
13116
13117   function formatUTCWeekNumberMonday(d, p) {
13118     return pad(utcMonday.count(utcYear(d), d), p, 2);
13119   }
13120
13121   function formatUTCYear(d, p) {
13122     return pad(d.getUTCFullYear() % 100, p, 2);
13123   }
13124
13125   function formatUTCFullYear(d, p) {
13126     return pad(d.getUTCFullYear() % 10000, p, 4);
13127   }
13128
13129   function formatUTCZone() {
13130     return "+0000";
13131   }
13132
13133   function formatLiteralPercent() {
13134     return "%";
13135   }
13136
13137   function formatUnixTimestamp(d) {
13138     return +d;
13139   }
13140
13141   function formatUnixTimestampSeconds(d) {
13142     return Math.floor(+d / 1000);
13143   }
13144
13145   var locale$1;
13146   var timeFormat;
13147   var timeParse;
13148   var utcFormat;
13149   var utcParse;
13150
13151   defaultLocale$1({
13152     dateTime: "%x, %X",
13153     date: "%-m/%-d/%Y",
13154     time: "%-I:%M:%S %p",
13155     periods: ["AM", "PM"],
13156     days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
13157     shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
13158     months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
13159     shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
13160   });
13161
13162   function defaultLocale$1(definition) {
13163     locale$1 = formatLocale$1(definition);
13164     timeFormat = locale$1.format;
13165     timeParse = locale$1.parse;
13166     utcFormat = locale$1.utcFormat;
13167     utcParse = locale$1.utcParse;
13168     return locale$1;
13169   }
13170
13171   var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13172
13173   function formatIsoNative(date) {
13174     return date.toISOString();
13175   }
13176
13177   var formatIso = Date.prototype.toISOString
13178       ? formatIsoNative
13179       : utcFormat(isoSpecifier);
13180
13181   function parseIsoNative(string) {
13182     var date = new Date(string);
13183     return isNaN(date) ? null : date;
13184   }
13185
13186   var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13187       ? parseIsoNative
13188       : utcParse(isoSpecifier);
13189
13190   var durationSecond$1 = 1000,
13191       durationMinute$1 = durationSecond$1 * 60,
13192       durationHour$1 = durationMinute$1 * 60,
13193       durationDay$1 = durationHour$1 * 24,
13194       durationWeek$1 = durationDay$1 * 7,
13195       durationMonth = durationDay$1 * 30,
13196       durationYear = durationDay$1 * 365;
13197
13198   function date$1(t) {
13199     return new Date(t);
13200   }
13201
13202   function number$3(t) {
13203     return t instanceof Date ? +t : +new Date(+t);
13204   }
13205
13206   function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) {
13207     var scale = continuous(deinterpolateLinear, interpolateNumber),
13208         invert = scale.invert,
13209         domain = scale.domain;
13210
13211     var formatMillisecond = format(".%L"),
13212         formatSecond = format(":%S"),
13213         formatMinute = format("%I:%M"),
13214         formatHour = format("%I %p"),
13215         formatDay = format("%a %d"),
13216         formatWeek = format("%b %d"),
13217         formatMonth = format("%B"),
13218         formatYear = format("%Y");
13219
13220     var tickIntervals = [
13221       [second$$1,  1,      durationSecond$1],
13222       [second$$1,  5,  5 * durationSecond$1],
13223       [second$$1, 15, 15 * durationSecond$1],
13224       [second$$1, 30, 30 * durationSecond$1],
13225       [minute$$1,  1,      durationMinute$1],
13226       [minute$$1,  5,  5 * durationMinute$1],
13227       [minute$$1, 15, 15 * durationMinute$1],
13228       [minute$$1, 30, 30 * durationMinute$1],
13229       [  hour$$1,  1,      durationHour$1  ],
13230       [  hour$$1,  3,  3 * durationHour$1  ],
13231       [  hour$$1,  6,  6 * durationHour$1  ],
13232       [  hour$$1, 12, 12 * durationHour$1  ],
13233       [   day$$1,  1,      durationDay$1   ],
13234       [   day$$1,  2,  2 * durationDay$1   ],
13235       [  week,  1,      durationWeek$1  ],
13236       [ month$$1,  1,      durationMonth ],
13237       [ month$$1,  3,  3 * durationMonth ],
13238       [  year$$1,  1,      durationYear  ]
13239     ];
13240
13241     function tickFormat(date$$1) {
13242       return (second$$1(date$$1) < date$$1 ? formatMillisecond
13243           : minute$$1(date$$1) < date$$1 ? formatSecond
13244           : hour$$1(date$$1) < date$$1 ? formatMinute
13245           : day$$1(date$$1) < date$$1 ? formatHour
13246           : month$$1(date$$1) < date$$1 ? (week(date$$1) < date$$1 ? formatDay : formatWeek)
13247           : year$$1(date$$1) < date$$1 ? formatMonth
13248           : formatYear)(date$$1);
13249     }
13250
13251     function tickInterval(interval, start, stop, step) {
13252       if (interval == null) interval = 10;
13253
13254       // If a desired tick count is specified, pick a reasonable tick interval
13255       // based on the extent of the domain and a rough estimate of tick size.
13256       // Otherwise, assume interval is already a time interval and use it.
13257       if (typeof interval === "number") {
13258         var target = Math.abs(stop - start) / interval,
13259             i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);
13260         if (i === tickIntervals.length) {
13261           step = tickStep(start / durationYear, stop / durationYear, interval);
13262           interval = year$$1;
13263         } else if (i) {
13264           i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13265           step = i[1];
13266           interval = i[0];
13267         } else {
13268           step = Math.max(tickStep(start, stop, interval), 1);
13269           interval = millisecond$$1;
13270         }
13271       }
13272
13273       return step == null ? interval : interval.every(step);
13274     }
13275
13276     scale.invert = function(y) {
13277       return new Date(invert(y));
13278     };
13279
13280     scale.domain = function(_) {
13281       return arguments.length ? domain(map$2.call(_, number$3)) : domain().map(date$1);
13282     };
13283
13284     scale.ticks = function(interval, step) {
13285       var d = domain(),
13286           t0 = d[0],
13287           t1 = d[d.length - 1],
13288           r = t1 < t0,
13289           t;
13290       if (r) t = t0, t0 = t1, t1 = t;
13291       t = tickInterval(interval, t0, t1, step);
13292       t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
13293       return r ? t.reverse() : t;
13294     };
13295
13296     scale.tickFormat = function(count, specifier) {
13297       return specifier == null ? tickFormat : format(specifier);
13298     };
13299
13300     scale.nice = function(interval, step) {
13301       var d = domain();
13302       return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
13303           ? domain(nice(d, interval))
13304           : scale;
13305     };
13306
13307     scale.copy = function() {
13308       return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format));
13309     };
13310
13311     return scale;
13312   }
13313
13314   function time() {
13315     return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13316   }
13317
13318   function utcTime() {
13319     return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
13320   }
13321
13322   function colors(s) {
13323     return s.match(/.{6}/g).map(function(x) {
13324       return "#" + x;
13325     });
13326   }
13327
13328   var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13329
13330   var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13331
13332   var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13333
13334   var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13335
13336   var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13337
13338   var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13339
13340   var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13341
13342   var rainbow = cubehelix();
13343
13344   function rainbow$1(t) {
13345     if (t < 0 || t > 1) t -= Math.floor(t);
13346     var ts = Math.abs(t - 0.5);
13347     rainbow.h = 360 * t - 100;
13348     rainbow.s = 1.5 - 1.5 * ts;
13349     rainbow.l = 0.8 - 0.9 * ts;
13350     return rainbow + "";
13351   }
13352
13353   function ramp(range) {
13354     var n = range.length;
13355     return function(t) {
13356       return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
13357     };
13358   }
13359
13360   var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13361
13362   var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13363
13364   var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13365
13366   var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13367
13368   function sequential(interpolator) {
13369     var x0 = 0,
13370         x1 = 1,
13371         clamp = false;
13372
13373     function scale(x) {
13374       var t = (x - x0) / (x1 - x0);
13375       return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13376     }
13377
13378     scale.domain = function(_) {
13379       return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13380     };
13381
13382     scale.clamp = function(_) {
13383       return arguments.length ? (clamp = !!_, scale) : clamp;
13384     };
13385
13386     scale.interpolator = function(_) {
13387       return arguments.length ? (interpolator = _, scale) : interpolator;
13388     };
13389
13390     scale.copy = function() {
13391       return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13392     };
13393
13394     return linearish(scale);
13395   }
13396
13397   function constant$a(x) {
13398     return function constant() {
13399       return x;
13400     };
13401   }
13402
13403   var abs$1 = Math.abs;
13404   var atan2$1 = Math.atan2;
13405   var cos$2 = Math.cos;
13406   var max$2 = Math.max;
13407   var min$1 = Math.min;
13408   var sin$2 = Math.sin;
13409   var sqrt$2 = Math.sqrt;
13410
13411   var epsilon$3 = 1e-12;
13412   var pi$4 = Math.PI;
13413   var halfPi$3 = pi$4 / 2;
13414   var tau$4 = 2 * pi$4;
13415
13416   function acos$1(x) {
13417     return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13418   }
13419
13420   function asin$1(x) {
13421     return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13422   }
13423
13424   function arcInnerRadius(d) {
13425     return d.innerRadius;
13426   }
13427
13428   function arcOuterRadius(d) {
13429     return d.outerRadius;
13430   }
13431
13432   function arcStartAngle(d) {
13433     return d.startAngle;
13434   }
13435
13436   function arcEndAngle(d) {
13437     return d.endAngle;
13438   }
13439
13440   function arcPadAngle(d) {
13441     return d && d.padAngle; // Note: optional!
13442   }
13443
13444   function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
13445     var x10 = x1 - x0, y10 = y1 - y0,
13446         x32 = x3 - x2, y32 = y3 - y2,
13447         t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
13448     return [x0 + t * x10, y0 + t * y10];
13449   }
13450
13451   // Compute perpendicular offset line of length rc.
13452   // http://mathworld.wolfram.com/Circle-LineIntersection.html
13453   function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
13454     var x01 = x0 - x1,
13455         y01 = y0 - y1,
13456         lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13457         ox = lo * y01,
13458         oy = -lo * x01,
13459         x11 = x0 + ox,
13460         y11 = y0 + oy,
13461         x10 = x1 + ox,
13462         y10 = y1 + oy,
13463         x00 = (x11 + x10) / 2,
13464         y00 = (y11 + y10) / 2,
13465         dx = x10 - x11,
13466         dy = y10 - y11,
13467         d2 = dx * dx + dy * dy,
13468         r = r1 - rc,
13469         D = x11 * y10 - x10 * y11,
13470         d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)),
13471         cx0 = (D * dy - dx * d) / d2,
13472         cy0 = (-D * dx - dy * d) / d2,
13473         cx1 = (D * dy + dx * d) / d2,
13474         cy1 = (-D * dx + dy * d) / d2,
13475         dx0 = cx0 - x00,
13476         dy0 = cy0 - y00,
13477         dx1 = cx1 - x00,
13478         dy1 = cy1 - y00;
13479
13480     // Pick the closer of the two intersection points.
13481     // TODO Is there a faster way to determine which intersection to use?
13482     if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
13483
13484     return {
13485       cx: cx0,
13486       cy: cy0,
13487       x01: -ox,
13488       y01: -oy,
13489       x11: cx0 * (r1 / r - 1),
13490       y11: cy0 * (r1 / r - 1)
13491     };
13492   }
13493
13494   function arc() {
13495     var innerRadius = arcInnerRadius,
13496         outerRadius = arcOuterRadius,
13497         cornerRadius = constant$a(0),
13498         padRadius = null,
13499         startAngle = arcStartAngle,
13500         endAngle = arcEndAngle,
13501         padAngle = arcPadAngle,
13502         context = null;
13503
13504     function arc() {
13505       var buffer,
13506           r,
13507           r0 = +innerRadius.apply(this, arguments),
13508           r1 = +outerRadius.apply(this, arguments),
13509           a0 = startAngle.apply(this, arguments) - halfPi$3,
13510           a1 = endAngle.apply(this, arguments) - halfPi$3,
13511           da = abs$1(a1 - a0),
13512           cw = a1 > a0;
13513
13514       if (!context) context = buffer = path();
13515
13516       // Ensure that the outer radius is always larger than the inner radius.
13517       if (r1 < r0) r = r1, r1 = r0, r0 = r;
13518
13519       // Is it a point?
13520       if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13521
13522       // Or is it a circle or annulus?
13523       else if (da > tau$4 - epsilon$3) {
13524         context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
13525         context.arc(0, 0, r1, a0, a1, !cw);
13526         if (r0 > epsilon$3) {
13527           context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
13528           context.arc(0, 0, r0, a1, a0, cw);
13529         }
13530       }
13531
13532       // Or is it a circular or annular sector?
13533       else {
13534         var a01 = a0,
13535             a11 = a1,
13536             a00 = a0,
13537             a10 = a1,
13538             da0 = da,
13539             da1 = da,
13540             ap = padAngle.apply(this, arguments) / 2,
13541             rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
13542             rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
13543             rc0 = rc,
13544             rc1 = rc,
13545             t0,
13546             t1;
13547
13548         // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
13549         if (rp > epsilon$3) {
13550           var p0 = asin$1(rp / r0 * sin$2(ap)),
13551               p1 = asin$1(rp / r1 * sin$2(ap));
13552           if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
13553           else da0 = 0, a00 = a10 = (a0 + a1) / 2;
13554           if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
13555           else da1 = 0, a01 = a11 = (a0 + a1) / 2;
13556         }
13557
13558         var x01 = r1 * cos$2(a01),
13559             y01 = r1 * sin$2(a01),
13560             x10 = r0 * cos$2(a10),
13561             y10 = r0 * sin$2(a10);
13562
13563         // Apply rounded corners?
13564         if (rc > epsilon$3) {
13565           var x11 = r1 * cos$2(a11),
13566               y11 = r1 * sin$2(a11),
13567               x00 = r0 * cos$2(a00),
13568               y00 = r0 * sin$2(a00);
13569
13570           // Restrict the corner radius according to the sector angle.
13571           if (da < pi$4) {
13572             var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13573                 ax = x01 - oc[0],
13574                 ay = y01 - oc[1],
13575                 bx = x11 - oc[0],
13576                 by = y11 - oc[1],
13577                 kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
13578                 lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
13579             rc0 = min$1(rc, (r0 - lc) / (kc - 1));
13580             rc1 = min$1(rc, (r1 - lc) / (kc + 1));
13581           }
13582         }
13583
13584         // Is the sector collapsed to a line?
13585         if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13586
13587         // Does the sector’s outer ring have rounded corners?
13588         else if (rc1 > epsilon$3) {
13589           t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
13590           t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
13591
13592           context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13593
13594           // Have the corners merged?
13595           if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13596
13597           // Otherwise, draw the two corners and the ring.
13598           else {
13599             context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13600             context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw);
13601             context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13602           }
13603         }
13604
13605         // Or is the outer ring just a circular arc?
13606         else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13607
13608         // Is there no inner ring, and it’s a circular sector?
13609         // Or perhaps it’s an annular sector collapsed due to padding?
13610         if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
13611
13612         // Does the sector’s inner ring (or point) have rounded corners?
13613         else if (rc0 > epsilon$3) {
13614           t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
13615           t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
13616
13617           context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13618
13619           // Have the corners merged?
13620           if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13621
13622           // Otherwise, draw the two corners and the ring.
13623           else {
13624             context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13625             context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw);
13626             context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13627           }
13628         }
13629
13630         // Or is the inner ring just a circular arc?
13631         else context.arc(0, 0, r0, a10, a00, cw);
13632       }
13633
13634       context.closePath();
13635
13636       if (buffer) return context = null, buffer + "" || null;
13637     }
13638
13639     arc.centroid = function() {
13640       var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
13641           a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
13642       return [cos$2(a) * r, sin$2(a) * r];
13643     };
13644
13645     arc.innerRadius = function(_) {
13646       return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : innerRadius;
13647     };
13648
13649     arc.outerRadius = function(_) {
13650       return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : outerRadius;
13651     };
13652
13653     arc.cornerRadius = function(_) {
13654       return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : cornerRadius;
13655     };
13656
13657     arc.padRadius = function(_) {
13658       return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), arc) : padRadius;
13659     };
13660
13661     arc.startAngle = function(_) {
13662       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : startAngle;
13663     };
13664
13665     arc.endAngle = function(_) {
13666       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : endAngle;
13667     };
13668
13669     arc.padAngle = function(_) {
13670       return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : padAngle;
13671     };
13672
13673     arc.context = function(_) {
13674       return arguments.length ? ((context = _ == null ? null : _), arc) : context;
13675     };
13676
13677     return arc;
13678   }
13679
13680   function Linear(context) {
13681     this._context = context;
13682   }
13683
13684   Linear.prototype = {
13685     areaStart: function() {
13686       this._line = 0;
13687     },
13688     areaEnd: function() {
13689       this._line = NaN;
13690     },
13691     lineStart: function() {
13692       this._point = 0;
13693     },
13694     lineEnd: function() {
13695       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13696       this._line = 1 - this._line;
13697     },
13698     point: function(x, y) {
13699       x = +x, y = +y;
13700       switch (this._point) {
13701         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
13702         case 1: this._point = 2; // proceed
13703         default: this._context.lineTo(x, y); break;
13704       }
13705     }
13706   };
13707
13708   function curveLinear(context) {
13709     return new Linear(context);
13710   }
13711
13712   function x$3(p) {
13713     return p[0];
13714   }
13715
13716   function y$3(p) {
13717     return p[1];
13718   }
13719
13720   function line() {
13721     var x$$1 = x$3,
13722         y$$1 = y$3,
13723         defined = constant$a(true),
13724         context = null,
13725         curve = curveLinear,
13726         output = null;
13727
13728     function line(data) {
13729       var i,
13730           n = data.length,
13731           d,
13732           defined0 = false,
13733           buffer;
13734
13735       if (context == null) output = curve(buffer = path());
13736
13737       for (i = 0; i <= n; ++i) {
13738         if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13739           if (defined0 = !defined0) output.lineStart();
13740           else output.lineEnd();
13741         }
13742         if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data));
13743       }
13744
13745       if (buffer) return output = null, buffer + "" || null;
13746     }
13747
13748     line.x = function(_) {
13749       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : x$$1;
13750     };
13751
13752     line.y = function(_) {
13753       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : y$$1;
13754     };
13755
13756     line.defined = function(_) {
13757       return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), line) : defined;
13758     };
13759
13760     line.curve = function(_) {
13761       return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13762     };
13763
13764     line.context = function(_) {
13765       return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13766     };
13767
13768     return line;
13769   }
13770
13771   function area() {
13772     var x0 = x$3,
13773         x1 = null,
13774         y0 = constant$a(0),
13775         y1 = y$3,
13776         defined = constant$a(true),
13777         context = null,
13778         curve = curveLinear,
13779         output = null;
13780
13781     function area(data) {
13782       var i,
13783           j,
13784           k,
13785           n = data.length,
13786           d,
13787           defined0 = false,
13788           buffer,
13789           x0z = new Array(n),
13790           y0z = new Array(n);
13791
13792       if (context == null) output = curve(buffer = path());
13793
13794       for (i = 0; i <= n; ++i) {
13795         if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13796           if (defined0 = !defined0) {
13797             j = i;
13798             output.areaStart();
13799             output.lineStart();
13800           } else {
13801             output.lineEnd();
13802             output.lineStart();
13803             for (k = i - 1; k >= j; --k) {
13804               output.point(x0z[k], y0z[k]);
13805             }
13806             output.lineEnd();
13807             output.areaEnd();
13808           }
13809         }
13810         if (defined0) {
13811           x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
13812           output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
13813         }
13814       }
13815
13816       if (buffer) return output = null, buffer + "" || null;
13817     }
13818
13819     function arealine() {
13820       return line().defined(defined).curve(curve).context(context);
13821     }
13822
13823     area.x = function(_) {
13824       return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), x1 = null, area) : x0;
13825     };
13826
13827     area.x0 = function(_) {
13828       return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), area) : x0;
13829     };
13830
13831     area.x1 = function(_) {
13832       return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : x1;
13833     };
13834
13835     area.y = function(_) {
13836       return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), y1 = null, area) : y0;
13837     };
13838
13839     area.y0 = function(_) {
13840       return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), area) : y0;
13841     };
13842
13843     area.y1 = function(_) {
13844       return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : y1;
13845     };
13846
13847     area.lineX0 =
13848     area.lineY0 = function() {
13849       return arealine().x(x0).y(y0);
13850     };
13851
13852     area.lineY1 = function() {
13853       return arealine().x(x0).y(y1);
13854     };
13855
13856     area.lineX1 = function() {
13857       return arealine().x(x1).y(y0);
13858     };
13859
13860     area.defined = function(_) {
13861       return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), area) : defined;
13862     };
13863
13864     area.curve = function(_) {
13865       return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13866     };
13867
13868     area.context = function(_) {
13869       return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13870     };
13871
13872     return area;
13873   }
13874
13875   function descending(a, b) {
13876     return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13877   }
13878
13879   function identity$6(d) {
13880     return d;
13881   }
13882
13883   function pie() {
13884     var value = identity$6,
13885         sortValues = descending,
13886         sort = null,
13887         startAngle = constant$a(0),
13888         endAngle = constant$a(tau$4),
13889         padAngle = constant$a(0);
13890
13891     function pie(data) {
13892       var i,
13893           n = data.length,
13894           j,
13895           k,
13896           sum = 0,
13897           index = new Array(n),
13898           arcs = new Array(n),
13899           a0 = +startAngle.apply(this, arguments),
13900           da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
13901           a1,
13902           p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13903           pa = p * (da < 0 ? -1 : 1),
13904           v;
13905
13906       for (i = 0; i < n; ++i) {
13907         if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13908           sum += v;
13909         }
13910       }
13911
13912       // Optionally sort the arcs by previously-computed values or by data.
13913       if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
13914       else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
13915
13916       // Compute the arcs! They are stored in the original data's order.
13917       for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
13918         j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
13919           data: data[j],
13920           index: i,
13921           value: v,
13922           startAngle: a0,
13923           endAngle: a1,
13924           padAngle: p
13925         };
13926       }
13927
13928       return arcs;
13929     }
13930
13931     pie.value = function(_) {
13932       return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), pie) : value;
13933     };
13934
13935     pie.sortValues = function(_) {
13936       return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13937     };
13938
13939     pie.sort = function(_) {
13940       return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13941     };
13942
13943     pie.startAngle = function(_) {
13944       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : startAngle;
13945     };
13946
13947     pie.endAngle = function(_) {
13948       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : endAngle;
13949     };
13950
13951     pie.padAngle = function(_) {
13952       return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : padAngle;
13953     };
13954
13955     return pie;
13956   }
13957
13958   var curveRadialLinear = curveRadial(curveLinear);
13959
13960   function Radial(curve) {
13961     this._curve = curve;
13962   }
13963
13964   Radial.prototype = {
13965     areaStart: function() {
13966       this._curve.areaStart();
13967     },
13968     areaEnd: function() {
13969       this._curve.areaEnd();
13970     },
13971     lineStart: function() {
13972       this._curve.lineStart();
13973     },
13974     lineEnd: function() {
13975       this._curve.lineEnd();
13976     },
13977     point: function(a, r) {
13978       this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13979     }
13980   };
13981
13982   function curveRadial(curve) {
13983
13984     function radial(context) {
13985       return new Radial(curve(context));
13986     }
13987
13988     radial._curve = curve;
13989
13990     return radial;
13991   }
13992
13993   function lineRadial(l) {
13994     var c = l.curve;
13995
13996     l.angle = l.x, delete l.x;
13997     l.radius = l.y, delete l.y;
13998
13999     l.curve = function(_) {
14000       return arguments.length ? c(curveRadial(_)) : c()._curve;
14001     };
14002
14003     return l;
14004   }
14005
14006   function lineRadial$1() {
14007     return lineRadial(line().curve(curveRadialLinear));
14008   }
14009
14010   function areaRadial() {
14011     var a = area().curve(curveRadialLinear),
14012         c = a.curve,
14013         x0 = a.lineX0,
14014         x1 = a.lineX1,
14015         y0 = a.lineY0,
14016         y1 = a.lineY1;
14017
14018     a.angle = a.x, delete a.x;
14019     a.startAngle = a.x0, delete a.x0;
14020     a.endAngle = a.x1, delete a.x1;
14021     a.radius = a.y, delete a.y;
14022     a.innerRadius = a.y0, delete a.y0;
14023     a.outerRadius = a.y1, delete a.y1;
14024     a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
14025     a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
14026     a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
14027     a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
14028
14029     a.curve = function(_) {
14030       return arguments.length ? c(curveRadial(_)) : c()._curve;
14031     };
14032
14033     return a;
14034   }
14035
14036   function pointRadial(x, y) {
14037     return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
14038   }
14039
14040   var slice$6 = Array.prototype.slice;
14041
14042   function linkSource(d) {
14043     return d.source;
14044   }
14045
14046   function linkTarget(d) {
14047     return d.target;
14048   }
14049
14050   function link$2(curve) {
14051     var source = linkSource,
14052         target = linkTarget,
14053         x$$1 = x$3,
14054         y$$1 = y$3,
14055         context = null;
14056
14057     function link() {
14058       var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
14059       if (!context) context = buffer = path();
14060       curve(context, +x$$1.apply(this, (argv[0] = s, argv)), +y$$1.apply(this, argv), +x$$1.apply(this, (argv[0] = t, argv)), +y$$1.apply(this, argv));
14061       if (buffer) return context = null, buffer + "" || null;
14062     }
14063
14064     link.source = function(_) {
14065       return arguments.length ? (source = _, link) : source;
14066     };
14067
14068     link.target = function(_) {
14069       return arguments.length ? (target = _, link) : target;
14070     };
14071
14072     link.x = function(_) {
14073       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : x$$1;
14074     };
14075
14076     link.y = function(_) {
14077       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : y$$1;
14078     };
14079
14080     link.context = function(_) {
14081       return arguments.length ? ((context = _ == null ? null : _), link) : context;
14082     };
14083
14084     return link;
14085   }
14086
14087   function curveHorizontal(context, x0, y0, x1, y1) {
14088     context.moveTo(x0, y0);
14089     context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
14090   }
14091
14092   function curveVertical(context, x0, y0, x1, y1) {
14093     context.moveTo(x0, y0);
14094     context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
14095   }
14096
14097   function curveRadial$1(context, x0, y0, x1, y1) {
14098     var p0 = pointRadial(x0, y0),
14099         p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
14100         p2 = pointRadial(x1, y0),
14101         p3 = pointRadial(x1, y1);
14102     context.moveTo(p0[0], p0[1]);
14103     context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
14104   }
14105
14106   function linkHorizontal() {
14107     return link$2(curveHorizontal);
14108   }
14109
14110   function linkVertical() {
14111     return link$2(curveVertical);
14112   }
14113
14114   function linkRadial() {
14115     var l = link$2(curveRadial$1);
14116     l.angle = l.x, delete l.x;
14117     l.radius = l.y, delete l.y;
14118     return l;
14119   }
14120
14121   var circle$2 = {
14122     draw: function(context, size) {
14123       var r = Math.sqrt(size / pi$4);
14124       context.moveTo(r, 0);
14125       context.arc(0, 0, r, 0, tau$4);
14126     }
14127   };
14128
14129   var cross$2 = {
14130     draw: function(context, size) {
14131       var r = Math.sqrt(size / 5) / 2;
14132       context.moveTo(-3 * r, -r);
14133       context.lineTo(-r, -r);
14134       context.lineTo(-r, -3 * r);
14135       context.lineTo(r, -3 * r);
14136       context.lineTo(r, -r);
14137       context.lineTo(3 * r, -r);
14138       context.lineTo(3 * r, r);
14139       context.lineTo(r, r);
14140       context.lineTo(r, 3 * r);
14141       context.lineTo(-r, 3 * r);
14142       context.lineTo(-r, r);
14143       context.lineTo(-3 * r, r);
14144       context.closePath();
14145     }
14146   };
14147
14148   var tan30 = Math.sqrt(1 / 3),
14149       tan30_2 = tan30 * 2;
14150
14151   var diamond = {
14152     draw: function(context, size) {
14153       var y = Math.sqrt(size / tan30_2),
14154           x = y * tan30;
14155       context.moveTo(0, -y);
14156       context.lineTo(x, 0);
14157       context.lineTo(0, y);
14158       context.lineTo(-x, 0);
14159       context.closePath();
14160     }
14161   };
14162
14163   var ka = 0.89081309152928522810,
14164       kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
14165       kx = Math.sin(tau$4 / 10) * kr,
14166       ky = -Math.cos(tau$4 / 10) * kr;
14167
14168   var star = {
14169     draw: function(context, size) {
14170       var r = Math.sqrt(size * ka),
14171           x = kx * r,
14172           y = ky * r;
14173       context.moveTo(0, -r);
14174       context.lineTo(x, y);
14175       for (var i = 1; i < 5; ++i) {
14176         var a = tau$4 * i / 5,
14177             c = Math.cos(a),
14178             s = Math.sin(a);
14179         context.lineTo(s * r, -c * r);
14180         context.lineTo(c * x - s * y, s * x + c * y);
14181       }
14182       context.closePath();
14183     }
14184   };
14185
14186   var square = {
14187     draw: function(context, size) {
14188       var w = Math.sqrt(size),
14189           x = -w / 2;
14190       context.rect(x, x, w, w);
14191     }
14192   };
14193
14194   var sqrt3 = Math.sqrt(3);
14195
14196   var triangle = {
14197     draw: function(context, size) {
14198       var y = -Math.sqrt(size / (sqrt3 * 3));
14199       context.moveTo(0, y * 2);
14200       context.lineTo(-sqrt3 * y, -y);
14201       context.lineTo(sqrt3 * y, -y);
14202       context.closePath();
14203     }
14204   };
14205
14206   var c = -0.5,
14207       s = Math.sqrt(3) / 2,
14208       k = 1 / Math.sqrt(12),
14209       a = (k / 2 + 1) * 3;
14210
14211   var wye = {
14212     draw: function(context, size) {
14213       var r = Math.sqrt(size / a),
14214           x0 = r / 2,
14215           y0 = r * k,
14216           x1 = x0,
14217           y1 = r * k + r,
14218           x2 = -x1,
14219           y2 = y1;
14220       context.moveTo(x0, y0);
14221       context.lineTo(x1, y1);
14222       context.lineTo(x2, y2);
14223       context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
14224       context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
14225       context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
14226       context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
14227       context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
14228       context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
14229       context.closePath();
14230     }
14231   };
14232
14233   var symbols = [
14234     circle$2,
14235     cross$2,
14236     diamond,
14237     square,
14238     star,
14239     triangle,
14240     wye
14241   ];
14242
14243   function symbol() {
14244     var type = constant$a(circle$2),
14245         size = constant$a(64),
14246         context = null;
14247
14248     function symbol() {
14249       var buffer;
14250       if (!context) context = buffer = path();
14251       type.apply(this, arguments).draw(context, +size.apply(this, arguments));
14252       if (buffer) return context = null, buffer + "" || null;
14253     }
14254
14255     symbol.type = function(_) {
14256       return arguments.length ? (type = typeof _ === "function" ? _ : constant$a(_), symbol) : type;
14257     };
14258
14259     symbol.size = function(_) {
14260       return arguments.length ? (size = typeof _ === "function" ? _ : constant$a(+_), symbol) : size;
14261     };
14262
14263     symbol.context = function(_) {
14264       return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14265     };
14266
14267     return symbol;
14268   }
14269
14270   function noop$2() {}
14271
14272   function point$2(that, x, y) {
14273     that._context.bezierCurveTo(
14274       (2 * that._x0 + that._x1) / 3,
14275       (2 * that._y0 + that._y1) / 3,
14276       (that._x0 + 2 * that._x1) / 3,
14277       (that._y0 + 2 * that._y1) / 3,
14278       (that._x0 + 4 * that._x1 + x) / 6,
14279       (that._y0 + 4 * that._y1 + y) / 6
14280     );
14281   }
14282
14283   function Basis(context) {
14284     this._context = context;
14285   }
14286
14287   Basis.prototype = {
14288     areaStart: function() {
14289       this._line = 0;
14290     },
14291     areaEnd: function() {
14292       this._line = NaN;
14293     },
14294     lineStart: function() {
14295       this._x0 = this._x1 =
14296       this._y0 = this._y1 = NaN;
14297       this._point = 0;
14298     },
14299     lineEnd: function() {
14300       switch (this._point) {
14301         case 3: point$2(this, this._x1, this._y1); // proceed
14302         case 2: this._context.lineTo(this._x1, this._y1); break;
14303       }
14304       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14305       this._line = 1 - this._line;
14306     },
14307     point: function(x, y) {
14308       x = +x, y = +y;
14309       switch (this._point) {
14310         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14311         case 1: this._point = 2; break;
14312         case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
14313         default: point$2(this, x, y); break;
14314       }
14315       this._x0 = this._x1, this._x1 = x;
14316       this._y0 = this._y1, this._y1 = y;
14317     }
14318   };
14319
14320   function basis$2(context) {
14321     return new Basis(context);
14322   }
14323
14324   function BasisClosed(context) {
14325     this._context = context;
14326   }
14327
14328   BasisClosed.prototype = {
14329     areaStart: noop$2,
14330     areaEnd: noop$2,
14331     lineStart: function() {
14332       this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
14333       this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
14334       this._point = 0;
14335     },
14336     lineEnd: function() {
14337       switch (this._point) {
14338         case 1: {
14339           this._context.moveTo(this._x2, this._y2);
14340           this._context.closePath();
14341           break;
14342         }
14343         case 2: {
14344           this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
14345           this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
14346           this._context.closePath();
14347           break;
14348         }
14349         case 3: {
14350           this.point(this._x2, this._y2);
14351           this.point(this._x3, this._y3);
14352           this.point(this._x4, this._y4);
14353           break;
14354         }
14355       }
14356     },
14357     point: function(x, y) {
14358       x = +x, y = +y;
14359       switch (this._point) {
14360         case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
14361         case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
14362         case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;
14363         default: point$2(this, x, y); break;
14364       }
14365       this._x0 = this._x1, this._x1 = x;
14366       this._y0 = this._y1, this._y1 = y;
14367     }
14368   };
14369
14370   function basisClosed$1(context) {
14371     return new BasisClosed(context);
14372   }
14373
14374   function BasisOpen(context) {
14375     this._context = context;
14376   }
14377
14378   BasisOpen.prototype = {
14379     areaStart: function() {
14380       this._line = 0;
14381     },
14382     areaEnd: function() {
14383       this._line = NaN;
14384     },
14385     lineStart: function() {
14386       this._x0 = this._x1 =
14387       this._y0 = this._y1 = NaN;
14388       this._point = 0;
14389     },
14390     lineEnd: function() {
14391       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14392       this._line = 1 - this._line;
14393     },
14394     point: function(x, y) {
14395       x = +x, y = +y;
14396       switch (this._point) {
14397         case 0: this._point = 1; break;
14398         case 1: this._point = 2; break;
14399         case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;
14400         case 3: this._point = 4; // proceed
14401         default: point$2(this, x, y); break;
14402       }
14403       this._x0 = this._x1, this._x1 = x;
14404       this._y0 = this._y1, this._y1 = y;
14405     }
14406   };
14407
14408   function basisOpen(context) {
14409     return new BasisOpen(context);
14410   }
14411
14412   function Bundle(context, beta) {
14413     this._basis = new Basis(context);
14414     this._beta = beta;
14415   }
14416
14417   Bundle.prototype = {
14418     lineStart: function() {
14419       this._x = [];
14420       this._y = [];
14421       this._basis.lineStart();
14422     },
14423     lineEnd: function() {
14424       var x = this._x,
14425           y = this._y,
14426           j = x.length - 1;
14427
14428       if (j > 0) {
14429         var x0 = x[0],
14430             y0 = y[0],
14431             dx = x[j] - x0,
14432             dy = y[j] - y0,
14433             i = -1,
14434             t;
14435
14436         while (++i <= j) {
14437           t = i / j;
14438           this._basis.point(
14439             this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14440             this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14441           );
14442         }
14443       }
14444
14445       this._x = this._y = null;
14446       this._basis.lineEnd();
14447     },
14448     point: function(x, y) {
14449       this._x.push(+x);
14450       this._y.push(+y);
14451     }
14452   };
14453
14454   var bundle = (function custom(beta) {
14455
14456     function bundle(context) {
14457       return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14458     }
14459
14460     bundle.beta = function(beta) {
14461       return custom(+beta);
14462     };
14463
14464     return bundle;
14465   })(0.85);
14466
14467   function point$3(that, x, y) {
14468     that._context.bezierCurveTo(
14469       that._x1 + that._k * (that._x2 - that._x0),
14470       that._y1 + that._k * (that._y2 - that._y0),
14471       that._x2 + that._k * (that._x1 - x),
14472       that._y2 + that._k * (that._y1 - y),
14473       that._x2,
14474       that._y2
14475     );
14476   }
14477
14478   function Cardinal(context, tension) {
14479     this._context = context;
14480     this._k = (1 - tension) / 6;
14481   }
14482
14483   Cardinal.prototype = {
14484     areaStart: function() {
14485       this._line = 0;
14486     },
14487     areaEnd: function() {
14488       this._line = NaN;
14489     },
14490     lineStart: function() {
14491       this._x0 = this._x1 = this._x2 =
14492       this._y0 = this._y1 = this._y2 = NaN;
14493       this._point = 0;
14494     },
14495     lineEnd: function() {
14496       switch (this._point) {
14497         case 2: this._context.lineTo(this._x2, this._y2); break;
14498         case 3: point$3(this, this._x1, this._y1); break;
14499       }
14500       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14501       this._line = 1 - this._line;
14502     },
14503     point: function(x, y) {
14504       x = +x, y = +y;
14505       switch (this._point) {
14506         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14507         case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
14508         case 2: this._point = 3; // proceed
14509         default: point$3(this, x, y); break;
14510       }
14511       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14512       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14513     }
14514   };
14515
14516   var cardinal = (function custom(tension) {
14517
14518     function cardinal(context) {
14519       return new Cardinal(context, tension);
14520     }
14521
14522     cardinal.tension = function(tension) {
14523       return custom(+tension);
14524     };
14525
14526     return cardinal;
14527   })(0);
14528
14529   function CardinalClosed(context, tension) {
14530     this._context = context;
14531     this._k = (1 - tension) / 6;
14532   }
14533
14534   CardinalClosed.prototype = {
14535     areaStart: noop$2,
14536     areaEnd: noop$2,
14537     lineStart: function() {
14538       this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14539       this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14540       this._point = 0;
14541     },
14542     lineEnd: function() {
14543       switch (this._point) {
14544         case 1: {
14545           this._context.moveTo(this._x3, this._y3);
14546           this._context.closePath();
14547           break;
14548         }
14549         case 2: {
14550           this._context.lineTo(this._x3, this._y3);
14551           this._context.closePath();
14552           break;
14553         }
14554         case 3: {
14555           this.point(this._x3, this._y3);
14556           this.point(this._x4, this._y4);
14557           this.point(this._x5, this._y5);
14558           break;
14559         }
14560       }
14561     },
14562     point: function(x, y) {
14563       x = +x, y = +y;
14564       switch (this._point) {
14565         case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14566         case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14567         case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14568         default: point$3(this, x, y); break;
14569       }
14570       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14571       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14572     }
14573   };
14574
14575   var cardinalClosed = (function custom(tension) {
14576
14577     function cardinal$$1(context) {
14578       return new CardinalClosed(context, tension);
14579     }
14580
14581     cardinal$$1.tension = function(tension) {
14582       return custom(+tension);
14583     };
14584
14585     return cardinal$$1;
14586   })(0);
14587
14588   function CardinalOpen(context, tension) {
14589     this._context = context;
14590     this._k = (1 - tension) / 6;
14591   }
14592
14593   CardinalOpen.prototype = {
14594     areaStart: function() {
14595       this._line = 0;
14596     },
14597     areaEnd: function() {
14598       this._line = NaN;
14599     },
14600     lineStart: function() {
14601       this._x0 = this._x1 = this._x2 =
14602       this._y0 = this._y1 = this._y2 = NaN;
14603       this._point = 0;
14604     },
14605     lineEnd: function() {
14606       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14607       this._line = 1 - this._line;
14608     },
14609     point: function(x, y) {
14610       x = +x, y = +y;
14611       switch (this._point) {
14612         case 0: this._point = 1; break;
14613         case 1: this._point = 2; break;
14614         case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14615         case 3: this._point = 4; // proceed
14616         default: point$3(this, x, y); break;
14617       }
14618       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14619       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14620     }
14621   };
14622
14623   var cardinalOpen = (function custom(tension) {
14624
14625     function cardinal$$1(context) {
14626       return new CardinalOpen(context, tension);
14627     }
14628
14629     cardinal$$1.tension = function(tension) {
14630       return custom(+tension);
14631     };
14632
14633     return cardinal$$1;
14634   })(0);
14635
14636   function point$4(that, x, y) {
14637     var x1 = that._x1,
14638         y1 = that._y1,
14639         x2 = that._x2,
14640         y2 = that._y2;
14641
14642     if (that._l01_a > epsilon$3) {
14643       var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
14644           n = 3 * that._l01_a * (that._l01_a + that._l12_a);
14645       x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
14646       y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
14647     }
14648
14649     if (that._l23_a > epsilon$3) {
14650       var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
14651           m = 3 * that._l23_a * (that._l23_a + that._l12_a);
14652       x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
14653       y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
14654     }
14655
14656     that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14657   }
14658
14659   function CatmullRom(context, alpha) {
14660     this._context = context;
14661     this._alpha = alpha;
14662   }
14663
14664   CatmullRom.prototype = {
14665     areaStart: function() {
14666       this._line = 0;
14667     },
14668     areaEnd: function() {
14669       this._line = NaN;
14670     },
14671     lineStart: function() {
14672       this._x0 = this._x1 = this._x2 =
14673       this._y0 = this._y1 = this._y2 = NaN;
14674       this._l01_a = this._l12_a = this._l23_a =
14675       this._l01_2a = this._l12_2a = this._l23_2a =
14676       this._point = 0;
14677     },
14678     lineEnd: function() {
14679       switch (this._point) {
14680         case 2: this._context.lineTo(this._x2, this._y2); break;
14681         case 3: this.point(this._x2, this._y2); break;
14682       }
14683       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14684       this._line = 1 - this._line;
14685     },
14686     point: function(x, y) {
14687       x = +x, y = +y;
14688
14689       if (this._point) {
14690         var x23 = this._x2 - x,
14691             y23 = this._y2 - y;
14692         this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14693       }
14694
14695       switch (this._point) {
14696         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14697         case 1: this._point = 2; break;
14698         case 2: this._point = 3; // proceed
14699         default: point$4(this, x, y); break;
14700       }
14701
14702       this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14703       this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14704       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14705       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14706     }
14707   };
14708
14709   var catmullRom = (function custom(alpha) {
14710
14711     function catmullRom(context) {
14712       return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14713     }
14714
14715     catmullRom.alpha = function(alpha) {
14716       return custom(+alpha);
14717     };
14718
14719     return catmullRom;
14720   })(0.5);
14721
14722   function CatmullRomClosed(context, alpha) {
14723     this._context = context;
14724     this._alpha = alpha;
14725   }
14726
14727   CatmullRomClosed.prototype = {
14728     areaStart: noop$2,
14729     areaEnd: noop$2,
14730     lineStart: function() {
14731       this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14732       this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14733       this._l01_a = this._l12_a = this._l23_a =
14734       this._l01_2a = this._l12_2a = this._l23_2a =
14735       this._point = 0;
14736     },
14737     lineEnd: function() {
14738       switch (this._point) {
14739         case 1: {
14740           this._context.moveTo(this._x3, this._y3);
14741           this._context.closePath();
14742           break;
14743         }
14744         case 2: {
14745           this._context.lineTo(this._x3, this._y3);
14746           this._context.closePath();
14747           break;
14748         }
14749         case 3: {
14750           this.point(this._x3, this._y3);
14751           this.point(this._x4, this._y4);
14752           this.point(this._x5, this._y5);
14753           break;
14754         }
14755       }
14756     },
14757     point: function(x, y) {
14758       x = +x, y = +y;
14759
14760       if (this._point) {
14761         var x23 = this._x2 - x,
14762             y23 = this._y2 - y;
14763         this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14764       }
14765
14766       switch (this._point) {
14767         case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14768         case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14769         case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14770         default: point$4(this, x, y); break;
14771       }
14772
14773       this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14774       this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14775       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14776       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14777     }
14778   };
14779
14780   var catmullRomClosed = (function custom(alpha) {
14781
14782     function catmullRom$$1(context) {
14783       return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14784     }
14785
14786     catmullRom$$1.alpha = function(alpha) {
14787       return custom(+alpha);
14788     };
14789
14790     return catmullRom$$1;
14791   })(0.5);
14792
14793   function CatmullRomOpen(context, alpha) {
14794     this._context = context;
14795     this._alpha = alpha;
14796   }
14797
14798   CatmullRomOpen.prototype = {
14799     areaStart: function() {
14800       this._line = 0;
14801     },
14802     areaEnd: function() {
14803       this._line = NaN;
14804     },
14805     lineStart: function() {
14806       this._x0 = this._x1 = this._x2 =
14807       this._y0 = this._y1 = this._y2 = NaN;
14808       this._l01_a = this._l12_a = this._l23_a =
14809       this._l01_2a = this._l12_2a = this._l23_2a =
14810       this._point = 0;
14811     },
14812     lineEnd: function() {
14813       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14814       this._line = 1 - this._line;
14815     },
14816     point: function(x, y) {
14817       x = +x, y = +y;
14818
14819       if (this._point) {
14820         var x23 = this._x2 - x,
14821             y23 = this._y2 - y;
14822         this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14823       }
14824
14825       switch (this._point) {
14826         case 0: this._point = 1; break;
14827         case 1: this._point = 2; break;
14828         case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14829         case 3: this._point = 4; // proceed
14830         default: point$4(this, x, y); break;
14831       }
14832
14833       this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14834       this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14835       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14836       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14837     }
14838   };
14839
14840   var catmullRomOpen = (function custom(alpha) {
14841
14842     function catmullRom$$1(context) {
14843       return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14844     }
14845
14846     catmullRom$$1.alpha = function(alpha) {
14847       return custom(+alpha);
14848     };
14849
14850     return catmullRom$$1;
14851   })(0.5);
14852
14853   function LinearClosed(context) {
14854     this._context = context;
14855   }
14856
14857   LinearClosed.prototype = {
14858     areaStart: noop$2,
14859     areaEnd: noop$2,
14860     lineStart: function() {
14861       this._point = 0;
14862     },
14863     lineEnd: function() {
14864       if (this._point) this._context.closePath();
14865     },
14866     point: function(x, y) {
14867       x = +x, y = +y;
14868       if (this._point) this._context.lineTo(x, y);
14869       else this._point = 1, this._context.moveTo(x, y);
14870     }
14871   };
14872
14873   function linearClosed(context) {
14874     return new LinearClosed(context);
14875   }
14876
14877   function sign$1(x) {
14878     return x < 0 ? -1 : 1;
14879   }
14880
14881   // Calculate the slopes of the tangents (Hermite-type interpolation) based on
14882   // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
14883   // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
14884   // NOV(II), P. 443, 1990.
14885   function slope3(that, x2, y2) {
14886     var h0 = that._x1 - that._x0,
14887         h1 = x2 - that._x1,
14888         s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
14889         s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
14890         p = (s0 * h1 + s1 * h0) / (h0 + h1);
14891     return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
14892   }
14893
14894   // Calculate a one-sided slope.
14895   function slope2(that, t) {
14896     var h = that._x1 - that._x0;
14897     return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
14898   }
14899
14900   // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
14901   // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
14902   // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
14903   function point$5(that, t0, t1) {
14904     var x0 = that._x0,
14905         y0 = that._y0,
14906         x1 = that._x1,
14907         y1 = that._y1,
14908         dx = (x1 - x0) / 3;
14909     that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14910   }
14911
14912   function MonotoneX(context) {
14913     this._context = context;
14914   }
14915
14916   MonotoneX.prototype = {
14917     areaStart: function() {
14918       this._line = 0;
14919     },
14920     areaEnd: function() {
14921       this._line = NaN;
14922     },
14923     lineStart: function() {
14924       this._x0 = this._x1 =
14925       this._y0 = this._y1 =
14926       this._t0 = NaN;
14927       this._point = 0;
14928     },
14929     lineEnd: function() {
14930       switch (this._point) {
14931         case 2: this._context.lineTo(this._x1, this._y1); break;
14932         case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
14933       }
14934       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14935       this._line = 1 - this._line;
14936     },
14937     point: function(x, y) {
14938       var t1 = NaN;
14939
14940       x = +x, y = +y;
14941       if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
14942       switch (this._point) {
14943         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14944         case 1: this._point = 2; break;
14945         case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
14946         default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
14947       }
14948
14949       this._x0 = this._x1, this._x1 = x;
14950       this._y0 = this._y1, this._y1 = y;
14951       this._t0 = t1;
14952     }
14953   };
14954
14955   function MonotoneY(context) {
14956     this._context = new ReflectContext(context);
14957   }
14958
14959   (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14960     MonotoneX.prototype.point.call(this, y, x);
14961   };
14962
14963   function ReflectContext(context) {
14964     this._context = context;
14965   }
14966
14967   ReflectContext.prototype = {
14968     moveTo: function(x, y) { this._context.moveTo(y, x); },
14969     closePath: function() { this._context.closePath(); },
14970     lineTo: function(x, y) { this._context.lineTo(y, x); },
14971     bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
14972   };
14973
14974   function monotoneX(context) {
14975     return new MonotoneX(context);
14976   }
14977
14978   function monotoneY(context) {
14979     return new MonotoneY(context);
14980   }
14981
14982   function Natural(context) {
14983     this._context = context;
14984   }
14985
14986   Natural.prototype = {
14987     areaStart: function() {
14988       this._line = 0;
14989     },
14990     areaEnd: function() {
14991       this._line = NaN;
14992     },
14993     lineStart: function() {
14994       this._x = [];
14995       this._y = [];
14996     },
14997     lineEnd: function() {
14998       var x = this._x,
14999           y = this._y,
15000           n = x.length;
15001
15002       if (n) {
15003         this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
15004         if (n === 2) {
15005           this._context.lineTo(x[1], y[1]);
15006         } else {
15007           var px = controlPoints(x),
15008               py = controlPoints(y);
15009           for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
15010             this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
15011           }
15012         }
15013       }
15014
15015       if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
15016       this._line = 1 - this._line;
15017       this._x = this._y = null;
15018     },
15019     point: function(x, y) {
15020       this._x.push(+x);
15021       this._y.push(+y);
15022     }
15023   };
15024
15025   // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
15026   function controlPoints(x) {
15027     var i,
15028         n = x.length - 1,
15029         m,
15030         a = new Array(n),
15031         b = new Array(n),
15032         r = new Array(n);
15033     a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
15034     for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
15035     a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
15036     for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
15037     a[n - 1] = r[n - 1] / b[n - 1];
15038     for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
15039     b[n - 1] = (x[n] + a[n - 1]) / 2;
15040     for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
15041     return [a, b];
15042   }
15043
15044   function natural(context) {
15045     return new Natural(context);
15046   }
15047
15048   function Step(context, t) {
15049     this._context = context;
15050     this._t = t;
15051   }
15052
15053   Step.prototype = {
15054     areaStart: function() {
15055       this._line = 0;
15056     },
15057     areaEnd: function() {
15058       this._line = NaN;
15059     },
15060     lineStart: function() {
15061       this._x = this._y = NaN;
15062       this._point = 0;
15063     },
15064     lineEnd: function() {
15065       if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
15066       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
15067       if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
15068     },
15069     point: function(x, y) {
15070       x = +x, y = +y;
15071       switch (this._point) {
15072         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
15073         case 1: this._point = 2; // proceed
15074         default: {
15075           if (this._t <= 0) {
15076             this._context.lineTo(this._x, y);
15077             this._context.lineTo(x, y);
15078           } else {
15079             var x1 = this._x * (1 - this._t) + x * this._t;
15080             this._context.lineTo(x1, this._y);
15081             this._context.lineTo(x1, y);
15082           }
15083           break;
15084         }
15085       }
15086       this._x = x, this._y = y;
15087     }
15088   };
15089
15090   function step(context) {
15091     return new Step(context, 0.5);
15092   }
15093
15094   function stepBefore(context) {
15095     return new Step(context, 0);
15096   }
15097
15098   function stepAfter(context) {
15099     return new Step(context, 1);
15100   }
15101
15102   function none$1(series, order) {
15103     if (!((n = series.length) > 1)) return;
15104     for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
15105       s0 = s1, s1 = series[order[i]];
15106       for (j = 0; j < m; ++j) {
15107         s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
15108       }
15109     }
15110   }
15111
15112   function none$2(series) {
15113     var n = series.length, o = new Array(n);
15114     while (--n >= 0) o[n] = n;
15115     return o;
15116   }
15117
15118   function stackValue(d, key) {
15119     return d[key];
15120   }
15121
15122   function stack() {
15123     var keys = constant$a([]),
15124         order = none$2,
15125         offset = none$1,
15126         value = stackValue;
15127
15128     function stack(data) {
15129       var kz = keys.apply(this, arguments),
15130           i,
15131           m = data.length,
15132           n = kz.length,
15133           sz = new Array(n),
15134           oz;
15135
15136       for (i = 0; i < n; ++i) {
15137         for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
15138           si[j] = sij = [0, +value(data[j], ki, j, data)];
15139           sij.data = data[j];
15140         }
15141         si.key = ki;
15142       }
15143
15144       for (i = 0, oz = order(sz); i < n; ++i) {
15145         sz[oz[i]].index = i;
15146       }
15147
15148       offset(sz, oz);
15149       return sz;
15150     }
15151
15152     stack.keys = function(_) {
15153       return arguments.length ? (keys = typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : keys;
15154     };
15155
15156     stack.value = function(_) {
15157       return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), stack) : value;
15158     };
15159
15160     stack.order = function(_) {
15161       return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : order;
15162     };
15163
15164     stack.offset = function(_) {
15165       return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15166     };
15167
15168     return stack;
15169   }
15170
15171   function expand(series, order) {
15172     if (!((n = series.length) > 0)) return;
15173     for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
15174       for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
15175       if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
15176     }
15177     none$1(series, order);
15178   }
15179
15180   function diverging(series, order) {
15181     if (!((n = series.length) > 1)) return;
15182     for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
15183       for (yp = yn = 0, i = 0; i < n; ++i) {
15184         if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
15185           d[0] = yp, d[1] = yp += dy;
15186         } else if (dy < 0) {
15187           d[1] = yn, d[0] = yn += dy;
15188         } else {
15189           d[0] = yp;
15190         }
15191       }
15192     }
15193   }
15194
15195   function silhouette(series, order) {
15196     if (!((n = series.length) > 0)) return;
15197     for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
15198       for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
15199       s0[j][1] += s0[j][0] = -y / 2;
15200     }
15201     none$1(series, order);
15202   }
15203
15204   function wiggle(series, order) {
15205     if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
15206     for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
15207       for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
15208         var si = series[order[i]],
15209             sij0 = si[j][1] || 0,
15210             sij1 = si[j - 1][1] || 0,
15211             s3 = (sij0 - sij1) / 2;
15212         for (var k = 0; k < i; ++k) {
15213           var sk = series[order[k]],
15214               skj0 = sk[j][1] || 0,
15215               skj1 = sk[j - 1][1] || 0;
15216           s3 += skj0 - skj1;
15217         }
15218         s1 += sij0, s2 += s3 * sij0;
15219       }
15220       s0[j - 1][1] += s0[j - 1][0] = y;
15221       if (s1) y -= s2 / s1;
15222     }
15223     s0[j - 1][1] += s0[j - 1][0] = y;
15224     none$1(series, order);
15225   }
15226
15227   function ascending$2(series) {
15228     var sums = series.map(sum$2);
15229     return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
15230   }
15231
15232   function sum$2(series) {
15233     var s = 0, i = -1, n = series.length, v;
15234     while (++i < n) if (v = +series[i][1]) s += v;
15235     return s;
15236   }
15237
15238   function descending$1(series) {
15239     return ascending$2(series).reverse();
15240   }
15241
15242   function insideOut(series) {
15243     var n = series.length,
15244         i,
15245         j,
15246         sums = series.map(sum$2),
15247         order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15248         top = 0,
15249         bottom = 0,
15250         tops = [],
15251         bottoms = [];
15252
15253     for (i = 0; i < n; ++i) {
15254       j = order[i];
15255       if (top < bottom) {
15256         top += sums[j];
15257         tops.push(j);
15258       } else {
15259         bottom += sums[j];
15260         bottoms.push(j);
15261       }
15262     }
15263
15264     return bottoms.reverse().concat(tops);
15265   }
15266
15267   function reverse(series) {
15268     return none$2(series).reverse();
15269   }
15270
15271   function constant$b(x) {
15272     return function() {
15273       return x;
15274     };
15275   }
15276
15277   function x$4(d) {
15278     return d[0];
15279   }
15280
15281   function y$4(d) {
15282     return d[1];
15283   }
15284
15285   function RedBlackTree() {
15286     this._ = null; // root node
15287   }
15288
15289   function RedBlackNode(node) {
15290     node.U = // parent node
15291     node.C = // color - true for red, false for black
15292     node.L = // left node
15293     node.R = // right node
15294     node.P = // previous node
15295     node.N = null; // next node
15296   }
15297
15298   RedBlackTree.prototype = {
15299     constructor: RedBlackTree,
15300
15301     insert: function(after, node) {
15302       var parent, grandpa, uncle;
15303
15304       if (after) {
15305         node.P = after;
15306         node.N = after.N;
15307         if (after.N) after.N.P = node;
15308         after.N = node;
15309         if (after.R) {
15310           after = after.R;
15311           while (after.L) after = after.L;
15312           after.L = node;
15313         } else {
15314           after.R = node;
15315         }
15316         parent = after;
15317       } else if (this._) {
15318         after = RedBlackFirst(this._);
15319         node.P = null;
15320         node.N = after;
15321         after.P = after.L = node;
15322         parent = after;
15323       } else {
15324         node.P = node.N = null;
15325         this._ = node;
15326         parent = null;
15327       }
15328       node.L = node.R = null;
15329       node.U = parent;
15330       node.C = true;
15331
15332       after = node;
15333       while (parent && parent.C) {
15334         grandpa = parent.U;
15335         if (parent === grandpa.L) {
15336           uncle = grandpa.R;
15337           if (uncle && uncle.C) {
15338             parent.C = uncle.C = false;
15339             grandpa.C = true;
15340             after = grandpa;
15341           } else {
15342             if (after === parent.R) {
15343               RedBlackRotateLeft(this, parent);
15344               after = parent;
15345               parent = after.U;
15346             }
15347             parent.C = false;
15348             grandpa.C = true;
15349             RedBlackRotateRight(this, grandpa);
15350           }
15351         } else {
15352           uncle = grandpa.L;
15353           if (uncle && uncle.C) {
15354             parent.C = uncle.C = false;
15355             grandpa.C = true;
15356             after = grandpa;
15357           } else {
15358             if (after === parent.L) {
15359               RedBlackRotateRight(this, parent);
15360               after = parent;
15361               parent = after.U;
15362             }
15363             parent.C = false;
15364             grandpa.C = true;
15365             RedBlackRotateLeft(this, grandpa);
15366           }
15367         }
15368         parent = after.U;
15369       }
15370       this._.C = false;
15371     },
15372
15373     remove: function(node) {
15374       if (node.N) node.N.P = node.P;
15375       if (node.P) node.P.N = node.N;
15376       node.N = node.P = null;
15377
15378       var parent = node.U,
15379           sibling,
15380           left = node.L,
15381           right = node.R,
15382           next,
15383           red;
15384
15385       if (!left) next = right;
15386       else if (!right) next = left;
15387       else next = RedBlackFirst(right);
15388
15389       if (parent) {
15390         if (parent.L === node) parent.L = next;
15391         else parent.R = next;
15392       } else {
15393         this._ = next;
15394       }
15395
15396       if (left && right) {
15397         red = next.C;
15398         next.C = node.C;
15399         next.L = left;
15400         left.U = next;
15401         if (next !== right) {
15402           parent = next.U;
15403           next.U = node.U;
15404           node = next.R;
15405           parent.L = node;
15406           next.R = right;
15407           right.U = next;
15408         } else {
15409           next.U = parent;
15410           parent = next;
15411           node = next.R;
15412         }
15413       } else {
15414         red = node.C;
15415         node = next;
15416       }
15417
15418       if (node) node.U = parent;
15419       if (red) return;
15420       if (node && node.C) { node.C = false; return; }
15421
15422       do {
15423         if (node === this._) break;
15424         if (node === parent.L) {
15425           sibling = parent.R;
15426           if (sibling.C) {
15427             sibling.C = false;
15428             parent.C = true;
15429             RedBlackRotateLeft(this, parent);
15430             sibling = parent.R;
15431           }
15432           if ((sibling.L && sibling.L.C)
15433               || (sibling.R && sibling.R.C)) {
15434             if (!sibling.R || !sibling.R.C) {
15435               sibling.L.C = false;
15436               sibling.C = true;
15437               RedBlackRotateRight(this, sibling);
15438               sibling = parent.R;
15439             }
15440             sibling.C = parent.C;
15441             parent.C = sibling.R.C = false;
15442             RedBlackRotateLeft(this, parent);
15443             node = this._;
15444             break;
15445           }
15446         } else {
15447           sibling = parent.L;
15448           if (sibling.C) {
15449             sibling.C = false;
15450             parent.C = true;
15451             RedBlackRotateRight(this, parent);
15452             sibling = parent.L;
15453           }
15454           if ((sibling.L && sibling.L.C)
15455             || (sibling.R && sibling.R.C)) {
15456             if (!sibling.L || !sibling.L.C) {
15457               sibling.R.C = false;
15458               sibling.C = true;
15459               RedBlackRotateLeft(this, sibling);
15460               sibling = parent.L;
15461             }
15462             sibling.C = parent.C;
15463             parent.C = sibling.L.C = false;
15464             RedBlackRotateRight(this, parent);
15465             node = this._;
15466             break;
15467           }
15468         }
15469         sibling.C = true;
15470         node = parent;
15471         parent = parent.U;
15472       } while (!node.C);
15473
15474       if (node) node.C = false;
15475     }
15476   };
15477
15478   function RedBlackRotateLeft(tree, node) {
15479     var p = node,
15480         q = node.R,
15481         parent = p.U;
15482
15483     if (parent) {
15484       if (parent.L === p) parent.L = q;
15485       else parent.R = q;
15486     } else {
15487       tree._ = q;
15488     }
15489
15490     q.U = parent;
15491     p.U = q;
15492     p.R = q.L;
15493     if (p.R) p.R.U = p;
15494     q.L = p;
15495   }
15496
15497   function RedBlackRotateRight(tree, node) {
15498     var p = node,
15499         q = node.L,
15500         parent = p.U;
15501
15502     if (parent) {
15503       if (parent.L === p) parent.L = q;
15504       else parent.R = q;
15505     } else {
15506       tree._ = q;
15507     }
15508
15509     q.U = parent;
15510     p.U = q;
15511     p.L = q.R;
15512     if (p.L) p.L.U = p;
15513     q.R = p;
15514   }
15515
15516   function RedBlackFirst(node) {
15517     while (node.L) node = node.L;
15518     return node;
15519   }
15520
15521   function createEdge(left, right, v0, v1) {
15522     var edge = [null, null],
15523         index = edges.push(edge) - 1;
15524     edge.left = left;
15525     edge.right = right;
15526     if (v0) setEdgeEnd(edge, left, right, v0);
15527     if (v1) setEdgeEnd(edge, right, left, v1);
15528     cells[left.index].halfedges.push(index);
15529     cells[right.index].halfedges.push(index);
15530     return edge;
15531   }
15532
15533   function createBorderEdge(left, v0, v1) {
15534     var edge = [v0, v1];
15535     edge.left = left;
15536     return edge;
15537   }
15538
15539   function setEdgeEnd(edge, left, right, vertex) {
15540     if (!edge[0] && !edge[1]) {
15541       edge[0] = vertex;
15542       edge.left = left;
15543       edge.right = right;
15544     } else if (edge.left === right) {
15545       edge[1] = vertex;
15546     } else {
15547       edge[0] = vertex;
15548     }
15549   }
15550
15551   // Liang–Barsky line clipping.
15552   function clipEdge(edge, x0, y0, x1, y1) {
15553     var a = edge[0],
15554         b = edge[1],
15555         ax = a[0],
15556         ay = a[1],
15557         bx = b[0],
15558         by = b[1],
15559         t0 = 0,
15560         t1 = 1,
15561         dx = bx - ax,
15562         dy = by - ay,
15563         r;
15564
15565     r = x0 - ax;
15566     if (!dx && r > 0) return;
15567     r /= dx;
15568     if (dx < 0) {
15569       if (r < t0) return;
15570       if (r < t1) t1 = r;
15571     } else if (dx > 0) {
15572       if (r > t1) return;
15573       if (r > t0) t0 = r;
15574     }
15575
15576     r = x1 - ax;
15577     if (!dx && r < 0) return;
15578     r /= dx;
15579     if (dx < 0) {
15580       if (r > t1) return;
15581       if (r > t0) t0 = r;
15582     } else if (dx > 0) {
15583       if (r < t0) return;
15584       if (r < t1) t1 = r;
15585     }
15586
15587     r = y0 - ay;
15588     if (!dy && r > 0) return;
15589     r /= dy;
15590     if (dy < 0) {
15591       if (r < t0) return;
15592       if (r < t1) t1 = r;
15593     } else if (dy > 0) {
15594       if (r > t1) return;
15595       if (r > t0) t0 = r;
15596     }
15597
15598     r = y1 - ay;
15599     if (!dy && r < 0) return;
15600     r /= dy;
15601     if (dy < 0) {
15602       if (r > t1) return;
15603       if (r > t0) t0 = r;
15604     } else if (dy > 0) {
15605       if (r < t0) return;
15606       if (r < t1) t1 = r;
15607     }
15608
15609     if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15610
15611     if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15612     if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15613     return true;
15614   }
15615
15616   function connectEdge(edge, x0, y0, x1, y1) {
15617     var v1 = edge[1];
15618     if (v1) return true;
15619
15620     var v0 = edge[0],
15621         left = edge.left,
15622         right = edge.right,
15623         lx = left[0],
15624         ly = left[1],
15625         rx = right[0],
15626         ry = right[1],
15627         fx = (lx + rx) / 2,
15628         fy = (ly + ry) / 2,
15629         fm,
15630         fb;
15631
15632     if (ry === ly) {
15633       if (fx < x0 || fx >= x1) return;
15634       if (lx > rx) {
15635         if (!v0) v0 = [fx, y0];
15636         else if (v0[1] >= y1) return;
15637         v1 = [fx, y1];
15638       } else {
15639         if (!v0) v0 = [fx, y1];
15640         else if (v0[1] < y0) return;
15641         v1 = [fx, y0];
15642       }
15643     } else {
15644       fm = (lx - rx) / (ry - ly);
15645       fb = fy - fm * fx;
15646       if (fm < -1 || fm > 1) {
15647         if (lx > rx) {
15648           if (!v0) v0 = [(y0 - fb) / fm, y0];
15649           else if (v0[1] >= y1) return;
15650           v1 = [(y1 - fb) / fm, y1];
15651         } else {
15652           if (!v0) v0 = [(y1 - fb) / fm, y1];
15653           else if (v0[1] < y0) return;
15654           v1 = [(y0 - fb) / fm, y0];
15655         }
15656       } else {
15657         if (ly < ry) {
15658           if (!v0) v0 = [x0, fm * x0 + fb];
15659           else if (v0[0] >= x1) return;
15660           v1 = [x1, fm * x1 + fb];
15661         } else {
15662           if (!v0) v0 = [x1, fm * x1 + fb];
15663           else if (v0[0] < x0) return;
15664           v1 = [x0, fm * x0 + fb];
15665         }
15666       }
15667     }
15668
15669     edge[0] = v0;
15670     edge[1] = v1;
15671     return true;
15672   }
15673
15674   function clipEdges(x0, y0, x1, y1) {
15675     var i = edges.length,
15676         edge;
15677
15678     while (i--) {
15679       if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
15680           || !clipEdge(edge, x0, y0, x1, y1)
15681           || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
15682               || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
15683         delete edges[i];
15684       }
15685     }
15686   }
15687
15688   function createCell(site) {
15689     return cells[site.index] = {
15690       site: site,
15691       halfedges: []
15692     };
15693   }
15694
15695   function cellHalfedgeAngle(cell, edge) {
15696     var site = cell.site,
15697         va = edge.left,
15698         vb = edge.right;
15699     if (site === vb) vb = va, va = site;
15700     if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
15701     if (site === va) va = edge[1], vb = edge[0];
15702     else va = edge[0], vb = edge[1];
15703     return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
15704   }
15705
15706   function cellHalfedgeStart(cell, edge) {
15707     return edge[+(edge.left !== cell.site)];
15708   }
15709
15710   function cellHalfedgeEnd(cell, edge) {
15711     return edge[+(edge.left === cell.site)];
15712   }
15713
15714   function sortCellHalfedges() {
15715     for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
15716       if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
15717         var index = new Array(m),
15718             array = new Array(m);
15719         for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
15720         index.sort(function(i, j) { return array[j] - array[i]; });
15721         for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
15722         for (j = 0; j < m; ++j) halfedges[j] = array[j];
15723       }
15724     }
15725   }
15726
15727   function clipCells(x0, y0, x1, y1) {
15728     var nCells = cells.length,
15729         iCell,
15730         cell,
15731         site,
15732         iHalfedge,
15733         halfedges,
15734         nHalfedges,
15735         start,
15736         startX,
15737         startY,
15738         end,
15739         endX,
15740         endY,
15741         cover = true;
15742
15743     for (iCell = 0; iCell < nCells; ++iCell) {
15744       if (cell = cells[iCell]) {
15745         site = cell.site;
15746         halfedges = cell.halfedges;
15747         iHalfedge = halfedges.length;
15748
15749         // Remove any dangling clipped edges.
15750         while (iHalfedge--) {
15751           if (!edges[halfedges[iHalfedge]]) {
15752             halfedges.splice(iHalfedge, 1);
15753           }
15754         }
15755
15756         // Insert any border edges as necessary.
15757         iHalfedge = 0, nHalfedges = halfedges.length;
15758         while (iHalfedge < nHalfedges) {
15759           end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
15760           start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
15761           if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
15762             halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
15763                 Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
15764                 : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
15765                 : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
15766                 : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
15767                 : null)) - 1);
15768             ++nHalfedges;
15769           }
15770         }
15771
15772         if (nHalfedges) cover = false;
15773       }
15774     }
15775
15776     // If there weren’t any edges, have the closest site cover the extent.
15777     // It doesn’t matter which corner of the extent we measure!
15778     if (cover) {
15779       var dx, dy, d2, dc = Infinity;
15780
15781       for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15782         if (cell = cells[iCell]) {
15783           site = cell.site;
15784           dx = site[0] - x0;
15785           dy = site[1] - y0;
15786           d2 = dx * dx + dy * dy;
15787           if (d2 < dc) dc = d2, cover = cell;
15788         }
15789       }
15790
15791       if (cover) {
15792         var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
15793         cover.halfedges.push(
15794           edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
15795           edges.push(createBorderEdge(site, v01, v11)) - 1,
15796           edges.push(createBorderEdge(site, v11, v10)) - 1,
15797           edges.push(createBorderEdge(site, v10, v00)) - 1
15798         );
15799       }
15800     }
15801
15802     // Lastly delete any cells with no edges; these were entirely clipped.
15803     for (iCell = 0; iCell < nCells; ++iCell) {
15804       if (cell = cells[iCell]) {
15805         if (!cell.halfedges.length) {
15806           delete cells[iCell];
15807         }
15808       }
15809     }
15810   }
15811
15812   var circlePool = [];
15813
15814   var firstCircle;
15815
15816   function Circle() {
15817     RedBlackNode(this);
15818     this.x =
15819     this.y =
15820     this.arc =
15821     this.site =
15822     this.cy = null;
15823   }
15824
15825   function attachCircle(arc) {
15826     var lArc = arc.P,
15827         rArc = arc.N;
15828
15829     if (!lArc || !rArc) return;
15830
15831     var lSite = lArc.site,
15832         cSite = arc.site,
15833         rSite = rArc.site;
15834
15835     if (lSite === rSite) return;
15836
15837     var bx = cSite[0],
15838         by = cSite[1],
15839         ax = lSite[0] - bx,
15840         ay = lSite[1] - by,
15841         cx = rSite[0] - bx,
15842         cy = rSite[1] - by;
15843
15844     var d = 2 * (ax * cy - ay * cx);
15845     if (d >= -epsilon2$2) return;
15846
15847     var ha = ax * ax + ay * ay,
15848         hc = cx * cx + cy * cy,
15849         x = (cy * ha - ay * hc) / d,
15850         y = (ax * hc - cx * ha) / d;
15851
15852     var circle = circlePool.pop() || new Circle;
15853     circle.arc = arc;
15854     circle.site = cSite;
15855     circle.x = x + bx;
15856     circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15857
15858     arc.circle = circle;
15859
15860     var before = null,
15861         node = circles._;
15862
15863     while (node) {
15864       if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
15865         if (node.L) node = node.L;
15866         else { before = node.P; break; }
15867       } else {
15868         if (node.R) node = node.R;
15869         else { before = node; break; }
15870       }
15871     }
15872
15873     circles.insert(before, circle);
15874     if (!before) firstCircle = circle;
15875   }
15876
15877   function detachCircle(arc) {
15878     var circle = arc.circle;
15879     if (circle) {
15880       if (!circle.P) firstCircle = circle.N;
15881       circles.remove(circle);
15882       circlePool.push(circle);
15883       RedBlackNode(circle);
15884       arc.circle = null;
15885     }
15886   }
15887
15888   var beachPool = [];
15889
15890   function Beach() {
15891     RedBlackNode(this);
15892     this.edge =
15893     this.site =
15894     this.circle = null;
15895   }
15896
15897   function createBeach(site) {
15898     var beach = beachPool.pop() || new Beach;
15899     beach.site = site;
15900     return beach;
15901   }
15902
15903   function detachBeach(beach) {
15904     detachCircle(beach);
15905     beaches.remove(beach);
15906     beachPool.push(beach);
15907     RedBlackNode(beach);
15908   }
15909
15910   function removeBeach(beach) {
15911     var circle = beach.circle,
15912         x = circle.x,
15913         y = circle.cy,
15914         vertex = [x, y],
15915         previous = beach.P,
15916         next = beach.N,
15917         disappearing = [beach];
15918
15919     detachBeach(beach);
15920
15921     var lArc = previous;
15922     while (lArc.circle
15923         && Math.abs(x - lArc.circle.x) < epsilon$4
15924         && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15925       previous = lArc.P;
15926       disappearing.unshift(lArc);
15927       detachBeach(lArc);
15928       lArc = previous;
15929     }
15930
15931     disappearing.unshift(lArc);
15932     detachCircle(lArc);
15933
15934     var rArc = next;
15935     while (rArc.circle
15936         && Math.abs(x - rArc.circle.x) < epsilon$4
15937         && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15938       next = rArc.N;
15939       disappearing.push(rArc);
15940       detachBeach(rArc);
15941       rArc = next;
15942     }
15943
15944     disappearing.push(rArc);
15945     detachCircle(rArc);
15946
15947     var nArcs = disappearing.length,
15948         iArc;
15949     for (iArc = 1; iArc < nArcs; ++iArc) {
15950       rArc = disappearing[iArc];
15951       lArc = disappearing[iArc - 1];
15952       setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
15953     }
15954
15955     lArc = disappearing[0];
15956     rArc = disappearing[nArcs - 1];
15957     rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15958
15959     attachCircle(lArc);
15960     attachCircle(rArc);
15961   }
15962
15963   function addBeach(site) {
15964     var x = site[0],
15965         directrix = site[1],
15966         lArc,
15967         rArc,
15968         dxl,
15969         dxr,
15970         node = beaches._;
15971
15972     while (node) {
15973       dxl = leftBreakPoint(node, directrix) - x;
15974       if (dxl > epsilon$4) node = node.L; else {
15975         dxr = x - rightBreakPoint(node, directrix);
15976         if (dxr > epsilon$4) {
15977           if (!node.R) {
15978             lArc = node;
15979             break;
15980           }
15981           node = node.R;
15982         } else {
15983           if (dxl > -epsilon$4) {
15984             lArc = node.P;
15985             rArc = node;
15986           } else if (dxr > -epsilon$4) {
15987             lArc = node;
15988             rArc = node.N;
15989           } else {
15990             lArc = rArc = node;
15991           }
15992           break;
15993         }
15994       }
15995     }
15996
15997     createCell(site);
15998     var newArc = createBeach(site);
15999     beaches.insert(lArc, newArc);
16000
16001     if (!lArc && !rArc) return;
16002
16003     if (lArc === rArc) {
16004       detachCircle(lArc);
16005       rArc = createBeach(lArc.site);
16006       beaches.insert(newArc, rArc);
16007       newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
16008       attachCircle(lArc);
16009       attachCircle(rArc);
16010       return;
16011     }
16012
16013     if (!rArc) { // && lArc
16014       newArc.edge = createEdge(lArc.site, newArc.site);
16015       return;
16016     }
16017
16018     // else lArc !== rArc
16019     detachCircle(lArc);
16020     detachCircle(rArc);
16021
16022     var lSite = lArc.site,
16023         ax = lSite[0],
16024         ay = lSite[1],
16025         bx = site[0] - ax,
16026         by = site[1] - ay,
16027         rSite = rArc.site,
16028         cx = rSite[0] - ax,
16029         cy = rSite[1] - ay,
16030         d = 2 * (bx * cy - by * cx),
16031         hb = bx * bx + by * by,
16032         hc = cx * cx + cy * cy,
16033         vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
16034
16035     setEdgeEnd(rArc.edge, lSite, rSite, vertex);
16036     newArc.edge = createEdge(lSite, site, null, vertex);
16037     rArc.edge = createEdge(site, rSite, null, vertex);
16038     attachCircle(lArc);
16039     attachCircle(rArc);
16040   }
16041
16042   function leftBreakPoint(arc, directrix) {
16043     var site = arc.site,
16044         rfocx = site[0],
16045         rfocy = site[1],
16046         pby2 = rfocy - directrix;
16047
16048     if (!pby2) return rfocx;
16049
16050     var lArc = arc.P;
16051     if (!lArc) return -Infinity;
16052
16053     site = lArc.site;
16054     var lfocx = site[0],
16055         lfocy = site[1],
16056         plby2 = lfocy - directrix;
16057
16058     if (!plby2) return lfocx;
16059
16060     var hl = lfocx - rfocx,
16061         aby2 = 1 / pby2 - 1 / plby2,
16062         b = hl / plby2;
16063
16064     if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
16065
16066     return (rfocx + lfocx) / 2;
16067   }
16068
16069   function rightBreakPoint(arc, directrix) {
16070     var rArc = arc.N;
16071     if (rArc) return leftBreakPoint(rArc, directrix);
16072     var site = arc.site;
16073     return site[1] === directrix ? site[0] : Infinity;
16074   }
16075
16076   var epsilon$4 = 1e-6;
16077   var epsilon2$2 = 1e-12;
16078   var beaches;
16079   var cells;
16080   var circles;
16081   var edges;
16082
16083   function triangleArea(a, b, c) {
16084     return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
16085   }
16086
16087   function lexicographic(a, b) {
16088     return b[1] - a[1]
16089         || b[0] - a[0];
16090   }
16091
16092   function Diagram(sites, extent) {
16093     var site = sites.sort(lexicographic).pop(),
16094         x,
16095         y,
16096         circle;
16097
16098     edges = [];
16099     cells = new Array(sites.length);
16100     beaches = new RedBlackTree;
16101     circles = new RedBlackTree;
16102
16103     while (true) {
16104       circle = firstCircle;
16105       if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
16106         if (site[0] !== x || site[1] !== y) {
16107           addBeach(site);
16108           x = site[0], y = site[1];
16109         }
16110         site = sites.pop();
16111       } else if (circle) {
16112         removeBeach(circle.arc);
16113       } else {
16114         break;
16115       }
16116     }
16117
16118     sortCellHalfedges();
16119
16120     if (extent) {
16121       var x0 = +extent[0][0],
16122           y0 = +extent[0][1],
16123           x1 = +extent[1][0],
16124           y1 = +extent[1][1];
16125       clipEdges(x0, y0, x1, y1);
16126       clipCells(x0, y0, x1, y1);
16127     }
16128
16129     this.edges = edges;
16130     this.cells = cells;
16131
16132     beaches =
16133     circles =
16134     edges =
16135     cells = null;
16136   }
16137
16138   Diagram.prototype = {
16139     constructor: Diagram,
16140
16141     polygons: function() {
16142       var edges = this.edges;
16143
16144       return this.cells.map(function(cell) {
16145         var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
16146         polygon.data = cell.site.data;
16147         return polygon;
16148       });
16149     },
16150
16151     triangles: function() {
16152       var triangles = [],
16153           edges = this.edges;
16154
16155       this.cells.forEach(function(cell, i) {
16156         if (!(m = (halfedges = cell.halfedges).length)) return;
16157         var site = cell.site,
16158             halfedges,
16159             j = -1,
16160             m,
16161             s0,
16162             e1 = edges[halfedges[m - 1]],
16163             s1 = e1.left === site ? e1.right : e1.left;
16164
16165         while (++j < m) {
16166           s0 = s1;
16167           e1 = edges[halfedges[j]];
16168           s1 = e1.left === site ? e1.right : e1.left;
16169           if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
16170             triangles.push([site.data, s0.data, s1.data]);
16171           }
16172         }
16173       });
16174
16175       return triangles;
16176     },
16177
16178     links: function() {
16179       return this.edges.filter(function(edge) {
16180         return edge.right;
16181       }).map(function(edge) {
16182         return {
16183           source: edge.left.data,
16184           target: edge.right.data
16185         };
16186       });
16187     },
16188
16189     find: function(x, y, radius) {
16190       var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16191
16192       // Use the previously-found cell, or start with an arbitrary one.
16193       while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
16194       var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
16195
16196       // Traverse the half-edges to find a closer cell, if any.
16197       do {
16198         cell = that.cells[i0 = i1], i1 = null;
16199         cell.halfedges.forEach(function(e) {
16200           var edge = that.edges[e], v = edge.left;
16201           if ((v === cell.site || !v) && !(v = edge.right)) return;
16202           var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
16203           if (v2 < d2) d2 = v2, i1 = v.index;
16204         });
16205       } while (i1 !== null);
16206
16207       that._found = i0;
16208
16209       return radius == null || d2 <= radius * radius ? cell.site : null;
16210     }
16211   };
16212
16213   function voronoi() {
16214     var x$$1 = x$4,
16215         y$$1 = y$4,
16216         extent = null;
16217
16218     function voronoi(data) {
16219       return new Diagram(data.map(function(d, i) {
16220         var s = [Math.round(x$$1(d, i, data) / epsilon$4) * epsilon$4, Math.round(y$$1(d, i, data) / epsilon$4) * epsilon$4];
16221         s.index = i;
16222         s.data = d;
16223         return s;
16224       }), extent);
16225     }
16226
16227     voronoi.polygons = function(data) {
16228       return voronoi(data).polygons();
16229     };
16230
16231     voronoi.links = function(data) {
16232       return voronoi(data).links();
16233     };
16234
16235     voronoi.triangles = function(data) {
16236       return voronoi(data).triangles();
16237     };
16238
16239     voronoi.x = function(_) {
16240       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : x$$1;
16241     };
16242
16243     voronoi.y = function(_) {
16244       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : y$$1;
16245     };
16246
16247     voronoi.extent = function(_) {
16248       return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];
16249     };
16250
16251     voronoi.size = function(_) {
16252       return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
16253     };
16254
16255     return voronoi;
16256   }
16257
16258   function constant$c(x) {
16259     return function() {
16260       return x;
16261     };
16262   }
16263
16264   function ZoomEvent(target, type, transform) {
16265     this.target = target;
16266     this.type = type;
16267     this.transform = transform;
16268   }
16269
16270   function Transform(k, x, y) {
16271     this.k = k;
16272     this.x = x;
16273     this.y = y;
16274   }
16275
16276   Transform.prototype = {
16277     constructor: Transform,
16278     scale: function(k) {
16279       return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16280     },
16281     translate: function(x, y) {
16282       return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
16283     },
16284     apply: function(point) {
16285       return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16286     },
16287     applyX: function(x) {
16288       return x * this.k + this.x;
16289     },
16290     applyY: function(y) {
16291       return y * this.k + this.y;
16292     },
16293     invert: function(location) {
16294       return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16295     },
16296     invertX: function(x) {
16297       return (x - this.x) / this.k;
16298     },
16299     invertY: function(y) {
16300       return (y - this.y) / this.k;
16301     },
16302     rescaleX: function(x) {
16303       return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16304     },
16305     rescaleY: function(y) {
16306       return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16307     },
16308     toString: function() {
16309       return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16310     }
16311   };
16312
16313   var identity$7 = new Transform(1, 0, 0);
16314
16315   transform.prototype = Transform.prototype;
16316
16317   function transform(node) {
16318     return node.__zoom || identity$7;
16319   }
16320
16321   function nopropagation$2() {
16322     event.stopImmediatePropagation();
16323   }
16324
16325   function noevent$2() {
16326     event.preventDefault();
16327     event.stopImmediatePropagation();
16328   }
16329
16330   // Ignore right-click, since that should open the context menu.
16331   function defaultFilter$2() {
16332     return !event.button;
16333   }
16334
16335   function defaultExtent$1() {
16336     var e = this, w, h;
16337     if (e instanceof SVGElement) {
16338       e = e.ownerSVGElement || e;
16339       w = e.width.baseVal.value;
16340       h = e.height.baseVal.value;
16341     } else {
16342       w = e.clientWidth;
16343       h = e.clientHeight;
16344     }
16345     return [[0, 0], [w, h]];
16346   }
16347
16348   function defaultTransform() {
16349     return this.__zoom || identity$7;
16350   }
16351
16352   function defaultWheelDelta() {
16353     return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16354   }
16355
16356   function defaultTouchable$1() {
16357     return "ontouchstart" in this;
16358   }
16359
16360   function defaultConstrain(transform$$1, extent, translateExtent) {
16361     var dx0 = transform$$1.invertX(extent[0][0]) - translateExtent[0][0],
16362         dx1 = transform$$1.invertX(extent[1][0]) - translateExtent[1][0],
16363         dy0 = transform$$1.invertY(extent[0][1]) - translateExtent[0][1],
16364         dy1 = transform$$1.invertY(extent[1][1]) - translateExtent[1][1];
16365     return transform$$1.translate(
16366       dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
16367       dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
16368     );
16369   }
16370
16371   function d3_zoom() {
16372     var filter = defaultFilter$2,
16373         extent = defaultExtent$1,
16374         constrain = defaultConstrain,
16375         wheelDelta = defaultWheelDelta,
16376         touchable = defaultTouchable$1,
16377         scaleExtent = [0, Infinity],
16378         translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
16379         duration = 250,
16380         interpolate$$1 = interpolateZoom,
16381         gestures = [],
16382         listeners = dispatch("start", "zoom", "end"),
16383         touchstarting,
16384         touchending,
16385         touchDelay = 500,
16386         wheelDelay = 150,
16387         clickDistance2 = 0;
16388
16389     function zoom(selection$$1) {
16390       selection$$1
16391           .property("__zoom", defaultTransform)
16392           .on("wheel.zoom", wheeled)
16393           .on("mousedown.zoom", mousedowned)
16394           .on("dblclick.zoom", dblclicked)
16395         .filter(touchable)
16396           .on("touchstart.zoom", touchstarted)
16397           .on("touchmove.zoom", touchmoved)
16398           .on("touchend.zoom touchcancel.zoom", touchended)
16399           .style("touch-action", "none")
16400           .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
16401     }
16402
16403     zoom.transform = function(collection, transform$$1) {
16404       var selection$$1 = collection.selection ? collection.selection() : collection;
16405       selection$$1.property("__zoom", defaultTransform);
16406       if (collection !== selection$$1) {
16407         schedule(collection, transform$$1);
16408       } else {
16409         selection$$1.interrupt().each(function() {
16410           gesture(this, arguments)
16411               .start()
16412               .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16413               .end();
16414         });
16415       }
16416     };
16417
16418     zoom.scaleBy = function(selection$$1, k) {
16419       zoom.scaleTo(selection$$1, function() {
16420         var k0 = this.__zoom.k,
16421             k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16422         return k0 * k1;
16423       });
16424     };
16425
16426     zoom.scaleTo = function(selection$$1, k) {
16427       zoom.transform(selection$$1, function() {
16428         var e = extent.apply(this, arguments),
16429             t0 = this.__zoom,
16430             p0 = centroid(e),
16431             p1 = t0.invert(p0),
16432             k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16433         return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
16434       });
16435     };
16436
16437     zoom.translateBy = function(selection$$1, x, y) {
16438       zoom.transform(selection$$1, function() {
16439         return constrain(this.__zoom.translate(
16440           typeof x === "function" ? x.apply(this, arguments) : x,
16441           typeof y === "function" ? y.apply(this, arguments) : y
16442         ), extent.apply(this, arguments), translateExtent);
16443       });
16444     };
16445
16446     zoom.translateTo = function(selection$$1, x, y) {
16447       zoom.transform(selection$$1, function() {
16448         var e = extent.apply(this, arguments),
16449             t = this.__zoom,
16450             p = centroid(e);
16451         return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
16452           typeof x === "function" ? -x.apply(this, arguments) : -x,
16453           typeof y === "function" ? -y.apply(this, arguments) : -y
16454         ), e, translateExtent);
16455       });
16456     };
16457
16458     function scale(transform$$1, k) {
16459       k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
16460       return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
16461     }
16462
16463     function translate(transform$$1, p0, p1) {
16464       var x = p0[0] - p1[0] * transform$$1.k, y = p0[1] - p1[1] * transform$$1.k;
16465       return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
16466     }
16467
16468     function centroid(extent) {
16469       return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16470     }
16471
16472     function schedule(transition$$1, transform$$1, center) {
16473       transition$$1
16474           .on("start.zoom", function() { gesture(this, arguments).start(); })
16475           .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16476           .tween("zoom", function() {
16477             var that = this,
16478                 args = arguments,
16479                 g = gesture(that, args),
16480                 e = extent.apply(that, args),
16481                 p = center || centroid(e),
16482                 w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
16483                 a = that.__zoom,
16484                 b = typeof transform$$1 === "function" ? transform$$1.apply(that, args) : transform$$1,
16485                 i = interpolate$$1(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
16486             return function(t) {
16487               if (t === 1) t = b; // Avoid rounding error on end.
16488               else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
16489               g.zoom(null, t);
16490             };
16491           });
16492     }
16493
16494     function gesture(that, args) {
16495       for (var i = 0, n = gestures.length, g; i < n; ++i) {
16496         if ((g = gestures[i]).that === that) {
16497           return g;
16498         }
16499       }
16500       return new Gesture(that, args);
16501     }
16502
16503     function Gesture(that, args) {
16504       this.that = that;
16505       this.args = args;
16506       this.index = -1;
16507       this.active = 0;
16508       this.extent = extent.apply(that, args);
16509     }
16510
16511     Gesture.prototype = {
16512       start: function() {
16513         if (++this.active === 1) {
16514           this.index = gestures.push(this) - 1;
16515           this.emit("start");
16516         }
16517         return this;
16518       },
16519       zoom: function(key, transform$$1) {
16520         if (this.mouse && key !== "mouse") this.mouse[1] = transform$$1.invert(this.mouse[0]);
16521         if (this.touch0 && key !== "touch") this.touch0[1] = transform$$1.invert(this.touch0[0]);
16522         if (this.touch1 && key !== "touch") this.touch1[1] = transform$$1.invert(this.touch1[0]);
16523         this.that.__zoom = transform$$1;
16524         this.emit("zoom");
16525         return this;
16526       },
16527       end: function() {
16528         if (--this.active === 0) {
16529           gestures.splice(this.index, 1);
16530           this.index = -1;
16531           this.emit("end");
16532         }
16533         return this;
16534       },
16535       emit: function(type) {
16536         customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16537       }
16538     };
16539
16540     function wheeled() {
16541       if (!filter.apply(this, arguments)) return;
16542       var g = gesture(this, arguments),
16543           t = this.__zoom,
16544           k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16545           p = mouse(this);
16546
16547       // If the mouse is in the same location as before, reuse it.
16548       // If there were recent wheel events, reset the wheel idle timeout.
16549       if (g.wheel) {
16550         if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16551           g.mouse[1] = t.invert(g.mouse[0] = p);
16552         }
16553         clearTimeout(g.wheel);
16554       }
16555
16556       // If this wheel event won’t trigger a transform change, ignore it.
16557       else if (t.k === k) return;
16558
16559       // Otherwise, capture the mouse point and location at the start.
16560       else {
16561         g.mouse = [p, t.invert(p)];
16562         interrupt(this);
16563         g.start();
16564       }
16565
16566       noevent$2();
16567       g.wheel = setTimeout(wheelidled, wheelDelay);
16568       g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
16569
16570       function wheelidled() {
16571         g.wheel = null;
16572         g.end();
16573       }
16574     }
16575
16576     function mousedowned() {
16577       if (touchending || !filter.apply(this, arguments)) return;
16578       var g = gesture(this, arguments),
16579           v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
16580           p = mouse(this),
16581           x0 = event.clientX,
16582           y0 = event.clientY;
16583
16584       nodrag(event.view);
16585       nopropagation$2();
16586       g.mouse = [p, this.__zoom.invert(p)];
16587       interrupt(this);
16588       g.start();
16589
16590       function mousemoved() {
16591         noevent$2();
16592         if (!g.moved) {
16593           var dx = event.clientX - x0, dy = event.clientY - y0;
16594           g.moved = dx * dx + dy * dy > clickDistance2;
16595         }
16596         g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent));
16597       }
16598
16599       function mouseupped() {
16600         v.on("mousemove.zoom mouseup.zoom", null);
16601         yesdrag(event.view, g.moved);
16602         noevent$2();
16603         g.end();
16604       }
16605     }
16606
16607     function dblclicked() {
16608       if (!filter.apply(this, arguments)) return;
16609       var t0 = this.__zoom,
16610           p0 = mouse(this),
16611           p1 = t0.invert(p0),
16612           k1 = t0.k * (event.shiftKey ? 0.5 : 2),
16613           t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
16614
16615       noevent$2();
16616       if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);
16617       else select(this).call(zoom.transform, t1);
16618     }
16619
16620     function touchstarted() {
16621       if (!filter.apply(this, arguments)) return;
16622       var g = gesture(this, arguments),
16623           touches = event.changedTouches,
16624           started,
16625           n = touches.length, i, t, p;
16626
16627       nopropagation$2();
16628       for (i = 0; i < n; ++i) {
16629         t = touches[i], p = touch(this, touches, t.identifier);
16630         p = [p, this.__zoom.invert(p), t.identifier];
16631         if (!g.touch0) g.touch0 = p, started = true;
16632         else if (!g.touch1) g.touch1 = p;
16633       }
16634
16635       // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16636       if (touchstarting) {
16637         touchstarting = clearTimeout(touchstarting);
16638         if (!g.touch1) {
16639           g.end();
16640           p = select(this).on("dblclick.zoom");
16641           if (p) p.apply(this, arguments);
16642           return;
16643         }
16644       }
16645
16646       if (started) {
16647         touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16648         interrupt(this);
16649         g.start();
16650       }
16651     }
16652
16653     function touchmoved() {
16654       var g = gesture(this, arguments),
16655           touches = event.changedTouches,
16656           n = touches.length, i, t, p, l;
16657
16658       noevent$2();
16659       if (touchstarting) touchstarting = clearTimeout(touchstarting);
16660       for (i = 0; i < n; ++i) {
16661         t = touches[i], p = touch(this, touches, t.identifier);
16662         if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
16663         else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
16664       }
16665       t = g.that.__zoom;
16666       if (g.touch1) {
16667         var p0 = g.touch0[0], l0 = g.touch0[1],
16668             p1 = g.touch1[0], l1 = g.touch1[1],
16669             dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
16670             dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
16671         t = scale(t, Math.sqrt(dp / dl));
16672         p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
16673         l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
16674       }
16675       else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16676       else return;
16677       g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
16678     }
16679
16680     function touchended() {
16681       var g = gesture(this, arguments),
16682           touches = event.changedTouches,
16683           n = touches.length, i, t;
16684
16685       nopropagation$2();
16686       if (touchending) clearTimeout(touchending);
16687       touchending = setTimeout(function() { touchending = null; }, touchDelay);
16688       for (i = 0; i < n; ++i) {
16689         t = touches[i];
16690         if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
16691         else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
16692       }
16693       if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
16694       if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
16695       else g.end();
16696     }
16697
16698     zoom.wheelDelta = function(_) {
16699       return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$c(+_), zoom) : wheelDelta;
16700     };
16701
16702     zoom.filter = function(_) {
16703       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$c(!!_), zoom) : filter;
16704     };
16705
16706     zoom.touchable = function(_) {
16707       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$c(!!_), zoom) : touchable;
16708     };
16709
16710     zoom.extent = function(_) {
16711       return arguments.length ? (extent = typeof _ === "function" ? _ : constant$c([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16712     };
16713
16714     zoom.scaleExtent = function(_) {
16715       return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
16716     };
16717
16718     zoom.translateExtent = function(_) {
16719       return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
16720     };
16721
16722     zoom.constrain = function(_) {
16723       return arguments.length ? (constrain = _, zoom) : constrain;
16724     };
16725
16726     zoom.duration = function(_) {
16727       return arguments.length ? (duration = +_, zoom) : duration;
16728     };
16729
16730     zoom.interpolate = function(_) {
16731       return arguments.length ? (interpolate$$1 = _, zoom) : interpolate$$1;
16732     };
16733
16734     zoom.on = function() {
16735       var value = listeners.on.apply(listeners, arguments);
16736       return value === listeners ? zoom : value;
16737     };
16738
16739     zoom.clickDistance = function(_) {
16740       return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16741     };
16742
16743     return zoom;
16744   }
16745
16746
16747
16748   var index$3 = /*#__PURE__*/Object.freeze({
16749     version: version,
16750     bisect: bisectRight,
16751     bisectRight: bisectRight,
16752     bisectLeft: bisectLeft,
16753     ascending: ascending,
16754     bisector: bisector,
16755     cross: cross,
16756     descending: d3_descending,
16757     deviation: deviation,
16758     extent: extent,
16759     histogram: histogram,
16760     thresholdFreedmanDiaconis: freedmanDiaconis,
16761     thresholdScott: scott,
16762     thresholdSturges: sturges,
16763     max: max,
16764     mean: mean,
16765     median: d3_median,
16766     merge: merge,
16767     min: min,
16768     pairs: pairs,
16769     permute: permute,
16770     quantile: quantile,
16771     range: range,
16772     scan: scan,
16773     shuffle: shuffle,
16774     sum: sum,
16775     ticks: ticks,
16776     tickIncrement: tickIncrement,
16777     tickStep: tickStep,
16778     transpose: transpose,
16779     variance: variance,
16780     zip: zip,
16781     axisTop: axisTop,
16782     axisRight: axisRight,
16783     axisBottom: axisBottom,
16784     axisLeft: axisLeft,
16785     brush: brush,
16786     brushX: brushX,
16787     brushY: brushY,
16788     brushSelection: brushSelection,
16789     chord: chord,
16790     ribbon: ribbon,
16791     nest: nest,
16792     set: set$2,
16793     map: map$1,
16794     keys: keys,
16795     values: values,
16796     entries: entries,
16797     color: color,
16798     rgb: rgb,
16799     hsl: hsl,
16800     lab: lab,
16801     hcl: hcl,
16802     cubehelix: cubehelix,
16803     dispatch: dispatch,
16804     drag: drag,
16805     dragDisable: nodrag,
16806     dragEnable: yesdrag,
16807     dsvFormat: dsv,
16808     csvParse: csvParse,
16809     csvParseRows: csvParseRows,
16810     csvFormat: csvFormat,
16811     csvFormatRows: csvFormatRows,
16812     tsvParse: tsvParse,
16813     tsvParseRows: tsvParseRows,
16814     tsvFormat: tsvFormat,
16815     tsvFormatRows: tsvFormatRows,
16816     easeLinear: linear$1,
16817     easeQuad: quadInOut,
16818     easeQuadIn: quadIn,
16819     easeQuadOut: quadOut,
16820     easeQuadInOut: quadInOut,
16821     easeCubic: cubicInOut,
16822     easeCubicIn: cubicIn,
16823     easeCubicOut: cubicOut,
16824     easeCubicInOut: cubicInOut,
16825     easePoly: polyInOut,
16826     easePolyIn: polyIn,
16827     easePolyOut: polyOut,
16828     easePolyInOut: polyInOut,
16829     easeSin: sinInOut,
16830     easeSinIn: sinIn,
16831     easeSinOut: sinOut,
16832     easeSinInOut: sinInOut,
16833     easeExp: expInOut,
16834     easeExpIn: expIn,
16835     easeExpOut: expOut,
16836     easeExpInOut: expInOut,
16837     easeCircle: circleInOut,
16838     easeCircleIn: circleIn,
16839     easeCircleOut: circleOut,
16840     easeCircleInOut: circleInOut,
16841     easeBounce: bounceOut,
16842     easeBounceIn: bounceIn,
16843     easeBounceOut: bounceOut,
16844     easeBounceInOut: bounceInOut,
16845     easeBack: backInOut,
16846     easeBackIn: backIn,
16847     easeBackOut: backOut,
16848     easeBackInOut: backInOut,
16849     easeElastic: elasticOut,
16850     easeElasticIn: elasticIn,
16851     easeElasticOut: elasticOut,
16852     easeElasticInOut: elasticInOut,
16853     forceCenter: center$1,
16854     forceCollide: collide,
16855     forceLink: link,
16856     forceManyBody: manyBody,
16857     forceRadial: radial,
16858     forceSimulation: simulation,
16859     forceX: x$2,
16860     forceY: y$2,
16861     formatDefaultLocale: defaultLocale,
16862     get format () { return format; },
16863     get formatPrefix () { return formatPrefix; },
16864     formatLocale: formatLocale,
16865     formatSpecifier: formatSpecifier,
16866     precisionFixed: precisionFixed,
16867     precisionPrefix: precisionPrefix,
16868     precisionRound: precisionRound,
16869     geoArea: d3_geoArea,
16870     geoBounds: d3_geoBounds,
16871     geoCentroid: d3_geoCentroid,
16872     geoCircle: circle,
16873     geoClipAntimeridian: clipAntimeridian,
16874     geoClipCircle: clipCircle,
16875     geoClipExtent: extent$1,
16876     geoClipRectangle: clipRectangle,
16877     geoContains: contains,
16878     geoDistance: distance,
16879     geoGraticule: graticule,
16880     geoGraticule10: graticule10,
16881     geoInterpolate: interpolate$2,
16882     geoLength: length$1,
16883     geoPath: d3_geoPath,
16884     geoAlbers: albers,
16885     geoAlbersUsa: albersUsa,
16886     geoAzimuthalEqualArea: azimuthalEqualArea,
16887     geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
16888     geoAzimuthalEquidistant: azimuthalEquidistant,
16889     geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
16890     geoConicConformal: conicConformal,
16891     geoConicConformalRaw: conicConformalRaw,
16892     geoConicEqualArea: conicEqualArea,
16893     geoConicEqualAreaRaw: conicEqualAreaRaw,
16894     geoConicEquidistant: conicEquidistant,
16895     geoConicEquidistantRaw: conicEquidistantRaw,
16896     geoEquirectangular: equirectangular,
16897     geoEquirectangularRaw: equirectangularRaw,
16898     geoGnomonic: gnomonic,
16899     geoGnomonicRaw: gnomonicRaw,
16900     geoIdentity: d3_geoIdentity,
16901     geoProjection: projection,
16902     geoProjectionMutator: projectionMutator,
16903     geoMercator: mercator,
16904     geoMercatorRaw: mercatorRaw,
16905     geoNaturalEarth1: naturalEarth1,
16906     geoNaturalEarth1Raw: naturalEarth1Raw,
16907     geoOrthographic: orthographic,
16908     geoOrthographicRaw: orthographicRaw,
16909     geoStereographic: stereographic,
16910     geoStereographicRaw: stereographicRaw,
16911     geoTransverseMercator: transverseMercator,
16912     geoTransverseMercatorRaw: transverseMercatorRaw,
16913     geoRotation: rotation,
16914     geoStream: geoStream,
16915     geoTransform: d3_geoTransform,
16916     cluster: cluster,
16917     hierarchy: hierarchy,
16918     pack: index$1,
16919     packSiblings: siblings,
16920     packEnclose: enclose,
16921     partition: partition,
16922     stratify: stratify,
16923     tree: tree,
16924     treemap: index$2,
16925     treemapBinary: binary,
16926     treemapDice: treemapDice,
16927     treemapSlice: treemapSlice,
16928     treemapSliceDice: sliceDice,
16929     treemapSquarify: squarify,
16930     treemapResquarify: resquarify,
16931     interpolate: interpolate,
16932     interpolateArray: array$1,
16933     interpolateBasis: basis$1,
16934     interpolateBasisClosed: basisClosed,
16935     interpolateDate: date,
16936     interpolateNumber: interpolateNumber,
16937     interpolateObject: object,
16938     interpolateRound: interpolateRound,
16939     interpolateString: interpolateString,
16940     interpolateTransformCss: interpolateTransformCss,
16941     interpolateTransformSvg: interpolateTransformSvg,
16942     interpolateZoom: interpolateZoom,
16943     interpolateRgb: interpolateRgb,
16944     interpolateRgbBasis: rgbBasis,
16945     interpolateRgbBasisClosed: rgbBasisClosed,
16946     interpolateHsl: hsl$2,
16947     interpolateHslLong: hslLong,
16948     interpolateLab: lab$1,
16949     interpolateHcl: hcl$2,
16950     interpolateHclLong: hclLong,
16951     interpolateCubehelix: cubehelix$2,
16952     interpolateCubehelixLong: cubehelixLong,
16953     quantize: d3_quantize,
16954     path: path,
16955     polygonArea: d3_polygonArea,
16956     polygonCentroid: d3_polygonCentroid,
16957     polygonHull: d3_polygonHull,
16958     polygonContains: contains$1,
16959     polygonLength: length$2,
16960     quadtree: quadtree,
16961     queue: queue,
16962     randomUniform: uniform,
16963     randomNormal: normal,
16964     randomLogNormal: logNormal,
16965     randomBates: bates,
16966     randomIrwinHall: irwinHall,
16967     randomExponential: exponential$1,
16968     request: request,
16969     html: html,
16970     json: d3_json,
16971     text: d3_text,
16972     xml: d3_xml,
16973     csv: csv$1,
16974     tsv: tsv$1,
16975     scaleBand: band,
16976     scalePoint: point$1,
16977     scaleIdentity: identity$5,
16978     scaleLinear: linear$2,
16979     scaleLog: log$1,
16980     scaleOrdinal: ordinal,
16981     scaleImplicit: implicit,
16982     scalePow: pow$1,
16983     scaleSqrt: sqrt$1,
16984     scaleQuantile: quantile$1,
16985     scaleQuantize: quantize,
16986     scaleThreshold: threshold,
16987     scaleTime: time,
16988     scaleUtc: utcTime,
16989     schemeCategory10: category10,
16990     schemeCategory20b: category20b,
16991     schemeCategory20c: category20c,
16992     schemeCategory20: category20,
16993     interpolateCubehelixDefault: cubehelix$3,
16994     interpolateRainbow: rainbow$1,
16995     interpolateWarm: warm,
16996     interpolateCool: cool,
16997     interpolateViridis: viridis,
16998     interpolateMagma: magma,
16999     interpolateInferno: inferno,
17000     interpolatePlasma: plasma,
17001     scaleSequential: sequential,
17002     create: create,
17003     creator: creator,
17004     local: local,
17005     matcher: matcher$1,
17006     mouse: mouse,
17007     namespace: namespace,
17008     namespaces: namespaces,
17009     clientPoint: point,
17010     select: select,
17011     selectAll: d3_selectAll,
17012     selection: selection,
17013     selector: selector,
17014     selectorAll: selectorAll,
17015     style: styleValue,
17016     touch: touch,
17017     touches: d3_touches,
17018     window: defaultView,
17019     get event () { return event; },
17020     customEvent: customEvent,
17021     arc: arc,
17022     area: area,
17023     line: line,
17024     pie: pie,
17025     areaRadial: areaRadial,
17026     radialArea: areaRadial,
17027     lineRadial: lineRadial$1,
17028     radialLine: lineRadial$1,
17029     pointRadial: pointRadial,
17030     linkHorizontal: linkHorizontal,
17031     linkVertical: linkVertical,
17032     linkRadial: linkRadial,
17033     symbol: symbol,
17034     symbols: symbols,
17035     symbolCircle: circle$2,
17036     symbolCross: cross$2,
17037     symbolDiamond: diamond,
17038     symbolSquare: square,
17039     symbolStar: star,
17040     symbolTriangle: triangle,
17041     symbolWye: wye,
17042     curveBasisClosed: basisClosed$1,
17043     curveBasisOpen: basisOpen,
17044     curveBasis: basis$2,
17045     curveBundle: bundle,
17046     curveCardinalClosed: cardinalClosed,
17047     curveCardinalOpen: cardinalOpen,
17048     curveCardinal: cardinal,
17049     curveCatmullRomClosed: catmullRomClosed,
17050     curveCatmullRomOpen: catmullRomOpen,
17051     curveCatmullRom: catmullRom,
17052     curveLinearClosed: linearClosed,
17053     curveLinear: curveLinear,
17054     curveMonotoneX: monotoneX,
17055     curveMonotoneY: monotoneY,
17056     curveNatural: natural,
17057     curveStep: step,
17058     curveStepAfter: stepAfter,
17059     curveStepBefore: stepBefore,
17060     stack: stack,
17061     stackOffsetExpand: expand,
17062     stackOffsetDiverging: diverging,
17063     stackOffsetNone: none$1,
17064     stackOffsetSilhouette: silhouette,
17065     stackOffsetWiggle: wiggle,
17066     stackOrderAscending: ascending$2,
17067     stackOrderDescending: descending$1,
17068     stackOrderInsideOut: insideOut,
17069     stackOrderNone: none$2,
17070     stackOrderReverse: reverse,
17071     timeInterval: newInterval,
17072     timeMillisecond: millisecond,
17073     timeMilliseconds: milliseconds,
17074     utcMillisecond: millisecond,
17075     utcMilliseconds: milliseconds,
17076     timeSecond: second,
17077     timeSeconds: seconds,
17078     utcSecond: second,
17079     utcSeconds: seconds,
17080     timeMinute: minute,
17081     timeMinutes: minutes,
17082     timeHour: hour,
17083     timeHours: hours,
17084     timeDay: day,
17085     timeDays: days,
17086     timeWeek: sunday,
17087     timeWeeks: sundays,
17088     timeSunday: sunday,
17089     timeSundays: sundays,
17090     timeMonday: monday,
17091     timeMondays: mondays,
17092     timeTuesday: tuesday,
17093     timeTuesdays: tuesdays,
17094     timeWednesday: wednesday,
17095     timeWednesdays: wednesdays,
17096     timeThursday: thursday,
17097     timeThursdays: thursdays,
17098     timeFriday: friday,
17099     timeFridays: fridays,
17100     timeSaturday: saturday,
17101     timeSaturdays: saturdays,
17102     timeMonth: month,
17103     timeMonths: months,
17104     timeYear: year,
17105     timeYears: years,
17106     utcMinute: utcMinute,
17107     utcMinutes: utcMinutes,
17108     utcHour: utcHour,
17109     utcHours: utcHours,
17110     utcDay: utcDay,
17111     utcDays: utcDays,
17112     utcWeek: utcSunday,
17113     utcWeeks: utcSundays,
17114     utcSunday: utcSunday,
17115     utcSundays: utcSundays,
17116     utcMonday: utcMonday,
17117     utcMondays: utcMondays,
17118     utcTuesday: utcTuesday,
17119     utcTuesdays: utcTuesdays,
17120     utcWednesday: utcWednesday,
17121     utcWednesdays: utcWednesdays,
17122     utcThursday: utcThursday,
17123     utcThursdays: utcThursdays,
17124     utcFriday: utcFriday,
17125     utcFridays: utcFridays,
17126     utcSaturday: utcSaturday,
17127     utcSaturdays: utcSaturdays,
17128     utcMonth: utcMonth,
17129     utcMonths: utcMonths,
17130     utcYear: utcYear,
17131     utcYears: utcYears,
17132     timeFormatDefaultLocale: defaultLocale$1,
17133     get timeFormat () { return timeFormat; },
17134     get timeParse () { return timeParse; },
17135     get utcFormat () { return utcFormat; },
17136     get utcParse () { return utcParse; },
17137     timeFormatLocale: formatLocale$1,
17138     isoFormat: formatIso,
17139     isoParse: parseIso,
17140     now: now,
17141     timer: timer,
17142     timerFlush: timerFlush,
17143     timeout: timeout$1,
17144     interval: interval$1,
17145     transition: transition,
17146     active: active,
17147     interrupt: interrupt,
17148     voronoi: voronoi,
17149     zoom: d3_zoom,
17150     zoomTransform: transform,
17151     zoomIdentity: identity$7
17152   });
17153
17154   function actionAddEntity(way) {
17155       return function(graph) {
17156           return graph.replace(way);
17157       };
17158   }
17159
17160   /**
17161    * Removes all key-value entries from the list cache.
17162    *
17163    * @private
17164    * @name clear
17165    * @memberOf ListCache
17166    */
17167   function listCacheClear() {
17168     this.__data__ = [];
17169     this.size = 0;
17170   }
17171
17172   /**
17173    * Performs a
17174    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17175    * comparison between two values to determine if they are equivalent.
17176    *
17177    * @static
17178    * @memberOf _
17179    * @since 4.0.0
17180    * @category Lang
17181    * @param {*} value The value to compare.
17182    * @param {*} other The other value to compare.
17183    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
17184    * @example
17185    *
17186    * var object = { 'a': 1 };
17187    * var other = { 'a': 1 };
17188    *
17189    * _.eq(object, object);
17190    * // => true
17191    *
17192    * _.eq(object, other);
17193    * // => false
17194    *
17195    * _.eq('a', 'a');
17196    * // => true
17197    *
17198    * _.eq('a', Object('a'));
17199    * // => false
17200    *
17201    * _.eq(NaN, NaN);
17202    * // => true
17203    */
17204   function eq(value, other) {
17205     return value === other || (value !== value && other !== other);
17206   }
17207
17208   /**
17209    * Gets the index at which the `key` is found in `array` of key-value pairs.
17210    *
17211    * @private
17212    * @param {Array} array The array to inspect.
17213    * @param {*} key The key to search for.
17214    * @returns {number} Returns the index of the matched value, else `-1`.
17215    */
17216   function assocIndexOf(array, key) {
17217     var length = array.length;
17218     while (length--) {
17219       if (eq(array[length][0], key)) {
17220         return length;
17221       }
17222     }
17223     return -1;
17224   }
17225
17226   /** Used for built-in method references. */
17227   var arrayProto = Array.prototype;
17228
17229   /** Built-in value references. */
17230   var splice = arrayProto.splice;
17231
17232   /**
17233    * Removes `key` and its value from the list cache.
17234    *
17235    * @private
17236    * @name delete
17237    * @memberOf ListCache
17238    * @param {string} key The key of the value to remove.
17239    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17240    */
17241   function listCacheDelete(key) {
17242     var data = this.__data__,
17243         index = assocIndexOf(data, key);
17244
17245     if (index < 0) {
17246       return false;
17247     }
17248     var lastIndex = data.length - 1;
17249     if (index == lastIndex) {
17250       data.pop();
17251     } else {
17252       splice.call(data, index, 1);
17253     }
17254     --this.size;
17255     return true;
17256   }
17257
17258   /**
17259    * Gets the list cache value for `key`.
17260    *
17261    * @private
17262    * @name get
17263    * @memberOf ListCache
17264    * @param {string} key The key of the value to get.
17265    * @returns {*} Returns the entry value.
17266    */
17267   function listCacheGet(key) {
17268     var data = this.__data__,
17269         index = assocIndexOf(data, key);
17270
17271     return index < 0 ? undefined : data[index][1];
17272   }
17273
17274   /**
17275    * Checks if a list cache value for `key` exists.
17276    *
17277    * @private
17278    * @name has
17279    * @memberOf ListCache
17280    * @param {string} key The key of the entry to check.
17281    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17282    */
17283   function listCacheHas(key) {
17284     return assocIndexOf(this.__data__, key) > -1;
17285   }
17286
17287   /**
17288    * Sets the list cache `key` to `value`.
17289    *
17290    * @private
17291    * @name set
17292    * @memberOf ListCache
17293    * @param {string} key The key of the value to set.
17294    * @param {*} value The value to set.
17295    * @returns {Object} Returns the list cache instance.
17296    */
17297   function listCacheSet(key, value) {
17298     var data = this.__data__,
17299         index = assocIndexOf(data, key);
17300
17301     if (index < 0) {
17302       ++this.size;
17303       data.push([key, value]);
17304     } else {
17305       data[index][1] = value;
17306     }
17307     return this;
17308   }
17309
17310   /**
17311    * Creates an list cache object.
17312    *
17313    * @private
17314    * @constructor
17315    * @param {Array} [entries] The key-value pairs to cache.
17316    */
17317   function ListCache(entries) {
17318     var index = -1,
17319         length = entries == null ? 0 : entries.length;
17320
17321     this.clear();
17322     while (++index < length) {
17323       var entry = entries[index];
17324       this.set(entry[0], entry[1]);
17325     }
17326   }
17327
17328   // Add methods to `ListCache`.
17329   ListCache.prototype.clear = listCacheClear;
17330   ListCache.prototype['delete'] = listCacheDelete;
17331   ListCache.prototype.get = listCacheGet;
17332   ListCache.prototype.has = listCacheHas;
17333   ListCache.prototype.set = listCacheSet;
17334
17335   /**
17336    * Removes all key-value entries from the stack.
17337    *
17338    * @private
17339    * @name clear
17340    * @memberOf Stack
17341    */
17342   function stackClear() {
17343     this.__data__ = new ListCache;
17344     this.size = 0;
17345   }
17346
17347   /**
17348    * Removes `key` and its value from the stack.
17349    *
17350    * @private
17351    * @name delete
17352    * @memberOf Stack
17353    * @param {string} key The key of the value to remove.
17354    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17355    */
17356   function stackDelete(key) {
17357     var data = this.__data__,
17358         result = data['delete'](key);
17359
17360     this.size = data.size;
17361     return result;
17362   }
17363
17364   /**
17365    * Gets the stack value for `key`.
17366    *
17367    * @private
17368    * @name get
17369    * @memberOf Stack
17370    * @param {string} key The key of the value to get.
17371    * @returns {*} Returns the entry value.
17372    */
17373   function stackGet(key) {
17374     return this.__data__.get(key);
17375   }
17376
17377   /**
17378    * Checks if a stack value for `key` exists.
17379    *
17380    * @private
17381    * @name has
17382    * @memberOf Stack
17383    * @param {string} key The key of the entry to check.
17384    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17385    */
17386   function stackHas(key) {
17387     return this.__data__.has(key);
17388   }
17389
17390   /** Detect free variable `global` from Node.js. */
17391   var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17392
17393   /** Detect free variable `self`. */
17394   var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17395
17396   /** Used as a reference to the global object. */
17397   var root$2 = freeGlobal || freeSelf || Function('return this')();
17398
17399   /** Built-in value references. */
17400   var Symbol = root$2.Symbol;
17401
17402   /** Used for built-in method references. */
17403   var objectProto = Object.prototype;
17404
17405   /** Used to check objects for own properties. */
17406   var hasOwnProperty = objectProto.hasOwnProperty;
17407
17408   /**
17409    * Used to resolve the
17410    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17411    * of values.
17412    */
17413   var nativeObjectToString = objectProto.toString;
17414
17415   /** Built-in value references. */
17416   var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17417
17418   /**
17419    * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17420    *
17421    * @private
17422    * @param {*} value The value to query.
17423    * @returns {string} Returns the raw `toStringTag`.
17424    */
17425   function getRawTag(value) {
17426     var isOwn = hasOwnProperty.call(value, symToStringTag),
17427         tag = value[symToStringTag];
17428
17429     try {
17430       value[symToStringTag] = undefined;
17431     } catch (e) {}
17432
17433     var result = nativeObjectToString.call(value);
17434     {
17435       if (isOwn) {
17436         value[symToStringTag] = tag;
17437       } else {
17438         delete value[symToStringTag];
17439       }
17440     }
17441     return result;
17442   }
17443
17444   /** Used for built-in method references. */
17445   var objectProto$1 = Object.prototype;
17446
17447   /**
17448    * Used to resolve the
17449    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17450    * of values.
17451    */
17452   var nativeObjectToString$1 = objectProto$1.toString;
17453
17454   /**
17455    * Converts `value` to a string using `Object.prototype.toString`.
17456    *
17457    * @private
17458    * @param {*} value The value to convert.
17459    * @returns {string} Returns the converted string.
17460    */
17461   function objectToString(value) {
17462     return nativeObjectToString$1.call(value);
17463   }
17464
17465   /** `Object#toString` result references. */
17466   var nullTag = '[object Null]',
17467       undefinedTag = '[object Undefined]';
17468
17469   /** Built-in value references. */
17470   var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17471
17472   /**
17473    * The base implementation of `getTag` without fallbacks for buggy environments.
17474    *
17475    * @private
17476    * @param {*} value The value to query.
17477    * @returns {string} Returns the `toStringTag`.
17478    */
17479   function baseGetTag(value) {
17480     if (value == null) {
17481       return value === undefined ? undefinedTag : nullTag;
17482     }
17483     return (symToStringTag$1 && symToStringTag$1 in Object(value))
17484       ? getRawTag(value)
17485       : objectToString(value);
17486   }
17487
17488   /**
17489    * Checks if `value` is the
17490    * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
17491    * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
17492    *
17493    * @static
17494    * @memberOf _
17495    * @since 0.1.0
17496    * @category Lang
17497    * @param {*} value The value to check.
17498    * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17499    * @example
17500    *
17501    * _.isObject({});
17502    * // => true
17503    *
17504    * _.isObject([1, 2, 3]);
17505    * // => true
17506    *
17507    * _.isObject(_.noop);
17508    * // => true
17509    *
17510    * _.isObject(null);
17511    * // => false
17512    */
17513   function isObject(value) {
17514     var type = typeof value;
17515     return value != null && (type == 'object' || type == 'function');
17516   }
17517
17518   /** `Object#toString` result references. */
17519   var asyncTag = '[object AsyncFunction]',
17520       funcTag = '[object Function]',
17521       genTag = '[object GeneratorFunction]',
17522       proxyTag = '[object Proxy]';
17523
17524   /**
17525    * Checks if `value` is classified as a `Function` object.
17526    *
17527    * @static
17528    * @memberOf _
17529    * @since 0.1.0
17530    * @category Lang
17531    * @param {*} value The value to check.
17532    * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17533    * @example
17534    *
17535    * _.isFunction(_);
17536    * // => true
17537    *
17538    * _.isFunction(/abc/);
17539    * // => false
17540    */
17541   function isFunction(value) {
17542     if (!isObject(value)) {
17543       return false;
17544     }
17545     // The use of `Object#toString` avoids issues with the `typeof` operator
17546     // in Safari 9 which returns 'object' for typed arrays and other constructors.
17547     var tag = baseGetTag(value);
17548     return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
17549   }
17550
17551   /** Used to detect overreaching core-js shims. */
17552   var coreJsData = root$2['__core-js_shared__'];
17553
17554   /** Used to detect methods masquerading as native. */
17555   var maskSrcKey = (function() {
17556     var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
17557     return uid ? ('Symbol(src)_1.' + uid) : '';
17558   }());
17559
17560   /**
17561    * Checks if `func` has its source masked.
17562    *
17563    * @private
17564    * @param {Function} func The function to check.
17565    * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17566    */
17567   function isMasked(func) {
17568     return !!maskSrcKey && (maskSrcKey in func);
17569   }
17570
17571   /** Used for built-in method references. */
17572   var funcProto = Function.prototype;
17573
17574   /** Used to resolve the decompiled source of functions. */
17575   var funcToString = funcProto.toString;
17576
17577   /**
17578    * Converts `func` to its source code.
17579    *
17580    * @private
17581    * @param {Function} func The function to convert.
17582    * @returns {string} Returns the source code.
17583    */
17584   function toSource(func) {
17585     if (func != null) {
17586       try {
17587         return funcToString.call(func);
17588       } catch (e) {}
17589       try {
17590         return (func + '');
17591       } catch (e) {}
17592     }
17593     return '';
17594   }
17595
17596   /**
17597    * Used to match `RegExp`
17598    * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17599    */
17600   var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17601
17602   /** Used to detect host constructors (Safari). */
17603   var reIsHostCtor = /^\[object .+?Constructor\]$/;
17604
17605   /** Used for built-in method references. */
17606   var funcProto$1 = Function.prototype,
17607       objectProto$2 = Object.prototype;
17608
17609   /** Used to resolve the decompiled source of functions. */
17610   var funcToString$1 = funcProto$1.toString;
17611
17612   /** Used to check objects for own properties. */
17613   var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
17614
17615   /** Used to detect if a method is native. */
17616   var reIsNative = RegExp('^' +
17617     funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
17618     .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
17619   );
17620
17621   /**
17622    * The base implementation of `_.isNative` without bad shim checks.
17623    *
17624    * @private
17625    * @param {*} value The value to check.
17626    * @returns {boolean} Returns `true` if `value` is a native function,
17627    *  else `false`.
17628    */
17629   function baseIsNative(value) {
17630     if (!isObject(value) || isMasked(value)) {
17631       return false;
17632     }
17633     var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17634     return pattern.test(toSource(value));
17635   }
17636
17637   /**
17638    * Gets the value at `key` of `object`.
17639    *
17640    * @private
17641    * @param {Object} [object] The object to query.
17642    * @param {string} key The key of the property to get.
17643    * @returns {*} Returns the property value.
17644    */
17645   function getValue(object, key) {
17646     return object == null ? undefined : object[key];
17647   }
17648
17649   /**
17650    * Gets the native function at `key` of `object`.
17651    *
17652    * @private
17653    * @param {Object} object The object to query.
17654    * @param {string} key The key of the method to get.
17655    * @returns {*} Returns the function if it's native, else `undefined`.
17656    */
17657   function getNative(object, key) {
17658     var value = getValue(object, key);
17659     return baseIsNative(value) ? value : undefined;
17660   }
17661
17662   /* Built-in method references that are verified to be native. */
17663   var Map$1 = getNative(root$2, 'Map');
17664
17665   /* Built-in method references that are verified to be native. */
17666   var nativeCreate = getNative(Object, 'create');
17667
17668   /**
17669    * Removes all key-value entries from the hash.
17670    *
17671    * @private
17672    * @name clear
17673    * @memberOf Hash
17674    */
17675   function hashClear() {
17676     this.__data__ = nativeCreate ? nativeCreate(null) : {};
17677     this.size = 0;
17678   }
17679
17680   /**
17681    * Removes `key` and its value from the hash.
17682    *
17683    * @private
17684    * @name delete
17685    * @memberOf Hash
17686    * @param {Object} hash The hash to modify.
17687    * @param {string} key The key of the value to remove.
17688    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17689    */
17690   function hashDelete(key) {
17691     var result = this.has(key) && delete this.__data__[key];
17692     this.size -= result ? 1 : 0;
17693     return result;
17694   }
17695
17696   /** Used to stand-in for `undefined` hash values. */
17697   var HASH_UNDEFINED = '__lodash_hash_undefined__';
17698
17699   /** Used for built-in method references. */
17700   var objectProto$3 = Object.prototype;
17701
17702   /** Used to check objects for own properties. */
17703   var hasOwnProperty$2 = objectProto$3.hasOwnProperty;
17704
17705   /**
17706    * Gets the hash value for `key`.
17707    *
17708    * @private
17709    * @name get
17710    * @memberOf Hash
17711    * @param {string} key The key of the value to get.
17712    * @returns {*} Returns the entry value.
17713    */
17714   function hashGet(key) {
17715     var data = this.__data__;
17716     if (nativeCreate) {
17717       var result = data[key];
17718       return result === HASH_UNDEFINED ? undefined : result;
17719     }
17720     return hasOwnProperty$2.call(data, key) ? data[key] : undefined;
17721   }
17722
17723   /** Used for built-in method references. */
17724   var objectProto$4 = Object.prototype;
17725
17726   /** Used to check objects for own properties. */
17727   var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
17728
17729   /**
17730    * Checks if a hash value for `key` exists.
17731    *
17732    * @private
17733    * @name has
17734    * @memberOf Hash
17735    * @param {string} key The key of the entry to check.
17736    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17737    */
17738   function hashHas(key) {
17739     var data = this.__data__;
17740     return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key);
17741   }
17742
17743   /** Used to stand-in for `undefined` hash values. */
17744   var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
17745
17746   /**
17747    * Sets the hash `key` to `value`.
17748    *
17749    * @private
17750    * @name set
17751    * @memberOf Hash
17752    * @param {string} key The key of the value to set.
17753    * @param {*} value The value to set.
17754    * @returns {Object} Returns the hash instance.
17755    */
17756   function hashSet(key, value) {
17757     var data = this.__data__;
17758     this.size += this.has(key) ? 0 : 1;
17759     data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
17760     return this;
17761   }
17762
17763   /**
17764    * Creates a hash object.
17765    *
17766    * @private
17767    * @constructor
17768    * @param {Array} [entries] The key-value pairs to cache.
17769    */
17770   function Hash(entries) {
17771     var index = -1,
17772         length = entries == null ? 0 : entries.length;
17773
17774     this.clear();
17775     while (++index < length) {
17776       var entry = entries[index];
17777       this.set(entry[0], entry[1]);
17778     }
17779   }
17780
17781   // Add methods to `Hash`.
17782   Hash.prototype.clear = hashClear;
17783   Hash.prototype['delete'] = hashDelete;
17784   Hash.prototype.get = hashGet;
17785   Hash.prototype.has = hashHas;
17786   Hash.prototype.set = hashSet;
17787
17788   /**
17789    * Removes all key-value entries from the map.
17790    *
17791    * @private
17792    * @name clear
17793    * @memberOf MapCache
17794    */
17795   function mapCacheClear() {
17796     this.size = 0;
17797     this.__data__ = {
17798       'hash': new Hash,
17799       'map': new (Map$1 || ListCache),
17800       'string': new Hash
17801     };
17802   }
17803
17804   /**
17805    * Checks if `value` is suitable for use as unique object key.
17806    *
17807    * @private
17808    * @param {*} value The value to check.
17809    * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
17810    */
17811   function isKeyable(value) {
17812     var type = typeof value;
17813     return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
17814       ? (value !== '__proto__')
17815       : (value === null);
17816   }
17817
17818   /**
17819    * Gets the data for `map`.
17820    *
17821    * @private
17822    * @param {Object} map The map to query.
17823    * @param {string} key The reference key.
17824    * @returns {*} Returns the map data.
17825    */
17826   function getMapData(map, key) {
17827     var data = map.__data__;
17828     return isKeyable(key)
17829       ? data[typeof key == 'string' ? 'string' : 'hash']
17830       : data.map;
17831   }
17832
17833   /**
17834    * Removes `key` and its value from the map.
17835    *
17836    * @private
17837    * @name delete
17838    * @memberOf MapCache
17839    * @param {string} key The key of the value to remove.
17840    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17841    */
17842   function mapCacheDelete(key) {
17843     var result = getMapData(this, key)['delete'](key);
17844     this.size -= result ? 1 : 0;
17845     return result;
17846   }
17847
17848   /**
17849    * Gets the map value for `key`.
17850    *
17851    * @private
17852    * @name get
17853    * @memberOf MapCache
17854    * @param {string} key The key of the value to get.
17855    * @returns {*} Returns the entry value.
17856    */
17857   function mapCacheGet(key) {
17858     return getMapData(this, key).get(key);
17859   }
17860
17861   /**
17862    * Checks if a map value for `key` exists.
17863    *
17864    * @private
17865    * @name has
17866    * @memberOf MapCache
17867    * @param {string} key The key of the entry to check.
17868    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17869    */
17870   function mapCacheHas(key) {
17871     return getMapData(this, key).has(key);
17872   }
17873
17874   /**
17875    * Sets the map `key` to `value`.
17876    *
17877    * @private
17878    * @name set
17879    * @memberOf MapCache
17880    * @param {string} key The key of the value to set.
17881    * @param {*} value The value to set.
17882    * @returns {Object} Returns the map cache instance.
17883    */
17884   function mapCacheSet(key, value) {
17885     var data = getMapData(this, key),
17886         size = data.size;
17887
17888     data.set(key, value);
17889     this.size += data.size == size ? 0 : 1;
17890     return this;
17891   }
17892
17893   /**
17894    * Creates a map cache object to store key-value pairs.
17895    *
17896    * @private
17897    * @constructor
17898    * @param {Array} [entries] The key-value pairs to cache.
17899    */
17900   function MapCache(entries) {
17901     var index = -1,
17902         length = entries == null ? 0 : entries.length;
17903
17904     this.clear();
17905     while (++index < length) {
17906       var entry = entries[index];
17907       this.set(entry[0], entry[1]);
17908     }
17909   }
17910
17911   // Add methods to `MapCache`.
17912   MapCache.prototype.clear = mapCacheClear;
17913   MapCache.prototype['delete'] = mapCacheDelete;
17914   MapCache.prototype.get = mapCacheGet;
17915   MapCache.prototype.has = mapCacheHas;
17916   MapCache.prototype.set = mapCacheSet;
17917
17918   /** Used as the size to enable large array optimizations. */
17919   var LARGE_ARRAY_SIZE = 200;
17920
17921   /**
17922    * Sets the stack `key` to `value`.
17923    *
17924    * @private
17925    * @name set
17926    * @memberOf Stack
17927    * @param {string} key The key of the value to set.
17928    * @param {*} value The value to set.
17929    * @returns {Object} Returns the stack cache instance.
17930    */
17931   function stackSet(key, value) {
17932     var data = this.__data__;
17933     if (data instanceof ListCache) {
17934       var pairs = data.__data__;
17935       if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
17936         pairs.push([key, value]);
17937         this.size = ++data.size;
17938         return this;
17939       }
17940       data = this.__data__ = new MapCache(pairs);
17941     }
17942     data.set(key, value);
17943     this.size = data.size;
17944     return this;
17945   }
17946
17947   /**
17948    * Creates a stack cache object to store key-value pairs.
17949    *
17950    * @private
17951    * @constructor
17952    * @param {Array} [entries] The key-value pairs to cache.
17953    */
17954   function Stack(entries) {
17955     var data = this.__data__ = new ListCache(entries);
17956     this.size = data.size;
17957   }
17958
17959   // Add methods to `Stack`.
17960   Stack.prototype.clear = stackClear;
17961   Stack.prototype['delete'] = stackDelete;
17962   Stack.prototype.get = stackGet;
17963   Stack.prototype.has = stackHas;
17964   Stack.prototype.set = stackSet;
17965
17966   /**
17967    * A specialized version of `_.forEach` for arrays without support for
17968    * iteratee shorthands.
17969    *
17970    * @private
17971    * @param {Array} [array] The array to iterate over.
17972    * @param {Function} iteratee The function invoked per iteration.
17973    * @returns {Array} Returns `array`.
17974    */
17975   function arrayEach(array, iteratee) {
17976     var index = -1,
17977         length = array == null ? 0 : array.length;
17978
17979     while (++index < length) {
17980       if (iteratee(array[index], index, array) === false) {
17981         break;
17982       }
17983     }
17984     return array;
17985   }
17986
17987   var defineProperty = (function() {
17988     try {
17989       var func = getNative(Object, 'defineProperty');
17990       func({}, '', {});
17991       return func;
17992     } catch (e) {}
17993   }());
17994
17995   /**
17996    * The base implementation of `assignValue` and `assignMergeValue` without
17997    * value checks.
17998    *
17999    * @private
18000    * @param {Object} object The object to modify.
18001    * @param {string} key The key of the property to assign.
18002    * @param {*} value The value to assign.
18003    */
18004   function baseAssignValue(object, key, value) {
18005     if (key == '__proto__' && defineProperty) {
18006       defineProperty(object, key, {
18007         'configurable': true,
18008         'enumerable': true,
18009         'value': value,
18010         'writable': true
18011       });
18012     } else {
18013       object[key] = value;
18014     }
18015   }
18016
18017   /** Used for built-in method references. */
18018   var objectProto$5 = Object.prototype;
18019
18020   /** Used to check objects for own properties. */
18021   var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
18022
18023   /**
18024    * Assigns `value` to `key` of `object` if the existing value is not equivalent
18025    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
18026    * for equality comparisons.
18027    *
18028    * @private
18029    * @param {Object} object The object to modify.
18030    * @param {string} key The key of the property to assign.
18031    * @param {*} value The value to assign.
18032    */
18033   function assignValue(object, key, value) {
18034     var objValue = object[key];
18035     if (!(hasOwnProperty$4.call(object, key) && eq(objValue, value)) ||
18036         (value === undefined && !(key in object))) {
18037       baseAssignValue(object, key, value);
18038     }
18039   }
18040
18041   /**
18042    * Copies properties of `source` to `object`.
18043    *
18044    * @private
18045    * @param {Object} source The object to copy properties from.
18046    * @param {Array} props The property identifiers to copy.
18047    * @param {Object} [object={}] The object to copy properties to.
18048    * @param {Function} [customizer] The function to customize copied values.
18049    * @returns {Object} Returns `object`.
18050    */
18051   function copyObject(source, props, object, customizer) {
18052     var isNew = !object;
18053     object || (object = {});
18054
18055     var index = -1,
18056         length = props.length;
18057
18058     while (++index < length) {
18059       var key = props[index];
18060
18061       var newValue = customizer
18062         ? customizer(object[key], source[key], key, object, source)
18063         : undefined;
18064
18065       if (newValue === undefined) {
18066         newValue = source[key];
18067       }
18068       if (isNew) {
18069         baseAssignValue(object, key, newValue);
18070       } else {
18071         assignValue(object, key, newValue);
18072       }
18073     }
18074     return object;
18075   }
18076
18077   /**
18078    * The base implementation of `_.times` without support for iteratee shorthands
18079    * or max array length checks.
18080    *
18081    * @private
18082    * @param {number} n The number of times to invoke `iteratee`.
18083    * @param {Function} iteratee The function invoked per iteration.
18084    * @returns {Array} Returns the array of results.
18085    */
18086   function baseTimes(n, iteratee) {
18087     var index = -1,
18088         result = Array(n);
18089
18090     while (++index < n) {
18091       result[index] = iteratee(index);
18092     }
18093     return result;
18094   }
18095
18096   /**
18097    * Checks if `value` is object-like. A value is object-like if it's not `null`
18098    * and has a `typeof` result of "object".
18099    *
18100    * @static
18101    * @memberOf _
18102    * @since 4.0.0
18103    * @category Lang
18104    * @param {*} value The value to check.
18105    * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
18106    * @example
18107    *
18108    * _.isObjectLike({});
18109    * // => true
18110    *
18111    * _.isObjectLike([1, 2, 3]);
18112    * // => true
18113    *
18114    * _.isObjectLike(_.noop);
18115    * // => false
18116    *
18117    * _.isObjectLike(null);
18118    * // => false
18119    */
18120   function isObjectLike(value) {
18121     return value != null && typeof value == 'object';
18122   }
18123
18124   /** `Object#toString` result references. */
18125   var argsTag = '[object Arguments]';
18126
18127   /**
18128    * The base implementation of `_.isArguments`.
18129    *
18130    * @private
18131    * @param {*} value The value to check.
18132    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18133    */
18134   function baseIsArguments(value) {
18135     return isObjectLike(value) && baseGetTag(value) == argsTag;
18136   }
18137
18138   /** Used for built-in method references. */
18139   var objectProto$6 = Object.prototype;
18140
18141   /** Used to check objects for own properties. */
18142   var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18143
18144   /** Built-in value references. */
18145   var propertyIsEnumerable = objectProto$6.propertyIsEnumerable;
18146
18147   /**
18148    * Checks if `value` is likely an `arguments` object.
18149    *
18150    * @static
18151    * @memberOf _
18152    * @since 0.1.0
18153    * @category Lang
18154    * @param {*} value The value to check.
18155    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18156    *  else `false`.
18157    * @example
18158    *
18159    * _.isArguments(function() { return arguments; }());
18160    * // => true
18161    *
18162    * _.isArguments([1, 2, 3]);
18163    * // => false
18164    */
18165   var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
18166     return isObjectLike(value) && hasOwnProperty$5.call(value, 'callee') &&
18167       !propertyIsEnumerable.call(value, 'callee');
18168   };
18169
18170   /**
18171    * Checks if `value` is classified as an `Array` object.
18172    *
18173    * @static
18174    * @memberOf _
18175    * @since 0.1.0
18176    * @category Lang
18177    * @param {*} value The value to check.
18178    * @returns {boolean} Returns `true` if `value` is an array, else `false`.
18179    * @example
18180    *
18181    * _.isArray([1, 2, 3]);
18182    * // => true
18183    *
18184    * _.isArray(document.body.children);
18185    * // => false
18186    *
18187    * _.isArray('abc');
18188    * // => false
18189    *
18190    * _.isArray(_.noop);
18191    * // => false
18192    */
18193   var isArray = Array.isArray;
18194
18195   /**
18196    * This method returns `false`.
18197    *
18198    * @static
18199    * @memberOf _
18200    * @since 4.13.0
18201    * @category Util
18202    * @returns {boolean} Returns `false`.
18203    * @example
18204    *
18205    * _.times(2, _.stubFalse);
18206    * // => [false, false]
18207    */
18208   function stubFalse() {
18209     return false;
18210   }
18211
18212   /** Detect free variable `exports`. */
18213   var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
18214
18215   /** Detect free variable `module`. */
18216   var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
18217
18218   /** Detect the popular CommonJS extension `module.exports`. */
18219   var moduleExports = freeModule && freeModule.exports === freeExports;
18220
18221   /** Built-in value references. */
18222   var Buffer = moduleExports ? root$2.Buffer : undefined;
18223
18224   /* Built-in method references for those with the same name as other `lodash` methods. */
18225   var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
18226
18227   /**
18228    * Checks if `value` is a buffer.
18229    *
18230    * @static
18231    * @memberOf _
18232    * @since 4.3.0
18233    * @category Lang
18234    * @param {*} value The value to check.
18235    * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
18236    * @example
18237    *
18238    * _.isBuffer(new Buffer(2));
18239    * // => true
18240    *
18241    * _.isBuffer(new Uint8Array(2));
18242    * // => false
18243    */
18244   var isBuffer = nativeIsBuffer || stubFalse;
18245
18246   /** Used as references for various `Number` constants. */
18247   var MAX_SAFE_INTEGER = 9007199254740991;
18248
18249   /** Used to detect unsigned integer values. */
18250   var reIsUint = /^(?:0|[1-9]\d*)$/;
18251
18252   /**
18253    * Checks if `value` is a valid array-like index.
18254    *
18255    * @private
18256    * @param {*} value The value to check.
18257    * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
18258    * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
18259    */
18260   function isIndex(value, length) {
18261     var type = typeof value;
18262     length = length == null ? MAX_SAFE_INTEGER : length;
18263
18264     return !!length &&
18265       (type == 'number' ||
18266         (type != 'symbol' && reIsUint.test(value))) &&
18267           (value > -1 && value % 1 == 0 && value < length);
18268   }
18269
18270   /** Used as references for various `Number` constants. */
18271   var MAX_SAFE_INTEGER$1 = 9007199254740991;
18272
18273   /**
18274    * Checks if `value` is a valid array-like length.
18275    *
18276    * **Note:** This method is loosely based on
18277    * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
18278    *
18279    * @static
18280    * @memberOf _
18281    * @since 4.0.0
18282    * @category Lang
18283    * @param {*} value The value to check.
18284    * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
18285    * @example
18286    *
18287    * _.isLength(3);
18288    * // => true
18289    *
18290    * _.isLength(Number.MIN_VALUE);
18291    * // => false
18292    *
18293    * _.isLength(Infinity);
18294    * // => false
18295    *
18296    * _.isLength('3');
18297    * // => false
18298    */
18299   function isLength(value) {
18300     return typeof value == 'number' &&
18301       value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
18302   }
18303
18304   /** `Object#toString` result references. */
18305   var argsTag$1 = '[object Arguments]',
18306       arrayTag = '[object Array]',
18307       boolTag = '[object Boolean]',
18308       dateTag = '[object Date]',
18309       errorTag = '[object Error]',
18310       funcTag$1 = '[object Function]',
18311       mapTag = '[object Map]',
18312       numberTag = '[object Number]',
18313       objectTag = '[object Object]',
18314       regexpTag = '[object RegExp]',
18315       setTag = '[object Set]',
18316       stringTag = '[object String]',
18317       weakMapTag = '[object WeakMap]';
18318
18319   var arrayBufferTag = '[object ArrayBuffer]',
18320       dataViewTag = '[object DataView]',
18321       float32Tag = '[object Float32Array]',
18322       float64Tag = '[object Float64Array]',
18323       int8Tag = '[object Int8Array]',
18324       int16Tag = '[object Int16Array]',
18325       int32Tag = '[object Int32Array]',
18326       uint8Tag = '[object Uint8Array]',
18327       uint8ClampedTag = '[object Uint8ClampedArray]',
18328       uint16Tag = '[object Uint16Array]',
18329       uint32Tag = '[object Uint32Array]';
18330
18331   /** Used to identify `toStringTag` values of typed arrays. */
18332   var typedArrayTags = {};
18333   typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
18334   typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
18335   typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
18336   typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
18337   typedArrayTags[uint32Tag] = true;
18338   typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
18339   typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
18340   typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
18341   typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
18342   typedArrayTags[mapTag] = typedArrayTags[numberTag] =
18343   typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
18344   typedArrayTags[setTag] = typedArrayTags[stringTag] =
18345   typedArrayTags[weakMapTag] = false;
18346
18347   /**
18348    * The base implementation of `_.isTypedArray` without Node.js optimizations.
18349    *
18350    * @private
18351    * @param {*} value The value to check.
18352    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18353    */
18354   function baseIsTypedArray(value) {
18355     return isObjectLike(value) &&
18356       isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
18357   }
18358
18359   /**
18360    * The base implementation of `_.unary` without support for storing metadata.
18361    *
18362    * @private
18363    * @param {Function} func The function to cap arguments for.
18364    * @returns {Function} Returns the new capped function.
18365    */
18366   function baseUnary(func) {
18367     return function(value) {
18368       return func(value);
18369     };
18370   }
18371
18372   /** Detect free variable `exports`. */
18373   var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18374
18375   /** Detect free variable `module`. */
18376   var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18377
18378   /** Detect the popular CommonJS extension `module.exports`. */
18379   var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18380
18381   /** Detect free variable `process` from Node.js. */
18382   var freeProcess = moduleExports$1 && freeGlobal.process;
18383
18384   /** Used to access faster Node.js helpers. */
18385   var nodeUtil = (function() {
18386     try {
18387       // Use `util.types` for Node.js 10+.
18388       var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;
18389
18390       if (types) {
18391         return types;
18392       }
18393
18394       // Legacy `process.binding('util')` for Node.js < 10.
18395       return freeProcess && freeProcess.binding && freeProcess.binding('util');
18396     } catch (e) {}
18397   }());
18398
18399   /* Node.js helper references. */
18400   var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18401
18402   /**
18403    * Checks if `value` is classified as a typed array.
18404    *
18405    * @static
18406    * @memberOf _
18407    * @since 3.0.0
18408    * @category Lang
18409    * @param {*} value The value to check.
18410    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18411    * @example
18412    *
18413    * _.isTypedArray(new Uint8Array);
18414    * // => true
18415    *
18416    * _.isTypedArray([]);
18417    * // => false
18418    */
18419   var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18420
18421   /** Used for built-in method references. */
18422   var objectProto$7 = Object.prototype;
18423
18424   /** Used to check objects for own properties. */
18425   var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18426
18427   /**
18428    * Creates an array of the enumerable property names of the array-like `value`.
18429    *
18430    * @private
18431    * @param {*} value The value to query.
18432    * @param {boolean} inherited Specify returning inherited property names.
18433    * @returns {Array} Returns the array of property names.
18434    */
18435   function arrayLikeKeys(value, inherited) {
18436     var isArr = isArray(value),
18437         isArg = !isArr && isArguments(value),
18438         isBuff = !isArr && !isArg && isBuffer(value),
18439         isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18440         skipIndexes = isArr || isArg || isBuff || isType,
18441         result = skipIndexes ? baseTimes(value.length, String) : [],
18442         length = result.length;
18443
18444     for (var key in value) {
18445       if ((inherited || hasOwnProperty$6.call(value, key)) &&
18446           !(skipIndexes && (
18447              // Safari 9 has enumerable `arguments.length` in strict mode.
18448              key == 'length' ||
18449              // Node.js 0.10 has enumerable non-index properties on buffers.
18450              (isBuff && (key == 'offset' || key == 'parent')) ||
18451              // PhantomJS 2 has enumerable non-index properties on typed arrays.
18452              (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18453              // Skip index properties.
18454              isIndex(key, length)
18455           ))) {
18456         result.push(key);
18457       }
18458     }
18459     return result;
18460   }
18461
18462   /** Used for built-in method references. */
18463   var objectProto$8 = Object.prototype;
18464
18465   /**
18466    * Checks if `value` is likely a prototype object.
18467    *
18468    * @private
18469    * @param {*} value The value to check.
18470    * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18471    */
18472   function isPrototype(value) {
18473     var Ctor = value && value.constructor,
18474         proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18475
18476     return value === proto;
18477   }
18478
18479   /**
18480    * Creates a unary function that invokes `func` with its argument transformed.
18481    *
18482    * @private
18483    * @param {Function} func The function to wrap.
18484    * @param {Function} transform The argument transform.
18485    * @returns {Function} Returns the new function.
18486    */
18487   function overArg(func, transform) {
18488     return function(arg) {
18489       return func(transform(arg));
18490     };
18491   }
18492
18493   /* Built-in method references for those with the same name as other `lodash` methods. */
18494   var nativeKeys = overArg(Object.keys, Object);
18495
18496   /** Used for built-in method references. */
18497   var objectProto$9 = Object.prototype;
18498
18499   /** Used to check objects for own properties. */
18500   var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18501
18502   /**
18503    * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18504    *
18505    * @private
18506    * @param {Object} object The object to query.
18507    * @returns {Array} Returns the array of property names.
18508    */
18509   function baseKeys(object) {
18510     if (!isPrototype(object)) {
18511       return nativeKeys(object);
18512     }
18513     var result = [];
18514     for (var key in Object(object)) {
18515       if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18516         result.push(key);
18517       }
18518     }
18519     return result;
18520   }
18521
18522   /**
18523    * Checks if `value` is array-like. A value is considered array-like if it's
18524    * not a function and has a `value.length` that's an integer greater than or
18525    * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
18526    *
18527    * @static
18528    * @memberOf _
18529    * @since 4.0.0
18530    * @category Lang
18531    * @param {*} value The value to check.
18532    * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18533    * @example
18534    *
18535    * _.isArrayLike([1, 2, 3]);
18536    * // => true
18537    *
18538    * _.isArrayLike(document.body.children);
18539    * // => true
18540    *
18541    * _.isArrayLike('abc');
18542    * // => true
18543    *
18544    * _.isArrayLike(_.noop);
18545    * // => false
18546    */
18547   function isArrayLike(value) {
18548     return value != null && isLength(value.length) && !isFunction(value);
18549   }
18550
18551   /**
18552    * Creates an array of the own enumerable property names of `object`.
18553    *
18554    * **Note:** Non-object values are coerced to objects. See the
18555    * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18556    * for more details.
18557    *
18558    * @static
18559    * @since 0.1.0
18560    * @memberOf _
18561    * @category Object
18562    * @param {Object} object The object to query.
18563    * @returns {Array} Returns the array of property names.
18564    * @example
18565    *
18566    * function Foo() {
18567    *   this.a = 1;
18568    *   this.b = 2;
18569    * }
18570    *
18571    * Foo.prototype.c = 3;
18572    *
18573    * _.keys(new Foo);
18574    * // => ['a', 'b'] (iteration order is not guaranteed)
18575    *
18576    * _.keys('hi');
18577    * // => ['0', '1']
18578    */
18579   function keys$1(object) {
18580     return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18581   }
18582
18583   /**
18584    * The base implementation of `_.assign` without support for multiple sources
18585    * or `customizer` functions.
18586    *
18587    * @private
18588    * @param {Object} object The destination object.
18589    * @param {Object} source The source object.
18590    * @returns {Object} Returns `object`.
18591    */
18592   function baseAssign(object, source) {
18593     return object && copyObject(source, keys$1(source), object);
18594   }
18595
18596   /**
18597    * This function is like
18598    * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18599    * except that it includes inherited enumerable properties.
18600    *
18601    * @private
18602    * @param {Object} object The object to query.
18603    * @returns {Array} Returns the array of property names.
18604    */
18605   function nativeKeysIn(object) {
18606     var result = [];
18607     if (object != null) {
18608       for (var key in Object(object)) {
18609         result.push(key);
18610       }
18611     }
18612     return result;
18613   }
18614
18615   /** Used for built-in method references. */
18616   var objectProto$a = Object.prototype;
18617
18618   /** Used to check objects for own properties. */
18619   var hasOwnProperty$8 = objectProto$a.hasOwnProperty;
18620
18621   /**
18622    * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18623    *
18624    * @private
18625    * @param {Object} object The object to query.
18626    * @returns {Array} Returns the array of property names.
18627    */
18628   function baseKeysIn(object) {
18629     if (!isObject(object)) {
18630       return nativeKeysIn(object);
18631     }
18632     var isProto = isPrototype(object),
18633         result = [];
18634
18635     for (var key in object) {
18636       if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18637         result.push(key);
18638       }
18639     }
18640     return result;
18641   }
18642
18643   /**
18644    * Creates an array of the own and inherited enumerable property names of `object`.
18645    *
18646    * **Note:** Non-object values are coerced to objects.
18647    *
18648    * @static
18649    * @memberOf _
18650    * @since 3.0.0
18651    * @category Object
18652    * @param {Object} object The object to query.
18653    * @returns {Array} Returns the array of property names.
18654    * @example
18655    *
18656    * function Foo() {
18657    *   this.a = 1;
18658    *   this.b = 2;
18659    * }
18660    *
18661    * Foo.prototype.c = 3;
18662    *
18663    * _.keysIn(new Foo);
18664    * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18665    */
18666   function keysIn$1(object) {
18667     return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18668   }
18669
18670   /**
18671    * The base implementation of `_.assignIn` without support for multiple sources
18672    * or `customizer` functions.
18673    *
18674    * @private
18675    * @param {Object} object The destination object.
18676    * @param {Object} source The source object.
18677    * @returns {Object} Returns `object`.
18678    */
18679   function baseAssignIn(object, source) {
18680     return object && copyObject(source, keysIn$1(source), object);
18681   }
18682
18683   /** Detect free variable `exports`. */
18684   var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18685
18686   /** Detect free variable `module`. */
18687   var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18688
18689   /** Detect the popular CommonJS extension `module.exports`. */
18690   var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18691
18692   /** Built-in value references. */
18693   var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18694       allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18695
18696   /**
18697    * Creates a clone of  `buffer`.
18698    *
18699    * @private
18700    * @param {Buffer} buffer The buffer to clone.
18701    * @param {boolean} [isDeep] Specify a deep clone.
18702    * @returns {Buffer} Returns the cloned buffer.
18703    */
18704   function cloneBuffer(buffer, isDeep) {
18705     if (isDeep) {
18706       return buffer.slice();
18707     }
18708     var length = buffer.length,
18709         result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18710
18711     buffer.copy(result);
18712     return result;
18713   }
18714
18715   /**
18716    * Copies the values of `source` to `array`.
18717    *
18718    * @private
18719    * @param {Array} source The array to copy values from.
18720    * @param {Array} [array=[]] The array to copy values to.
18721    * @returns {Array} Returns `array`.
18722    */
18723   function copyArray(source, array) {
18724     var index = -1,
18725         length = source.length;
18726
18727     array || (array = Array(length));
18728     while (++index < length) {
18729       array[index] = source[index];
18730     }
18731     return array;
18732   }
18733
18734   /**
18735    * A specialized version of `_.filter` for arrays without support for
18736    * iteratee shorthands.
18737    *
18738    * @private
18739    * @param {Array} [array] The array to iterate over.
18740    * @param {Function} predicate The function invoked per iteration.
18741    * @returns {Array} Returns the new filtered array.
18742    */
18743   function arrayFilter(array, predicate) {
18744     var index = -1,
18745         length = array == null ? 0 : array.length,
18746         resIndex = 0,
18747         result = [];
18748
18749     while (++index < length) {
18750       var value = array[index];
18751       if (predicate(value, index, array)) {
18752         result[resIndex++] = value;
18753       }
18754     }
18755     return result;
18756   }
18757
18758   /**
18759    * This method returns a new empty array.
18760    *
18761    * @static
18762    * @memberOf _
18763    * @since 4.13.0
18764    * @category Util
18765    * @returns {Array} Returns the new empty array.
18766    * @example
18767    *
18768    * var arrays = _.times(2, _.stubArray);
18769    *
18770    * console.log(arrays);
18771    * // => [[], []]
18772    *
18773    * console.log(arrays[0] === arrays[1]);
18774    * // => false
18775    */
18776   function stubArray() {
18777     return [];
18778   }
18779
18780   /** Used for built-in method references. */
18781   var objectProto$b = Object.prototype;
18782
18783   /** Built-in value references. */
18784   var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable;
18785
18786   /* Built-in method references for those with the same name as other `lodash` methods. */
18787   var nativeGetSymbols = Object.getOwnPropertySymbols;
18788
18789   /**
18790    * Creates an array of the own enumerable symbols of `object`.
18791    *
18792    * @private
18793    * @param {Object} object The object to query.
18794    * @returns {Array} Returns the array of symbols.
18795    */
18796   var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18797     if (object == null) {
18798       return [];
18799     }
18800     object = Object(object);
18801     return arrayFilter(nativeGetSymbols(object), function(symbol) {
18802       return propertyIsEnumerable$1.call(object, symbol);
18803     });
18804   };
18805
18806   /**
18807    * Copies own symbols of `source` to `object`.
18808    *
18809    * @private
18810    * @param {Object} source The object to copy symbols from.
18811    * @param {Object} [object={}] The object to copy symbols to.
18812    * @returns {Object} Returns `object`.
18813    */
18814   function copySymbols(source, object) {
18815     return copyObject(source, getSymbols(source), object);
18816   }
18817
18818   /**
18819    * Appends the elements of `values` to `array`.
18820    *
18821    * @private
18822    * @param {Array} array The array to modify.
18823    * @param {Array} values The values to append.
18824    * @returns {Array} Returns `array`.
18825    */
18826   function arrayPush(array, values) {
18827     var index = -1,
18828         length = values.length,
18829         offset = array.length;
18830
18831     while (++index < length) {
18832       array[offset + index] = values[index];
18833     }
18834     return array;
18835   }
18836
18837   /** Built-in value references. */
18838   var getPrototype = overArg(Object.getPrototypeOf, Object);
18839
18840   /* Built-in method references for those with the same name as other `lodash` methods. */
18841   var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18842
18843   /**
18844    * Creates an array of the own and inherited enumerable symbols of `object`.
18845    *
18846    * @private
18847    * @param {Object} object The object to query.
18848    * @returns {Array} Returns the array of symbols.
18849    */
18850   var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18851     var result = [];
18852     while (object) {
18853       arrayPush(result, getSymbols(object));
18854       object = getPrototype(object);
18855     }
18856     return result;
18857   };
18858
18859   /**
18860    * Copies own and inherited symbols of `source` to `object`.
18861    *
18862    * @private
18863    * @param {Object} source The object to copy symbols from.
18864    * @param {Object} [object={}] The object to copy symbols to.
18865    * @returns {Object} Returns `object`.
18866    */
18867   function copySymbolsIn(source, object) {
18868     return copyObject(source, getSymbolsIn(source), object);
18869   }
18870
18871   /**
18872    * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
18873    * `keysFunc` and `symbolsFunc` to get the enumerable property names and
18874    * symbols of `object`.
18875    *
18876    * @private
18877    * @param {Object} object The object to query.
18878    * @param {Function} keysFunc The function to get the keys of `object`.
18879    * @param {Function} symbolsFunc The function to get the symbols of `object`.
18880    * @returns {Array} Returns the array of property names and symbols.
18881    */
18882   function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18883     var result = keysFunc(object);
18884     return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18885   }
18886
18887   /**
18888    * Creates an array of own enumerable property names and symbols of `object`.
18889    *
18890    * @private
18891    * @param {Object} object The object to query.
18892    * @returns {Array} Returns the array of property names and symbols.
18893    */
18894   function getAllKeys(object) {
18895     return baseGetAllKeys(object, keys$1, getSymbols);
18896   }
18897
18898   /**
18899    * Creates an array of own and inherited enumerable property names and
18900    * symbols of `object`.
18901    *
18902    * @private
18903    * @param {Object} object The object to query.
18904    * @returns {Array} Returns the array of property names and symbols.
18905    */
18906   function getAllKeysIn(object) {
18907     return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18908   }
18909
18910   /* Built-in method references that are verified to be native. */
18911   var DataView = getNative(root$2, 'DataView');
18912
18913   /* Built-in method references that are verified to be native. */
18914   var Promise = getNative(root$2, 'Promise');
18915
18916   /* Built-in method references that are verified to be native. */
18917   var Set$1 = getNative(root$2, 'Set');
18918
18919   /* Built-in method references that are verified to be native. */
18920   var WeakMap = getNative(root$2, 'WeakMap');
18921
18922   /** `Object#toString` result references. */
18923   var mapTag$1 = '[object Map]',
18924       objectTag$1 = '[object Object]',
18925       promiseTag = '[object Promise]',
18926       setTag$1 = '[object Set]',
18927       weakMapTag$1 = '[object WeakMap]';
18928
18929   var dataViewTag$1 = '[object DataView]';
18930
18931   /** Used to detect maps, sets, and weakmaps. */
18932   var dataViewCtorString = toSource(DataView),
18933       mapCtorString = toSource(Map$1),
18934       promiseCtorString = toSource(Promise),
18935       setCtorString = toSource(Set$1),
18936       weakMapCtorString = toSource(WeakMap);
18937
18938   /**
18939    * Gets the `toStringTag` of `value`.
18940    *
18941    * @private
18942    * @param {*} value The value to query.
18943    * @returns {string} Returns the `toStringTag`.
18944    */
18945   var getTag = baseGetTag;
18946
18947   // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
18948   if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
18949       (Map$1 && getTag(new Map$1) != mapTag$1) ||
18950       (Promise && getTag(Promise.resolve()) != promiseTag) ||
18951       (Set$1 && getTag(new Set$1) != setTag$1) ||
18952       (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
18953     getTag = function(value) {
18954       var result = baseGetTag(value),
18955           Ctor = result == objectTag$1 ? value.constructor : undefined,
18956           ctorString = Ctor ? toSource(Ctor) : '';
18957
18958       if (ctorString) {
18959         switch (ctorString) {
18960           case dataViewCtorString: return dataViewTag$1;
18961           case mapCtorString: return mapTag$1;
18962           case promiseCtorString: return promiseTag;
18963           case setCtorString: return setTag$1;
18964           case weakMapCtorString: return weakMapTag$1;
18965         }
18966       }
18967       return result;
18968     };
18969   }
18970
18971   var getTag$1 = getTag;
18972
18973   /** Used for built-in method references. */
18974   var objectProto$c = Object.prototype;
18975
18976   /** Used to check objects for own properties. */
18977   var hasOwnProperty$9 = objectProto$c.hasOwnProperty;
18978
18979   /**
18980    * Initializes an array clone.
18981    *
18982    * @private
18983    * @param {Array} array The array to clone.
18984    * @returns {Array} Returns the initialized clone.
18985    */
18986   function initCloneArray(array) {
18987     var length = array.length,
18988         result = new array.constructor(length);
18989
18990     // Add properties assigned by `RegExp#exec`.
18991     if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
18992       result.index = array.index;
18993       result.input = array.input;
18994     }
18995     return result;
18996   }
18997
18998   /** Built-in value references. */
18999   var Uint8Array$1 = root$2.Uint8Array;
19000
19001   /**
19002    * Creates a clone of `arrayBuffer`.
19003    *
19004    * @private
19005    * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
19006    * @returns {ArrayBuffer} Returns the cloned array buffer.
19007    */
19008   function cloneArrayBuffer(arrayBuffer) {
19009     var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19010     new Uint8Array$1(result).set(new Uint8Array$1(arrayBuffer));
19011     return result;
19012   }
19013
19014   /**
19015    * Creates a clone of `dataView`.
19016    *
19017    * @private
19018    * @param {Object} dataView The data view to clone.
19019    * @param {boolean} [isDeep] Specify a deep clone.
19020    * @returns {Object} Returns the cloned data view.
19021    */
19022   function cloneDataView(dataView, isDeep) {
19023     var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19024     return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19025   }
19026
19027   /** Used to match `RegExp` flags from their coerced string values. */
19028   var reFlags = /\w*$/;
19029
19030   /**
19031    * Creates a clone of `regexp`.
19032    *
19033    * @private
19034    * @param {Object} regexp The regexp to clone.
19035    * @returns {Object} Returns the cloned regexp.
19036    */
19037   function cloneRegExp(regexp) {
19038     var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19039     result.lastIndex = regexp.lastIndex;
19040     return result;
19041   }
19042
19043   /** Used to convert symbols to primitives and strings. */
19044   var symbolProto = Symbol ? Symbol.prototype : undefined,
19045       symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19046
19047   /**
19048    * Creates a clone of the `symbol` object.
19049    *
19050    * @private
19051    * @param {Object} symbol The symbol object to clone.
19052    * @returns {Object} Returns the cloned symbol object.
19053    */
19054   function cloneSymbol(symbol) {
19055     return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19056   }
19057
19058   /**
19059    * Creates a clone of `typedArray`.
19060    *
19061    * @private
19062    * @param {Object} typedArray The typed array to clone.
19063    * @param {boolean} [isDeep] Specify a deep clone.
19064    * @returns {Object} Returns the cloned typed array.
19065    */
19066   function cloneTypedArray(typedArray, isDeep) {
19067     var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19068     return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19069   }
19070
19071   /** `Object#toString` result references. */
19072   var boolTag$1 = '[object Boolean]',
19073       dateTag$1 = '[object Date]',
19074       mapTag$2 = '[object Map]',
19075       numberTag$1 = '[object Number]',
19076       regexpTag$1 = '[object RegExp]',
19077       setTag$2 = '[object Set]',
19078       stringTag$1 = '[object String]',
19079       symbolTag = '[object Symbol]';
19080
19081   var arrayBufferTag$1 = '[object ArrayBuffer]',
19082       dataViewTag$2 = '[object DataView]',
19083       float32Tag$1 = '[object Float32Array]',
19084       float64Tag$1 = '[object Float64Array]',
19085       int8Tag$1 = '[object Int8Array]',
19086       int16Tag$1 = '[object Int16Array]',
19087       int32Tag$1 = '[object Int32Array]',
19088       uint8Tag$1 = '[object Uint8Array]',
19089       uint8ClampedTag$1 = '[object Uint8ClampedArray]',
19090       uint16Tag$1 = '[object Uint16Array]',
19091       uint32Tag$1 = '[object Uint32Array]';
19092
19093   /**
19094    * Initializes an object clone based on its `toStringTag`.
19095    *
19096    * **Note:** This function only supports cloning values with tags of
19097    * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19098    *
19099    * @private
19100    * @param {Object} object The object to clone.
19101    * @param {string} tag The `toStringTag` of the object to clone.
19102    * @param {boolean} [isDeep] Specify a deep clone.
19103    * @returns {Object} Returns the initialized clone.
19104    */
19105   function initCloneByTag(object, tag, isDeep) {
19106     var Ctor = object.constructor;
19107     switch (tag) {
19108       case arrayBufferTag$1:
19109         return cloneArrayBuffer(object);
19110
19111       case boolTag$1:
19112       case dateTag$1:
19113         return new Ctor(+object);
19114
19115       case dataViewTag$2:
19116         return cloneDataView(object, isDeep);
19117
19118       case float32Tag$1: case float64Tag$1:
19119       case int8Tag$1: case int16Tag$1: case int32Tag$1:
19120       case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
19121         return cloneTypedArray(object, isDeep);
19122
19123       case mapTag$2:
19124         return new Ctor;
19125
19126       case numberTag$1:
19127       case stringTag$1:
19128         return new Ctor(object);
19129
19130       case regexpTag$1:
19131         return cloneRegExp(object);
19132
19133       case setTag$2:
19134         return new Ctor;
19135
19136       case symbolTag:
19137         return cloneSymbol(object);
19138     }
19139   }
19140
19141   /** Built-in value references. */
19142   var objectCreate = Object.create;
19143
19144   /**
19145    * The base implementation of `_.create` without support for assigning
19146    * properties to the created object.
19147    *
19148    * @private
19149    * @param {Object} proto The object to inherit from.
19150    * @returns {Object} Returns the new object.
19151    */
19152   var baseCreate = (function() {
19153     function object() {}
19154     return function(proto) {
19155       if (!isObject(proto)) {
19156         return {};
19157       }
19158       if (objectCreate) {
19159         return objectCreate(proto);
19160       }
19161       object.prototype = proto;
19162       var result = new object;
19163       object.prototype = undefined;
19164       return result;
19165     };
19166   }());
19167
19168   /**
19169    * Initializes an object clone.
19170    *
19171    * @private
19172    * @param {Object} object The object to clone.
19173    * @returns {Object} Returns the initialized clone.
19174    */
19175   function initCloneObject(object) {
19176     return (typeof object.constructor == 'function' && !isPrototype(object))
19177       ? baseCreate(getPrototype(object))
19178       : {};
19179   }
19180
19181   /** `Object#toString` result references. */
19182   var mapTag$3 = '[object Map]';
19183
19184   /**
19185    * The base implementation of `_.isMap` without Node.js optimizations.
19186    *
19187    * @private
19188    * @param {*} value The value to check.
19189    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19190    */
19191   function baseIsMap(value) {
19192     return isObjectLike(value) && getTag$1(value) == mapTag$3;
19193   }
19194
19195   /* Node.js helper references. */
19196   var nodeIsMap = nodeUtil && nodeUtil.isMap;
19197
19198   /**
19199    * Checks if `value` is classified as a `Map` object.
19200    *
19201    * @static
19202    * @memberOf _
19203    * @since 4.3.0
19204    * @category Lang
19205    * @param {*} value The value to check.
19206    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19207    * @example
19208    *
19209    * _.isMap(new Map);
19210    * // => true
19211    *
19212    * _.isMap(new WeakMap);
19213    * // => false
19214    */
19215   var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19216
19217   /** `Object#toString` result references. */
19218   var setTag$3 = '[object Set]';
19219
19220   /**
19221    * The base implementation of `_.isSet` without Node.js optimizations.
19222    *
19223    * @private
19224    * @param {*} value The value to check.
19225    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19226    */
19227   function baseIsSet(value) {
19228     return isObjectLike(value) && getTag$1(value) == setTag$3;
19229   }
19230
19231   /* Node.js helper references. */
19232   var nodeIsSet = nodeUtil && nodeUtil.isSet;
19233
19234   /**
19235    * Checks if `value` is classified as a `Set` object.
19236    *
19237    * @static
19238    * @memberOf _
19239    * @since 4.3.0
19240    * @category Lang
19241    * @param {*} value The value to check.
19242    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19243    * @example
19244    *
19245    * _.isSet(new Set);
19246    * // => true
19247    *
19248    * _.isSet(new WeakSet);
19249    * // => false
19250    */
19251   var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19252
19253   /** Used to compose bitmasks for cloning. */
19254   var CLONE_DEEP_FLAG = 1,
19255       CLONE_FLAT_FLAG = 2,
19256       CLONE_SYMBOLS_FLAG = 4;
19257
19258   /** `Object#toString` result references. */
19259   var argsTag$2 = '[object Arguments]',
19260       arrayTag$1 = '[object Array]',
19261       boolTag$2 = '[object Boolean]',
19262       dateTag$2 = '[object Date]',
19263       errorTag$1 = '[object Error]',
19264       funcTag$2 = '[object Function]',
19265       genTag$1 = '[object GeneratorFunction]',
19266       mapTag$4 = '[object Map]',
19267       numberTag$2 = '[object Number]',
19268       objectTag$2 = '[object Object]',
19269       regexpTag$2 = '[object RegExp]',
19270       setTag$4 = '[object Set]',
19271       stringTag$2 = '[object String]',
19272       symbolTag$1 = '[object Symbol]',
19273       weakMapTag$2 = '[object WeakMap]';
19274
19275   var arrayBufferTag$2 = '[object ArrayBuffer]',
19276       dataViewTag$3 = '[object DataView]',
19277       float32Tag$2 = '[object Float32Array]',
19278       float64Tag$2 = '[object Float64Array]',
19279       int8Tag$2 = '[object Int8Array]',
19280       int16Tag$2 = '[object Int16Array]',
19281       int32Tag$2 = '[object Int32Array]',
19282       uint8Tag$2 = '[object Uint8Array]',
19283       uint8ClampedTag$2 = '[object Uint8ClampedArray]',
19284       uint16Tag$2 = '[object Uint16Array]',
19285       uint32Tag$2 = '[object Uint32Array]';
19286
19287   /** Used to identify `toStringTag` values supported by `_.clone`. */
19288   var cloneableTags = {};
19289   cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
19290   cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
19291   cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
19292   cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
19293   cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
19294   cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] =
19295   cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
19296   cloneableTags[regexpTag$2] = cloneableTags[setTag$4] =
19297   cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
19298   cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
19299   cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
19300   cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
19301   cloneableTags[weakMapTag$2] = false;
19302
19303   /**
19304    * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19305    * traversed objects.
19306    *
19307    * @private
19308    * @param {*} value The value to clone.
19309    * @param {boolean} bitmask The bitmask flags.
19310    *  1 - Deep clone
19311    *  2 - Flatten inherited properties
19312    *  4 - Clone symbols
19313    * @param {Function} [customizer] The function to customize cloning.
19314    * @param {string} [key] The key of `value`.
19315    * @param {Object} [object] The parent object of `value`.
19316    * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
19317    * @returns {*} Returns the cloned value.
19318    */
19319   function baseClone(value, bitmask, customizer, key, object, stack) {
19320     var result,
19321         isDeep = bitmask & CLONE_DEEP_FLAG,
19322         isFlat = bitmask & CLONE_FLAT_FLAG,
19323         isFull = bitmask & CLONE_SYMBOLS_FLAG;
19324
19325     if (customizer) {
19326       result = object ? customizer(value, key, object, stack) : customizer(value);
19327     }
19328     if (result !== undefined) {
19329       return result;
19330     }
19331     if (!isObject(value)) {
19332       return value;
19333     }
19334     var isArr = isArray(value);
19335     if (isArr) {
19336       result = initCloneArray(value);
19337       if (!isDeep) {
19338         return copyArray(value, result);
19339       }
19340     } else {
19341       var tag = getTag$1(value),
19342           isFunc = tag == funcTag$2 || tag == genTag$1;
19343
19344       if (isBuffer(value)) {
19345         return cloneBuffer(value, isDeep);
19346       }
19347       if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19348         result = (isFlat || isFunc) ? {} : initCloneObject(value);
19349         if (!isDeep) {
19350           return isFlat
19351             ? copySymbolsIn(value, baseAssignIn(result, value))
19352             : copySymbols(value, baseAssign(result, value));
19353         }
19354       } else {
19355         if (!cloneableTags[tag]) {
19356           return object ? value : {};
19357         }
19358         result = initCloneByTag(value, tag, isDeep);
19359       }
19360     }
19361     // Check for circular references and return its corresponding clone.
19362     stack || (stack = new Stack);
19363     var stacked = stack.get(value);
19364     if (stacked) {
19365       return stacked;
19366     }
19367     stack.set(value, result);
19368
19369     if (isSet(value)) {
19370       value.forEach(function(subValue) {
19371         result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19372       });
19373
19374       return result;
19375     }
19376
19377     if (isMap(value)) {
19378       value.forEach(function(subValue, key) {
19379         result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19380       });
19381
19382       return result;
19383     }
19384
19385     var keysFunc = isFull
19386       ? (isFlat ? getAllKeysIn : getAllKeys)
19387       : (isFlat ? keysIn : keys$1);
19388
19389     var props = isArr ? undefined : keysFunc(value);
19390     arrayEach(props || value, function(subValue, key) {
19391       if (props) {
19392         key = subValue;
19393         subValue = value[key];
19394       }
19395       // Recursively populate clone (susceptible to call stack limits).
19396       assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19397     });
19398     return result;
19399   }
19400
19401   /** Used to compose bitmasks for cloning. */
19402   var CLONE_SYMBOLS_FLAG$1 = 4;
19403
19404   /**
19405    * Creates a shallow clone of `value`.
19406    *
19407    * **Note:** This method is loosely based on the
19408    * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
19409    * and supports cloning arrays, array buffers, booleans, date objects, maps,
19410    * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
19411    * arrays. The own enumerable properties of `arguments` objects are cloned
19412    * as plain objects. An empty object is returned for uncloneable values such
19413    * as error objects, functions, DOM nodes, and WeakMaps.
19414    *
19415    * @static
19416    * @memberOf _
19417    * @since 0.1.0
19418    * @category Lang
19419    * @param {*} value The value to clone.
19420    * @returns {*} Returns the cloned value.
19421    * @see _.cloneDeep
19422    * @example
19423    *
19424    * var objects = [{ 'a': 1 }, { 'b': 2 }];
19425    *
19426    * var shallow = _.clone(objects);
19427    * console.log(shallow[0] === objects[0]);
19428    * // => true
19429    */
19430   function clone(value) {
19431     return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19432   }
19433
19434   /**
19435    * A specialized version of `baseAggregator` for arrays.
19436    *
19437    * @private
19438    * @param {Array} [array] The array to iterate over.
19439    * @param {Function} setter The function to set `accumulator` values.
19440    * @param {Function} iteratee The iteratee to transform keys.
19441    * @param {Object} accumulator The initial aggregated object.
19442    * @returns {Function} Returns `accumulator`.
19443    */
19444   function arrayAggregator(array, setter, iteratee, accumulator) {
19445     var index = -1,
19446         length = array == null ? 0 : array.length;
19447
19448     while (++index < length) {
19449       var value = array[index];
19450       setter(accumulator, value, iteratee(value), array);
19451     }
19452     return accumulator;
19453   }
19454
19455   /**
19456    * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19457    *
19458    * @private
19459    * @param {boolean} [fromRight] Specify iterating from right to left.
19460    * @returns {Function} Returns the new base function.
19461    */
19462   function createBaseFor(fromRight) {
19463     return function(object, iteratee, keysFunc) {
19464       var index = -1,
19465           iterable = Object(object),
19466           props = keysFunc(object),
19467           length = props.length;
19468
19469       while (length--) {
19470         var key = props[fromRight ? length : ++index];
19471         if (iteratee(iterable[key], key, iterable) === false) {
19472           break;
19473         }
19474       }
19475       return object;
19476     };
19477   }
19478
19479   /**
19480    * The base implementation of `baseForOwn` which iterates over `object`
19481    * properties returned by `keysFunc` and invokes `iteratee` for each property.
19482    * Iteratee functions may exit iteration early by explicitly returning `false`.
19483    *
19484    * @private
19485    * @param {Object} object The object to iterate over.
19486    * @param {Function} iteratee The function invoked per iteration.
19487    * @param {Function} keysFunc The function to get the keys of `object`.
19488    * @returns {Object} Returns `object`.
19489    */
19490   var baseFor = createBaseFor();
19491
19492   /**
19493    * The base implementation of `_.forOwn` without support for iteratee shorthands.
19494    *
19495    * @private
19496    * @param {Object} object The object to iterate over.
19497    * @param {Function} iteratee The function invoked per iteration.
19498    * @returns {Object} Returns `object`.
19499    */
19500   function baseForOwn(object, iteratee) {
19501     return object && baseFor(object, iteratee, keys$1);
19502   }
19503
19504   /**
19505    * Creates a `baseEach` or `baseEachRight` function.
19506    *
19507    * @private
19508    * @param {Function} eachFunc The function to iterate over a collection.
19509    * @param {boolean} [fromRight] Specify iterating from right to left.
19510    * @returns {Function} Returns the new base function.
19511    */
19512   function createBaseEach(eachFunc, fromRight) {
19513     return function(collection, iteratee) {
19514       if (collection == null) {
19515         return collection;
19516       }
19517       if (!isArrayLike(collection)) {
19518         return eachFunc(collection, iteratee);
19519       }
19520       var length = collection.length,
19521           index = fromRight ? length : -1,
19522           iterable = Object(collection);
19523
19524       while ((fromRight ? index-- : ++index < length)) {
19525         if (iteratee(iterable[index], index, iterable) === false) {
19526           break;
19527         }
19528       }
19529       return collection;
19530     };
19531   }
19532
19533   /**
19534    * The base implementation of `_.forEach` without support for iteratee shorthands.
19535    *
19536    * @private
19537    * @param {Array|Object} collection The collection to iterate over.
19538    * @param {Function} iteratee The function invoked per iteration.
19539    * @returns {Array|Object} Returns `collection`.
19540    */
19541   var baseEach = createBaseEach(baseForOwn);
19542
19543   /**
19544    * Aggregates elements of `collection` on `accumulator` with keys transformed
19545    * by `iteratee` and values set by `setter`.
19546    *
19547    * @private
19548    * @param {Array|Object} collection The collection to iterate over.
19549    * @param {Function} setter The function to set `accumulator` values.
19550    * @param {Function} iteratee The iteratee to transform keys.
19551    * @param {Object} accumulator The initial aggregated object.
19552    * @returns {Function} Returns `accumulator`.
19553    */
19554   function baseAggregator(collection, setter, iteratee, accumulator) {
19555     baseEach(collection, function(value, key, collection) {
19556       setter(accumulator, value, iteratee(value), collection);
19557     });
19558     return accumulator;
19559   }
19560
19561   /** Used to stand-in for `undefined` hash values. */
19562   var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19563
19564   /**
19565    * Adds `value` to the array cache.
19566    *
19567    * @private
19568    * @name add
19569    * @memberOf SetCache
19570    * @alias push
19571    * @param {*} value The value to cache.
19572    * @returns {Object} Returns the cache instance.
19573    */
19574   function setCacheAdd(value) {
19575     this.__data__.set(value, HASH_UNDEFINED$2);
19576     return this;
19577   }
19578
19579   /**
19580    * Checks if `value` is in the array cache.
19581    *
19582    * @private
19583    * @name has
19584    * @memberOf SetCache
19585    * @param {*} value The value to search for.
19586    * @returns {number} Returns `true` if `value` is found, else `false`.
19587    */
19588   function setCacheHas(value) {
19589     return this.__data__.has(value);
19590   }
19591
19592   /**
19593    *
19594    * Creates an array cache object to store unique values.
19595    *
19596    * @private
19597    * @constructor
19598    * @param {Array} [values] The values to cache.
19599    */
19600   function SetCache(values) {
19601     var index = -1,
19602         length = values == null ? 0 : values.length;
19603
19604     this.__data__ = new MapCache;
19605     while (++index < length) {
19606       this.add(values[index]);
19607     }
19608   }
19609
19610   // Add methods to `SetCache`.
19611   SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19612   SetCache.prototype.has = setCacheHas;
19613
19614   /**
19615    * A specialized version of `_.some` for arrays without support for iteratee
19616    * shorthands.
19617    *
19618    * @private
19619    * @param {Array} [array] The array to iterate over.
19620    * @param {Function} predicate The function invoked per iteration.
19621    * @returns {boolean} Returns `true` if any element passes the predicate check,
19622    *  else `false`.
19623    */
19624   function arraySome(array, predicate) {
19625     var index = -1,
19626         length = array == null ? 0 : array.length;
19627
19628     while (++index < length) {
19629       if (predicate(array[index], index, array)) {
19630         return true;
19631       }
19632     }
19633     return false;
19634   }
19635
19636   /**
19637    * Checks if a `cache` value for `key` exists.
19638    *
19639    * @private
19640    * @param {Object} cache The cache to query.
19641    * @param {string} key The key of the entry to check.
19642    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19643    */
19644   function cacheHas(cache, key) {
19645     return cache.has(key);
19646   }
19647
19648   /** Used to compose bitmasks for value comparisons. */
19649   var COMPARE_PARTIAL_FLAG = 1,
19650       COMPARE_UNORDERED_FLAG = 2;
19651
19652   /**
19653    * A specialized version of `baseIsEqualDeep` for arrays with support for
19654    * partial deep comparisons.
19655    *
19656    * @private
19657    * @param {Array} array The array to compare.
19658    * @param {Array} other The other array to compare.
19659    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19660    * @param {Function} customizer The function to customize comparisons.
19661    * @param {Function} equalFunc The function to determine equivalents of values.
19662    * @param {Object} stack Tracks traversed `array` and `other` objects.
19663    * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19664    */
19665   function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19666     var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19667         arrLength = array.length,
19668         othLength = other.length;
19669
19670     if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19671       return false;
19672     }
19673     // Assume cyclic values are equal.
19674     var stacked = stack.get(array);
19675     if (stacked && stack.get(other)) {
19676       return stacked == other;
19677     }
19678     var index = -1,
19679         result = true,
19680         seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19681
19682     stack.set(array, other);
19683     stack.set(other, array);
19684
19685     // Ignore non-index properties.
19686     while (++index < arrLength) {
19687       var arrValue = array[index],
19688           othValue = other[index];
19689
19690       if (customizer) {
19691         var compared = isPartial
19692           ? customizer(othValue, arrValue, index, other, array, stack)
19693           : customizer(arrValue, othValue, index, array, other, stack);
19694       }
19695       if (compared !== undefined) {
19696         if (compared) {
19697           continue;
19698         }
19699         result = false;
19700         break;
19701       }
19702       // Recursively compare arrays (susceptible to call stack limits).
19703       if (seen) {
19704         if (!arraySome(other, function(othValue, othIndex) {
19705               if (!cacheHas(seen, othIndex) &&
19706                   (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19707                 return seen.push(othIndex);
19708               }
19709             })) {
19710           result = false;
19711           break;
19712         }
19713       } else if (!(
19714             arrValue === othValue ||
19715               equalFunc(arrValue, othValue, bitmask, customizer, stack)
19716           )) {
19717         result = false;
19718         break;
19719       }
19720     }
19721     stack['delete'](array);
19722     stack['delete'](other);
19723     return result;
19724   }
19725
19726   /**
19727    * Converts `map` to its key-value pairs.
19728    *
19729    * @private
19730    * @param {Object} map The map to convert.
19731    * @returns {Array} Returns the key-value pairs.
19732    */
19733   function mapToArray(map) {
19734     var index = -1,
19735         result = Array(map.size);
19736
19737     map.forEach(function(value, key) {
19738       result[++index] = [key, value];
19739     });
19740     return result;
19741   }
19742
19743   /**
19744    * Converts `set` to an array of its values.
19745    *
19746    * @private
19747    * @param {Object} set The set to convert.
19748    * @returns {Array} Returns the values.
19749    */
19750   function setToArray(set) {
19751     var index = -1,
19752         result = Array(set.size);
19753
19754     set.forEach(function(value) {
19755       result[++index] = value;
19756     });
19757     return result;
19758   }
19759
19760   /** Used to compose bitmasks for value comparisons. */
19761   var COMPARE_PARTIAL_FLAG$1 = 1,
19762       COMPARE_UNORDERED_FLAG$1 = 2;
19763
19764   /** `Object#toString` result references. */
19765   var boolTag$3 = '[object Boolean]',
19766       dateTag$3 = '[object Date]',
19767       errorTag$2 = '[object Error]',
19768       mapTag$5 = '[object Map]',
19769       numberTag$3 = '[object Number]',
19770       regexpTag$3 = '[object RegExp]',
19771       setTag$5 = '[object Set]',
19772       stringTag$3 = '[object String]',
19773       symbolTag$2 = '[object Symbol]';
19774
19775   var arrayBufferTag$3 = '[object ArrayBuffer]',
19776       dataViewTag$4 = '[object DataView]';
19777
19778   /** Used to convert symbols to primitives and strings. */
19779   var symbolProto$1 = Symbol ? Symbol.prototype : undefined,
19780       symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
19781
19782   /**
19783    * A specialized version of `baseIsEqualDeep` for comparing objects of
19784    * the same `toStringTag`.
19785    *
19786    * **Note:** This function only supports comparing values with tags of
19787    * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19788    *
19789    * @private
19790    * @param {Object} object The object to compare.
19791    * @param {Object} other The other object to compare.
19792    * @param {string} tag The `toStringTag` of the objects to compare.
19793    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19794    * @param {Function} customizer The function to customize comparisons.
19795    * @param {Function} equalFunc The function to determine equivalents of values.
19796    * @param {Object} stack Tracks traversed `object` and `other` objects.
19797    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19798    */
19799   function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19800     switch (tag) {
19801       case dataViewTag$4:
19802         if ((object.byteLength != other.byteLength) ||
19803             (object.byteOffset != other.byteOffset)) {
19804           return false;
19805         }
19806         object = object.buffer;
19807         other = other.buffer;
19808
19809       case arrayBufferTag$3:
19810         if ((object.byteLength != other.byteLength) ||
19811             !equalFunc(new Uint8Array$1(object), new Uint8Array$1(other))) {
19812           return false;
19813         }
19814         return true;
19815
19816       case boolTag$3:
19817       case dateTag$3:
19818       case numberTag$3:
19819         // Coerce booleans to `1` or `0` and dates to milliseconds.
19820         // Invalid dates are coerced to `NaN`.
19821         return eq(+object, +other);
19822
19823       case errorTag$2:
19824         return object.name == other.name && object.message == other.message;
19825
19826       case regexpTag$3:
19827       case stringTag$3:
19828         // Coerce regexes to strings and treat strings, primitives and objects,
19829         // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19830         // for more details.
19831         return object == (other + '');
19832
19833       case mapTag$5:
19834         var convert = mapToArray;
19835
19836       case setTag$5:
19837         var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19838         convert || (convert = setToArray);
19839
19840         if (object.size != other.size && !isPartial) {
19841           return false;
19842         }
19843         // Assume cyclic values are equal.
19844         var stacked = stack.get(object);
19845         if (stacked) {
19846           return stacked == other;
19847         }
19848         bitmask |= COMPARE_UNORDERED_FLAG$1;
19849
19850         // Recursively compare objects (susceptible to call stack limits).
19851         stack.set(object, other);
19852         var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19853         stack['delete'](object);
19854         return result;
19855
19856       case symbolTag$2:
19857         if (symbolValueOf$1) {
19858           return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19859         }
19860     }
19861     return false;
19862   }
19863
19864   /** Used to compose bitmasks for value comparisons. */
19865   var COMPARE_PARTIAL_FLAG$2 = 1;
19866
19867   /** Used for built-in method references. */
19868   var objectProto$d = Object.prototype;
19869
19870   /** Used to check objects for own properties. */
19871   var hasOwnProperty$a = objectProto$d.hasOwnProperty;
19872
19873   /**
19874    * A specialized version of `baseIsEqualDeep` for objects with support for
19875    * partial deep comparisons.
19876    *
19877    * @private
19878    * @param {Object} object The object to compare.
19879    * @param {Object} other The other object to compare.
19880    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19881    * @param {Function} customizer The function to customize comparisons.
19882    * @param {Function} equalFunc The function to determine equivalents of values.
19883    * @param {Object} stack Tracks traversed `object` and `other` objects.
19884    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19885    */
19886   function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19887     var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19888         objProps = getAllKeys(object),
19889         objLength = objProps.length,
19890         othProps = getAllKeys(other),
19891         othLength = othProps.length;
19892
19893     if (objLength != othLength && !isPartial) {
19894       return false;
19895     }
19896     var index = objLength;
19897     while (index--) {
19898       var key = objProps[index];
19899       if (!(isPartial ? key in other : hasOwnProperty$a.call(other, key))) {
19900         return false;
19901       }
19902     }
19903     // Assume cyclic values are equal.
19904     var stacked = stack.get(object);
19905     if (stacked && stack.get(other)) {
19906       return stacked == other;
19907     }
19908     var result = true;
19909     stack.set(object, other);
19910     stack.set(other, object);
19911
19912     var skipCtor = isPartial;
19913     while (++index < objLength) {
19914       key = objProps[index];
19915       var objValue = object[key],
19916           othValue = other[key];
19917
19918       if (customizer) {
19919         var compared = isPartial
19920           ? customizer(othValue, objValue, key, other, object, stack)
19921           : customizer(objValue, othValue, key, object, other, stack);
19922       }
19923       // Recursively compare objects (susceptible to call stack limits).
19924       if (!(compared === undefined
19925             ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19926             : compared
19927           )) {
19928         result = false;
19929         break;
19930       }
19931       skipCtor || (skipCtor = key == 'constructor');
19932     }
19933     if (result && !skipCtor) {
19934       var objCtor = object.constructor,
19935           othCtor = other.constructor;
19936
19937       // Non `Object` object instances with different constructors are not equal.
19938       if (objCtor != othCtor &&
19939           ('constructor' in object && 'constructor' in other) &&
19940           !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19941             typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19942         result = false;
19943       }
19944     }
19945     stack['delete'](object);
19946     stack['delete'](other);
19947     return result;
19948   }
19949
19950   /** Used to compose bitmasks for value comparisons. */
19951   var COMPARE_PARTIAL_FLAG$3 = 1;
19952
19953   /** `Object#toString` result references. */
19954   var argsTag$3 = '[object Arguments]',
19955       arrayTag$2 = '[object Array]',
19956       objectTag$3 = '[object Object]';
19957
19958   /** Used for built-in method references. */
19959   var objectProto$e = Object.prototype;
19960
19961   /** Used to check objects for own properties. */
19962   var hasOwnProperty$b = objectProto$e.hasOwnProperty;
19963
19964   /**
19965    * A specialized version of `baseIsEqual` for arrays and objects which performs
19966    * deep comparisons and tracks traversed objects enabling objects with circular
19967    * references to be compared.
19968    *
19969    * @private
19970    * @param {Object} object The object to compare.
19971    * @param {Object} other The other object to compare.
19972    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19973    * @param {Function} customizer The function to customize comparisons.
19974    * @param {Function} equalFunc The function to determine equivalents of values.
19975    * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19976    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19977    */
19978   function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19979     var objIsArr = isArray(object),
19980         othIsArr = isArray(other),
19981         objTag = objIsArr ? arrayTag$2 : getTag$1(object),
19982         othTag = othIsArr ? arrayTag$2 : getTag$1(other);
19983
19984     objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19985     othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19986
19987     var objIsObj = objTag == objectTag$3,
19988         othIsObj = othTag == objectTag$3,
19989         isSameTag = objTag == othTag;
19990
19991     if (isSameTag && isBuffer(object)) {
19992       if (!isBuffer(other)) {
19993         return false;
19994       }
19995       objIsArr = true;
19996       objIsObj = false;
19997     }
19998     if (isSameTag && !objIsObj) {
19999       stack || (stack = new Stack);
20000       return (objIsArr || isTypedArray(object))
20001         ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
20002         : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
20003     }
20004     if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
20005       var objIsWrapped = objIsObj && hasOwnProperty$b.call(object, '__wrapped__'),
20006           othIsWrapped = othIsObj && hasOwnProperty$b.call(other, '__wrapped__');
20007
20008       if (objIsWrapped || othIsWrapped) {
20009         var objUnwrapped = objIsWrapped ? object.value() : object,
20010             othUnwrapped = othIsWrapped ? other.value() : other;
20011
20012         stack || (stack = new Stack);
20013         return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20014       }
20015     }
20016     if (!isSameTag) {
20017       return false;
20018     }
20019     stack || (stack = new Stack);
20020     return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20021   }
20022
20023   /**
20024    * The base implementation of `_.isEqual` which supports partial comparisons
20025    * and tracks traversed objects.
20026    *
20027    * @private
20028    * @param {*} value The value to compare.
20029    * @param {*} other The other value to compare.
20030    * @param {boolean} bitmask The bitmask flags.
20031    *  1 - Unordered comparison
20032    *  2 - Partial comparison
20033    * @param {Function} [customizer] The function to customize comparisons.
20034    * @param {Object} [stack] Tracks traversed `value` and `other` objects.
20035    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
20036    */
20037   function baseIsEqual(value, other, bitmask, customizer, stack) {
20038     if (value === other) {
20039       return true;
20040     }
20041     if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20042       return value !== value && other !== other;
20043     }
20044     return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20045   }
20046
20047   /** Used to compose bitmasks for value comparisons. */
20048   var COMPARE_PARTIAL_FLAG$4 = 1,
20049       COMPARE_UNORDERED_FLAG$2 = 2;
20050
20051   /**
20052    * The base implementation of `_.isMatch` without support for iteratee shorthands.
20053    *
20054    * @private
20055    * @param {Object} object The object to inspect.
20056    * @param {Object} source The object of property values to match.
20057    * @param {Array} matchData The property names, values, and compare flags to match.
20058    * @param {Function} [customizer] The function to customize comparisons.
20059    * @returns {boolean} Returns `true` if `object` is a match, else `false`.
20060    */
20061   function baseIsMatch(object, source, matchData, customizer) {
20062     var index = matchData.length,
20063         length = index,
20064         noCustomizer = !customizer;
20065
20066     if (object == null) {
20067       return !length;
20068     }
20069     object = Object(object);
20070     while (index--) {
20071       var data = matchData[index];
20072       if ((noCustomizer && data[2])
20073             ? data[1] !== object[data[0]]
20074             : !(data[0] in object)
20075           ) {
20076         return false;
20077       }
20078     }
20079     while (++index < length) {
20080       data = matchData[index];
20081       var key = data[0],
20082           objValue = object[key],
20083           srcValue = data[1];
20084
20085       if (noCustomizer && data[2]) {
20086         if (objValue === undefined && !(key in object)) {
20087           return false;
20088         }
20089       } else {
20090         var stack = new Stack;
20091         if (customizer) {
20092           var result = customizer(objValue, srcValue, key, object, source, stack);
20093         }
20094         if (!(result === undefined
20095               ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20096               : result
20097             )) {
20098           return false;
20099         }
20100       }
20101     }
20102     return true;
20103   }
20104
20105   /**
20106    * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20107    *
20108    * @private
20109    * @param {*} value The value to check.
20110    * @returns {boolean} Returns `true` if `value` if suitable for strict
20111    *  equality comparisons, else `false`.
20112    */
20113   function isStrictComparable(value) {
20114     return value === value && !isObject(value);
20115   }
20116
20117   /**
20118    * Gets the property names, values, and compare flags of `object`.
20119    *
20120    * @private
20121    * @param {Object} object The object to query.
20122    * @returns {Array} Returns the match data of `object`.
20123    */
20124   function getMatchData(object) {
20125     var result = keys$1(object),
20126         length = result.length;
20127
20128     while (length--) {
20129       var key = result[length],
20130           value = object[key];
20131
20132       result[length] = [key, value, isStrictComparable(value)];
20133     }
20134     return result;
20135   }
20136
20137   /**
20138    * A specialized version of `matchesProperty` for source values suitable
20139    * for strict equality comparisons, i.e. `===`.
20140    *
20141    * @private
20142    * @param {string} key The key of the property to get.
20143    * @param {*} srcValue The value to match.
20144    * @returns {Function} Returns the new spec function.
20145    */
20146   function matchesStrictComparable(key, srcValue) {
20147     return function(object) {
20148       if (object == null) {
20149         return false;
20150       }
20151       return object[key] === srcValue &&
20152         (srcValue !== undefined || (key in Object(object)));
20153     };
20154   }
20155
20156   /**
20157    * The base implementation of `_.matches` which doesn't clone `source`.
20158    *
20159    * @private
20160    * @param {Object} source The object of property values to match.
20161    * @returns {Function} Returns the new spec function.
20162    */
20163   function baseMatches(source) {
20164     var matchData = getMatchData(source);
20165     if (matchData.length == 1 && matchData[0][2]) {
20166       return matchesStrictComparable(matchData[0][0], matchData[0][1]);
20167     }
20168     return function(object) {
20169       return object === source || baseIsMatch(object, source, matchData);
20170     };
20171   }
20172
20173   /** `Object#toString` result references. */
20174   var symbolTag$3 = '[object Symbol]';
20175
20176   /**
20177    * Checks if `value` is classified as a `Symbol` primitive or object.
20178    *
20179    * @static
20180    * @memberOf _
20181    * @since 4.0.0
20182    * @category Lang
20183    * @param {*} value The value to check.
20184    * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20185    * @example
20186    *
20187    * _.isSymbol(Symbol.iterator);
20188    * // => true
20189    *
20190    * _.isSymbol('abc');
20191    * // => false
20192    */
20193   function isSymbol(value) {
20194     return typeof value == 'symbol' ||
20195       (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20196   }
20197
20198   /** Used to match property names within property paths. */
20199   var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20200       reIsPlainProp = /^\w*$/;
20201
20202   /**
20203    * Checks if `value` is a property name and not a property path.
20204    *
20205    * @private
20206    * @param {*} value The value to check.
20207    * @param {Object} [object] The object to query keys on.
20208    * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
20209    */
20210   function isKey(value, object) {
20211     if (isArray(value)) {
20212       return false;
20213     }
20214     var type = typeof value;
20215     if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20216         value == null || isSymbol(value)) {
20217       return true;
20218     }
20219     return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20220       (object != null && value in Object(object));
20221   }
20222
20223   /** Error message constants. */
20224   var FUNC_ERROR_TEXT = 'Expected a function';
20225
20226   /**
20227    * Creates a function that memoizes the result of `func`. If `resolver` is
20228    * provided, it determines the cache key for storing the result based on the
20229    * arguments provided to the memoized function. By default, the first argument
20230    * provided to the memoized function is used as the map cache key. The `func`
20231    * is invoked with the `this` binding of the memoized function.
20232    *
20233    * **Note:** The cache is exposed as the `cache` property on the memoized
20234    * function. Its creation may be customized by replacing the `_.memoize.Cache`
20235    * constructor with one whose instances implement the
20236    * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
20237    * method interface of `clear`, `delete`, `get`, `has`, and `set`.
20238    *
20239    * @static
20240    * @memberOf _
20241    * @since 0.1.0
20242    * @category Function
20243    * @param {Function} func The function to have its output memoized.
20244    * @param {Function} [resolver] The function to resolve the cache key.
20245    * @returns {Function} Returns the new memoized function.
20246    * @example
20247    *
20248    * var object = { 'a': 1, 'b': 2 };
20249    * var other = { 'c': 3, 'd': 4 };
20250    *
20251    * var values = _.memoize(_.values);
20252    * values(object);
20253    * // => [1, 2]
20254    *
20255    * values(other);
20256    * // => [3, 4]
20257    *
20258    * object.a = 2;
20259    * values(object);
20260    * // => [1, 2]
20261    *
20262    * // Modify the result cache.
20263    * values.cache.set(object, ['a', 'b']);
20264    * values(object);
20265    * // => ['a', 'b']
20266    *
20267    * // Replace `_.memoize.Cache`.
20268    * _.memoize.Cache = WeakMap;
20269    */
20270   function memoize(func, resolver) {
20271     if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20272       throw new TypeError(FUNC_ERROR_TEXT);
20273     }
20274     var memoized = function() {
20275       var args = arguments,
20276           key = resolver ? resolver.apply(this, args) : args[0],
20277           cache = memoized.cache;
20278
20279       if (cache.has(key)) {
20280         return cache.get(key);
20281       }
20282       var result = func.apply(this, args);
20283       memoized.cache = cache.set(key, result) || cache;
20284       return result;
20285     };
20286     memoized.cache = new (memoize.Cache || MapCache);
20287     return memoized;
20288   }
20289
20290   // Expose `MapCache`.
20291   memoize.Cache = MapCache;
20292
20293   /** Used as the maximum memoize cache size. */
20294   var MAX_MEMOIZE_SIZE = 500;
20295
20296   /**
20297    * A specialized version of `_.memoize` which clears the memoized function's
20298    * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20299    *
20300    * @private
20301    * @param {Function} func The function to have its output memoized.
20302    * @returns {Function} Returns the new memoized function.
20303    */
20304   function memoizeCapped(func) {
20305     var result = memoize(func, function(key) {
20306       if (cache.size === MAX_MEMOIZE_SIZE) {
20307         cache.clear();
20308       }
20309       return key;
20310     });
20311
20312     var cache = result.cache;
20313     return result;
20314   }
20315
20316   /** Used to match property names within property paths. */
20317   var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20318
20319   /** Used to match backslashes in property paths. */
20320   var reEscapeChar = /\\(\\)?/g;
20321
20322   /**
20323    * Converts `string` to a property path array.
20324    *
20325    * @private
20326    * @param {string} string The string to convert.
20327    * @returns {Array} Returns the property path array.
20328    */
20329   var stringToPath = memoizeCapped(function(string) {
20330     var result = [];
20331     if (string.charCodeAt(0) === 46 /* . */) {
20332       result.push('');
20333     }
20334     string.replace(rePropName, function(match, number, quote, subString) {
20335       result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20336     });
20337     return result;
20338   });
20339
20340   /**
20341    * A specialized version of `_.map` for arrays without support for iteratee
20342    * shorthands.
20343    *
20344    * @private
20345    * @param {Array} [array] The array to iterate over.
20346    * @param {Function} iteratee The function invoked per iteration.
20347    * @returns {Array} Returns the new mapped array.
20348    */
20349   function arrayMap(array, iteratee) {
20350     var index = -1,
20351         length = array == null ? 0 : array.length,
20352         result = Array(length);
20353
20354     while (++index < length) {
20355       result[index] = iteratee(array[index], index, array);
20356     }
20357     return result;
20358   }
20359
20360   /** Used as references for various `Number` constants. */
20361   var INFINITY = 1 / 0;
20362
20363   /** Used to convert symbols to primitives and strings. */
20364   var symbolProto$2 = Symbol ? Symbol.prototype : undefined,
20365       symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
20366
20367   /**
20368    * The base implementation of `_.toString` which doesn't convert nullish
20369    * values to empty strings.
20370    *
20371    * @private
20372    * @param {*} value The value to process.
20373    * @returns {string} Returns the string.
20374    */
20375   function baseToString(value) {
20376     // Exit early for strings to avoid a performance hit in some environments.
20377     if (typeof value == 'string') {
20378       return value;
20379     }
20380     if (isArray(value)) {
20381       // Recursively convert values (susceptible to call stack limits).
20382       return arrayMap(value, baseToString) + '';
20383     }
20384     if (isSymbol(value)) {
20385       return symbolToString ? symbolToString.call(value) : '';
20386     }
20387     var result = (value + '');
20388     return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20389   }
20390
20391   /**
20392    * Converts `value` to a string. An empty string is returned for `null`
20393    * and `undefined` values. The sign of `-0` is preserved.
20394    *
20395    * @static
20396    * @memberOf _
20397    * @since 4.0.0
20398    * @category Lang
20399    * @param {*} value The value to convert.
20400    * @returns {string} Returns the converted string.
20401    * @example
20402    *
20403    * _.toString(null);
20404    * // => ''
20405    *
20406    * _.toString(-0);
20407    * // => '-0'
20408    *
20409    * _.toString([1, 2, 3]);
20410    * // => '1,2,3'
20411    */
20412   function toString(value) {
20413     return value == null ? '' : baseToString(value);
20414   }
20415
20416   /**
20417    * Casts `value` to a path array if it's not one.
20418    *
20419    * @private
20420    * @param {*} value The value to inspect.
20421    * @param {Object} [object] The object to query keys on.
20422    * @returns {Array} Returns the cast property path array.
20423    */
20424   function castPath(value, object) {
20425     if (isArray(value)) {
20426       return value;
20427     }
20428     return isKey(value, object) ? [value] : stringToPath(toString(value));
20429   }
20430
20431   /** Used as references for various `Number` constants. */
20432   var INFINITY$1 = 1 / 0;
20433
20434   /**
20435    * Converts `value` to a string key if it's not a string or symbol.
20436    *
20437    * @private
20438    * @param {*} value The value to inspect.
20439    * @returns {string|symbol} Returns the key.
20440    */
20441   function toKey(value) {
20442     if (typeof value == 'string' || isSymbol(value)) {
20443       return value;
20444     }
20445     var result = (value + '');
20446     return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20447   }
20448
20449   /**
20450    * The base implementation of `_.get` without support for default values.
20451    *
20452    * @private
20453    * @param {Object} object The object to query.
20454    * @param {Array|string} path The path of the property to get.
20455    * @returns {*} Returns the resolved value.
20456    */
20457   function baseGet(object, path) {
20458     path = castPath(path, object);
20459
20460     var index = 0,
20461         length = path.length;
20462
20463     while (object != null && index < length) {
20464       object = object[toKey(path[index++])];
20465     }
20466     return (index && index == length) ? object : undefined;
20467   }
20468
20469   /**
20470    * Gets the value at `path` of `object`. If the resolved value is
20471    * `undefined`, the `defaultValue` is returned in its place.
20472    *
20473    * @static
20474    * @memberOf _
20475    * @since 3.7.0
20476    * @category Object
20477    * @param {Object} object The object to query.
20478    * @param {Array|string} path The path of the property to get.
20479    * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20480    * @returns {*} Returns the resolved value.
20481    * @example
20482    *
20483    * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20484    *
20485    * _.get(object, 'a[0].b.c');
20486    * // => 3
20487    *
20488    * _.get(object, ['a', '0', 'b', 'c']);
20489    * // => 3
20490    *
20491    * _.get(object, 'a.b.c', 'default');
20492    * // => 'default'
20493    */
20494   function get$2(object, path, defaultValue) {
20495     var result = object == null ? undefined : baseGet(object, path);
20496     return result === undefined ? defaultValue : result;
20497   }
20498
20499   /**
20500    * The base implementation of `_.hasIn` without support for deep paths.
20501    *
20502    * @private
20503    * @param {Object} [object] The object to query.
20504    * @param {Array|string} key The key to check.
20505    * @returns {boolean} Returns `true` if `key` exists, else `false`.
20506    */
20507   function baseHasIn(object, key) {
20508     return object != null && key in Object(object);
20509   }
20510
20511   /**
20512    * Checks if `path` exists on `object`.
20513    *
20514    * @private
20515    * @param {Object} object The object to query.
20516    * @param {Array|string} path The path to check.
20517    * @param {Function} hasFunc The function to check properties.
20518    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20519    */
20520   function hasPath(object, path, hasFunc) {
20521     path = castPath(path, object);
20522
20523     var index = -1,
20524         length = path.length,
20525         result = false;
20526
20527     while (++index < length) {
20528       var key = toKey(path[index]);
20529       if (!(result = object != null && hasFunc(object, key))) {
20530         break;
20531       }
20532       object = object[key];
20533     }
20534     if (result || ++index != length) {
20535       return result;
20536     }
20537     length = object == null ? 0 : object.length;
20538     return !!length && isLength(length) && isIndex(key, length) &&
20539       (isArray(object) || isArguments(object));
20540   }
20541
20542   /**
20543    * Checks if `path` is a direct or inherited property of `object`.
20544    *
20545    * @static
20546    * @memberOf _
20547    * @since 4.0.0
20548    * @category Object
20549    * @param {Object} object The object to query.
20550    * @param {Array|string} path The path to check.
20551    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20552    * @example
20553    *
20554    * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20555    *
20556    * _.hasIn(object, 'a');
20557    * // => true
20558    *
20559    * _.hasIn(object, 'a.b');
20560    * // => true
20561    *
20562    * _.hasIn(object, ['a', 'b']);
20563    * // => true
20564    *
20565    * _.hasIn(object, 'b');
20566    * // => false
20567    */
20568   function hasIn(object, path) {
20569     return object != null && hasPath(object, path, baseHasIn);
20570   }
20571
20572   /** Used to compose bitmasks for value comparisons. */
20573   var COMPARE_PARTIAL_FLAG$5 = 1,
20574       COMPARE_UNORDERED_FLAG$3 = 2;
20575
20576   /**
20577    * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20578    *
20579    * @private
20580    * @param {string} path The path of the property to get.
20581    * @param {*} srcValue The value to match.
20582    * @returns {Function} Returns the new spec function.
20583    */
20584   function baseMatchesProperty(path, srcValue) {
20585     if (isKey(path) && isStrictComparable(srcValue)) {
20586       return matchesStrictComparable(toKey(path), srcValue);
20587     }
20588     return function(object) {
20589       var objValue = get$2(object, path);
20590       return (objValue === undefined && objValue === srcValue)
20591         ? hasIn(object, path)
20592         : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20593     };
20594   }
20595
20596   /**
20597    * This method returns the first argument it receives.
20598    *
20599    * @static
20600    * @since 0.1.0
20601    * @memberOf _
20602    * @category Util
20603    * @param {*} value Any value.
20604    * @returns {*} Returns `value`.
20605    * @example
20606    *
20607    * var object = { 'a': 1 };
20608    *
20609    * console.log(_.identity(object) === object);
20610    * // => true
20611    */
20612   function identity$8(value) {
20613     return value;
20614   }
20615
20616   /**
20617    * The base implementation of `_.property` without support for deep paths.
20618    *
20619    * @private
20620    * @param {string} key The key of the property to get.
20621    * @returns {Function} Returns the new accessor function.
20622    */
20623   function baseProperty(key) {
20624     return function(object) {
20625       return object == null ? undefined : object[key];
20626     };
20627   }
20628
20629   /**
20630    * A specialized version of `baseProperty` which supports deep paths.
20631    *
20632    * @private
20633    * @param {Array|string} path The path of the property to get.
20634    * @returns {Function} Returns the new accessor function.
20635    */
20636   function basePropertyDeep(path) {
20637     return function(object) {
20638       return baseGet(object, path);
20639     };
20640   }
20641
20642   /**
20643    * Creates a function that returns the value at `path` of a given object.
20644    *
20645    * @static
20646    * @memberOf _
20647    * @since 2.4.0
20648    * @category Util
20649    * @param {Array|string} path The path of the property to get.
20650    * @returns {Function} Returns the new accessor function.
20651    * @example
20652    *
20653    * var objects = [
20654    *   { 'a': { 'b': 2 } },
20655    *   { 'a': { 'b': 1 } }
20656    * ];
20657    *
20658    * _.map(objects, _.property('a.b'));
20659    * // => [2, 1]
20660    *
20661    * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20662    * // => [1, 2]
20663    */
20664   function property(path) {
20665     return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20666   }
20667
20668   /**
20669    * The base implementation of `_.iteratee`.
20670    *
20671    * @private
20672    * @param {*} [value=_.identity] The value to convert to an iteratee.
20673    * @returns {Function} Returns the iteratee.
20674    */
20675   function baseIteratee(value) {
20676     // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20677     // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20678     if (typeof value == 'function') {
20679       return value;
20680     }
20681     if (value == null) {
20682       return identity$8;
20683     }
20684     if (typeof value == 'object') {
20685       return isArray(value)
20686         ? baseMatchesProperty(value[0], value[1])
20687         : baseMatches(value);
20688     }
20689     return property(value);
20690   }
20691
20692   /**
20693    * Creates a function like `_.groupBy`.
20694    *
20695    * @private
20696    * @param {Function} setter The function to set accumulator values.
20697    * @param {Function} [initializer] The accumulator object initializer.
20698    * @returns {Function} Returns the new aggregator function.
20699    */
20700   function createAggregator(setter, initializer) {
20701     return function(collection, iteratee) {
20702       var func = isArray(collection) ? arrayAggregator : baseAggregator,
20703           accumulator = initializer ? initializer() : {};
20704
20705       return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20706     };
20707   }
20708
20709   /** Used for built-in method references. */
20710   var objectProto$f = Object.prototype;
20711
20712   /** Used to check objects for own properties. */
20713   var hasOwnProperty$c = objectProto$f.hasOwnProperty;
20714
20715   /**
20716    * Creates an object composed of keys generated from the results of running
20717    * each element of `collection` thru `iteratee`. The order of grouped values
20718    * is determined by the order they occur in `collection`. The corresponding
20719    * value of each key is an array of elements responsible for generating the
20720    * key. The iteratee is invoked with one argument: (value).
20721    *
20722    * @static
20723    * @memberOf _
20724    * @since 0.1.0
20725    * @category Collection
20726    * @param {Array|Object} collection The collection to iterate over.
20727    * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
20728    * @returns {Object} Returns the composed aggregate object.
20729    * @example
20730    *
20731    * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20732    * // => { '4': [4.2], '6': [6.1, 6.3] }
20733    *
20734    * // The `_.property` iteratee shorthand.
20735    * _.groupBy(['one', 'two', 'three'], 'length');
20736    * // => { '3': ['one', 'two'], '5': ['three'] }
20737    */
20738   var groupBy = createAggregator(function(result, value, key) {
20739     if (hasOwnProperty$c.call(result, key)) {
20740       result[key].push(value);
20741     } else {
20742       baseAssignValue(result, key, [value]);
20743     }
20744   });
20745
20746   /**
20747    * Gets the last element of `array`.
20748    *
20749    * @static
20750    * @memberOf _
20751    * @since 0.1.0
20752    * @category Array
20753    * @param {Array} array The array to query.
20754    * @returns {*} Returns the last element of `array`.
20755    * @example
20756    *
20757    * _.last([1, 2, 3]);
20758    * // => 3
20759    */
20760   function last(array) {
20761     var length = array == null ? 0 : array.length;
20762     return length ? array[length - 1] : undefined;
20763   }
20764
20765   /**
20766    * The base implementation of `_.slice` without an iteratee call guard.
20767    *
20768    * @private
20769    * @param {Array} array The array to slice.
20770    * @param {number} [start=0] The start position.
20771    * @param {number} [end=array.length] The end position.
20772    * @returns {Array} Returns the slice of `array`.
20773    */
20774   function baseSlice(array, start, end) {
20775     var index = -1,
20776         length = array.length;
20777
20778     if (start < 0) {
20779       start = -start > length ? 0 : (length + start);
20780     }
20781     end = end > length ? length : end;
20782     if (end < 0) {
20783       end += length;
20784     }
20785     length = start > end ? 0 : ((end - start) >>> 0);
20786     start >>>= 0;
20787
20788     var result = Array(length);
20789     while (++index < length) {
20790       result[index] = array[index + start];
20791     }
20792     return result;
20793   }
20794
20795   /**
20796    * Gets the parent value at `path` of `object`.
20797    *
20798    * @private
20799    * @param {Object} object The object to query.
20800    * @param {Array} path The path to get the parent value of.
20801    * @returns {*} Returns the parent value.
20802    */
20803   function parent(object, path) {
20804     return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20805   }
20806
20807   /**
20808    * The base implementation of `_.unset`.
20809    *
20810    * @private
20811    * @param {Object} object The object to modify.
20812    * @param {Array|string} path The property path to unset.
20813    * @returns {boolean} Returns `true` if the property is deleted, else `false`.
20814    */
20815   function baseUnset(object, path) {
20816     path = castPath(path, object);
20817     object = parent(object, path);
20818     return object == null || delete object[toKey(last(path))];
20819   }
20820
20821   /** `Object#toString` result references. */
20822   var objectTag$4 = '[object Object]';
20823
20824   /** Used for built-in method references. */
20825   var funcProto$2 = Function.prototype,
20826       objectProto$g = Object.prototype;
20827
20828   /** Used to resolve the decompiled source of functions. */
20829   var funcToString$2 = funcProto$2.toString;
20830
20831   /** Used to check objects for own properties. */
20832   var hasOwnProperty$d = objectProto$g.hasOwnProperty;
20833
20834   /** Used to infer the `Object` constructor. */
20835   var objectCtorString = funcToString$2.call(Object);
20836
20837   /**
20838    * Checks if `value` is a plain object, that is, an object created by the
20839    * `Object` constructor or one with a `[[Prototype]]` of `null`.
20840    *
20841    * @static
20842    * @memberOf _
20843    * @since 0.8.0
20844    * @category Lang
20845    * @param {*} value The value to check.
20846    * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20847    * @example
20848    *
20849    * function Foo() {
20850    *   this.a = 1;
20851    * }
20852    *
20853    * _.isPlainObject(new Foo);
20854    * // => false
20855    *
20856    * _.isPlainObject([1, 2, 3]);
20857    * // => false
20858    *
20859    * _.isPlainObject({ 'x': 0, 'y': 0 });
20860    * // => true
20861    *
20862    * _.isPlainObject(Object.create(null));
20863    * // => true
20864    */
20865   function isPlainObject(value) {
20866     if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20867       return false;
20868     }
20869     var proto = getPrototype(value);
20870     if (proto === null) {
20871       return true;
20872     }
20873     var Ctor = hasOwnProperty$d.call(proto, 'constructor') && proto.constructor;
20874     return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20875       funcToString$2.call(Ctor) == objectCtorString;
20876   }
20877
20878   /**
20879    * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20880    * objects.
20881    *
20882    * @private
20883    * @param {*} value The value to inspect.
20884    * @param {string} key The key of the property to inspect.
20885    * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
20886    */
20887   function customOmitClone(value) {
20888     return isPlainObject(value) ? undefined : value;
20889   }
20890
20891   /** Built-in value references. */
20892   var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20893
20894   /**
20895    * Checks if `value` is a flattenable `arguments` object or array.
20896    *
20897    * @private
20898    * @param {*} value The value to check.
20899    * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20900    */
20901   function isFlattenable(value) {
20902     return isArray(value) || isArguments(value) ||
20903       !!(spreadableSymbol && value && value[spreadableSymbol]);
20904   }
20905
20906   /**
20907    * The base implementation of `_.flatten` with support for restricting flattening.
20908    *
20909    * @private
20910    * @param {Array} array The array to flatten.
20911    * @param {number} depth The maximum recursion depth.
20912    * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
20913    * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
20914    * @param {Array} [result=[]] The initial result value.
20915    * @returns {Array} Returns the new flattened array.
20916    */
20917   function baseFlatten(array, depth, predicate, isStrict, result) {
20918     var index = -1,
20919         length = array.length;
20920
20921     predicate || (predicate = isFlattenable);
20922     result || (result = []);
20923
20924     while (++index < length) {
20925       var value = array[index];
20926       if (depth > 0 && predicate(value)) {
20927         if (depth > 1) {
20928           // Recursively flatten arrays (susceptible to call stack limits).
20929           baseFlatten(value, depth - 1, predicate, isStrict, result);
20930         } else {
20931           arrayPush(result, value);
20932         }
20933       } else if (!isStrict) {
20934         result[result.length] = value;
20935       }
20936     }
20937     return result;
20938   }
20939
20940   /**
20941    * Flattens `array` a single level deep.
20942    *
20943    * @static
20944    * @memberOf _
20945    * @since 0.1.0
20946    * @category Array
20947    * @param {Array} array The array to flatten.
20948    * @returns {Array} Returns the new flattened array.
20949    * @example
20950    *
20951    * _.flatten([1, [2, [3, [4]], 5]]);
20952    * // => [1, 2, [3, [4]], 5]
20953    */
20954   function flatten(array) {
20955     var length = array == null ? 0 : array.length;
20956     return length ? baseFlatten(array, 1) : [];
20957   }
20958
20959   /**
20960    * A faster alternative to `Function#apply`, this function invokes `func`
20961    * with the `this` binding of `thisArg` and the arguments of `args`.
20962    *
20963    * @private
20964    * @param {Function} func The function to invoke.
20965    * @param {*} thisArg The `this` binding of `func`.
20966    * @param {Array} args The arguments to invoke `func` with.
20967    * @returns {*} Returns the result of `func`.
20968    */
20969   function apply(func, thisArg, args) {
20970     switch (args.length) {
20971       case 0: return func.call(thisArg);
20972       case 1: return func.call(thisArg, args[0]);
20973       case 2: return func.call(thisArg, args[0], args[1]);
20974       case 3: return func.call(thisArg, args[0], args[1], args[2]);
20975     }
20976     return func.apply(thisArg, args);
20977   }
20978
20979   /* Built-in method references for those with the same name as other `lodash` methods. */
20980   var nativeMax = Math.max;
20981
20982   /**
20983    * A specialized version of `baseRest` which transforms the rest array.
20984    *
20985    * @private
20986    * @param {Function} func The function to apply a rest parameter to.
20987    * @param {number} [start=func.length-1] The start position of the rest parameter.
20988    * @param {Function} transform The rest array transform.
20989    * @returns {Function} Returns the new function.
20990    */
20991   function overRest(func, start, transform) {
20992     start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20993     return function() {
20994       var args = arguments,
20995           index = -1,
20996           length = nativeMax(args.length - start, 0),
20997           array = Array(length);
20998
20999       while (++index < length) {
21000         array[index] = args[start + index];
21001       }
21002       index = -1;
21003       var otherArgs = Array(start + 1);
21004       while (++index < start) {
21005         otherArgs[index] = args[index];
21006       }
21007       otherArgs[start] = transform(array);
21008       return apply(func, this, otherArgs);
21009     };
21010   }
21011
21012   /**
21013    * Creates a function that returns `value`.
21014    *
21015    * @static
21016    * @memberOf _
21017    * @since 2.4.0
21018    * @category Util
21019    * @param {*} value The value to return from the new function.
21020    * @returns {Function} Returns the new constant function.
21021    * @example
21022    *
21023    * var objects = _.times(2, _.constant({ 'a': 1 }));
21024    *
21025    * console.log(objects);
21026    * // => [{ 'a': 1 }, { 'a': 1 }]
21027    *
21028    * console.log(objects[0] === objects[1]);
21029    * // => true
21030    */
21031   function constant$d(value) {
21032     return function() {
21033       return value;
21034     };
21035   }
21036
21037   /**
21038    * The base implementation of `setToString` without support for hot loop shorting.
21039    *
21040    * @private
21041    * @param {Function} func The function to modify.
21042    * @param {Function} string The `toString` result.
21043    * @returns {Function} Returns `func`.
21044    */
21045   var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
21046     return defineProperty(func, 'toString', {
21047       'configurable': true,
21048       'enumerable': false,
21049       'value': constant$d(string),
21050       'writable': true
21051     });
21052   };
21053
21054   /** Used to detect hot functions by number of calls within a span of milliseconds. */
21055   var HOT_COUNT = 800,
21056       HOT_SPAN = 16;
21057
21058   /* Built-in method references for those with the same name as other `lodash` methods. */
21059   var nativeNow = Date.now;
21060
21061   /**
21062    * Creates a function that'll short out and invoke `identity` instead
21063    * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
21064    * milliseconds.
21065    *
21066    * @private
21067    * @param {Function} func The function to restrict.
21068    * @returns {Function} Returns the new shortable function.
21069    */
21070   function shortOut(func) {
21071     var count = 0,
21072         lastCalled = 0;
21073
21074     return function() {
21075       var stamp = nativeNow(),
21076           remaining = HOT_SPAN - (stamp - lastCalled);
21077
21078       lastCalled = stamp;
21079       if (remaining > 0) {
21080         if (++count >= HOT_COUNT) {
21081           return arguments[0];
21082         }
21083       } else {
21084         count = 0;
21085       }
21086       return func.apply(undefined, arguments);
21087     };
21088   }
21089
21090   /**
21091    * Sets the `toString` method of `func` to return `string`.
21092    *
21093    * @private
21094    * @param {Function} func The function to modify.
21095    * @param {Function} string The `toString` result.
21096    * @returns {Function} Returns `func`.
21097    */
21098   var setToString = shortOut(baseSetToString);
21099
21100   /**
21101    * A specialized version of `baseRest` which flattens the rest array.
21102    *
21103    * @private
21104    * @param {Function} func The function to apply a rest parameter to.
21105    * @returns {Function} Returns the new function.
21106    */
21107   function flatRest(func) {
21108     return setToString(overRest(func, undefined, flatten), func + '');
21109   }
21110
21111   /** Used to compose bitmasks for cloning. */
21112   var CLONE_DEEP_FLAG$1 = 1,
21113       CLONE_FLAT_FLAG$1 = 2,
21114       CLONE_SYMBOLS_FLAG$2 = 4;
21115
21116   /**
21117    * The opposite of `_.pick`; this method creates an object composed of the
21118    * own and inherited enumerable property paths of `object` that are not omitted.
21119    *
21120    * **Note:** This method is considerably slower than `_.pick`.
21121    *
21122    * @static
21123    * @since 0.1.0
21124    * @memberOf _
21125    * @category Object
21126    * @param {Object} object The source object.
21127    * @param {...(string|string[])} [paths] The property paths to omit.
21128    * @returns {Object} Returns the new object.
21129    * @example
21130    *
21131    * var object = { 'a': 1, 'b': '2', 'c': 3 };
21132    *
21133    * _.omit(object, ['a', 'c']);
21134    * // => { 'b': '2' }
21135    */
21136   var omit = flatRest(function(object, paths) {
21137     var result = {};
21138     if (object == null) {
21139       return result;
21140     }
21141     var isDeep = false;
21142     paths = arrayMap(paths, function(path) {
21143       path = castPath(path, object);
21144       isDeep || (isDeep = path.length > 1);
21145       return path;
21146     });
21147     copyObject(object, getAllKeysIn(object), result);
21148     if (isDeep) {
21149       result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21150     }
21151     var length = paths.length;
21152     while (length--) {
21153       baseUnset(result, paths[length]);
21154     }
21155     return result;
21156   });
21157
21158   /**
21159    * Creates an array with all falsey values removed. The values `false`, `null`,
21160    * `0`, `""`, `undefined`, and `NaN` are falsey.
21161    *
21162    * @static
21163    * @memberOf _
21164    * @since 0.1.0
21165    * @category Array
21166    * @param {Array} array The array to compact.
21167    * @returns {Array} Returns the new array of filtered values.
21168    * @example
21169    *
21170    * _.compact([0, 1, false, 2, '', 3]);
21171    * // => [1, 2, 3]
21172    */
21173   function compact(array) {
21174     var index = -1,
21175         length = array == null ? 0 : array.length,
21176         resIndex = 0,
21177         result = [];
21178
21179     while (++index < length) {
21180       var value = array[index];
21181       if (value) {
21182         result[resIndex++] = value;
21183       }
21184     }
21185     return result;
21186   }
21187
21188   /**
21189    * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21190    *
21191    * @private
21192    * @param {Function} func The function to apply a rest parameter to.
21193    * @param {number} [start=func.length-1] The start position of the rest parameter.
21194    * @returns {Function} Returns the new function.
21195    */
21196   function baseRest(func, start) {
21197     return setToString(overRest(func, start, identity$8), func + '');
21198   }
21199
21200   /**
21201    * Checks if the given arguments are from an iteratee call.
21202    *
21203    * @private
21204    * @param {*} value The potential iteratee value argument.
21205    * @param {*} index The potential iteratee index or key argument.
21206    * @param {*} object The potential iteratee object argument.
21207    * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
21208    *  else `false`.
21209    */
21210   function isIterateeCall(value, index, object) {
21211     if (!isObject(object)) {
21212       return false;
21213     }
21214     var type = typeof index;
21215     if (type == 'number'
21216           ? (isArrayLike(object) && isIndex(index, object.length))
21217           : (type == 'string' && index in object)
21218         ) {
21219       return eq(object[index], value);
21220     }
21221     return false;
21222   }
21223
21224   /**
21225    * Creates a function like `_.assign`.
21226    *
21227    * @private
21228    * @param {Function} assigner The function to assign values.
21229    * @returns {Function} Returns the new assigner function.
21230    */
21231   function createAssigner(assigner) {
21232     return baseRest(function(object, sources) {
21233       var index = -1,
21234           length = sources.length,
21235           customizer = length > 1 ? sources[length - 1] : undefined,
21236           guard = length > 2 ? sources[2] : undefined;
21237
21238       customizer = (assigner.length > 3 && typeof customizer == 'function')
21239         ? (length--, customizer)
21240         : undefined;
21241
21242       if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21243         customizer = length < 3 ? undefined : customizer;
21244         length = 1;
21245       }
21246       object = Object(object);
21247       while (++index < length) {
21248         var source = sources[index];
21249         if (source) {
21250           assigner(object, source, index, customizer);
21251         }
21252       }
21253       return object;
21254     });
21255   }
21256
21257   /**
21258    * This method is like `_.assign` except that it iterates over own and
21259    * inherited source properties.
21260    *
21261    * **Note:** This method mutates `object`.
21262    *
21263    * @static
21264    * @memberOf _
21265    * @since 4.0.0
21266    * @alias extend
21267    * @category Object
21268    * @param {Object} object The destination object.
21269    * @param {...Object} [sources] The source objects.
21270    * @returns {Object} Returns `object`.
21271    * @see _.assign
21272    * @example
21273    *
21274    * function Foo() {
21275    *   this.a = 1;
21276    * }
21277    *
21278    * function Bar() {
21279    *   this.c = 3;
21280    * }
21281    *
21282    * Foo.prototype.b = 2;
21283    * Bar.prototype.d = 4;
21284    *
21285    * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21286    * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21287    */
21288   var assignIn = createAssigner(function(object, source) {
21289     copyObject(source, keysIn$1(source), object);
21290   });
21291
21292   /**
21293    * The base implementation of `_.filter` without support for iteratee shorthands.
21294    *
21295    * @private
21296    * @param {Array|Object} collection The collection to iterate over.
21297    * @param {Function} predicate The function invoked per iteration.
21298    * @returns {Array} Returns the new filtered array.
21299    */
21300   function baseFilter(collection, predicate) {
21301     var result = [];
21302     baseEach(collection, function(value, index, collection) {
21303       if (predicate(value, index, collection)) {
21304         result.push(value);
21305       }
21306     });
21307     return result;
21308   }
21309
21310   /**
21311    * Iterates over elements of `collection`, returning an array of all elements
21312    * `predicate` returns truthy for. The predicate is invoked with three
21313    * arguments: (value, index|key, collection).
21314    *
21315    * **Note:** Unlike `_.remove`, this method returns a new array.
21316    *
21317    * @static
21318    * @memberOf _
21319    * @since 0.1.0
21320    * @category Collection
21321    * @param {Array|Object} collection The collection to iterate over.
21322    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21323    * @returns {Array} Returns the new filtered array.
21324    * @see _.reject
21325    * @example
21326    *
21327    * var users = [
21328    *   { 'user': 'barney', 'age': 36, 'active': true },
21329    *   { 'user': 'fred',   'age': 40, 'active': false }
21330    * ];
21331    *
21332    * _.filter(users, function(o) { return !o.active; });
21333    * // => objects for ['fred']
21334    *
21335    * // The `_.matches` iteratee shorthand.
21336    * _.filter(users, { 'age': 36, 'active': true });
21337    * // => objects for ['barney']
21338    *
21339    * // The `_.matchesProperty` iteratee shorthand.
21340    * _.filter(users, ['active', false]);
21341    * // => objects for ['fred']
21342    *
21343    * // The `_.property` iteratee shorthand.
21344    * _.filter(users, 'active');
21345    * // => objects for ['barney']
21346    */
21347   function filter(collection, predicate) {
21348     var func = isArray(collection) ? arrayFilter : baseFilter;
21349     return func(collection, baseIteratee(predicate, 3));
21350   }
21351
21352   /**
21353    * Creates a `_.find` or `_.findLast` function.
21354    *
21355    * @private
21356    * @param {Function} findIndexFunc The function to find the collection index.
21357    * @returns {Function} Returns the new find function.
21358    */
21359   function createFind(findIndexFunc) {
21360     return function(collection, predicate, fromIndex) {
21361       var iterable = Object(collection);
21362       if (!isArrayLike(collection)) {
21363         var iteratee = baseIteratee(predicate, 3);
21364         collection = keys$1(collection);
21365         predicate = function(key) { return iteratee(iterable[key], key, iterable); };
21366       }
21367       var index = findIndexFunc(collection, predicate, fromIndex);
21368       return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21369     };
21370   }
21371
21372   /**
21373    * The base implementation of `_.findIndex` and `_.findLastIndex` without
21374    * support for iteratee shorthands.
21375    *
21376    * @private
21377    * @param {Array} array The array to inspect.
21378    * @param {Function} predicate The function invoked per iteration.
21379    * @param {number} fromIndex The index to search from.
21380    * @param {boolean} [fromRight] Specify iterating from right to left.
21381    * @returns {number} Returns the index of the matched value, else `-1`.
21382    */
21383   function baseFindIndex(array, predicate, fromIndex, fromRight) {
21384     var length = array.length,
21385         index = fromIndex + (fromRight ? 1 : -1);
21386
21387     while ((fromRight ? index-- : ++index < length)) {
21388       if (predicate(array[index], index, array)) {
21389         return index;
21390       }
21391     }
21392     return -1;
21393   }
21394
21395   /** Used as references for various `Number` constants. */
21396   var NAN = 0 / 0;
21397
21398   /** Used to match leading and trailing whitespace. */
21399   var reTrim = /^\s+|\s+$/g;
21400
21401   /** Used to detect bad signed hexadecimal string values. */
21402   var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21403
21404   /** Used to detect binary string values. */
21405   var reIsBinary = /^0b[01]+$/i;
21406
21407   /** Used to detect octal string values. */
21408   var reIsOctal = /^0o[0-7]+$/i;
21409
21410   /** Built-in method references without a dependency on `root`. */
21411   var freeParseInt = parseInt;
21412
21413   /**
21414    * Converts `value` to a number.
21415    *
21416    * @static
21417    * @memberOf _
21418    * @since 4.0.0
21419    * @category Lang
21420    * @param {*} value The value to process.
21421    * @returns {number} Returns the number.
21422    * @example
21423    *
21424    * _.toNumber(3.2);
21425    * // => 3.2
21426    *
21427    * _.toNumber(Number.MIN_VALUE);
21428    * // => 5e-324
21429    *
21430    * _.toNumber(Infinity);
21431    * // => Infinity
21432    *
21433    * _.toNumber('3.2');
21434    * // => 3.2
21435    */
21436   function toNumber(value) {
21437     if (typeof value == 'number') {
21438       return value;
21439     }
21440     if (isSymbol(value)) {
21441       return NAN;
21442     }
21443     if (isObject(value)) {
21444       var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21445       value = isObject(other) ? (other + '') : other;
21446     }
21447     if (typeof value != 'string') {
21448       return value === 0 ? value : +value;
21449     }
21450     value = value.replace(reTrim, '');
21451     var isBinary = reIsBinary.test(value);
21452     return (isBinary || reIsOctal.test(value))
21453       ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
21454       : (reIsBadHex.test(value) ? NAN : +value);
21455   }
21456
21457   /** Used as references for various `Number` constants. */
21458   var INFINITY$2 = 1 / 0,
21459       MAX_INTEGER = 1.7976931348623157e+308;
21460
21461   /**
21462    * Converts `value` to a finite number.
21463    *
21464    * @static
21465    * @memberOf _
21466    * @since 4.12.0
21467    * @category Lang
21468    * @param {*} value The value to convert.
21469    * @returns {number} Returns the converted number.
21470    * @example
21471    *
21472    * _.toFinite(3.2);
21473    * // => 3.2
21474    *
21475    * _.toFinite(Number.MIN_VALUE);
21476    * // => 5e-324
21477    *
21478    * _.toFinite(Infinity);
21479    * // => 1.7976931348623157e+308
21480    *
21481    * _.toFinite('3.2');
21482    * // => 3.2
21483    */
21484   function toFinite(value) {
21485     if (!value) {
21486       return value === 0 ? value : 0;
21487     }
21488     value = toNumber(value);
21489     if (value === INFINITY$2 || value === -INFINITY$2) {
21490       var sign = (value < 0 ? -1 : 1);
21491       return sign * MAX_INTEGER;
21492     }
21493     return value === value ? value : 0;
21494   }
21495
21496   /**
21497    * Converts `value` to an integer.
21498    *
21499    * **Note:** This method is loosely based on
21500    * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21501    *
21502    * @static
21503    * @memberOf _
21504    * @since 4.0.0
21505    * @category Lang
21506    * @param {*} value The value to convert.
21507    * @returns {number} Returns the converted integer.
21508    * @example
21509    *
21510    * _.toInteger(3.2);
21511    * // => 3
21512    *
21513    * _.toInteger(Number.MIN_VALUE);
21514    * // => 0
21515    *
21516    * _.toInteger(Infinity);
21517    * // => 1.7976931348623157e+308
21518    *
21519    * _.toInteger('3.2');
21520    * // => 3
21521    */
21522   function toInteger(value) {
21523     var result = toFinite(value),
21524         remainder = result % 1;
21525
21526     return result === result ? (remainder ? result - remainder : result) : 0;
21527   }
21528
21529   /* Built-in method references for those with the same name as other `lodash` methods. */
21530   var nativeMax$1 = Math.max;
21531
21532   /**
21533    * This method is like `_.find` except that it returns the index of the first
21534    * element `predicate` returns truthy for instead of the element itself.
21535    *
21536    * @static
21537    * @memberOf _
21538    * @since 1.1.0
21539    * @category Array
21540    * @param {Array} array The array to inspect.
21541    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21542    * @param {number} [fromIndex=0] The index to search from.
21543    * @returns {number} Returns the index of the found element, else `-1`.
21544    * @example
21545    *
21546    * var users = [
21547    *   { 'user': 'barney',  'active': false },
21548    *   { 'user': 'fred',    'active': false },
21549    *   { 'user': 'pebbles', 'active': true }
21550    * ];
21551    *
21552    * _.findIndex(users, function(o) { return o.user == 'barney'; });
21553    * // => 0
21554    *
21555    * // The `_.matches` iteratee shorthand.
21556    * _.findIndex(users, { 'user': 'fred', 'active': false });
21557    * // => 1
21558    *
21559    * // The `_.matchesProperty` iteratee shorthand.
21560    * _.findIndex(users, ['active', false]);
21561    * // => 0
21562    *
21563    * // The `_.property` iteratee shorthand.
21564    * _.findIndex(users, 'active');
21565    * // => 2
21566    */
21567   function findIndex(array, predicate, fromIndex) {
21568     var length = array == null ? 0 : array.length;
21569     if (!length) {
21570       return -1;
21571     }
21572     var index = fromIndex == null ? 0 : toInteger(fromIndex);
21573     if (index < 0) {
21574       index = nativeMax$1(length + index, 0);
21575     }
21576     return baseFindIndex(array, baseIteratee(predicate, 3), index);
21577   }
21578
21579   /**
21580    * Iterates over elements of `collection`, returning the first element
21581    * `predicate` returns truthy for. The predicate is invoked with three
21582    * arguments: (value, index|key, collection).
21583    *
21584    * @static
21585    * @memberOf _
21586    * @since 0.1.0
21587    * @category Collection
21588    * @param {Array|Object} collection The collection to inspect.
21589    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21590    * @param {number} [fromIndex=0] The index to search from.
21591    * @returns {*} Returns the matched element, else `undefined`.
21592    * @example
21593    *
21594    * var users = [
21595    *   { 'user': 'barney',  'age': 36, 'active': true },
21596    *   { 'user': 'fred',    'age': 40, 'active': false },
21597    *   { 'user': 'pebbles', 'age': 1,  'active': true }
21598    * ];
21599    *
21600    * _.find(users, function(o) { return o.age < 40; });
21601    * // => object for 'barney'
21602    *
21603    * // The `_.matches` iteratee shorthand.
21604    * _.find(users, { 'age': 1, 'active': true });
21605    * // => object for 'pebbles'
21606    *
21607    * // The `_.matchesProperty` iteratee shorthand.
21608    * _.find(users, ['active', false]);
21609    * // => object for 'fred'
21610    *
21611    * // The `_.property` iteratee shorthand.
21612    * _.find(users, 'active');
21613    * // => object for 'barney'
21614    */
21615   var find$1 = createFind(findIndex);
21616
21617   /**
21618    * The base implementation of `_.map` without support for iteratee shorthands.
21619    *
21620    * @private
21621    * @param {Array|Object} collection The collection to iterate over.
21622    * @param {Function} iteratee The function invoked per iteration.
21623    * @returns {Array} Returns the new mapped array.
21624    */
21625   function baseMap(collection, iteratee) {
21626     var index = -1,
21627         result = isArrayLike(collection) ? Array(collection.length) : [];
21628
21629     baseEach(collection, function(value, key, collection) {
21630       result[++index] = iteratee(value, key, collection);
21631     });
21632     return result;
21633   }
21634
21635   /**
21636    * Creates an array of values by running each element in `collection` thru
21637    * `iteratee`. The iteratee is invoked with three arguments:
21638    * (value, index|key, collection).
21639    *
21640    * Many lodash methods are guarded to work as iteratees for methods like
21641    * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21642    *
21643    * The guarded methods are:
21644    * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
21645    * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
21646    * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
21647    * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
21648    *
21649    * @static
21650    * @memberOf _
21651    * @since 0.1.0
21652    * @category Collection
21653    * @param {Array|Object} collection The collection to iterate over.
21654    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
21655    * @returns {Array} Returns the new mapped array.
21656    * @example
21657    *
21658    * function square(n) {
21659    *   return n * n;
21660    * }
21661    *
21662    * _.map([4, 8], square);
21663    * // => [16, 64]
21664    *
21665    * _.map({ 'a': 4, 'b': 8 }, square);
21666    * // => [16, 64] (iteration order is not guaranteed)
21667    *
21668    * var users = [
21669    *   { 'user': 'barney' },
21670    *   { 'user': 'fred' }
21671    * ];
21672    *
21673    * // The `_.property` iteratee shorthand.
21674    * _.map(users, 'user');
21675    * // => ['barney', 'fred']
21676    */
21677   function map$3(collection, iteratee) {
21678     var func = isArray(collection) ? arrayMap : baseMap;
21679     return func(collection, baseIteratee(iteratee, 3));
21680   }
21681
21682   /**
21683    * The base implementation of `_.values` and `_.valuesIn` which creates an
21684    * array of `object` property values corresponding to the property names
21685    * of `props`.
21686    *
21687    * @private
21688    * @param {Object} object The object to query.
21689    * @param {Array} props The property names to get values for.
21690    * @returns {Object} Returns the array of property values.
21691    */
21692   function baseValues(object, props) {
21693     return arrayMap(props, function(key) {
21694       return object[key];
21695     });
21696   }
21697
21698   /**
21699    * Creates an array of the own enumerable string keyed property values of `object`.
21700    *
21701    * **Note:** Non-object values are coerced to objects.
21702    *
21703    * @static
21704    * @since 0.1.0
21705    * @memberOf _
21706    * @category Object
21707    * @param {Object} object The object to query.
21708    * @returns {Array} Returns the array of property values.
21709    * @example
21710    *
21711    * function Foo() {
21712    *   this.a = 1;
21713    *   this.b = 2;
21714    * }
21715    *
21716    * Foo.prototype.c = 3;
21717    *
21718    * _.values(new Foo);
21719    * // => [1, 2] (iteration order is not guaranteed)
21720    *
21721    * _.values('hi');
21722    * // => ['h', 'i']
21723    */
21724   function values$1(object) {
21725     return object == null ? [] : baseValues(object, keys$1(object));
21726   }
21727
21728   /**
21729    * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21730    * of key-value pairs for `object` corresponding to the property names of `props`.
21731    *
21732    * @private
21733    * @param {Object} object The object to query.
21734    * @param {Array} props The property names to get values for.
21735    * @returns {Object} Returns the key-value pairs.
21736    */
21737   function baseToPairs(object, props) {
21738     return arrayMap(props, function(key) {
21739       return [key, object[key]];
21740     });
21741   }
21742
21743   /**
21744    * Converts `set` to its value-value pairs.
21745    *
21746    * @private
21747    * @param {Object} set The set to convert.
21748    * @returns {Array} Returns the value-value pairs.
21749    */
21750   function setToPairs(set) {
21751     var index = -1,
21752         result = Array(set.size);
21753
21754     set.forEach(function(value) {
21755       result[++index] = [value, value];
21756     });
21757     return result;
21758   }
21759
21760   /** `Object#toString` result references. */
21761   var mapTag$6 = '[object Map]',
21762       setTag$6 = '[object Set]';
21763
21764   /**
21765    * Creates a `_.toPairs` or `_.toPairsIn` function.
21766    *
21767    * @private
21768    * @param {Function} keysFunc The function to get the keys of a given object.
21769    * @returns {Function} Returns the new pairs function.
21770    */
21771   function createToPairs(keysFunc) {
21772     return function(object) {
21773       var tag = getTag$1(object);
21774       if (tag == mapTag$6) {
21775         return mapToArray(object);
21776       }
21777       if (tag == setTag$6) {
21778         return setToPairs(object);
21779       }
21780       return baseToPairs(object, keysFunc(object));
21781     };
21782   }
21783
21784   /**
21785    * Creates an array of own enumerable string keyed-value pairs for `object`
21786    * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21787    * entries are returned.
21788    *
21789    * @static
21790    * @memberOf _
21791    * @since 4.0.0
21792    * @alias entries
21793    * @category Object
21794    * @param {Object} object The object to query.
21795    * @returns {Array} Returns the key-value pairs.
21796    * @example
21797    *
21798    * function Foo() {
21799    *   this.a = 1;
21800    *   this.b = 2;
21801    * }
21802    *
21803    * Foo.prototype.c = 3;
21804    *
21805    * _.toPairs(new Foo);
21806    * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21807    */
21808   var toPairs = createToPairs(keys$1);
21809
21810   /**
21811    * The base implementation of `_.isNaN` without support for number objects.
21812    *
21813    * @private
21814    * @param {*} value The value to check.
21815    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21816    */
21817   function baseIsNaN(value) {
21818     return value !== value;
21819   }
21820
21821   /**
21822    * A specialized version of `_.indexOf` which performs strict equality
21823    * comparisons of values, i.e. `===`.
21824    *
21825    * @private
21826    * @param {Array} array The array to inspect.
21827    * @param {*} value The value to search for.
21828    * @param {number} fromIndex The index to search from.
21829    * @returns {number} Returns the index of the matched value, else `-1`.
21830    */
21831   function strictIndexOf(array, value, fromIndex) {
21832     var index = fromIndex - 1,
21833         length = array.length;
21834
21835     while (++index < length) {
21836       if (array[index] === value) {
21837         return index;
21838       }
21839     }
21840     return -1;
21841   }
21842
21843   /**
21844    * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21845    *
21846    * @private
21847    * @param {Array} array The array to inspect.
21848    * @param {*} value The value to search for.
21849    * @param {number} fromIndex The index to search from.
21850    * @returns {number} Returns the index of the matched value, else `-1`.
21851    */
21852   function baseIndexOf(array, value, fromIndex) {
21853     return value === value
21854       ? strictIndexOf(array, value, fromIndex)
21855       : baseFindIndex(array, baseIsNaN, fromIndex);
21856   }
21857
21858   /**
21859    * A specialized version of `_.includes` for arrays without support for
21860    * specifying an index to search from.
21861    *
21862    * @private
21863    * @param {Array} [array] The array to inspect.
21864    * @param {*} target The value to search for.
21865    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21866    */
21867   function arrayIncludes(array, value) {
21868     var length = array == null ? 0 : array.length;
21869     return !!length && baseIndexOf(array, value, 0) > -1;
21870   }
21871
21872   /**
21873    * This function is like `arrayIncludes` except that it accepts a comparator.
21874    *
21875    * @private
21876    * @param {Array} [array] The array to inspect.
21877    * @param {*} target The value to search for.
21878    * @param {Function} comparator The comparator invoked per element.
21879    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21880    */
21881   function arrayIncludesWith(array, value, comparator) {
21882     var index = -1,
21883         length = array == null ? 0 : array.length;
21884
21885     while (++index < length) {
21886       if (comparator(value, array[index])) {
21887         return true;
21888       }
21889     }
21890     return false;
21891   }
21892
21893   /**
21894    * This method returns `undefined`.
21895    *
21896    * @static
21897    * @memberOf _
21898    * @since 2.3.0
21899    * @category Util
21900    * @example
21901    *
21902    * _.times(2, _.noop);
21903    * // => [undefined, undefined]
21904    */
21905   function noop$3() {
21906     // No operation performed.
21907   }
21908
21909   /** Used as references for various `Number` constants. */
21910   var INFINITY$3 = 1 / 0;
21911
21912   /**
21913    * Creates a set object of `values`.
21914    *
21915    * @private
21916    * @param {Array} values The values to add to the set.
21917    * @returns {Object} Returns the new set.
21918    */
21919   var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21920     return new Set$1(values);
21921   };
21922
21923   /** Used as the size to enable large array optimizations. */
21924   var LARGE_ARRAY_SIZE$1 = 200;
21925
21926   /**
21927    * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21928    *
21929    * @private
21930    * @param {Array} array The array to inspect.
21931    * @param {Function} [iteratee] The iteratee invoked per element.
21932    * @param {Function} [comparator] The comparator invoked per element.
21933    * @returns {Array} Returns the new duplicate free array.
21934    */
21935   function baseUniq(array, iteratee, comparator) {
21936     var index = -1,
21937         includes = arrayIncludes,
21938         length = array.length,
21939         isCommon = true,
21940         result = [],
21941         seen = result;
21942
21943     if (comparator) {
21944       isCommon = false;
21945       includes = arrayIncludesWith;
21946     }
21947     else if (length >= LARGE_ARRAY_SIZE$1) {
21948       var set = iteratee ? null : createSet(array);
21949       if (set) {
21950         return setToArray(set);
21951       }
21952       isCommon = false;
21953       includes = cacheHas;
21954       seen = new SetCache;
21955     }
21956     else {
21957       seen = iteratee ? [] : result;
21958     }
21959     outer:
21960     while (++index < length) {
21961       var value = array[index],
21962           computed = iteratee ? iteratee(value) : value;
21963
21964       value = (comparator || value !== 0) ? value : 0;
21965       if (isCommon && computed === computed) {
21966         var seenIndex = seen.length;
21967         while (seenIndex--) {
21968           if (seen[seenIndex] === computed) {
21969             continue outer;
21970           }
21971         }
21972         if (iteratee) {
21973           seen.push(computed);
21974         }
21975         result.push(value);
21976       }
21977       else if (!includes(seen, computed, comparator)) {
21978         if (seen !== result) {
21979           seen.push(computed);
21980         }
21981         result.push(value);
21982       }
21983     }
21984     return result;
21985   }
21986
21987   /**
21988    * This method is like `_.isArrayLike` except that it also checks if `value`
21989    * is an object.
21990    *
21991    * @static
21992    * @memberOf _
21993    * @since 4.0.0
21994    * @category Lang
21995    * @param {*} value The value to check.
21996    * @returns {boolean} Returns `true` if `value` is an array-like object,
21997    *  else `false`.
21998    * @example
21999    *
22000    * _.isArrayLikeObject([1, 2, 3]);
22001    * // => true
22002    *
22003    * _.isArrayLikeObject(document.body.children);
22004    * // => true
22005    *
22006    * _.isArrayLikeObject('abc');
22007    * // => false
22008    *
22009    * _.isArrayLikeObject(_.noop);
22010    * // => false
22011    */
22012   function isArrayLikeObject(value) {
22013     return isObjectLike(value) && isArrayLike(value);
22014   }
22015
22016   /**
22017    * Creates an array of unique values, in order, from all given arrays using
22018    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22019    * for equality comparisons.
22020    *
22021    * @static
22022    * @memberOf _
22023    * @since 0.1.0
22024    * @category Array
22025    * @param {...Array} [arrays] The arrays to inspect.
22026    * @returns {Array} Returns the new array of combined values.
22027    * @example
22028    *
22029    * _.union([2], [1, 2]);
22030    * // => [2, 1]
22031    */
22032   var union = baseRest(function(arrays) {
22033     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22034   });
22035
22036   /** Used as the size to enable large array optimizations. */
22037   var LARGE_ARRAY_SIZE$2 = 200;
22038
22039   /**
22040    * The base implementation of methods like `_.difference` without support
22041    * for excluding multiple arrays or iteratee shorthands.
22042    *
22043    * @private
22044    * @param {Array} array The array to inspect.
22045    * @param {Array} values The values to exclude.
22046    * @param {Function} [iteratee] The iteratee invoked per element.
22047    * @param {Function} [comparator] The comparator invoked per element.
22048    * @returns {Array} Returns the new array of filtered values.
22049    */
22050   function baseDifference(array, values, iteratee, comparator) {
22051     var index = -1,
22052         includes = arrayIncludes,
22053         isCommon = true,
22054         length = array.length,
22055         result = [],
22056         valuesLength = values.length;
22057
22058     if (!length) {
22059       return result;
22060     }
22061     if (iteratee) {
22062       values = arrayMap(values, baseUnary(iteratee));
22063     }
22064     if (comparator) {
22065       includes = arrayIncludesWith;
22066       isCommon = false;
22067     }
22068     else if (values.length >= LARGE_ARRAY_SIZE$2) {
22069       includes = cacheHas;
22070       isCommon = false;
22071       values = new SetCache(values);
22072     }
22073     outer:
22074     while (++index < length) {
22075       var value = array[index],
22076           computed = iteratee == null ? value : iteratee(value);
22077
22078       value = (comparator || value !== 0) ? value : 0;
22079       if (isCommon && computed === computed) {
22080         var valuesIndex = valuesLength;
22081         while (valuesIndex--) {
22082           if (values[valuesIndex] === computed) {
22083             continue outer;
22084           }
22085         }
22086         result.push(value);
22087       }
22088       else if (!includes(values, computed, comparator)) {
22089         result.push(value);
22090       }
22091     }
22092     return result;
22093   }
22094
22095   /**
22096    * Creates an array excluding all given values using
22097    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22098    * for equality comparisons.
22099    *
22100    * **Note:** Unlike `_.pull`, this method returns a new array.
22101    *
22102    * @static
22103    * @memberOf _
22104    * @since 0.1.0
22105    * @category Array
22106    * @param {Array} array The array to inspect.
22107    * @param {...*} [values] The values to exclude.
22108    * @returns {Array} Returns the new array of filtered values.
22109    * @see _.difference, _.xor
22110    * @example
22111    *
22112    * _.without([2, 1, 2, 3], 1, 2);
22113    * // => [3]
22114    */
22115   var without = baseRest(function(array, values) {
22116     return isArrayLikeObject(array)
22117       ? baseDifference(array, values)
22118       : [];
22119   });
22120
22121   function osmIsInterestingTag(key) {
22122       return key !== 'attribution' &&
22123           key !== 'created_by' &&
22124           key !== 'source' &&
22125           key !== 'odbl' &&
22126           key.indexOf('tiger:') !== 0;
22127
22128   }
22129
22130
22131   var osmOneWayTags = {
22132       'aerialway': {
22133           'chair_lift': true,
22134           'mixed_lift': true,
22135           't-bar': true,
22136           'j-bar': true,
22137           'platter': true,
22138           'rope_tow': true,
22139           'magic_carpet': true,
22140           'yes': true
22141       },
22142       'highway': {
22143           'motorway': true
22144       },
22145       'junction': {
22146           'circular': true,
22147           'roundabout': true
22148       },
22149       'man_made': {
22150           'piste:halfpipe': true
22151       },
22152       'piste:type': {
22153           'downhill': true,
22154           'sled': true,
22155           'yes': true
22156       },
22157       'waterway': {
22158           'canal': true,
22159           'ditch': true,
22160           'drain': true,
22161           'river': true,
22162           'stream': true
22163       }
22164   };
22165
22166
22167   var osmPavedTags = {
22168       'surface': {
22169           'paved': true,
22170           'asphalt': true,
22171           'concrete': true,
22172           'concrete:lanes': true,
22173           'concrete:plates': true
22174       },
22175       'tracktype': {
22176           'grade1': true
22177       }
22178   };
22179
22180   var wikipedia = [
22181       [
22182           "Abkhazian",
22183           "Аҧсшәа",
22184           "ab"
22185       ],
22186       [
22187           "Achinese",
22188           "Acèh",
22189           "ace"
22190       ],
22191       [
22192           "Adyghe",
22193           "адыгабзэ",
22194           "ady"
22195       ],
22196       [
22197           "Afrikaans",
22198           "Afrikaans",
22199           "af"
22200       ],
22201       [
22202           "Akan",
22203           "Akan",
22204           "ak"
22205       ],
22206       [
22207           "Alemannisch",
22208           "Alemannisch",
22209           "als"
22210       ],
22211       [
22212           "Amharic",
22213           "አማርኛ",
22214           "am"
22215       ],
22216       [
22217           "Aragonese",
22218           "aragonés",
22219           "an"
22220       ],
22221       [
22222           "Old English",
22223           "Ænglisc",
22224           "ang"
22225       ],
22226       [
22227           "Arabic",
22228           "العربية",
22229           "ar"
22230       ],
22231       [
22232           "Aramaic",
22233           "ܐܪܡܝܐ",
22234           "arc"
22235       ],
22236       [
22237           "Egyptian Arabic",
22238           "مصرى",
22239           "arz"
22240       ],
22241       [
22242           "Assamese",
22243           "অসমীয়া",
22244           "as"
22245       ],
22246       [
22247           "Asturian",
22248           "asturianu",
22249           "ast"
22250       ],
22251       [
22252           "Avaric",
22253           "авар",
22254           "av"
22255       ],
22256       [
22257           "Aymara",
22258           "Aymar aru",
22259           "ay"
22260       ],
22261       [
22262           "Azerbaijani",
22263           "azərbaycanca",
22264           "az"
22265       ],
22266       [
22267           "تۆرکجه",
22268           "تۆرکجه",
22269           "azb"
22270       ],
22271       [
22272           "Bashkir",
22273           "башҡортса",
22274           "ba"
22275       ],
22276       [
22277           "Bavarian",
22278           "Boarisch",
22279           "bar"
22280       ],
22281       [
22282           "Samogitian",
22283           "žemaitėška",
22284           "bat-smg"
22285       ],
22286       [
22287           "Bikol Central",
22288           "Bikol Central",
22289           "bcl"
22290       ],
22291       [
22292           "Belarusian",
22293           "беларуская",
22294           "be"
22295       ],
22296       [
22297           "беларуская (тарашкевіца)‎",
22298           "беларуская (тарашкевіца)‎",
22299           "be-x-old"
22300       ],
22301       [
22302           "Bulgarian",
22303           "български",
22304           "bg"
22305       ],
22306       [
22307           "भोजपुरी",
22308           "भोजपुरी",
22309           "bh"
22310       ],
22311       [
22312           "Bislama",
22313           "Bislama",
22314           "bi"
22315       ],
22316       [
22317           "Banjar",
22318           "Bahasa Banjar",
22319           "bjn"
22320       ],
22321       [
22322           "Bambara",
22323           "bamanankan",
22324           "bm"
22325       ],
22326       [
22327           "Bangla",
22328           "বাংলা",
22329           "bn"
22330       ],
22331       [
22332           "Tibetan",
22333           "བོད་ཡིག",
22334           "bo"
22335       ],
22336       [
22337           "Bishnupriya",
22338           "বিষ্ণুপ্রিয়া মণিপুরী",
22339           "bpy"
22340       ],
22341       [
22342           "Breton",
22343           "brezhoneg",
22344           "br"
22345       ],
22346       [
22347           "Bosnian",
22348           "bosanski",
22349           "bs"
22350       ],
22351       [
22352           "Buginese",
22353           "ᨅᨔ ᨕᨘᨁᨗ",
22354           "bug"
22355       ],
22356       [
22357           "буряад",
22358           "буряад",
22359           "bxr"
22360       ],
22361       [
22362           "Catalan",
22363           "català",
22364           "ca"
22365       ],
22366       [
22367           "Chavacano de Zamboanga",
22368           "Chavacano de Zamboanga",
22369           "cbk-zam"
22370       ],
22371       [
22372           "Min Dong Chinese",
22373           "Mìng-dĕ̤ng-ngṳ̄",
22374           "cdo"
22375       ],
22376       [
22377           "Chechen",
22378           "нохчийн",
22379           "ce"
22380       ],
22381       [
22382           "Cebuano",
22383           "Cebuano",
22384           "ceb"
22385       ],
22386       [
22387           "Chamorro",
22388           "Chamoru",
22389           "ch"
22390       ],
22391       [
22392           "Cherokee",
22393           "ᏣᎳᎩ",
22394           "chr"
22395       ],
22396       [
22397           "Cheyenne",
22398           "Tsetsêhestâhese",
22399           "chy"
22400       ],
22401       [
22402           "Central Kurdish",
22403           "کوردیی ناوەندی",
22404           "ckb"
22405       ],
22406       [
22407           "Corsican",
22408           "corsu",
22409           "co"
22410       ],
22411       [
22412           "Cree",
22413           "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
22414           "cr"
22415       ],
22416       [
22417           "Crimean Turkish",
22418           "qırımtatarca",
22419           "crh"
22420       ],
22421       [
22422           "Czech",
22423           "čeština",
22424           "cs"
22425       ],
22426       [
22427           "Kashubian",
22428           "kaszëbsczi",
22429           "csb"
22430       ],
22431       [
22432           "Church Slavic",
22433           "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
22434           "cu"
22435       ],
22436       [
22437           "Chuvash",
22438           "Чӑвашла",
22439           "cv"
22440       ],
22441       [
22442           "Welsh",
22443           "Cymraeg",
22444           "cy"
22445       ],
22446       [
22447           "Danish",
22448           "dansk",
22449           "da"
22450       ],
22451       [
22452           "German",
22453           "Deutsch",
22454           "de"
22455       ],
22456       [
22457           "Zazaki",
22458           "Zazaki",
22459           "diq"
22460       ],
22461       [
22462           "Lower Sorbian",
22463           "dolnoserbski",
22464           "dsb"
22465       ],
22466       [
22467           "Divehi",
22468           "ދިވެހިބަސް",
22469           "dv"
22470       ],
22471       [
22472           "Dzongkha",
22473           "ཇོང་ཁ",
22474           "dz"
22475       ],
22476       [
22477           "Ewe",
22478           "eʋegbe",
22479           "ee"
22480       ],
22481       [
22482           "Greek",
22483           "Ελληνικά",
22484           "el"
22485       ],
22486       [
22487           "Emiliano-Romagnolo",
22488           "emiliàn e rumagnòl",
22489           "eml"
22490       ],
22491       [
22492           "English",
22493           "English",
22494           "en"
22495       ],
22496       [
22497           "Esperanto",
22498           "Esperanto",
22499           "eo"
22500       ],
22501       [
22502           "Spanish",
22503           "español",
22504           "es"
22505       ],
22506       [
22507           "Estonian",
22508           "eesti",
22509           "et"
22510       ],
22511       [
22512           "Basque",
22513           "euskara",
22514           "eu"
22515       ],
22516       [
22517           "Extremaduran",
22518           "estremeñu",
22519           "ext"
22520       ],
22521       [
22522           "Persian",
22523           "فارسی",
22524           "fa"
22525       ],
22526       [
22527           "Fulah",
22528           "Fulfulde",
22529           "ff"
22530       ],
22531       [
22532           "Finnish",
22533           "suomi",
22534           "fi"
22535       ],
22536       [
22537           "Võro",
22538           "Võro",
22539           "fiu-vro"
22540       ],
22541       [
22542           "Fijian",
22543           "Na Vosa Vakaviti",
22544           "fj"
22545       ],
22546       [
22547           "Faroese",
22548           "føroyskt",
22549           "fo"
22550       ],
22551       [
22552           "French",
22553           "français",
22554           "fr"
22555       ],
22556       [
22557           "Arpitan",
22558           "arpetan",
22559           "frp"
22560       ],
22561       [
22562           "Northern Frisian",
22563           "Nordfriisk",
22564           "frr"
22565       ],
22566       [
22567           "Friulian",
22568           "furlan",
22569           "fur"
22570       ],
22571       [
22572           "Western Frisian",
22573           "Frysk",
22574           "fy"
22575       ],
22576       [
22577           "Irish",
22578           "Gaeilge",
22579           "ga"
22580       ],
22581       [
22582           "Gagauz",
22583           "Gagauz",
22584           "gag"
22585       ],
22586       [
22587           "Gan Chinese",
22588           "贛語",
22589           "gan"
22590       ],
22591       [
22592           "Scottish Gaelic",
22593           "Gàidhlig",
22594           "gd"
22595       ],
22596       [
22597           "Galician",
22598           "galego",
22599           "gl"
22600       ],
22601       [
22602           "Gilaki",
22603           "گیلکی",
22604           "glk"
22605       ],
22606       [
22607           "Guarani",
22608           "Avañe'ẽ",
22609           "gn"
22610       ],
22611       [
22612           "Goan Konkani",
22613           "गोंयची कोंकणी / Gõychi Konknni",
22614           "gom"
22615       ],
22616       [
22617           "Gothic",
22618           "𐌲𐌿𐍄𐌹𐍃𐌺",
22619           "got"
22620       ],
22621       [
22622           "Gujarati",
22623           "ગુજરાતી",
22624           "gu"
22625       ],
22626       [
22627           "Manx",
22628           "Gaelg",
22629           "gv"
22630       ],
22631       [
22632           "Hausa",
22633           "Hausa",
22634           "ha"
22635       ],
22636       [
22637           "Hakka Chinese",
22638           "客家語/Hak-kâ-ngî",
22639           "hak"
22640       ],
22641       [
22642           "Hawaiian",
22643           "Hawaiʻi",
22644           "haw"
22645       ],
22646       [
22647           "Hebrew",
22648           "עברית",
22649           "he"
22650       ],
22651       [
22652           "Hindi",
22653           "हिन्दी",
22654           "hi"
22655       ],
22656       [
22657           "Fiji Hindi",
22658           "Fiji Hindi",
22659           "hif"
22660       ],
22661       [
22662           "Croatian",
22663           "hrvatski",
22664           "hr"
22665       ],
22666       [
22667           "Upper Sorbian",
22668           "hornjoserbsce",
22669           "hsb"
22670       ],
22671       [
22672           "Haitian Creole",
22673           "Kreyòl ayisyen",
22674           "ht"
22675       ],
22676       [
22677           "Hungarian",
22678           "magyar",
22679           "hu"
22680       ],
22681       [
22682           "Armenian",
22683           "Հայերեն",
22684           "hy"
22685       ],
22686       [
22687           "Interlingua",
22688           "interlingua",
22689           "ia"
22690       ],
22691       [
22692           "Indonesian",
22693           "Bahasa Indonesia",
22694           "id"
22695       ],
22696       [
22697           "Interlingue",
22698           "Interlingue",
22699           "ie"
22700       ],
22701       [
22702           "Igbo",
22703           "Igbo",
22704           "ig"
22705       ],
22706       [
22707           "Inupiaq",
22708           "Iñupiak",
22709           "ik"
22710       ],
22711       [
22712           "Iloko",
22713           "Ilokano",
22714           "ilo"
22715       ],
22716       [
22717           "Ido",
22718           "Ido",
22719           "io"
22720       ],
22721       [
22722           "Icelandic",
22723           "íslenska",
22724           "is"
22725       ],
22726       [
22727           "Italian",
22728           "italiano",
22729           "it"
22730       ],
22731       [
22732           "Inuktitut",
22733           "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22734           "iu"
22735       ],
22736       [
22737           "Japanese",
22738           "日本語",
22739           "ja"
22740       ],
22741       [
22742           "Jamaican Creole English",
22743           "Patois",
22744           "jam"
22745       ],
22746       [
22747           "Lojban",
22748           "la .lojban.",
22749           "jbo"
22750       ],
22751       [
22752           "Javanese",
22753           "Basa Jawa",
22754           "jv"
22755       ],
22756       [
22757           "Georgian",
22758           "ქართული",
22759           "ka"
22760       ],
22761       [
22762           "Kara-Kalpak",
22763           "Qaraqalpaqsha",
22764           "kaa"
22765       ],
22766       [
22767           "Kabyle",
22768           "Taqbaylit",
22769           "kab"
22770       ],
22771       [
22772           "Kabardian",
22773           "Адыгэбзэ",
22774           "kbd"
22775       ],
22776       [
22777           "Kongo",
22778           "Kongo",
22779           "kg"
22780       ],
22781       [
22782           "Kikuyu",
22783           "Gĩkũyũ",
22784           "ki"
22785       ],
22786       [
22787           "Kazakh",
22788           "қазақша",
22789           "kk"
22790       ],
22791       [
22792           "Kalaallisut",
22793           "kalaallisut",
22794           "kl"
22795       ],
22796       [
22797           "Khmer",
22798           "ភាសាខ្មែរ",
22799           "km"
22800       ],
22801       [
22802           "Kannada",
22803           "ಕನ್ನಡ",
22804           "kn"
22805       ],
22806       [
22807           "Korean",
22808           "한국어",
22809           "ko"
22810       ],
22811       [
22812           "Komi-Permyak",
22813           "Перем Коми",
22814           "koi"
22815       ],
22816       [
22817           "Karachay-Balkar",
22818           "къарачай-малкъар",
22819           "krc"
22820       ],
22821       [
22822           "Kashmiri",
22823           "कॉशुर / کٲشُر",
22824           "ks"
22825       ],
22826       [
22827           "Colognian",
22828           "Ripoarisch",
22829           "ksh"
22830       ],
22831       [
22832           "Kurdish",
22833           "Kurdî",
22834           "ku"
22835       ],
22836       [
22837           "Komi",
22838           "коми",
22839           "kv"
22840       ],
22841       [
22842           "Cornish",
22843           "kernowek",
22844           "kw"
22845       ],
22846       [
22847           "Kyrgyz",
22848           "Кыргызча",
22849           "ky"
22850       ],
22851       [
22852           "Latin",
22853           "Latina",
22854           "la"
22855       ],
22856       [
22857           "Ladino",
22858           "Ladino",
22859           "lad"
22860       ],
22861       [
22862           "Luxembourgish",
22863           "Lëtzebuergesch",
22864           "lb"
22865       ],
22866       [
22867           "лакку",
22868           "лакку",
22869           "lbe"
22870       ],
22871       [
22872           "Lezghian",
22873           "лезги",
22874           "lez"
22875       ],
22876       [
22877           "Ganda",
22878           "Luganda",
22879           "lg"
22880       ],
22881       [
22882           "Limburgish",
22883           "Limburgs",
22884           "li"
22885       ],
22886       [
22887           "Ligurian",
22888           "Ligure",
22889           "lij"
22890       ],
22891       [
22892           "Lombard",
22893           "lumbaart",
22894           "lmo"
22895       ],
22896       [
22897           "Lingala",
22898           "lingála",
22899           "ln"
22900       ],
22901       [
22902           "Lao",
22903           "ລາວ",
22904           "lo"
22905       ],
22906       [
22907           "Northern Luri",
22908           "لۊری شومالی",
22909           "lrc"
22910       ],
22911       [
22912           "Lithuanian",
22913           "lietuvių",
22914           "lt"
22915       ],
22916       [
22917           "Latgalian",
22918           "latgaļu",
22919           "ltg"
22920       ],
22921       [
22922           "Latvian",
22923           "latviešu",
22924           "lv"
22925       ],
22926       [
22927           "Maithili",
22928           "मैथिली",
22929           "mai"
22930       ],
22931       [
22932           "Basa Banyumasan",
22933           "Basa Banyumasan",
22934           "map-bms"
22935       ],
22936       [
22937           "Moksha",
22938           "мокшень",
22939           "mdf"
22940       ],
22941       [
22942           "Malagasy",
22943           "Malagasy",
22944           "mg"
22945       ],
22946       [
22947           "Eastern Mari",
22948           "олык марий",
22949           "mhr"
22950       ],
22951       [
22952           "Maori",
22953           "Māori",
22954           "mi"
22955       ],
22956       [
22957           "Minangkabau",
22958           "Baso Minangkabau",
22959           "min"
22960       ],
22961       [
22962           "Macedonian",
22963           "македонски",
22964           "mk"
22965       ],
22966       [
22967           "Malayalam",
22968           "മലയാളം",
22969           "ml"
22970       ],
22971       [
22972           "Mongolian",
22973           "монгол",
22974           "mn"
22975       ],
22976       [
22977           "Marathi",
22978           "मराठी",
22979           "mr"
22980       ],
22981       [
22982           "Western Mari",
22983           "кырык мары",
22984           "mrj"
22985       ],
22986       [
22987           "Malay",
22988           "Bahasa Melayu",
22989           "ms"
22990       ],
22991       [
22992           "Maltese",
22993           "Malti",
22994           "mt"
22995       ],
22996       [
22997           "Mirandese",
22998           "Mirandés",
22999           "mwl"
23000       ],
23001       [
23002           "Burmese",
23003           "မြန်မာဘာသာ",
23004           "my"
23005       ],
23006       [
23007           "Erzya",
23008           "эрзянь",
23009           "myv"
23010       ],
23011       [
23012           "Mazanderani",
23013           "مازِرونی",
23014           "mzn"
23015       ],
23016       [
23017           "Nauru",
23018           "Dorerin Naoero",
23019           "na"
23020       ],
23021       [
23022           "Nāhuatl",
23023           "Nāhuatl",
23024           "nah"
23025       ],
23026       [
23027           "Neapolitan",
23028           "Napulitano",
23029           "nap"
23030       ],
23031       [
23032           "Low German",
23033           "Plattdüütsch",
23034           "nds"
23035       ],
23036       [
23037           "Low Saxon",
23038           "Nedersaksies",
23039           "nds-nl"
23040       ],
23041       [
23042           "Nepali",
23043           "नेपाली",
23044           "ne"
23045       ],
23046       [
23047           "Newari",
23048           "नेपाल भाषा",
23049           "new"
23050       ],
23051       [
23052           "Dutch",
23053           "Nederlands",
23054           "nl"
23055       ],
23056       [
23057           "Norwegian Nynorsk",
23058           "norsk nynorsk",
23059           "nn"
23060       ],
23061       [
23062           "Norwegian",
23063           "norsk bokmål",
23064           "no"
23065       ],
23066       [
23067           "Novial",
23068           "Novial",
23069           "nov"
23070       ],
23071       [
23072           "Nouormand",
23073           "Nouormand",
23074           "nrm"
23075       ],
23076       [
23077           "Northern Sotho",
23078           "Sesotho sa Leboa",
23079           "nso"
23080       ],
23081       [
23082           "Navajo",
23083           "Diné bizaad",
23084           "nv"
23085       ],
23086       [
23087           "Nyanja",
23088           "Chi-Chewa",
23089           "ny"
23090       ],
23091       [
23092           "Occitan",
23093           "occitan",
23094           "oc"
23095       ],
23096       [
23097           "Livvi-Karelian",
23098           "Livvinkarjala",
23099           "olo"
23100       ],
23101       [
23102           "Oromo",
23103           "Oromoo",
23104           "om"
23105       ],
23106       [
23107           "Odia",
23108           "ଓଡ଼ିଆ",
23109           "or"
23110       ],
23111       [
23112           "Ossetic",
23113           "Ирон",
23114           "os"
23115       ],
23116       [
23117           "Punjabi",
23118           "ਪੰਜਾਬੀ",
23119           "pa"
23120       ],
23121       [
23122           "Pangasinan",
23123           "Pangasinan",
23124           "pag"
23125       ],
23126       [
23127           "Pampanga",
23128           "Kapampangan",
23129           "pam"
23130       ],
23131       [
23132           "Papiamento",
23133           "Papiamentu",
23134           "pap"
23135       ],
23136       [
23137           "Picard",
23138           "Picard",
23139           "pcd"
23140       ],
23141       [
23142           "Pennsylvania German",
23143           "Deitsch",
23144           "pdc"
23145       ],
23146       [
23147           "Palatine German",
23148           "Pälzisch",
23149           "pfl"
23150       ],
23151       [
23152           "Pali",
23153           "पालि",
23154           "pi"
23155       ],
23156       [
23157           "Norfuk / Pitkern",
23158           "Norfuk / Pitkern",
23159           "pih"
23160       ],
23161       [
23162           "Polish",
23163           "polski",
23164           "pl"
23165       ],
23166       [
23167           "Piedmontese",
23168           "Piemontèis",
23169           "pms"
23170       ],
23171       [
23172           "Western Punjabi",
23173           "پنجابی",
23174           "pnb"
23175       ],
23176       [
23177           "Pontic",
23178           "Ποντιακά",
23179           "pnt"
23180       ],
23181       [
23182           "Pashto",
23183           "پښتو",
23184           "ps"
23185       ],
23186       [
23187           "Portuguese",
23188           "português",
23189           "pt"
23190       ],
23191       [
23192           "Quechua",
23193           "Runa Simi",
23194           "qu"
23195       ],
23196       [
23197           "Romansh",
23198           "rumantsch",
23199           "rm"
23200       ],
23201       [
23202           "Romani",
23203           "Romani",
23204           "rmy"
23205       ],
23206       [
23207           "Rundi",
23208           "Kirundi",
23209           "rn"
23210       ],
23211       [
23212           "Romanian",
23213           "română",
23214           "ro"
23215       ],
23216       [
23217           "Aromanian",
23218           "armãneashti",
23219           "roa-rup"
23220       ],
23221       [
23222           "tarandíne",
23223           "tarandíne",
23224           "roa-tara"
23225       ],
23226       [
23227           "Russian",
23228           "русский",
23229           "ru"
23230       ],
23231       [
23232           "Rusyn",
23233           "русиньскый",
23234           "rue"
23235       ],
23236       [
23237           "Kinyarwanda",
23238           "Kinyarwanda",
23239           "rw"
23240       ],
23241       [
23242           "Sanskrit",
23243           "संस्कृतम्",
23244           "sa"
23245       ],
23246       [
23247           "Sakha",
23248           "саха тыла",
23249           "sah"
23250       ],
23251       [
23252           "Sardinian",
23253           "sardu",
23254           "sc"
23255       ],
23256       [
23257           "Sicilian",
23258           "sicilianu",
23259           "scn"
23260       ],
23261       [
23262           "Scots",
23263           "Scots",
23264           "sco"
23265       ],
23266       [
23267           "Sindhi",
23268           "سنڌي",
23269           "sd"
23270       ],
23271       [
23272           "Northern Sami",
23273           "sámegiella",
23274           "se"
23275       ],
23276       [
23277           "Sango",
23278           "Sängö",
23279           "sg"
23280       ],
23281       [
23282           "Serbo-Croatian",
23283           "srpskohrvatski / српскохрватски",
23284           "sh"
23285       ],
23286       [
23287           "Sinhala",
23288           "සිංහල",
23289           "si"
23290       ],
23291       [
23292           "Simple English",
23293           "Simple English",
23294           "simple"
23295       ],
23296       [
23297           "Slovak",
23298           "slovenčina",
23299           "sk"
23300       ],
23301       [
23302           "Slovenian",
23303           "slovenščina",
23304           "sl"
23305       ],
23306       [
23307           "Samoan",
23308           "Gagana Samoa",
23309           "sm"
23310       ],
23311       [
23312           "Shona",
23313           "chiShona",
23314           "sn"
23315       ],
23316       [
23317           "Somali",
23318           "Soomaaliga",
23319           "so"
23320       ],
23321       [
23322           "Albanian",
23323           "shqip",
23324           "sq"
23325       ],
23326       [
23327           "Serbian",
23328           "српски / srpski",
23329           "sr"
23330       ],
23331       [
23332           "Sranan Tongo",
23333           "Sranantongo",
23334           "srn"
23335       ],
23336       [
23337           "Swati",
23338           "SiSwati",
23339           "ss"
23340       ],
23341       [
23342           "Southern Sotho",
23343           "Sesotho",
23344           "st"
23345       ],
23346       [
23347           "Saterland Frisian",
23348           "Seeltersk",
23349           "stq"
23350       ],
23351       [
23352           "Sundanese",
23353           "Basa Sunda",
23354           "su"
23355       ],
23356       [
23357           "Swedish",
23358           "svenska",
23359           "sv"
23360       ],
23361       [
23362           "Swahili",
23363           "Kiswahili",
23364           "sw"
23365       ],
23366       [
23367           "Silesian",
23368           "ślůnski",
23369           "szl"
23370       ],
23371       [
23372           "Tamil",
23373           "தமிழ்",
23374           "ta"
23375       ],
23376       [
23377           "Tulu",
23378           "ತುಳು",
23379           "tcy"
23380       ],
23381       [
23382           "Telugu",
23383           "తెలుగు",
23384           "te"
23385       ],
23386       [
23387           "Tetum",
23388           "tetun",
23389           "tet"
23390       ],
23391       [
23392           "Tajik",
23393           "тоҷикӣ",
23394           "tg"
23395       ],
23396       [
23397           "Thai",
23398           "ไทย",
23399           "th"
23400       ],
23401       [
23402           "Tigrinya",
23403           "ትግርኛ",
23404           "ti"
23405       ],
23406       [
23407           "Turkmen",
23408           "Türkmençe",
23409           "tk"
23410       ],
23411       [
23412           "Tagalog",
23413           "Tagalog",
23414           "tl"
23415       ],
23416       [
23417           "Tswana",
23418           "Setswana",
23419           "tn"
23420       ],
23421       [
23422           "Tongan",
23423           "lea faka-Tonga",
23424           "to"
23425       ],
23426       [
23427           "Tok Pisin",
23428           "Tok Pisin",
23429           "tpi"
23430       ],
23431       [
23432           "Turkish",
23433           "Türkçe",
23434           "tr"
23435       ],
23436       [
23437           "Tsonga",
23438           "Xitsonga",
23439           "ts"
23440       ],
23441       [
23442           "Tatar",
23443           "татарча/tatarça",
23444           "tt"
23445       ],
23446       [
23447           "Tumbuka",
23448           "chiTumbuka",
23449           "tum"
23450       ],
23451       [
23452           "Twi",
23453           "Twi",
23454           "tw"
23455       ],
23456       [
23457           "Tahitian",
23458           "reo tahiti",
23459           "ty"
23460       ],
23461       [
23462           "Tuvinian",
23463           "тыва дыл",
23464           "tyv"
23465       ],
23466       [
23467           "Udmurt",
23468           "удмурт",
23469           "udm"
23470       ],
23471       [
23472           "Uyghur",
23473           "ئۇيغۇرچە / Uyghurche",
23474           "ug"
23475       ],
23476       [
23477           "Ukrainian",
23478           "українська",
23479           "uk"
23480       ],
23481       [
23482           "Urdu",
23483           "اردو",
23484           "ur"
23485       ],
23486       [
23487           "Uzbek",
23488           "oʻzbekcha/ўзбекча",
23489           "uz"
23490       ],
23491       [
23492           "Venda",
23493           "Tshivenda",
23494           "ve"
23495       ],
23496       [
23497           "Venetian",
23498           "vèneto",
23499           "vec"
23500       ],
23501       [
23502           "Veps",
23503           "vepsän kel’",
23504           "vep"
23505       ],
23506       [
23507           "Vietnamese",
23508           "Tiếng Việt",
23509           "vi"
23510       ],
23511       [
23512           "West Flemish",
23513           "West-Vlams",
23514           "vls"
23515       ],
23516       [
23517           "Volapük",
23518           "Volapük",
23519           "vo"
23520       ],
23521       [
23522           "Walloon",
23523           "walon",
23524           "wa"
23525       ],
23526       [
23527           "Waray",
23528           "Winaray",
23529           "war"
23530       ],
23531       [
23532           "Wolof",
23533           "Wolof",
23534           "wo"
23535       ],
23536       [
23537           "Wu Chinese",
23538           "吴语",
23539           "wuu"
23540       ],
23541       [
23542           "Kalmyk",
23543           "хальмг",
23544           "xal"
23545       ],
23546       [
23547           "Xhosa",
23548           "isiXhosa",
23549           "xh"
23550       ],
23551       [
23552           "Mingrelian",
23553           "მარგალური",
23554           "xmf"
23555       ],
23556       [
23557           "Yiddish",
23558           "ייִדיש",
23559           "yi"
23560       ],
23561       [
23562           "Yoruba",
23563           "Yorùbá",
23564           "yo"
23565       ],
23566       [
23567           "Zhuang",
23568           "Vahcuengh",
23569           "za"
23570       ],
23571       [
23572           "Zeelandic",
23573           "Zeêuws",
23574           "zea"
23575       ],
23576       [
23577           "Chinese",
23578           "中文",
23579           "zh"
23580       ],
23581       [
23582           "Classical Chinese",
23583           "文言",
23584           "zh-classical"
23585       ],
23586       [
23587           "Chinese (Min Nan)",
23588           "Bân-lâm-gú",
23589           "zh-min-nan"
23590       ],
23591       [
23592           "Cantonese",
23593           "粵語",
23594           "zh-yue"
23595       ],
23596       [
23597           "Zulu",
23598           "isiZulu",
23599           "zu"
23600       ]
23601   ];
23602
23603   var wikipedia$1 = /*#__PURE__*/Object.freeze({
23604     default: wikipedia
23605   });
23606
23607   var require$$6 = ( wikipedia$1 && wikipedia ) || wikipedia$1;
23608
23609   var wikipedia$2 = require$$6;
23610
23611   var amenity = {arts_centre:{"Świetlica wiejska":{count:62},"Дом культуры":{count:182}},bank:{ABANCA:{count:83},"ABN AMRO":{count:152},ABSA:{count:105},AIB:{count:85},ANZ:{count:378},"ASB Bank":{count:51},"ATB Financial":{count:68},AXA:{count:106},Agribank:{count:58},Akbank:{count:129},"Alior Bank":{count:180},"Allahabad Bank":{count:52},"Allied Bank":{count:67},"Alpha Bank":{count:329},"Andhra Bank":{count:97},Antonveneta:{count:56},Argenta:{count:125},"Asia United Bank":{count:57},"Askari Bank":{count:71},"Associated Bank":{count:55},"Axis Bank":{count:198},BAC:{count:77},"BAWAG PSK":{count:97},"BB&T":{count:418},BBBank:{count:58},BBK:{count:122},BBVA:{count:1445},"BBVA Bancomer":{count:157},"BBVA Compass":{count:80},"BBVA Continental":{count:74},"BBVA Francés":{count:158},BCA:{count:135},BCI:{count:140},BCP:{count:226},BCR:{count:232},BDO:{count:538},"BGŻ BNP Paribas":{count:74},BMCE:{count:53},BMN:{count:88},BMO:{count:339},"BMO Harris Bank":{count:72},BNA:{count:70},BNI:{count:136},BNL:{count:159},"BNP Paribas":{count:1165},"BNP Paribas Fortis":{count:303},BOC:{count:95},BPH:{count:63},BPI:{count:579},"BPI Family Savings Bank":{count:54},BRD:{count:276},BRED:{count:70},BRI:{count:209},"BW-Bank":{count:95},"BZ WBK":{count:156},Banamex:{count:356},"Banc Sabadell":{count:175},"Banca Intesa":{count:92},"Banca March":{count:51},"Banca Popolare di Milano":{count:99},"Banca Popolare di Novara":{count:79},"Banca Popolare di Sondrio":{count:105},"Banca Popolare di Verona":{count:59},"Banca Popolare di Vicenza":{count:119},"Banca Românească":{count:61},"Banca Sella":{count:56},"Banca Transilvania":{count:167},"Banco Agrario":{count:58},"Banco Azteca":{count:119},"Banco BCI":{count:74},"Banco Continental":{count:64},"Banco Estado":{count:153},"Banco Fassil":{count:59},"Banco G&T Continental":{count:84},"Banco General":{count:53},"Banco Industrial":{count:91},"Banco Internacional":{count:62},"Banco Nacional":{count:143},"Banco Nación":{count:149},"Banco Pastor":{count:74},"Banco Pichincha":{count:109},"Banco Popular":{count:619},"Banco Provincia":{count:138},"Banco Sabadell":{count:189},"Banco Santander":{count:112},"Banco Sol":{count:74},"Banco de Bogotá":{count:74},"Banco de Chile":{count:175},"Banco de Costa Rica":{count:123},"Banco de Desarrollo Banrural":{count:85},"Banco de Occidente":{count:67},"Banco de Venezuela":{count:76},"Banco de la Nación":{count:156},"Banco de la Nación Argentina":{count:166},"Banco di Napoli":{count:79},"Banco di Sardegna":{count:79},"Banco do Brasil":{count:1313},"Banco do Nordeste":{count:56},BancoEstado:{count:121},Bancolombia:{count:170},Bancomer:{count:227},Bancpost:{count:77},Banesco:{count:209},"Bangkok Bank":{count:69},"Bank Al Habib":{count:52},"Bank Alfalah":{count:63},"Bank Austria":{count:123},"Bank BCA":{count:71},"Bank BNI":{count:67},"Bank BPH":{count:56},"Bank BRI":{count:196},"Bank Danamon":{count:60},"Bank Mandiri":{count:232},"Bank Mega":{count:54},"Bank Spółdzielczy":{count:395},"Bank Zachodni WBK":{count:103},"Bank of Africa":{count:59},"Bank of America":{count:1787},"Bank of Baroda":{count:122},"Bank of Ceylon":{count:74},"Bank of China":{count:152},"Bank of Commerce":{count:69},"Bank of India":{count:113},"Bank of Ireland":{count:151},"Bank of Montreal":{count:157},"Bank of New Zealand":{count:63},"Bank of Scotland":{count:122},"Bank of the West":{count:173},Bankia:{count:613},Bankinter:{count:139},"Banner Bank":{count:53},Banorte:{count:260},"Banque Atlantique":{count:57},"Banque Nationale":{count:137},"Banque Populaire":{count:919},Banrisul:{count:101},Banrural:{count:84},Barclays:{count:1243},Bcc:{count:54},Belfius:{count:285},"Bendigo Bank":{count:140},"Berliner Volksbank":{count:73},Bicentenario:{count:173},Bradesco:{count:977},"Budapest Bank":{count:56},CBAO:{count:53},"CEC Bank":{count:121},CGD:{count:52},"CIB Bank":{count:64},CIBC:{count:574},CIC:{count:742},"CIMB Bank":{count:64},CNEP:{count:52},"Caisse Desjardins":{count:69},"Caisse d'Épargne":{count:1607},Caixa:{count:239},"Caixa Econômica Federal":{count:573},"Caixa Geral de Depósitos":{count:231},CaixaBank:{count:343},"Caja Círculo":{count:68},"Caja Duero":{count:90},"Caja España":{count:74},"Caja Rural":{count:216},"Caja Rural de Jaén":{count:55},CajaSur:{count:73},Cajamar:{count:216},"Cajero Automatico Bancared":{count:123},"Canara Bank":{count:270},"Capital One":{count:199},Carige:{count:57},Cariparma:{count:69},"Cassa di Risparmio del Veneto":{count:102},CatalunyaCaixa:{count:107},"Central Bank of India":{count:60},Chase:{count:1658},"China Bank":{count:156},"China Bank Savings":{count:54},"China Construction Bank":{count:68},Citibank:{count:485},"Citizens Bank":{count:248},"Clydesdale Bank":{count:55},"Columbia Bank":{count:79},"Comerica Bank":{count:67},"Commerce Bank":{count:61},"Commercial Bank":{count:75},"Commercial Bank of Ceylon PLC":{count:100},Commerzbank:{count:879},"Commonwealth Bank":{count:376},"Corporation Bank":{count:92},Credem:{count:77},Credicoop:{count:111},"Credit Agricole":{count:104},"Credit Suisse":{count:93},Crelan:{count:53},"Crédit Agricole":{count:2544},"Crédit Mutuel":{count:1129},"Crédit Mutuel de Bretagne":{count:368},"Crédit du Nord":{count:148},"Crédito Agrícola":{count:87},"Cбербанк":{count:74},"Danske Bank":{count:157},Davivienda:{count:172},"De Venezuela":{count:87},Denizbank:{count:58},Desjardins:{count:80},"Deutsche Bank":{count:995},"Dubai Islamic Bank":{count:71},"EastWest Bank":{count:127},Ecobank:{count:197},"Erste Bank":{count:200},Eurobank:{count:261},"Express Union":{count:58},FNB:{count:143},"Federal Bank":{count:88},"Fifth Third Bank":{count:234},Finansbank:{count:68},"First Bank":{count:91},"First Citizens Bank":{count:88},"First National Bank":{count:209},Galicia:{count:179},Garanti:{count:58},"Garanti Bankası":{count:82},"Getin Bank":{count:112},Groupama:{count:61},"HDFC Bank":{count:219},HNB:{count:67},HSBC:{count:1748},Halifax:{count:367},Halkbank:{count:74},"Hamburger Sparkasse":{count:159},Handelsbanken:{count:250},"Hong Leong Bank":{count:51},"Hrvatska poštanska banka":{count:54},"Huntington Bank":{count:110},HypoVereinsbank:{count:408},ICBC:{count:158},"ICICI Bank":{count:224},"IDBI Bank":{count:73},ING:{count:654},"ING Bank Śląski":{count:128},IberCaja:{count:209},"Indian Bank":{count:98},"Indian Overseas Bank":{count:108},Interbank:{count:131},"Intesa San Paolo":{count:257},"Itaú":{count:1077},"K&H Bank":{count:75},KBC:{count:273},"Kasa Stefczyka":{count:65},"Key Bank":{count:382},"Komerční banka":{count:180},Kreissparkasse:{count:600},"Kreissparkasse Köln":{count:69},Kutxabank:{count:68},LCL:{count:903},"La Banque Postale":{count:124},"La Caixa":{count:1144},"Laboral Kutxa":{count:66},Landbank:{count:115},Liberbank:{count:164},"Lloyds Bank":{count:612},"M&T Bank":{count:184},MCB:{count:62},"MCB Bank":{count:54},"MONETA Money Bank":{count:92},Macro:{count:174},Maybank:{count:234},"Meezan Bank":{count:63},Mercantil:{count:132},"Metro Bank":{count:57},Metrobank:{count:434},"Millennium BCP":{count:119},"Millennium Bank":{count:386},"Monte dei Paschi di Siena":{count:265},Montepio:{count:113},NAB:{count:205},NSB:{count:51},NatWest:{count:800},"National Bank":{count:147},Nationwide:{count:337},Nedbank:{count:100},Nordea:{count:331},"Novo Banco":{count:101},OLB:{count:57},OTP:{count:362},Oberbank:{count:103},"Occidental de Descuento":{count:68},"Oldenburgische Landesbank":{count:68},"One Network Bank":{count:91},Osuuspankki:{count:89},PBZ:{count:65},PKO:{count:58},"PKO BP":{count:561},PNB:{count:323},PNC:{count:52},"PNC Bank":{count:639},PSBank:{count:108},Patagonia:{count:94},"Pekao SA":{count:155},"Peoples Bank":{count:254},"Philippine National Bank":{count:69},"Piraeus Bank":{count:96},Popular:{count:104},Postbank:{count:567},"Postbank Finanzcenter":{count:65},Provincial:{count:135},"Public Bank":{count:90},"Punjab National Bank":{count:134},RBC:{count:487},"RBC Financial Group":{count:59},RBS:{count:190},RCBC:{count:144},"RCBC Savings Bank":{count:84},Rabobank:{count:557},"Raiffeisen Polbank":{count:78},Raiffeisenbank:{count:2705},"Regions Bank":{count:204},"Republic Bank":{count:85},"Royal Bank":{count:90},"Royal Bank of Canada":{count:56},"Royal Bank of Scotland":{count:129},SEB:{count:129},"SNS Bank":{count:58},Sabadell:{count:97},"Sampath Bank":{count:87},Santander:{count:3268},"Santander Consumer Bank":{count:109},"Santander Río":{count:239},"Santander Totta":{count:201},Sberbank:{count:135},Scotiabank:{count:1144},"Security Bank":{count:171},Sicredi:{count:94},"Slovenská sporiteľňa":{count:165},"Société Générale":{count:1136},"Sparda-Bank":{count:277},Sparkasse:{count:4667},"Sparkasse Aachen":{count:56},"Sparkasse KölnBonn":{count:76},Stadtsparkasse:{count:68},"Stanbic Bank":{count:63},"Standard Bank":{count:165},"Standard Chartered":{count:95},"Standard Chartered Bank":{count:74},"State Bank of India":{count:1013},SunTrust:{count:322},Supervielle:{count:72},Swedbank:{count:252},"Syndicate Bank":{count:118},"TCF Bank":{count:85},"TD Bank":{count:425},"TD Canada Trust":{count:675},TEB:{count:56},TSB:{count:259},"Takarékszövetkezet":{count:120},Targobank:{count:279},"Tatra banka":{count:70},"Türkiye İş Bankası":{count:53},UBS:{count:169},"UCO Bank":{count:51},UCPB:{count:122},UOB:{count:126},"US Bank":{count:723},"Ulster Bank":{count:100},"Umpqua Bank":{count:103},"UniCredit Bank":{count:548},"Unicaja Banco":{count:182},"Unicredit Banca":{count:496},"Union Bank":{count:304},"United Bank":{count:68},"VR-Bank":{count:506},"Vakıfbank":{count:85},"Veneto Banca":{count:73},"Vijaya Bank":{count:56},"Volks- und Raiffeisenbank":{count:53},Volksbank:{count:2665},"Volksbank Mittelhessen":{count:53},"Volksbank Raiffeisenbank":{count:63},"VÚB":{count:105},"Washington Federal":{count:65},"Wells Fargo":{count:1947},"Western Union":{count:440},Westpac:{count:322},"Yorkshire Bank":{count:95},"Yorkshire Building Society":{count:69},"Zagrebačka banka":{count:54},"Ziraat Bankası":{count:172},mBank:{count:70},"ČSOB":{count:211},"Česká spořitelna":{count:243},"İş Bankası":{count:112},"Εθνική Τράπεζα":{count:103},"Πειραιώς":{count:120},"Τράπεζα Πειραιώς":{count:104},"Авангард":{count:76},"Альфа-Банк":{count:301},"Банк Москвы":{count:176},"Банка ДСК":{count:63},"Белагропромбанк":{count:184},"Беларусбанк":{count:570},"Белинвестбанк":{count:78},"Бинбанк":{count:114},"ВТБ":{count:80},"ВТБ24":{count:545},"Возрождение":{count:81},"Газпромбанк":{count:161},"Генбанк":{count:83},"Казкоммерцбанк":{count:74},"МДМ Банк":{count:52},"Московский индустриальный банк":{count:53},"Мособлбанк":{count:54},"Народный банк":{count:63},"ОТП Банк":{count:54},"Открытие":{count:92},"Ощадбанк":{count:883},"ПУМБ":{count:78},"Почта Банк":{count:65},"ПриватБанк":{count:1018},"Приватбанк":{count:76},"Приднестровский Сбербанк":{count:59},"Приорбанк":{count:69},"Промсвязьбанк":{count:133},"РНКБ":{count:124},"Райффайзен":{count:65},"Райффайзен Банк Аваль":{count:125},"Райффайзенбанк":{count:52},"Росбанк":{count:218},"Россельхозбанк":{count:374},"Русский стандарт":{count:55},"Сбербанк":{count:6921},"Совкомбанк":{count:186},"УкрСиббанк":{count:213},"Укрсоцбанк":{count:57},"Уралсиб":{count:130},"Хоум Кредит":{count:53},"בנק הפועלים":{count:112},"בנק לאומי":{count:83},"بانک":{count:219},"بانک آینده":{count:58},"بانک اقتصاد نوین":{count:78},"بانک انصار":{count:99},"بانک تجارت":{count:365},"بانک رفاه":{count:138},"بانک رفاه کارگران":{count:72},"بانک سپه":{count:348},"بانک شهر":{count:93},"بانک صادرات":{count:492},"بانک قوامین":{count:110},"بانک مسکن":{count:263},"بانک ملت":{count:428},"بانک ملی":{count:561},"بانک ملی ایران":{count:80},"بانک مهر اقتصاد":{count:92},"بانک پارسیان":{count:103},"بانک پاسارگاد":{count:107},"بانک کشاورزی":{count:277},"صادرات":{count:85},"ملی":{count:67},"پست بانک":{count:71},"ธนาคารกรุงเทพ":{count:121},"ธนาคารกรุงไทย":{count:85},"ธนาคารกสิกรไทย":{count:108},"ธนาคารออมสิน":{count:71},"ธนาคารไทยพาณิชย์":{count:95},"みずほ銀行":{count:255},"りそな銀行":{count:135},"三井住友銀行":{count:204},"三菱東京UFJ銀行":{count:235},"中国农业银行":{count:198},"中国工商银行":{count:181},"中国建设银行":{count:158},"中国邮政储蓄银行":{count:76},"中国银行":{count:275},"交通银行":{count:68},"京都中央信用金庫":{count:53},"京都銀行":{count:66},"农业银行":{count:78},"北海道銀行":{count:51},"合作金庫銀行":{count:55},"土地銀行":{count:54},"工商银行":{count:160},"建设银行":{count:89},"彰化銀行":{count:53},"招商银行":{count:94},"横浜銀行":{count:92},"第一銀行":{count:78},"華南銀行":{count:52},"국민은행":{count:199,tags:{"name:en":"Gungmin Bank"}},"기업은행":{count:53},"농협":{count:148},"새마을금고":{count:102},"신한은행":{count:245,tags:{"name:en":"Sinhan Bank"}},"우리은행":{count:316,tags:{"name:en":"Uri Bank"}},"하나은행":{count:85}},bar:{"Bar Centrale":{count:141},"Bar Sport":{count:90},"Beach Bar":{count:80},"Pool Bar":{count:54}},bicycle_rental:{Bicing:{count:130},"Call a Bike":{count:95},Grid:{count:51},Mibici:{count:116},metropolradruhr:{count:91}},bureau_de_change:{Abitab:{count:55},Change:{count:51},Travelex:{count:75},"Western Union":{count:189}},cafe:{"85度C":{count:128},"Bar Centrale":{count:77},"Bar Kafe":{count:253},Barista:{count:65},Bistro:{count:60},Bonafide:{count:63},"Cafe Coffee Day":{count:239},"Cafe Nero":{count:52},Cafeteria:{count:579},"Cafetería":{count:61},"Caffè Nero":{count:316},"Café Amazon":{count:241},"Café Central":{count:115},"Café de la Place":{count:55},"Café des Sports":{count:71},"Caribou Coffee":{count:184},"Coffee Fellows":{count:77},"Coffee House":{count:71},"Coffee Island":{count:51},"Coffee Time":{count:133},Costa:{count:1403},"Country Style":{count:58},"Dolce Vita":{count:55},"Dunkin' Donuts":{count:1662,tags:{cuisine:"donut"}},"Eiscafe Dolomiti":{count:51},"Eiscafe Venezia":{count:237},"Espresso House":{count:122},Havanna:{count:81},"Internet Cafe":{count:95},"Jamba Juice":{count:86},Kafe:{count:55},"Krispy Kreme":{count:63},"Le Pain Quotidien":{count:59},"McCafé":{count:72,tags:{amenity:"cafe",cuisine:"coffee_shop"}},"Peet's Coffee & Tea":{count:82},"Pret A Manger":{count:174},Prime:{count:51},"Second Cup":{count:234},Segafredo:{count:103},Starbucks:{count:8463,tags:{cuisine:"coffee_shop"}},Subway:{count:114},Tchibo:{count:168},"The Coffee Bean & Tea Leaf":{count:93},"The Coffee Club":{count:81},"Tim Hortons":{count:1945},"Traveler's Coffee":{count:70},Venezia:{count:55},"Wayne's Coffee":{count:52},"Берёзка":{count:52},"Бистро":{count:84},"Буфет":{count:56},"Встреча":{count:83},"Даблби":{count:59},"Закусочная":{count:101},"Кофе Хауз":{count:119},"Кофейня":{count:78},"Лакомка":{count:62},"Летнее кафе":{count:61},"Оазис":{count:54},"Пельменная":{count:63},"Пиццерия":{count:60},"Рандеву":{count:54},"Сказка":{count:66},"Смак":{count:62},"Старбакс":{count:55},"Столовая":{count:1181},"Теремок":{count:64},"Уют":{count:115},"Хуторок":{count:59},"Шашлычная":{count:153},"Шоколад":{count:54},"Шоколадница":{count:252},"ארומה":{count:64},"مقهى":{count:136},"คาเฟ่ อเมซอน":{count:59},"エクセルシオール カフェ":{count:61},"カフェ・ド・クリエ":{count:80,tags:{"name:en":"Cafe de CRIE"}},"カフェ・ベローチェ":{count:105},"コメダ珈琲店":{count:179},"サンマルクカフェ":{count:156},"スターバックス":{count:558,tags:{"name:en":"Starbucks"}},"タリーズコーヒー":{count:243},"ドトールコーヒーショップ":{count:489,tags:{"name:en":"Doutor"}},"星巴克":{count:146},"스타벅스":{count:52}},car_rental:{Alamo:{count:57},Avis:{count:604},Budget:{count:218},Enterprise:{count:594},"Enterprise Rent-a-Car":{count:51},Europcar:{count:611},Hertz:{count:654},Localiza:{count:59},Sixt:{count:323},Thrifty:{count:81},"U-Haul":{count:94},"オリックスレンタカー":{count:54},"トヨタレンタカー":{count:57},"トヨタレンタリース":{count:63},"ニッポンレンタカー":{count:113}},car_wash:{Aral:{count:88},Autolavaggio:{count:52},BP:{count:63},Esso:{count:55},"H-E-B Car Wash":{count:71},"Intermarché":{count:60},"Lavage Auto":{count:60},Lavazh:{count:52},Myjnia:{count:54},"Myjnia bezdotykowa":{count:93},"Myjnia samochodowa":{count:66},Shell:{count:162},"Spălătorie Auto":{count:69},"Spălătorie auto":{count:52},"Автомийка":{count:63}},cinema:{"Cinema City":{count:61},Cinemark:{count:87},Cinemex:{count:70},Cinepolis:{count:59},Cineworld:{count:64},Odeon:{count:81}},clinic:{"ФАП":{count:162}},dentist:{"Aspen Dental":{count:73},"Family Dentistry":{count:51},Vitaldent:{count:54},"Стоматолог":{count:72},"Стоматологія":{count:66}},doctors:{"Háziorvosi rendelő":{count:54},"Инвитро":{count:115},"ФАП":{count:147}},driving_school:{"Автодром":{count:55}},fast_food:{"A&W":{count:614},"Ali Baba":{count:101},"Angel's Burger":{count:66},Antalya:{count:53},"Arby's":{count:1432},"Asia Bistro":{count:53},"Asia Wok":{count:53},"Baskin-Robbins":{count:262,tags:{amenity:"ice_cream"}},Bistro:{count:80},"Bob's":{count:83},Bojangles:{count:89},"Booster Juice":{count:76},"Boston Market":{count:107},"Braum's":{count:58},"Burger King":{count:6601,tags:{cuisine:"burger"}},"Burger Machine":{count:55},"Büfé":{count:72},"Captain D's":{count:56},"Carl's Jr.":{count:593,tags:{cuisine:"burger"}},Checkers:{count:102},"Chick-fil-A":{count:906,tags:{cuisine:"chicken"}},"Chicken Express":{count:67},Chipotle:{count:688,tags:{cuisine:"mexican"}},Chowking:{count:250},"Church's Chicken":{count:249},"CoCo壱番屋":{count:218},"Cold Stone Creamery":{count:72},"Cook Out":{count:81},"Culver's":{count:541},DQ:{count:66},"Dairy Queen":{count:1485},"Del Taco":{count:244},Ditsch:{count:55},"Domino's Pizza":{count:2577,tags:{cuisine:"pizza"}},"Dunkin' Donuts":{count:747,tags:{cuisine:"donut"}},"El Pollo Loco":{count:132},Everest:{count:59},"Extreme Pita":{count:58},"Fazoli's":{count:53},"Firehouse Subs":{count:147},"Fish & Chips":{count:185},"Fish and Chips":{count:55},"Five Guys":{count:457},Greenwich:{count:83},"Habib's":{count:87},"Hallo Pizza":{count:98},"Hardee's":{count:634,tags:{cuisine:"burger"}},"Harvey's":{count:158},Hesburger:{count:164},"Hungry Jacks":{count:261,tags:{cuisine:"burger"}},"In-N-Out Burger":{count:211},Istanbul:{count:96},"Istanbul Kebab":{count:59},"Jack in the Box":{count:951,tags:{cuisine:"burger"}},"Jamba Juice":{count:148},"Jersey Mike's Subs":{count:88},"Jimmy John's":{count:519,tags:{cuisine:"sandwich"}},Jollibee:{count:740},KFC:{count:6003,tags:{cuisine:"chicken"}},"KFC/Taco Bell":{count:70},"Kebab House":{count:74},Kebabai:{count:64},"Kochlöffel":{count:78},Kotipizza:{count:89},"Krispy Kreme":{count:63},Krystal:{count:53},"Little Caesars":{count:567},"Little Caesars Pizza":{count:82},"Long John Silver's":{count:200},Lotteria:{count:67},Max:{count:54},"McDonald's":{count:18327,tags:{cuisine:"burger"}},"Minute Burger":{count:53},"Mr. Sub":{count:153},"New York Pizza":{count:65},Nordsee:{count:198},"Panda Express":{count:593,tags:{cuisine:"chinese"}},"Panera Bread":{count:120},"Papa John's":{count:820,tags:{cuisine:"pizza"}},"Papa Murphy's":{count:100},Pinulito:{count:58},"Pita Pit":{count:150},"Pizza Hut":{count:1503,tags:{cuisine:"pizza"}},"Pizza Hut Delivery":{count:70},"Pizza King":{count:56},"Pizza Nova":{count:90},"Pizza Pizza":{count:411},"Pollo Campero":{count:134},"Pollo Granjero":{count:66},"Popeye's":{count:521,tags:{cuisine:"chicken"}},"Popeyes Louisiana Kitchen":{count:51},Qdoba:{count:91},Quick:{count:434},Quiznos:{count:401},"Rally's":{count:68},"Red Rooster":{count:192},Sbarro:{count:65},"Schlotzsky's Deli":{count:348},Sibylla:{count:74},Sonic:{count:1166,tags:{cuisine:"burger"}},Starbucks:{count:60,tags:{cuisine:"coffee_shop"}},Steers:{count:190},Subway:{count:11431},"Taco Bell":{count:2947,tags:{cuisine:"mexican"}},"Taco Bueno":{count:59},"Taco Cabana":{count:57},"Taco Del Mar":{count:57},"Taco John's":{count:141},"Taco Time":{count:171},Telepizza:{count:323},"Thai Express":{count:63},"The Pizza Company":{count:62},"Waffle House":{count:86},"Wendy's":{count:3036,tags:{cuisine:"burger"}},Whataburger:{count:815},"White Castle":{count:149},Wienerschnitzel:{count:61},Wimpy:{count:168},"Zaxby's":{count:185},"Γρηγόρης":{count:59},"Бистро":{count:61},"Бургер Кинг":{count:181},"Крошка Картошка":{count:77},"Макдоналдс":{count:469,tags:{"name:en":"McDonald's"}},"Робин Сдобин":{count:131},"Русский Аппетит":{count:129},"Сабвэй":{count:73},"Стардог!s":{count:66},"Теремок":{count:155},"Шаверма":{count:93},"Шаурма":{count:265},"かっぱ寿司":{count:84},"かつや":{count:58},"くら寿司":{count:99},"すき家":{count:571,tags:{"name:en":"Sukiya"}},"なか卯":{count:180},"ほっかほっか亭":{count:57},"ほっともっと":{count:168},"オリジン弁当":{count:93},"ケンタッキーフライドチキン":{count:334,tags:{cuisine:"chicken","name:en":"KFC"}},"サブウェイ":{count:74},"スシロー":{count:94},"マクドナルド":{count:1261,tags:{cuisine:"burger","name:en":"McDonald's"}},"ミスタードーナツ":{count:188},"モスバーガー":{count:507,tags:{"name:en":"Mos Burger"}},"ロッテリア":{count:97},"丸亀製麺":{count:57},"吉野家":{count:461},"幸楽苑":{count:80},"摩斯漢堡":{count:86},"松屋":{count:574,tags:{"name:en":"Matsuya"}},"肯德基":{count:197},"麥當勞":{count:224},"麦当劳":{count:97},"롯데리아":{count:83}},fuel:{"76":{count:603},"1-2-3":{count:75},"7-Eleven":{count:1013},ABC:{count:83},ADNOC:{count:76},ANP:{count:202},ARAL:{count:68},Aegean:{count:56},Afriquia:{count:134},Agip:{count:2348},Agrola:{count:99},Alon:{count:54},Alpet:{count:61},Api:{count:234},Aral:{count:1708},Arco:{count:585},Asda:{count:51},Auchan:{count:84},Avanti:{count:112},Avia:{count:1061},BEBECO:{count:77},BFT:{count:102},BHPetrol:{count:60},BP:{count:4069},BR:{count:874},Bangchak:{count:106},Benzina:{count:167},"Bharat Petroleum":{count:230},Bliska:{count:141},CAMPSA:{count:420},CARREFOUR:{count:61},CEPSA:{count:892},CNG:{count:373},Caltex:{count:1574},Campsa:{count:64},"Canadian Tire":{count:97},Carrefour:{count:372},"Casey's General Store":{count:385},Cenex:{count:222},Cepsa:{count:305},Ceypetco:{count:70},Chevron:{count:1781},"Circle K":{count:730},Citgo:{count:692},Clark:{count:56},"Co-op":{count:52},"Coles Express":{count:305},Conoco:{count:398},Coop:{count:71},Copec:{count:566},Copetrol:{count:119},Cosmo:{count:68},"Costco Gasoline":{count:203},"Couche-Tard":{count:54},Crodux:{count:51},"Cumberland Farms":{count:93},Delta:{count:157},"Diamond Shamrock":{count:51},"Drummed Fuel":{count:178},"E. Leclerc":{count:136},EKO:{count:224},ENEOS:{count:1600},ENI:{count:92},ERG:{count:71},Elan:{count:208},Eneos:{count:130},Engen:{count:383},Eni:{count:681},Erg:{count:469},Esso:{count:4742},"Esso Express":{count:176},EuroOil:{count:52},Exxon:{count:1064},F24:{count:67},Firezone:{count:66},"Flying V":{count:175},GALP:{count:788},Gazprom:{count:68},GetGo:{count:54},Goil:{count:78},Gulf:{count:416},"H-E-B Fuel":{count:51},"H-E-B Gas":{count:155},HEM:{count:276},HP:{count:163},"HP Petrol Pump":{count:53},Helios:{count:63},Hess:{count:195},"Hindustan Petroleum":{count:82},Holiday:{count:156},Husky:{count:244},IES:{count:57},IP:{count:993},"Independent Fuel Station":{count:52},"Indian Oil":{count:416},"Indipend.":{count:129},Ingo:{count:62},"Intermarché":{count:556},"Intermarché Super":{count:102},Ipiranga:{count:173},Irving:{count:194},"JA-SS":{count:74},JOMO:{count:51},Jet:{count:707},Jetti:{count:61},Kangaroo:{count:115},Kobil:{count:87},Kroger:{count:59},"Kroger Fuel":{count:68},"Kum & Go":{count:136},"Kwik Trip":{count:210},LPG:{count:349},"LPG Station":{count:51},LUKOIL:{count:61},Liberty:{count:93},Lotos:{count:284},"Lotos Optima":{count:71},"Love's":{count:52},Lukoil:{count:908},MEROIL:{count:70},MOL:{count:436},MRS:{count:65},Marathon:{count:694},Maverik:{count:66},Maxol:{count:57},Metano:{count:248},Migrol:{count:71},Minipump:{count:140},Mobil:{count:1387},Mobile:{count:62},Mol:{count:64},Morrisons:{count:128},Moya:{count:62},"Murphy USA":{count:190},NP:{count:63},Neste:{count:166},"OIL!":{count:110},OK:{count:269},OKQ8:{count:218},OMV:{count:936},Oilibya:{count:127,tags:{brand:"Oilibya","name:ar":"أويليبيا"}},Opet:{count:117},Orlen:{count:1185},PETRONOR:{count:182},PSO:{count:121},"PSO Petrol Pump":{count:56},PT:{count:306},PTT:{count:423},"PV Oil":{count:100},"Pacific Pride":{count:54},Pecsa:{count:130},Pemex:{count:2023},Pertamina:{count:324},Petro:{count:54},"Petro-Canada":{count:893},Petrochina:{count:116},Petroecuador:{count:64},"Petrol Ofisi":{count:237},Petrolimex:{count:325},Petrom:{count:381},Petron:{count:1485},Petronas:{count:387},Petroperu:{count:110},"Phillips 66":{count:424},Phoenix:{count:210},Pilot:{count:69},Pioneer:{count:104},Posto:{count:52},"Posto Atem":{count:68},"Posto Ipiranga":{count:177},"Posto Shell":{count:104},Primax:{count:288},Prio:{count:52},Puma:{count:442},Q1:{count:53},Q8:{count:1467},"Q8 Easy":{count:66},QuikTrip:{count:251},REPSOL:{count:1380},RaceTrac:{count:80},Raiffeisenbank:{count:130},Repsol:{count:1099},Rompetrol:{count:234},"Royal Farms":{count:79},Rubis:{count:108},"SB Tank":{count:62},SPBU:{count:203},Safeway:{count:74},"Sainsbury's":{count:75},"Sam's Club":{count:57},Sasol:{count:90},"Sea Oil":{count:142},Sheetz:{count:304},Shell:{count:12317},"Shell Express":{count:135},Sinclair:{count:201},Sinopec:{count:106},"Sinopec Fuel":{count:116},Slovnaft:{count:259},Socar:{count:86},Sokimex:{count:85},Speedway:{count:556},St1:{count:141},Star:{count:419},"Star Oil":{count:100},"Station Service E. Leclerc":{count:423},Statoil:{count:495},"Stewart's":{count:72},Sunoco:{count:853},"Super U":{count:174},Tamoil:{count:959},Tango:{count:146},Teboil:{count:100},Tela:{count:191},Terpel:{count:367},Tesco:{count:218},Texaco:{count:1167},Tinq:{count:219},Topaz:{count:111},Total:{count:3591},"Total Access":{count:226},"Total Erg":{count:59},TotalErg:{count:267},"Turkey Hill":{count:80},"Turmöl":{count:80},Ultramar:{count:372},United:{count:197},Uno:{count:134},"Uno-X":{count:69},Valero:{count:778},Vito:{count:91},WOG:{count:350},Wawa:{count:173},Westfalen:{count:94},"Woolworths Petrol":{count:187},Z:{count:98},bft:{count:202},eni:{count:71},"ΕΚΟ":{count:58},"АГЗС":{count:1020},"АЗС":{count:86},"Авіас":{count:116},"БРСМ-Нафта":{count:64},"Башнефть":{count:272},"Белоруснефть":{count:71},"Газовая заправка":{count:57},"Газпромнефть":{count:1242},"Гелиос":{count:61},"ЕКА":{count:78},"Заправка":{count:63},"КазМунайГаз":{count:150},"Лукойл":{count:2327},"Макпетрол":{count:108},"НК Альянс":{count:105},"Нефтьмагистраль":{count:66},"ОККО":{count:316},"ОМВ":{count:55},"Октан":{count:53},"ПТК":{count:104},"Петрол":{count:124},"Пропан":{count:83},"Роснефть":{count:957},"Сибнефть":{count:51},"Сургутнефтегаз":{count:95},"ТНК":{count:588},"Татнефтепродукт":{count:58},"Татнефть":{count:331},"Укрнафта":{count:228},"דור אלון":{count:126},"דלק":{count:160},"סונול":{count:159},"פז":{count:209},"محطة وقود":{count:221},"محطه وقود":{count:98},"پمپ بنزین":{count:559},"پمپ گاز":{count:152},"บางจาก":{count:214},"ป.ต.ท.":{count:414},"เชลล์":{count:90},"เอสโซ่":{count:82},"エッソ":{count:70},"エネオス":{count:301},"コスモ石油":{count:415},"ゼネラル":{count:75},"中国石化":{count:104},"中国石化 Sinopec":{count:61},"中国石油":{count:82},"中油":{count:64},"出光":{count:620,tags:{"name:en":"Idemitsu"}},"加油站":{count:60},"台灣中油":{count:257},"昭和シェル":{count:274}},hospital:{"Cruz Roja":{count:93},IMSS:{count:64},"Инфекционное отделение":{count:91},"Кожно-венерологический диспансер":{count:57},"Районная больница":{count:88},"Роддом":{count:133},"Родильный дом":{count:75},"Скорая помощь":{count:75},"ФАП":{count:108},"ЦРБ":{count:122},"Центральная районная больница":{count:144},"โรงพยาบาลส่งเสริมสุขภาพตำบล":{count:69}},ice_cream:{"Baskin-Robbins":{count:69,tags:{amenity:"ice_cream"}},"Cold Stone Creamery":{count:66},Grido:{count:163}},kindergarten:{"Amado Nervo":{count:64},Anganwadi:{count:85},"Arche Noah":{count:67},"Benito Juarez":{count:89},"CONAFE Preescolar":{count:90},Cuauhtemoc:{count:54},"Cursos Comunitarios":{count:74},"Educacion Inicial de CONAFE No Escolarizado":{count:184},"Emiliano Zapata":{count:60},"Estefania Casta�eda":{count:53},"Evangelischer Kindergarten":{count:320},"Federico Froebel":{count:88},"Gabriela Mistral":{count:129},"Jean Piaget":{count:82},"Jose Vasconcelos":{count:71},"Juan Escutia":{count:82},"Katholischer Kindergarten":{count:99},"Kindergarten Regenbogen":{count:62},"Kindergarten St. Josef":{count:55},"Kindergarten St. Martin":{count:55},"Maria Montessori":{count:93},"Miguel Hidalgo Y Costilla":{count:57},"Ni�os Heroes":{count:68},PAUD:{count:82},Pusteblume:{count:54},"Rosaura Zapata":{count:68},"Sor Juana Ines De La Cruz":{count:76},Spatzennest:{count:54},"Städtischer Kindergarten":{count:103},"Villa Kunterbunt":{count:88},Waldkindergarten:{count:111},Waldorfkindergarten:{count:71},"Óvoda":{count:72},"Детсад":{count:65},"Детский сад \"Солнышко\"":{count:83},"Детский сад № 1":{count:54},"Детский сад №1":{count:150},"Детский сад №10":{count:77},"Детский сад №11":{count:81},"Детский сад №12":{count:57},"Детский сад №13":{count:57},"Детский сад №14":{count:76},"Детский сад №15":{count:72},"Детский сад №16":{count:58},"Детский сад №17":{count:67},"Детский сад №18":{count:77},"Детский сад №19":{count:62},"Детский сад №2":{count:155},"Детский сад №22":{count:60},"Детский сад №24":{count:53},"Детский сад №25":{count:56},"Детский сад №27":{count:54},"Детский сад №29":{count:57},"Детский сад №3":{count:129},"Детский сад №33":{count:55},"Детский сад №4":{count:86},"Детский сад №5":{count:106},"Детский сад №6":{count:93},"Детский сад №7":{count:98},"Детский сад №8":{count:80},"Детский сад №9":{count:80},"Дитячий садок":{count:58},"Сказка":{count:52},"Солнышко":{count:99},"Теремок":{count:59},"საბავშვო ბაღი":{count:69},"中央保育所":{count:56}},library:{"Biblioteca Comunale":{count:212},"Biblioteca comunale":{count:187},"Biblioteka Publiczna":{count:78},"Bibliothèque Municipale":{count:299},"Bibliothèque municipale":{count:247},"Bücherei":{count:113},"Central Library":{count:65},"Gemeindebücherei":{count:150},"Gminna Biblioteka Publiczna":{count:71},"Miejska Biblioteka Publiczna":{count:66},"Médiathèque":{count:287},"Městská knihovna":{count:60},"Public Library":{count:91},Stadtbibliothek:{count:232},"Stadtbücherei":{count:289},"Городская библиотека":{count:69},"Детская библиотека":{count:260},"Центральная библиотека":{count:83},"Центральная городская библиотека":{count:61},"图书馆":{count:65}},pharmacy:{"36.6":{count:57},"Adler-Apotheke":{count:375},"Alte Apotheke":{count:99},"Apollo Pharmacy":{count:87},Apotek:{count:62},"Apotek Hjärtat":{count:51},"Apotheke am Markt":{count:83},"Bahnhof Apotheke":{count:51},"Bahnhof-Apotheke":{count:90},"Bartell Drugs":{count:53},Benavides:{count:83},Benu:{count:61},Boots:{count:1348},Botica:{count:118},"Brunnen-Apotheke":{count:77},"Burg-Apotheke":{count:76},"Bären-Apotheke":{count:111},CVS:{count:3228},Camelia:{count:54},Catena:{count:112},"Chemist Warehouse":{count:82},Clicks:{count:123},"Cruz Azul":{count:97},"Cruz Verde":{count:223},"Dbam o Zdrowie":{count:68},"Dr. Max":{count:324},"Droga Raia":{count:152},"Drogaria São Paulo":{count:87},Drogasil:{count:157},"Duane Reade":{count:91},Eczane:{count:88},"Engel-Apotheke":{count:143},"Eurovaistinė":{count:89},Familiprix:{count:70},Farmacenter:{count:65},"Farmacia Centrale":{count:61},"Farmacia Comunale":{count:196},"Farmacia Guadalajara":{count:146},"Farmacia del Ahorro":{count:65},"Farmacias Ahumada":{count:182},"Farmacias Cruz Azul":{count:134},"Farmacias Cruz Verde":{count:162},"Farmacias Económicas":{count:63},"Farmacias Guadalajara":{count:107},"Farmacias SalcoBrand":{count:140},"Farmacias Sana Sana":{count:111},"Farmacias Similares":{count:137},"Farmacias del Ahorro":{count:187},Farmacity:{count:191},Farmahorro:{count:53},Farmatodo:{count:165},Felicia:{count:56},Fybeca:{count:52},"Generika Drugstore":{count:52},"Gintarinė vaistinė":{count:121},Guardian:{count:71},"Gyógyszertár":{count:59},"H-E-B Pharmacy":{count:239},"Hirsch-Apotheke":{count:180},"Hubertus Apotheke":{count:120},Inkafarma:{count:234},"Jean Coutu":{count:132},"Kinney Drugs":{count:74},"Kur-Apotheke":{count:52},"Linden-Apotheke":{count:224},Ljekarna:{count:77},"Lloyds Pharmacy":{count:539},"Lékárna":{count:52},"Löwen-Apotheke":{count:397},"Marien-Apotheke":{count:370},"Markt-Apotheke":{count:207},"Mercury Drug":{count:584},Mifarma:{count:195},"Mēness aptieka":{count:64},"Neue Apotheke":{count:129},"Pague Menos":{count:74},Panvel:{count:77},"Park-Apotheke":{count:54},"Pharmacie Centrale":{count:218},"Pharmacie Principale":{count:62},"Pharmacie de l'Hôtel de Ville":{count:52},"Pharmacie de la Gare":{count:114},"Pharmacie de la Mairie":{count:71},"Pharmacie de la Poste":{count:68},"Pharmacie du Centre":{count:154},"Pharmacie du Marché":{count:110},"Pharmacie du Parc":{count:60},Pharmaprix:{count:99},Pharmasave:{count:129},"Punkt Apteczny":{count:53},"Rathaus-Apotheke":{count:181},"Rats-Apotheke":{count:126},Rexall:{count:109},"Rite Aid":{count:1481},"Rose Pharmacy":{count:99},"Rosen-Apotheke":{count:205},"Rowlands Pharmacy":{count:127},SalcoBrand:{count:112},"Sana Sana":{count:95},"Schloss-Apotheke":{count:62},Sensiblu:{count:115},"Shoppers Drug Mart":{count:713},"Sonnen-Apotheke":{count:372},"South Star Drug":{count:69},"Stadt-Apotheke":{count:397},"Stern-Apotheke":{count:83},Superdrug:{count:177},"São João":{count:54},"The Generics Pharmacy":{count:211},Uniprix:{count:63},Walgreens:{count:3314},"Walgreens Pharmacy":{count:76},"Walmart Pharmacy":{count:99},Watsons:{count:110},"Well Pharmacy":{count:61},"centro naturista":{count:123},"А5":{count:94},"Айболит":{count:88},"Аптека 36,6":{count:285},"Аптека низких цен":{count:65},"Аптека низьких цін":{count:88},"Аптека от склада":{count:83},"Аптека №1":{count:92},"Аптечный пункт":{count:285},"Арніка":{count:124},"Бережная аптека":{count:67},"Будь здоров":{count:63},"Вита":{count:140},"Горздрав":{count:395},"Живика":{count:105},"Здоровье":{count:87},"Имплозия":{count:84},"Классика":{count:102},"Ладушка":{count:53},"Мед-сервіс":{count:59},"Мелодия здоровья":{count:60},"Невис":{count:151},"Норма":{count:89},"Озерки":{count:54},"Панацея":{count:68},"Первая помощь":{count:132},"Планета здоровья":{count:140},"Радуга":{count:139},"Ригла":{count:215},"Семейная":{count:52},"Социальная аптека":{count:62},"Столички":{count:83},"Фармакопейка":{count:85},"Фармакор":{count:106},"Фармация":{count:187},"Фармленд":{count:108},"Центральная аптека":{count:57},"סופר-פארם":{count:93},"داروخانه":{count:264},"داروخانه شبانه روزی":{count:54},"صيدلية":{count:148},"くすりの福太郎":{count:51},"さくら薬局":{count:52},"ウエルシア":{count:84},"カワチ薬品":{count:52},"クリエイト":{count:53},"サンドラッグ":{count:130},"スギ薬局":{count:134},"セイジョー":{count:58},"ツルハドラッグ":{count:185},"ドラッグてらしま (Drug Terashima)":{count:58},"マツモトキヨシ":{count:221},"丁丁藥局":{count:75}},pub:{"Black Bull":{count:55},"Commercial Hotel":{count:62},"Cross Keys":{count:64},"Irish Pub":{count:107},"Kings Arms":{count:81},"Kings Head":{count:65},"New Inn":{count:100},"Prince of Wales":{count:89},"Queens Head":{count:55},"Red Lion":{count:201},"Rose & Crown":{count:63},"Rose and Crown":{count:82},"Royal Hotel":{count:64},"Royal Oak":{count:172},"The Albion":{count:51},"The Anchor":{count:68},"The Angel":{count:55},"The Beehive":{count:52},"The Bell":{count:128},"The Bell Inn":{count:58},"The Black Horse":{count:100},"The Bull":{count:82},"The Castle":{count:63},"The Chequers":{count:74},"The Cricketers":{count:56},"The Cross Keys":{count:58},"The Crown":{count:252},"The Crown Inn":{count:88},"The Fox":{count:76},"The George":{count:119},"The Green Man":{count:59},"The Greyhound":{count:99},"The Kings Arms":{count:65},"The Kings Head":{count:68},"The New Inn":{count:126},"The Plough":{count:182},"The Plough Inn":{count:57},"The Queens Head":{count:61},"The Railway":{count:112},"The Red Lion":{count:271},"The Rising Sun":{count:74},"The Royal Oak":{count:223},"The Ship":{count:92},"The Ship Inn":{count:98},"The Star":{count:72},"The Star Inn":{count:53},"The Sun Inn":{count:51},"The Swan":{count:155},"The Swan Inn":{count:59},"The Victoria":{count:72},"The Wheatsheaf":{count:126},"The White Hart":{count:247},"The White Horse":{count:234},"The White Lion":{count:75},"The White Swan":{count:55},"魚民":{count:119},"鳥貴族":{count:57}},restaurant:{Adler:{count:228},Adria:{count:60},"Adyar Ananda Bhavan":{count:60},Akropolis:{count:212},"Ali Baba":{count:59},"Alte Post":{count:68},"Applebee's":{count:977},Asia:{count:78},Athen:{count:75},Athos:{count:61},Autogrill:{count:60},Bahnhof:{count:56},"Bella Italia":{count:194},"Bella Napoli":{count:88},"Big Boy":{count:58},Bistro:{count:64},"Bob Evans":{count:269},"Bonefish Grill":{count:73},"Boston Market":{count:91},"Boston Pizza":{count:278},"Buffalo Grill":{count:282},"Buffalo Wild Wings":{count:454},"Bären":{count:75},Cafeteria:{count:65},"California Pizza Kitchen":{count:116},Campanile:{count:55},Canteen:{count:91},Capri:{count:56},"Captain D's":{count:54},"Carluccio's":{count:57},"Carpe Diem":{count:60},"Carrabba's Italian Grill":{count:62},"Casa Mia":{count:64},Casablanca:{count:61},"Cheesecake Factory":{count:52},Chifa:{count:86},"Chili's":{count:698},"China Buffet":{count:54},"China Garden":{count:114},"China House":{count:72},"China Town":{count:117},"China Wok":{count:100},Chiquito:{count:55},"Chuck E. Cheese's":{count:54},"Cici's Pizza":{count:51},"CoCo壱番屋":{count:77},"Cold Stone Creamery":{count:67},Comedor:{count:60},"Comida China":{count:52},Courtepaille:{count:170},"Cracker Barrel":{count:392},"Da Grasso":{count:63},"Da Vinci":{count:88},Delphi:{count:105},"Denny's":{count:850},"Deutsches Haus":{count:93},Dionysos:{count:75},"Dolce Vita":{count:121},Dorfkrug:{count:60},"Dunkin' Donuts":{count:94,tags:{cuisine:"donut"}},"East Side Mario's":{count:53},"El Greco":{count:112},"El Paso":{count:60},"El Rancho":{count:82},Europa:{count:61},"Famous Dave's":{count:62},"Firehouse Subs":{count:85},"Five Guys":{count:91},Flunch:{count:179},"Frankie & Benny's":{count:151},"Friendly's":{count:113},"Gasthaus Krone":{count:93},"Gasthaus zur Linde":{count:59},"Gasthof zur Post":{count:109},"Golden Corral":{count:209},"Golden Dragon":{count:62},"Great Wall":{count:54},"Grüner Baum":{count:122},Gusto:{count:74},"Hard Rock Cafe":{count:96},"Hardee's":{count:56,tags:{cuisine:"burger"}},Harvester:{count:75},Hellas:{count:66},Hippopotamus:{count:115},Hirsch:{count:83},Hirschen:{count:86},"Hong Kong":{count:126},Hooters:{count:190},IHOP:{count:758},"IL Патио":{count:51},"Jason's Deli":{count:73},"Jimmy John's":{count:150,tags:{cuisine:"sandwich"}},"Joe's Crab Shack":{count:70},"Jägerhof":{count:54},Kantine:{count:104},"Kelsey's":{count:66},Kirchenwirt:{count:94},Kreta:{count:70},Kreuz:{count:85},Krone:{count:179},Kudu:{count:172},"L'Escale":{count:66},"L'Osteria":{count:80},"La Bodega":{count:55},"La Boucherie":{count:80},"La Cantina":{count:105},"La Casa":{count:66},"La Casona":{count:62},"La Dolce Vita":{count:129},"La Fontana":{count:62},"La Gondola":{count:60},"La Hacienda":{count:54},"La Pataterie":{count:116},"La Pergola":{count:87},"La Perla":{count:85},"La Piazza":{count:123},"La Piazzetta":{count:77},"La Place":{count:55},"La Scala":{count:62},"La Strada":{count:74},"La Tagliatella":{count:69},"La Tasca":{count:56},"La Taverna":{count:58},"La Terrasse":{count:82},"La Terraza":{count:56},"La Terrazza":{count:57},"La Trattoria":{count:91},Lamm:{count:69},Linde:{count:114},Lindenhof:{count:95},"Little Caesars":{count:80},"Little Chef":{count:62},"Little Italy":{count:90},"Logan's Roadhouse":{count:89},"LongHorn Steakhouse":{count:183},Lotus:{count:87},"Léon de Bruxelles":{count:63},"Löwen":{count:141},"MK Restaurants":{count:65},Maharaja:{count:52},"Mamma Mia":{count:130},Mandarin:{count:90},"Mang Inasal":{count:128},"Marco Polo":{count:62},"Marco's Pizza":{count:53},"McAlister's Deli":{count:51},Mediterraneo:{count:55},"Mellow Mushroom":{count:73},Mensa:{count:148},Milano:{count:77},"Mimi's Cafe":{count:52},"Moe's Southwest Grill":{count:79},Mykonos:{count:89},Mythos:{count:61},"Nando's":{count:412},"Noodles & Company":{count:106},"O'Charley's":{count:61},Oasis:{count:73},"Ocean Basket":{count:71},Ochsen:{count:94},"Old Chicago":{count:54},"Olive Garden":{count:504},Olympia:{count:86},Osaka:{count:52},"Outback Steakhouse":{count:399},"P.F. Chang's":{count:53},"Pancake House":{count:79},Panda:{count:52},"Panera Bread":{count:582},Panorama:{count:102},"Papa Murphy's":{count:66},Parrilla:{count:62},Peking:{count:68},Perkins:{count:157},Pinocchio:{count:63},"Pizza Express":{count:417},"Pizza Factory":{count:59},"Pizza House":{count:56},"Pizza Hut":{count:2688,tags:{cuisine:"pizza"}},"Pizza Ranch":{count:77},"Pizzeria Italia":{count:65},"Pizzeria Milano":{count:51},"Pizzeria Napoli":{count:53},"Pizzeria Roma":{count:86},"Pizzeria Venezia":{count:54},"Poivre Rouge":{count:56},"Pollo Campero":{count:53},Pomodoro:{count:62},Portofino:{count:67},Poseidon:{count:145},Prezzo:{count:147},Qdoba:{count:81},"Qdoba Mexican Grill":{count:54},Ratskeller:{count:161},"Red Lobster":{count:419},"Red Robin":{count:312},"Restaurante Universitário":{count:53},Rhodos:{count:94},"Ristorante Del Arte":{count:160},Roma:{count:85},Rose:{count:51},"Round Table Pizza":{count:100},"Ruby Tuesday":{count:303},"Rössle":{count:54},"Rössli":{count:93},Saigon:{count:51},Sakura:{count:139},"San Marco":{count:88},Santorini:{count:59},"Schwarzer Adler":{count:65},"Schützenhaus":{count:151},"Shakey's":{count:64},Shalimar:{count:53},Shanghai:{count:96},"Shari's":{count:75},"Shoney's":{count:55},Sizzler:{count:90},Sonic:{count:80,tags:{cuisine:"burger"}},Sonne:{count:121},Sphinx:{count:66},Sportheim:{count:113},Spur:{count:70},Starbucks:{count:54,tags:{cuisine:"coffee_shop"}},"Steak 'n Shake":{count:86,tags:{cuisine:"burger"}},Sternen:{count:85},Subway:{count:1108},"Sunset Grill":{count:55},Sushi:{count:88},"Sushi Bar":{count:68},"Swiss Chalet":{count:162},Syrtaki:{count:65},"TGI Friday's":{count:364},"Taj Mahal":{count:183},"Taste of India":{count:68},Taverna:{count:69},Telepizza:{count:109},"Texas Roadhouse":{count:232},"The Cheesecake Factory":{count:52},"Tim Hortons":{count:61},"Toby Carvery":{count:51},"Tony Roma's":{count:63},Toscana:{count:76},Trattoria:{count:70},Traube:{count:68},Vapiano:{count:136},Venezia:{count:68},"Village Inn":{count:149},Vips:{count:109},"Waffle House":{count:521},Wagamama:{count:111},"Waldschänke":{count:52},Warung:{count:73},Wasabi:{count:70},Wimpy:{count:66},"Zaxby's":{count:60},Zizzi:{count:102},Zorbas:{count:62},"Zum Hirschen":{count:52},"Zum Löwen":{count:80},"Zur Krone":{count:96},"Zur Linde":{count:228},"Zur Post":{count:125},"Zur Sonne":{count:77},"Евразия":{count:93},"Ресторан":{count:60},"Тануки":{count:62},"Якитория":{count:84},"رستوران":{count:72},"مطعم":{count:52},"すき家":{count:61,tags:{"name:en":"Sukiya"}},"はま寿司":{count:67},"びっくりドンキー":{count:120},"やよい軒":{count:71},"ガスト":{count:512,tags:{"name:en":"Gusto"}},"ココス":{count:142},"サイゼリア":{count:54},"サイゼリヤ":{count:285},"ジョイフル":{count:83},"ジョナサン":{count:139},"ジョリーパスタ":{count:75},"デニーズ":{count:199},"バーミヤン":{count:130},"ロイヤルホスト":{count:108},"丸亀製麺":{count:98},"八方雲集":{count:145},"吉野家":{count:61},"夢庵":{count:67},"大戸屋":{count:68},"大阪王将":{count:68},"天下一品":{count:70},"安楽亭":{count:60},"牛角":{count:107},"食堂":{count:63},"餃子の王将":{count:212},"바다횟집 (Bada Fish Restaurant)":{count:52}},school:{"Adolfo Lopez Mateos":{count:137},"Agustin Ya�ez":{count:57},"Albert-Schweitzer-Schule":{count:81},"Amado Nervo":{count:85},"Astrid-Lindgren-Schule":{count:77},"Benito Juarez":{count:294},"Brown School":{count:54},CEM:{count:215},"Center School":{count:115},"Central Elementary School":{count:179},"Central High School":{count:130},"Central School":{count:215},"Colegio San José":{count:74},"Collège Jean Moulin":{count:68},"Collège privé Saint-Joseph":{count:60},Cuauhtemoc:{count:152},"Curso Comunitario":{count:57},"Cursos Comunitarios":{count:116},EPP:{count:112},"Emiliano Zapata":{count:286},"Fairview Elementary School":{count:64},"Fairview School":{count:164},"Francisco I Madero":{count:86},"Francisco I. Madero":{count:52},"Francisco Villa":{count:116},"Franklin Elementary School":{count:96},"Franklin School":{count:126},"Garfield Elementary School":{count:69},"Garfield School":{count:58},"Gimnazjum nr 1":{count:59},"Government School":{count:60},"Gregorio Torres Quintero":{count:53},"Groupe Scolaire":{count:57},"Guadalupe Victoria":{count:58},"Highland School":{count:71},"Hillcrest Elementary School":{count:63},"Holy Cross School":{count:68},"Holy Family School":{count:77},"Holy Trinity School":{count:59},"Ignacio Allende":{count:51},"Ignacio Zaragoza":{count:98},"Immaculate Conception School":{count:83},"Jackson Elementary School":{count:53},"Jackson School":{count:56},"Jefferson Elementary School":{count:177},"Jefferson School":{count:108},"Jose Clemente Orozco":{count:59},"Jose Ma Morelos Y Pavon":{count:120},"Jose Vasconcelos":{count:73},"Josefa Ortiz De Dominguez":{count:78},"Juan Escutia":{count:121},"Justo Sierra":{count:118},Kumon:{count:66},"Lazaro Cardenas":{count:68},"Lazaro Cardenas Del Rio":{count:153},"Leona Vicario":{count:64},"Liberty Elementary School":{count:56},"Liberty School":{count:84},"Lincoln Elementary School":{count:264},"Lincoln School":{count:269},"Longfellow Elementary School":{count:55},"Longfellow School":{count:53},"Madison Elementary School":{count:55},"Manuel Lopez Cotilla":{count:107},"Maple Grove School":{count:51},"McKinley Elementary School":{count:62},"McKinley School":{count:63},"Miguel Hidalgo":{count:86},"Miguel Hidalgo Y Costilla":{count:213},"Miller School":{count:66},"Mount Pleasant School":{count:61},"Mount Zion School":{count:53},"Mountain View Elementary School":{count:52},"New Hope School":{count:51},"Nicolas Bravo":{count:58},"Ni�os Heroes":{count:155},"Nombre En Tramite":{count:126},"North Elementary School":{count:57},"Oak Grove School":{count:148},"Pedro Moreno":{count:69},Pestalozzischule:{count:84},"Pine Grove School":{count:63},"Pleasant Hill School":{count:110},"Pleasant Valley School":{count:85},"Pleasant View School":{count:61},"Primaria Comunitaria":{count:59},"Ramon Corona":{count:54},"Ricardo Flores Magon":{count:91},"Riverside School":{count:76},"Roosevelt Elementary School":{count:112},"Roosevelt School":{count:114},SD:{count:76},SDN:{count:290},"Sacred Heart School":{count:206},"Saint Francis School":{count:56},"Saint James School":{count:83},"Saint Johns School":{count:173},"Saint Joseph School":{count:147},"Saint Josephs School":{count:157},"Saint Kizito Primary School":{count:61},"Saint Mary School":{count:54},"Saint Marys School":{count:256},"Saint Patricks School":{count:80},"Saint Paul School":{count:53},"Saint Pauls School":{count:74},"Saint Peters School":{count:81},Schillerschule:{count:61},"School Number 1":{count:233},"School Number 2":{count:206},"School Number 3":{count:184},"School Number 4":{count:126},"Smith School":{count:60},"Sor Juana Ines De La Cruz":{count:56},"South Elementary School":{count:53},"Sunnyside School":{count:60},"Szkoła Podstawowa nr 1":{count:78},"Szkoła Podstawowa nr 2":{count:75},"Szkoła Podstawowa nr 3":{count:60},"Trinity School":{count:85},"UNIDAD EDUCATIVA":{count:106},"Union School":{count:128},"Valentin Gomez Farias":{count:71},"Venustiano Carranza":{count:64},"Vicente Guerrero":{count:159},Volkshochschule:{count:105},Volksschule:{count:366},"Washington Elementary School":{count:192},"Washington School":{count:213},"West Elementary School":{count:58},"White School":{count:51},"Wilson Elementary School":{count:66},"Wilson School":{count:80},"Általános iskola":{count:105},"École Jules Ferry":{count:51},"École Notre-Dame":{count:61},"École Saint-Joseph":{count:96},"École primaire Jean Jaurès":{count:71},"École primaire Jules Ferry":{count:82},"École primaire privée Notre-Dame":{count:69},"École primaire privée Saint-Joseph":{count:132},"École primaire privée Sainte-Marie":{count:63},"École élémentaire Jules Ferry":{count:52},"Școala Generală":{count:51},"Școală":{count:53},"Вечерняя школа":{count:53},"Гимназия №1":{count:96},"ДЮСШ":{count:63},"Средняя школа №1":{count:80},"Средняя школа №2":{count:86},"Средняя школа №3":{count:58},"Школа № 1":{count:130},"Школа № 2":{count:117},"Школа № 3":{count:80},"Школа № 4":{count:77},"Школа № 5":{count:55},"Школа №1":{count:576},"Школа №10":{count:167},"Школа №11":{count:148},"Школа №12":{count:136},"Школа №13":{count:129},"Школа №14":{count:123},"Школа №15":{count:129},"Школа №16":{count:99},"Школа №17":{count:117},"Школа №18":{count:111},"Школа №19":{count:98},"Школа №2":{count:509},"Школа №20":{count:100},"Школа №21":{count:72},"Школа №22":{count:72},"Школа №23":{count:75},"Школа №24":{count:78},"Школа №25":{count:57},"Школа №26":{count:64},"Школа №27":{count:58},"Школа №28":{count:53},"Школа №3":{count:393},"Школа №31":{count:55},"Школа №35":{count:54},"Школа №4":{count:281},"Школа №5":{count:275},"Школа №6":{count:217},"Школа №7":{count:215},"Школа №8":{count:188},"Школа №9":{count:183},"مدرسة":{count:92},"مدرسه":{count:500},"市立南中学校":{count:53},"市立南小学校":{count:56},"市立東中学校":{count:54}},social_facility:{"Safe Haven":{count:92},"Детский дом":{count:70},"Социальный участковый":{count:195}},theatre:{Amfiteatr:{count:97},Amphitheater:{count:110},Amphitheatre:{count:109},"Freilichtbühne":{count:78},"Teatro Comunale":{count:56}}};
23612   var leisure = {fitness_centre:{"Anytime Fitness":{count:143},"Gold's Gym":{count:61},"LA Fitness":{count:126},"Planet Fitness":{count:106},"Snap Fitness":{count:67}},playground:{"Çocuk Parkı":{count:60},"놀이터":{count:292}},sports_centre:{"Anytime Fitness":{count:152},"Complejo Municipal de Deportes":{count:88},"Complexe Sportif":{count:51},Curves:{count:91},"Fitness First":{count:70},"Gold's Gym":{count:82},"Kieser Training":{count:90},"LA Fitness":{count:72},"Life Time Fitness":{count:76},McFit:{count:60},"Mrs. Sporty":{count:76},Orlik:{count:82},"Pabellón Municipal de Deportes":{count:109},"Palestra Comunale":{count:81},"Planet Fitness":{count:106},"Salle Omnisport":{count:57},"Schützenhaus":{count:79},"Snap Fitness":{count:51},"Virgin Active":{count:69},YMCA:{count:174},"ДЮСШ":{count:82},"Ледовый дворец":{count:54},"体育館":{count:80}},swimming_pool:{Schwimmerbecken:{count:57},"Yüzme Havuzu":{count:51},"プール":{count:56},"游泳池":{count:55}}};
23613   var man_made = {windmill:{"De Hoop":{count:57}}};
23614   var shop = {alcohol:{Alko:{count:170},"BC Liquor Store":{count:66},BWS:{count:157},"Bargain Booze":{count:140},"Beer Store":{count:66},Botilleria:{count:121},"Dan Murphy's":{count:61},"Gall & Gall":{count:511},LCBO:{count:430},"Liquor Depot":{count:53},"Liquor Store":{count:72},Liquorland:{count:112},Mitra:{count:60},Nicolas:{count:253},SAQ:{count:169},Systembolaget:{count:271},"The Beer Store":{count:231},Vinmonopolet:{count:66},"Алкомаркет":{count:67},"Ароматный мир":{count:196},"Бристоль":{count:329},"Градус":{count:52},"Живое пиво":{count:182},"Красное & Белое":{count:989},"Кристалл":{count:56},"Норман":{count:146},"Отдохни":{count:75},"Пиво":{count:73},"Разливное пиво":{count:143}},baby_goods:{Aubert:{count:56},"Babies R Us":{count:80},BabyOne:{count:52},"西松屋":{count:53}},bakery:{AILI:{count:53},Anker:{count:85},Awiteks:{count:53},Backshop:{count:57},Backwerk:{count:161},Baguette:{count:72},"Bakers Delight":{count:75},"Bakker Bart":{count:97},Banette:{count:111},"Bäckerei Fuchs":{count:62},"Bäckerei Grimminger":{count:51},"Bäckerei Müller":{count:68},"Bäckerei Schmidt":{count:103},"Bäckerei Schneider":{count:52},Cooplands:{count:63},"Dat Backhus":{count:81},"Der Beck":{count:114},"Der Mann":{count:53},Ditsch:{count:70},"Dunkin' Donuts":{count:55,tags:{cuisine:"donut"}},Fornetti:{count:113},"Goeken backen":{count:53},Goldilocks:{count:124},Greggs:{count:613},Hofpfisterei:{count:134},Ihle:{count:108},"Julie's Bakeshop":{count:57},"K&U":{count:117},"K&U Bäckerei":{count:54},Kamps:{count:268},"La Mie Câline":{count:56},"Le Crobag":{count:54},"Le Fournil":{count:57},"Lila Bäcker":{count:107},"Lipóti Pékség":{count:54},"Marie Blachère":{count:89},Mlinar:{count:80},Musmanni:{count:81},Oebel:{count:65},Paul:{count:186},"Red Ribbon":{count:72},"Schäfer's":{count:146},Sehne:{count:91},"Stadtbäckerei":{count:60},Steinecke:{count:268},"Sternenbäck":{count:89},"Ströck":{count:62},"Wiener Feinbäcker":{count:55},"von Allwörden":{count:65},"Булочная":{count:71},"Горячий хлеб":{count:54},"Каравай":{count:56},"Кулиничи":{count:121},"Кулиничі":{count:59},"Свежий хлеб":{count:68},"Хлеб":{count:177},"مخبز":{count:72},"مخبزة":{count:55},"نان لواش":{count:54},"نانوایی":{count:665},"نانوایی بربری":{count:140},"نانوایی سنگک":{count:68},"نانوایی سنگکی":{count:52},"نانوایی لواش":{count:63}},beauty:{Marionnaud:{count:54},"Sally Beauty Supply":{count:151},"Yves Rocher":{count:654}},bed:{"Dänisches Bettenlager":{count:157},"Matratzen Concord":{count:361},"Mattress Firm":{count:173},"Sleepy's":{count:52}},beverages:{"50嵐":{count:101},Dursty:{count:77},"Edeka Getränkemarkt":{count:69},Fristo:{count:88},"Getränke Hoffmann":{count:187},"Getränkeland":{count:81},"Getränkemarkt":{count:110},"Orterer Getränkemarkt":{count:64},"Rewe Getränkemarkt":{count:256},Trinkgut:{count:112},"茶湯會":{count:56}},bicycle:{Giant:{count:52},Halfords:{count:158},"Веломарка":{count:51},"サイクルベースあさひ":{count:87}},bookmaker:{Betfred:{count:320},Coral:{count:466},Ladbrokes:{count:629},"Paddy Power":{count:127},"William Hill":{count:634},"ΟΠΑΠ":{count:102}},butcher:{"Boucherie Charcuterie":{count:51},"Carnicería":{count:78},"Fleischerei Richter":{count:51},"Húsbolt":{count:52},Macelleria:{count:84},Vinzenzmurr:{count:55},"Ариант":{count:84},"Великолукский мясокомбинат":{count:173},"Мясная лавка":{count:226},"Мясницкий ряд":{count:64},"Мясной":{count:53},"Мясо":{count:156},"Наша Ряба":{count:60},"Свежее мясо":{count:111}},car:{Audi:{count:191},BMW:{count:216},Chevrolet:{count:259},"Citroën":{count:445},Dacia:{count:56},Fiat:{count:167},Ford:{count:446},Honda:{count:348},Hyundai:{count:421},Isuzu:{count:66},Kia:{count:456},"Land Rover":{count:54},Lexus:{count:76},Mazda:{count:193},"Mercedes-Benz":{count:447},Mitsubishi:{count:176},"Mitsubishi Motors":{count:60},NISSAN:{count:51},Nissan:{count:424},Opel:{count:218},Peugeot:{count:527},Porsche:{count:97},Renault:{count:701},Seat:{count:90},Skoda:{count:143},Subaru:{count:118},Suzuki:{count:178},Toyota:{count:597},Volkswagen:{count:371},Volvo:{count:180}},car_parts:{"Advance Auto Parts":{count:306},AutoZone:{count:759},Brezan:{count:95},Halfords:{count:95},"NAPA Auto Parts":{count:250},"Napa Auto Parts":{count:61},"O'Reilly Auto Parts":{count:374},Repco:{count:77},"Tokić":{count:61},"repuestos automotrices":{count:56},"Автозапчастини":{count:61},"Автомир":{count:53},"イエローハット":{count:80},"オートバックス":{count:91},"タイヤ館":{count:83}},car_repair:{"A.T.U":{count:457},"Advance Auto Parts":{count:290},Borracharia:{count:56},"Bosch Car Service":{count:65},Carglass:{count:234},"Citroën":{count:108},Euromaster:{count:142},"Feu Vert":{count:178},Firestone:{count:224},"Firestone Complete Auto Care":{count:73},Ford:{count:61},"Garage Renault":{count:84},Gomeria:{count:153},"Gomería":{count:107},Goodyear:{count:97},"Grease Monkey":{count:57},Halfords:{count:56},"Jiffy Lube":{count:464},"Kwik Fit":{count:249},Lubricentro:{count:83},Meineke:{count:52},Mekonomen:{count:59},Midas:{count:462},"Mr. Lube":{count:56},"NAPA Auto Parts":{count:82},Norauto:{count:257},"O'Reilly Auto Parts":{count:227},"Pep Boys":{count:79},Peugeot:{count:152},"Pit Stop":{count:84},"Point S":{count:59},Renault:{count:294},Roady:{count:82},"Sears Auto Center":{count:59},Speedy:{count:192},"Stacja Kontroli Pojazdów":{count:70},Taller:{count:63},Toyota:{count:63},Valvoline:{count:52},"Valvoline Instant Oil Change":{count:92},Wulkanizacja:{count:84},"ÖAMTC":{count:52},"Автомастерская":{count:93},"Авторемонт":{count:57},"Автосервис":{count:799},"Автосервис+шиномонтаж":{count:66},"Вулканизация":{count:72},"Замена масла":{count:98},"СТО":{count:1058},"Шиномонтаж":{count:3591},"шиномонтаж":{count:173}},carpet:{"Carpet Right":{count:111},Carpetright:{count:53}},charity:{"Age UK":{count:116},"Barnardo's":{count:56},"British Heart Foundation":{count:189},"Cancer Research UK":{count:129},Goodwill:{count:120},Oxfam:{count:216},"Salvation Army":{count:63},Scope:{count:74},"Sue Ryder":{count:83}},chemist:{"7 Дней":{count:55},Bipa:{count:485},Budnikowsky:{count:114},CVS:{count:58},Etos:{count:486},Kruidvat:{count:1169},Matas:{count:74},"Müller":{count:350},Rossmann:{count:2516},Schlecker:{count:51},Teta:{count:120},Trekpleister:{count:185},Walgreens:{count:142},Watsons:{count:123},dm:{count:1877},"Бытовая химия":{count:73},"Магнит Косметик":{count:233},"Мила":{count:70},"Остров чистоты":{count:110},"Рубль Бум":{count:68},"Улыбка радуги":{count:110},"スギ薬局":{count:51},"丁丁藥局":{count:72},"屈臣氏":{count:134},"康是美":{count:81}},clothes:{AOKI:{count:119},AWG:{count:95},Ackermans:{count:98},Adidas:{count:224},Adler:{count:83},"American Apparel":{count:89},"American Eagle Outfitters":{count:93},Anthropologie:{count:55},Ardene:{count:55},"Armand Thiery":{count:89},"Banana Republic":{count:120},Benetton:{count:190},Bershka:{count:166},Bonita:{count:315},Bonobo:{count:59},"Brooks Brothers":{count:55},Burberry:{count:63},"Burlington Coat Factory":{count:104},Burton:{count:94},"C&A":{count:860},"Cache Cache":{count:59},"Calvin Klein":{count:78},Calzedonia:{count:264},"Camaïeu":{count:167},Caroll:{count:75},"Carter's":{count:64},Cecil:{count:119},Celio:{count:206},"Charles Vögele":{count:133},"Chico's":{count:96},Cropp:{count:68},Cubus:{count:65},Desigual:{count:175},Devred:{count:59},Didi:{count:72},Diesel:{count:77},"Dorothy Perkins":{count:85},"Dress Barn":{count:135},Dressmann:{count:67},"Eddie Bauer":{count:54},Edgars:{count:117},Engbers:{count:64},"Ernsting's family":{count:720},Esprit:{count:404},Etam:{count:121},Express:{count:56},"Fat Face":{count:82},"Forever 21":{count:124},Gant:{count:78},Gap:{count:258},"Gerry Weber":{count:220},"Gina Laura":{count:80},Goodwill:{count:65},Guess:{count:146},Gymboree:{count:60},"Gémo":{count:99},"H&M":{count:1467},Hallhuber:{count:63},House:{count:67},"Hugo Boss":{count:109},Humana:{count:83},"Hunkemöller":{count:224},Intimissimi:{count:173},JBC:{count:54},"Jack & Jones":{count:174},"Jack Wolfskin":{count:68},"Jeans Fritz":{count:110},Jennyfer:{count:81},Jet:{count:68},Jigsaw:{count:51},Jules:{count:120},Justice:{count:81},KappAhl:{count:68},KiK:{count:1862},Kiabi:{count:276},"La Halle":{count:148},Lacoste:{count:193},"Lane Bryant":{count:86},"Levi's":{count:197},Lindex:{count:120},Loft:{count:62},Mango:{count:339},"Marc O'Polo":{count:82},"Mark's":{count:76},"Marks & Spencer":{count:53},Marshalls:{count:218},"Massimo Dutti":{count:109},Matalan:{count:144},Maurices:{count:70},"Max Mara":{count:55},"Men's Wearhouse":{count:128},Mexx:{count:68},"Michael Kors":{count:55},Mim:{count:57},Monsoon:{count:75},"Mr Price":{count:99},NKD:{count:783},"New Look":{count:280},"New Yorker":{count:350},NewYorker:{count:54},Next:{count:313},Nike:{count:122},"Nordstrom Rack":{count:57},OVS:{count:92},"Okaïdi":{count:63},"Old Navy":{count:361},Only:{count:94},Orchestra:{count:117},"Original Marines":{count:60},Orsay:{count:168},Outfit:{count:51},Outlet:{count:63},Palmers:{count:78},Peacocks:{count:178},"Peek & Cloppenburg":{count:69},Pep:{count:139},Pepco:{count:153},"Petit Bateau":{count:67},Pimkie:{count:163},"Plato's Closet":{count:53},Primark:{count:177},Promod:{count:195},"Pull & Bear":{count:63},Puma:{count:65},Reitmans:{count:71},Reserved:{count:150},"River Island":{count:125},Ross:{count:363},Sela:{count:58},"Sergent Major":{count:77},Shoeby:{count:109},Sisley:{count:82},Springfield:{count:83},Stefanel:{count:63},Steps:{count:56},Stradivarius:{count:103},"Street One":{count:153},Superdry:{count:82},"TJ Maxx":{count:200},"TK Maxx":{count:209},Takko:{count:843},Talbots:{count:54},"Tally Weijl":{count:151},Tati:{count:64},Terranova:{count:63},Tesha:{count:76},Tezenis:{count:98},"The Children's Place":{count:71},"The North Face":{count:56},"The Sting":{count:53},Timberland:{count:87},"Toko Pakaian":{count:72},"Tom Tailor":{count:120},"Tommy Hilfiger":{count:206},Topshop:{count:62},Triumph:{count:132},Truworths:{count:72},"Ulla Popken":{count:117},Uniqlo:{count:63},"United Colors of Benetton":{count:210},"Urban Outfitters":{count:130},"Vero Moda":{count:222},"Victoria's Secret":{count:143},"Vögele":{count:191},WE:{count:68},Wibra:{count:99},Winners:{count:112},Woolworths:{count:119},Yamamay:{count:65},Zara:{count:540},Zeeman:{count:379},"mister*lady":{count:59},"s.Oliver":{count:103},"Детская одежда":{count:59},"Женская одежда":{count:65},"Липненски":{count:81},"Московская ярмарка":{count:51},"Одежда":{count:163},"Смешные цены":{count:86},"Спецодежда":{count:85},"しまむら":{count:213},"ユニクロ":{count:201},"ワークマン":{count:65},"洋服の青山":{count:242},"西松屋":{count:113}},coffee:{"Café Amazon":{count:212},Nespresso:{count:74},Starbucks:{count:264,tags:{cuisine:"coffee_shop"}},Tchibo:{count:197}},computer:{"Apple Store":{count:75},DNS:{count:234},"PC World":{count:59},"ДНС":{count:55}},confectionery:{"Fagyizó":{count:58},Hussel:{count:78},Leonidas:{count:84},"T. SN":{count:77},Thorntons:{count:66}},convenience:{"711":{count:64},"777":{count:58},"24 часа":{count:85},"7-Eleven":{count:11418},"8 à Huit":{count:82},"99 Speedmart":{count:85},ABC:{count:716},AMPM:{count:125},"Aibė":{count:112},Alepa:{count:60},Alfamart:{count:427},Alimentara:{count:63},Almacen:{count:405},"Almacén":{count:94},Aral:{count:93},BP:{count:273},"BP Shop":{count:70},Baqala:{count:181},"Best One":{count:57},"Best-One":{count:63},Biedronka:{count:98},Bodega:{count:83},Bonjour:{count:71},CBA:{count:299},COOP:{count:470},"COOP Jednota":{count:381},CU:{count:324},"Carrefour City":{count:91},"Carrefour Express":{count:255},"Casey's General Store":{count:225},"Casino Shop":{count:56},Centra:{count:139},"Central Convenience Store":{count:69},Chevron:{count:110},"Circle K":{count:790},Citgo:{count:73},"Co-Op":{count:54},"Co-op":{count:161},"Coles Express":{count:217},Coop:{count:492},"Coop Jednota":{count:128},"Corner Store":{count:109},Costcutter:{count:435},"Couche-Tard":{count:139},"Cumberland Farms":{count:109},"Daisy Mart":{count:57},Delikatesy:{count:148},"Delikatesy Centrum":{count:182},"Dollar General":{count:646},"Dollar Tree":{count:67},"Dépanneur":{count:53},Esso:{count:143},Express:{count:53},Extra:{count:86},Exxon:{count:51},"Family Dollar":{count:85},FamilyMart:{count:919},"Food Mart":{count:512},"Four Square":{count:99},Franprix:{count:96},Fresh:{count:67},Freshmarket:{count:224},GS25:{count:343},Groszek:{count:254},"Hasty Market":{count:87},Holiday:{count:67},"Hruška":{count:89},Indomaret:{count:483},Jednota:{count:66},Joker:{count:56},"K-Market":{count:104},Kangaroo:{count:54},"Kangaroo Express":{count:51},Kisbolt:{count:94},Konzum:{count:229},"Kum & Go":{count:127},"Kwik Trip":{count:134},Lawson:{count:311},Lewiatan:{count:565},"Lifestyle Express":{count:114},Londis:{count:505},"M&S Simply Food":{count:72},"Mac's":{count:295},Mace:{count:166},Magazin:{count:81},"Magazin Mixt":{count:139},"Magazin Non-Stop":{count:62},"Magazin mixt":{count:57},Marathon:{count:59},Maxikiosco:{count:86},"Małpka Express":{count:71},"McColl's":{count:289},Mercator:{count:122},Migrolino:{count:63},"Mini ABC":{count:77},"Mini Market":{count:1312},"Mini Market Non-Stop":{count:134},"Mini Mart":{count:78},"Mini Stop":{count:466},Minimercado:{count:77},"Mlin i pekare":{count:63},Mobil:{count:82},"Nasz Sklep":{count:92},Nisa:{count:70},"Nisa Local":{count:164},OK:{count:107},"OK-Mart":{count:51},"OK便利商店":{count:96},"OK便利店 Circle K":{count:92},Odido:{count:148},"On The Run":{count:53},"On the Run":{count:111},"One Stop":{count:294},Oxxo:{count:2261},"Parduotuvė":{count:102},"Petit Casino":{count:297},"Plaid Pantry":{count:69},Potraviny:{count:438},Prehrana:{count:88},Premier:{count:321},Proxi:{count:249},"Proxy":{count:53},Pulperia:{count:56},"Pulpería":{count:51},QuikTrip:{count:161},"Rite Aid":{count:72},"Royal Farms":{count:90},"Sainsbury's Local":{count:208},Sale:{count:89},"Sari-sari Store":{count:82},Select:{count:133},Sheetz:{count:137},Shell:{count:479},"Shell Select":{count:71},"Shop & Go":{count:80},Siwa:{count:157},"Sklep spożywczy":{count:151},"Smíšené zboží":{count:57},Spar:{count:1472},Speedway:{count:108},"Społem":{count:199},"Spätkauf":{count:60},Statoil:{count:62},"Stewart's":{count:255},Stores:{count:70},Stripes:{count:63},Studenac:{count:113},Sunkus:{count:51},Sunoco:{count:65},"Słoneczko":{count:61},"TESCO Lotus Express":{count:55},Tchibo:{count:75},Tesco:{count:54},"Tesco Express":{count:661},"Tesco Lotus Express":{count:107},"The Co-operative Food":{count:341},"Tom Market 89":{count:232},Total:{count:172},"United Dairy Farmers":{count:55},Utile:{count:63},Valero:{count:71},Vegyesbolt:{count:391},"Večerka":{count:131},Vival:{count:381},Volg:{count:149},Wawa:{count:279},Weltladen:{count:64},"Woolworths Petrol":{count:97},abc:{count:374},ampm:{count:152},"best-one":{count:52},odido:{count:77},"Élelmiszer":{count:59},"Élelmiszerbolt":{count:65},"Żabka":{count:1656},"Žabka":{count:61},"АТБ":{count:56},"Августина":{count:52},"Авоська":{count:115},"Агрокомплекс":{count:79},"Альянс":{count:51},"Апельсин":{count:72},"Ассорти":{count:118},"Белорусские продукты":{count:58},"Берёзка":{count:193},"Везунчик":{count:66},"Верный":{count:61},"Весна":{count:101},"Ветеран":{count:56},"Визит":{count:99},"Виктория":{count:164},"ВкусВилл":{count:131},"Гастроном":{count:383},"Гермес":{count:68},"Гроздь":{count:52},"Гурман":{count:92},"Дикси":{count:270},"Домашний":{count:77},"Евроопт":{count:152},"Елена":{count:68},"Ермолино":{count:51},"КазМунайГаз":{count:117},"Калинка":{count:61},"Каравай":{count:52},"Квартал":{count:57},"Кировский":{count:86},"Колобок":{count:51},"Колосок":{count:58},"Копеечка":{count:99},"Копейка":{count:65},"Корзинка":{count:54},"Крамниця":{count:64},"Кристалл":{count:57},"Кулинария":{count:134},"Купец":{count:64},"Ласточка":{count:51},"Лидер":{count:60},"Любимый":{count:84},"Люкс":{count:59},"Магазин при АЗС":{count:54},"Магнит":{count:1991},"Магнолия":{count:88},"Мария-Ра":{count:197},"Маяк":{count:76},"Меркурий":{count:77},"Мечта":{count:103},"Минимаркет":{count:424},"Мираж":{count:56},"Монетка":{count:165},"Надежда":{count:115},"Ника":{count:57},"Оазис":{count:57},"Олимп":{count:51},"Перекресток":{count:157},"Подсолнух":{count:69},"Престиж":{count:58},"Продукти":{count:1446},"Продуктовый":{count:307},"Продуктовый магазин":{count:803},"Продукты":{count:8416},"Продукты 24":{count:65},"Пятёрочка":{count:1324},"Радуга":{count:165},"Родны кут":{count:90},"Ромашка":{count:83},"Русь":{count:61},"Светлана":{count:96},"Сказка":{count:62},"Смак":{count:151},"Солнечный":{count:54},"Солнышко":{count:54},"Татьяна":{count:68},"Теремок":{count:105},"Тройка":{count:62},"У Палыча":{count:69},"Универсам":{count:153},"Фортуна":{count:97},"Хороший":{count:55},"Центральный":{count:73},"Чайка":{count:57},"Шанс":{count:60},"Эконом":{count:72},"Юбилейный":{count:56},"Юлия":{count:58},"продукты":{count:157},"მარკეტი":{count:134},"მარკეტი (Market)":{count:71},"サンクス":{count:970,tags:{"name:en":"Sunkus"}},"サークルK":{count:1109,tags:{"name:en":"Circle K"}},"スリーエフ":{count:228},"セイコーマート":{count:449},"セブン-イレブン":{count:7859,tags:{"name:en":"7-Eleven"}},"セブンイレブン(Seven-Eleven)":{count:332},"セーブオン":{count:71},"デイリーヤマザキ":{count:421},"ファミリーマート":{count:4457,tags:{"name:en":"FamilyMart"}},"ポプラ":{count:101},"ミニストップ":{count:773,tags:{"name:en":"MINISTOP"}},"ヤマザキショップ":{count:106},"ローソン":{count:4247,tags:{"name:en":"Lawson"}},"ローソンストア100":{count:272},"全家":{count:482},"全家便利商店":{count:833},"萊爾富":{count:405},"세븐일레븐":{count:157}},copyshop:{"FedEx Office":{count:53},"FedEx Office Print and Ship Center":{count:170}},cosmetics:{Douglas:{count:58},Lush:{count:80},Marionnaud:{count:55},Sephora:{count:184},"The Body Shop":{count:95},"Yves Rocher":{count:111},"Л'Этуаль":{count:111},"Магнит Косметик":{count:116},"Магнит косметик":{count:63},"Магнит-Косметик":{count:55},"Мила":{count:68},"Подружка":{count:51}},craft:{"Hobby Lobby":{count:96},Michaels:{count:222}},deli:{"ほっともっと":{count:58}},department_store:{Argos:{count:90},"Bed Bath & Beyond":{count:72},"Big Lots":{count:142},"Big W":{count:120},"Canadian Tire":{count:176},Coppel:{count:55},Debenhams:{count:118},"Dillard's":{count:86},"Dollar General":{count:62},"Dollar Tree":{count:64},"El Corte Inglés":{count:61},"Family Dollar":{count:76},"Fred Meyer":{count:51},"Galeria Kaufhof":{count:60},HEMA:{count:248},"Harvey Norman":{count:62},JCPenney:{count:365},Karstadt:{count:66},Kmart:{count:390},"Kohl's":{count:371},"Lojas Americanas":{count:63},"Macy's":{count:292},"Marks & Spencer":{count:136},Marshalls:{count:58},Myer:{count:51},Nordstrom:{count:54},"Sam's Club":{count:103},Sears:{count:462},Shopko:{count:65},Target:{count:1104},"The Warehouse":{count:68},Walmart:{count:847},"Walmart Supercenter":{count:234},Woolworth:{count:153},"Магнит":{count:88},"Универмаг":{count:170}},doityourself:{"Ace Hardware":{count:300},"B&Q":{count:229},Bauhaus:{count:223},Biltema:{count:64},Brico:{count:126},"Bricomarché":{count:425},Bricorama:{count:117},"Bunnings Warehouse":{count:210},"Canadian Tire":{count:138},Castorama:{count:168},Easy:{count:53},Gamma:{count:133},"Globus Baumarkt":{count:52},Hagebaumarkt:{count:132},Hellweg:{count:70},"Home Depot":{count:1345},"Home Hardware":{count:172},Homebase:{count:205},Hornbach:{count:134},Hubo:{count:107},Karwei:{count:77},Lagerhaus:{count:116},"Leroy Merlin":{count:285},"Lowe's":{count:1236},Lowes:{count:95},Menards:{count:132},"Mr Bricolage":{count:112},"Mr.Bricolage":{count:139},OBI:{count:501},"Point P":{count:125},Praktiker:{count:54},Praxis:{count:61},Rona:{count:77},Screwfix:{count:80},"Sonderpreis Baumarkt":{count:68},Tekzen:{count:112},"Toom Baumarkt":{count:155},Weldom:{count:110},Wickes:{count:159},"Леруа Мерлен":{count:54},"Мастер":{count:59},"Сантехника":{count:51},"Строитель":{count:67},"Стройматериалы":{count:506},"Хозтовары":{count:137},"カインズホーム":{count:51},"コメリ":{count:137},"コーナン":{count:77}},dry_cleaning:{Cleaners:{count:103},Pressing:{count:58},"Диана":{count:88},"Химчистка":{count:73},"ホワイト急便":{count:136}},electronics:{"Apple Store":{count:63},BCC:{count:54},"Batteries Plus Bulbs":{count:74},Bell:{count:73},"Best Buy":{count:706},Boulanger:{count:71},Currys:{count:109},"Currys PC World":{count:70},DNS:{count:111},Darty:{count:168},Elektra:{count:64},Elgiganten:{count:67},Euronics:{count:247},Expert:{count:224},Hartlauer:{count:64},Interdiscount:{count:57},"La Curacao":{count:69},Maplin:{count:114},"Media Expert":{count:163},"Media Markt":{count:422},Musimundo:{count:53},Neonet:{count:97},"RTV Euro AGD":{count:68},"Radio Shack":{count:485},Rogers:{count:61},Samsung:{count:164},Saturn:{count:155},Sony:{count:51},"The Source":{count:91},Unieuro:{count:66},"М.Видео":{count:121},"Фокстрот":{count:76},"Эксперт":{count:70},"Эльдорадо":{count:313},"エディオン":{count:74},"ケーズデンキ":{count:136},"コジマ":{count:53},"ヤマダ電機":{count:162},"全國電子":{count:72},"燦坤3C":{count:52}},erotic:{Orion:{count:85}},fabric:{"Ткани":{count:121}},farm:{Hofladen:{count:63}},florist:{"Blume 2000":{count:94},"Blumen Risse":{count:69},Fleuriste:{count:54},Interflora:{count:78},"Monceau Fleurs":{count:69},"Virágbolt":{count:64},"Квіти":{count:86},"Цветочный магазин":{count:57},"Цветы":{count:1098}},frame:{"rumah penduduk":{count:316}},funeral_directors:{"The Co-operative Funeralcare":{count:82},"Ритуальные услуги":{count:133}},furniture:{"Aaron's":{count:57},"Black Red White":{count:79},Bodzio:{count:61},But:{count:162},Casa:{count:62},Conforama:{count:174},DFS:{count:52},"Dänisches Bettenlager":{count:464},Fly:{count:53},Harveys:{count:58},IKEA:{count:234},JYSK:{count:431},Kwantum:{count:54},"Leen Bakker":{count:72},"Pier 1 Imports":{count:95},Roller:{count:99},"The Brick":{count:68},"Меблі":{count:70},"ニトリ":{count:93}},garden_centre:{Dehner:{count:59},"Gamm Vert":{count:210},Jardiland:{count:124},"Point Vert":{count:68},Welkoop:{count:97},"Семена":{count:53}},gift:{"Card Factory":{count:116},Hallmark:{count:163},"Подарки":{count:56}},greengrocer:{"Frutería":{count:60},"Овощи и фрукты":{count:71}},hairdresser:{Berber:{count:71},"Cost Cutters":{count:69},"Fantastic Sams":{count:53},Figaro:{count:79},"First Choice Haircutters":{count:51},"Franck Provost":{count:136},Frizerie:{count:59},"Great Clips":{count:578},Haarmonie:{count:79},Haarscharf:{count:59},"Hair Cuttery":{count:121},Hairkiller:{count:73},"Jean Louis David":{count:90},"Jean-Louis David":{count:59},Klier:{count:239},Klipp:{count:76},"Le Salon":{count:55},"Marco Aldany":{count:55},"Peluquería":{count:165},"Salon fryzjerski":{count:52},"Sport Clips":{count:114},"Super Cuts":{count:55},Supercuts:{count:359},Tchip:{count:62},"The Barber Shop":{count:130},"Toni & Guy":{count:77},"Top Hair":{count:74},"Виктория":{count:53},"Елена":{count:53},"Локон":{count:67},"Парикмахерская":{count:798},"Перукарня":{count:119},"Салон красоты":{count:58},"Стиль":{count:94},"Шарм":{count:79},"حلاق":{count:65}},hardware:{"1000 мелочей":{count:125},"Ferretería":{count:295},"Harbor Freight Tools":{count:57},"Home Hardware":{count:94},"Lowe's":{count:74},Quincaillerie:{count:105},"True Value":{count:52},"Würth":{count:51},"Промтовары":{count:67},"Сантехника":{count:87},"Стройматериалы":{count:142},"Товары для дома":{count:69},"Хозтовары":{count:477}},hearing_aids:{Amplifon:{count:124},Geers:{count:66},"Kind Hörgeräte":{count:74},amplifon:{count:52}},hifi:{"Bang & Olufsen":{count:51}},houseware:{Blokker:{count:264},Marskramer:{count:72},Xenos:{count:119}},interior_decoration:{Casa:{count:65},Depot:{count:97}},jewelry:{"585":{count:94},Apart:{count:53},"Bijou Brigitte":{count:172},Christ:{count:116},"Claire's":{count:99},"Ernest Jones":{count:53},"H Samuel":{count:55},"James Avery Jewelry":{count:99},"Julien d'Orcel":{count:123},"Kay Jewelers":{count:78},Pandora:{count:280},Swarovski:{count:240},"Адамас":{count:60},"Золото":{count:51}},kiosk:{Aral:{count:76},Edicola:{count:94},Esso:{count:51},KIOS:{count:288},Kiosko:{count:62},Kiosque:{count:68},Kolporter:{count:88},"Lietuvos spauda":{count:62},Narvesen:{count:188},"Pressbyrån":{count:117},"Pulpería":{count:61},"R-Kioski":{count:352},Relay:{count:61},Ruch:{count:187},Shell:{count:122},"Tabak Trafik":{count:83},Tisak:{count:245},Trafik:{count:221},Trafika:{count:64},Trinkhalle:{count:98},Warung:{count:73},"Белсоюзпечать":{count:59},"Киоск":{count:143},"Продукты":{count:212},"Роспечать":{count:233},"Союзпечать":{count:94},"მარკეტი (Market)":{count:94}},kitchen:{Cuisinella:{count:60},"Home Utensils":{count:65}},laundry:{Launderette:{count:51},"Lavandería":{count:84},"コインランドリー":{count:64}},lottery:{"Loteria de la Provincia":{count:63},"Lotería Nacional":{count:221},"Lotería de la Provincia":{count:349},Lotto:{count:192},"Lottózó":{count:69},ONCE:{count:91}},mall:{"Торговый центр":{count:57}},massage:{"Massage Envy":{count:80}},medical_supply:{"Pofam-Poznań":{count:61}},mobile_phone:{"3 Store":{count:90},"AT&T":{count:558},Bell:{count:140},"Bitė":{count:66},"Boost Mobile":{count:151},"Carphone Warehouse":{count:357},Claro:{count:446},"Cricket Wireless":{count:73},Digicel:{count:152},EE:{count:190},MetroPCS:{count:201},Movistar:{count:411},O2:{count:527},Orange:{count:730},Personal:{count:54},Play:{count:150},Plus:{count:122},Rogers:{count:52},SFR:{count:156},Samsung:{count:71},Sprint:{count:394},"T-Mobile":{count:665},TIM:{count:67},Telcel:{count:52},Tele2:{count:186},Telekom:{count:148},"Telekom Shop":{count:99},Telenor:{count:99},Telus:{count:69},"The Phone House":{count:137},Three:{count:57},Tim:{count:51},"Télécentre":{count:76},Verizon:{count:152},"Verizon Wireless":{count:629},Vodafone:{count:1168},"Vodafone Shop":{count:52},Wind:{count:156},Yoigo:{count:61},au:{count:136},"auショップ":{count:340},"mobilcom debitel":{count:63},"Алло":{count:86},"Билайн":{count:441},"Евросеть":{count:1020},"Київстар":{count:57},"МТС":{count:1012},"Мегафон":{count:687},"Связной":{count:842},"Теле2":{count:70},"ソフトバンクショップ":{count:482},"ドコモショップ":{count:426}},money_lender:{"Money Mart":{count:95}},motorcycle:{"Harley Davidson":{count:81},Honda:{count:238},Suzuki:{count:90},Yamaha:{count:235}},music:{HMV:{count:81},TSUTAYA:{count:53}},musical_instrument:{"Guitar Center":{count:51}},newsagent:{Edicola:{count:111},Kolporter:{count:56},"Maison de la Presse":{count:132},Relay:{count:246},"Tabac Presse":{count:82},Trafika:{count:60},WHSmith:{count:160},"Белсоюзпечать":{count:52},"Витебскоблсоюзпечать":{count:56},"Первая полоса":{count:57},"Печать":{count:74},"Роспечать":{count:371},"Союзпечать":{count:130}},optician:{"Alain Afflelou":{count:204},Apollo:{count:441},Atol:{count:124},"Boots Opticians":{count:101},Fielmann:{count:477},"General Óptica":{count:53},"Grand Optical":{count:57},"Générale d'Optique":{count:94},"Hakim Optical":{count:73},"Hans Anders":{count:105},Krys:{count:192},"Les Opticiens Mutualistes":{count:103},"Optic 2000":{count:281},"Optical Center":{count:125},Pearle:{count:199},"Pearle Vision":{count:52},Specsavers:{count:384},"Sunglass Hut":{count:61},Synoptik:{count:55},"Vision Express":{count:183},"แว่นท็อปเจริญ":{count:97},"メガネスーパー":{count:62},"眼鏡市場":{count:206}},outdoor:{"Jack Wolfskin":{count:51},"Mountain Warehouse":{count:74},REI:{count:77},"Рыболов":{count:70}},paint:{"Benjamin Moore":{count:58},Comex:{count:68},Jotun:{count:51},"National Paints":{count:53},"Sherwin Williams":{count:323},"Sherwin-Williams Paints":{count:59}},pawnbroker:{"Cash Converters":{count:83},Lombard:{count:55},"Palawan Pawnshop":{count:52}},pet:{"Das Futterhaus":{count:158},Fressnapf:{count:620},"Global Pet Foods":{count:54},"Maxi Zoo":{count:65},"Pet Valu":{count:112},PetSmart:{count:491},Petco:{count:377},"Pets at Home":{count:170},"Бетховен":{count:60},"Зоотовары":{count:79},"Четыре лапы":{count:56}},second_hand:{Goodwill:{count:235},"Value Village":{count:53}},shoes:{Adidas:{count:51},Aldo:{count:74},Bata:{count:281},"Besson Chaussures":{count:124},Brantano:{count:132},CCC:{count:245},Camper:{count:51},Chaussea:{count:102},Clarks:{count:268},Converse:{count:58},Crocs:{count:64},DSW:{count:52},Deichmann:{count:1231},Dosenbach:{count:58},Ecco:{count:185},"Famous Footwear":{count:178},"Foot Locker":{count:240},Geox:{count:151},Kari:{count:66},"La Halle aux Chaussures":{count:158},Mephisto:{count:57},Minelli:{count:55},"New Balance":{count:52},Payless:{count:56},"Payless Shoe Source":{count:316},"Payless ShoeSource":{count:133},"Quick Schuh":{count:116},"Rack Room Shoes":{count:51},Reno:{count:233},Rieker:{count:83},Salamander:{count:103},"San Marina":{count:54},Scapino:{count:67},"Shoe Carnival":{count:66},"Shoe Zone":{count:161},"Siemes Schuhcenter":{count:69},Skechers:{count:83},Tamaris:{count:99},Timberland:{count:51},vanHaren:{count:98},"Éram":{count:88},"Ремонт обуви":{count:71},"ЦентрОбувь":{count:76},"Юничел":{count:73},"東京靴流通センター":{count:81}},sports:{Adidas:{count:132},Aktiesport:{count:61},"Big 5 Sporting Goods":{count:93},Decathlon:{count:409},"Dick's Sporting Goods":{count:222},Hervis:{count:66},Intersport:{count:737},"JD Sports":{count:58},Nike:{count:95},"Sport 2000":{count:209},"Sports Authority":{count:108},"Sports Direct":{count:217},"Спортмастер":{count:208},"Спорттовары":{count:68}},stationery:{"Bureau Vallée":{count:64},Libro:{count:73},McPaper:{count:158},"Office Depot":{count:378},"Office Max":{count:169},Officeworks:{count:73},Pagro:{count:64},Paperchase:{count:54},Ryman:{count:85},Staples:{count:671},"Канцтовары":{count:140}},supermarket:{"7-Eleven":{count:60},"A&O":{count:67},A101:{count:388},"AD Delhaize":{count:80},ADEG:{count:85},"Ahorramás":{count:66},Albert:{count:245},"Albert Heijn":{count:766},Albertsons:{count:316},Aldi:{count:6323},"Aldi Nord":{count:356},"Aldi Süd":{count:916},Alfamart:{count:109},Alimerka:{count:96},Alnatura:{count:97},Asda:{count:474},Atac:{count:53},"Atacadão":{count:80},Auchan:{count:229},BM:{count:52},Biedronka:{count:2348},"Big C":{count:53},Billa:{count:1592},Bim:{count:678},Biocoop:{count:159},"Bodega Aurrera":{count:264},Budgens:{count:77},"Bulk Barn":{count:54},Bunnpris:{count:69},CBA:{count:236},CONAD:{count:67},COOP:{count:255},"COOP Jednota":{count:177},CRAI:{count:66},CU:{count:64},Caprabo:{count:144},"Cargills Food City":{count:79},Carrefour:{count:2544},"Carrefour City":{count:349},"Carrefour Contact":{count:270},"Carrefour Express":{count:921},Centra:{count:63},"Centre Commercial E. Leclerc":{count:385},Checkers:{count:140},Chedraui:{count:80},"Co-Op":{count:62},"Co-op":{count:352},"Co-operative":{count:51},Coles:{count:583},Colmado:{count:103},Colruyt:{count:212},Combi:{count:127},"Comercial Mexicana":{count:59},Conad:{count:560},"Conad City":{count:95},Condis:{count:126},Consum:{count:236},Continente:{count:111},Coop:{count:1665},"Coop Extra":{count:88},"Coop Jednota":{count:101},"Coop Konsum":{count:96},"Costco Gasoline":{count:295},Costcutter:{count:93},Coto:{count:65},Countdown:{count:135},Coviran:{count:124},"Covirán":{count:51},Crai:{count:119},"Cub Foods":{count:57},"Dagli'Brugsen":{count:135},Deen:{count:55},Delhaize:{count:228},"Delikatesy Centrum":{count:209},Denner:{count:412},Despar:{count:209},"Despensa Familiar":{count:81},Dia:{count:1329},"Dia %":{count:181},"Dia Market":{count:60},Dino:{count:298},"Dirk van den Broek":{count:66},Disco:{count:74},Diska:{count:68},"Dollar General":{count:106},"Dollar Tree":{count:52},"Dunnes Stores":{count:72},"E-Center":{count:66},"E. Leclerc":{count:186},"E. Leclerc Drive":{count:97},EKO:{count:78},"EMTÉ":{count:74},Edeka:{count:2231},Ekom:{count:64},Ekono:{count:68},"El Árbol":{count:86},Eroski:{count:351},Esselunga:{count:106},EuroSpin:{count:81},Eurospar:{count:340},Eurospin:{count:328},Extra:{count:149},"Famiglia Cooperativa":{count:89},Famila:{count:167},"Family Dollar":{count:72},Fareway:{count:51},Farmfoods:{count:141},Feneberg:{count:64},"Food Basics":{count:116},"Food Lion":{count:425},Foodland:{count:192},Foodworks:{count:90},Franprix:{count:401},"Fred Meyer":{count:70},Freshmarket:{count:86},Froiz:{count:97},"Føtex":{count:74},G20:{count:71},GS25:{count:72},Gadis:{count:126},Game:{count:59},Giant:{count:276},"Giant Eagle":{count:134},"Grand Frais":{count:70},"Grocery Outlet":{count:128},"Géant Casino":{count:75},"H-E-B":{count:274},HIT:{count:64},Hannaford:{count:95},"Harris Teeter":{count:158},"Hemköp":{count:87},"Heron Foods":{count:55},Hofer:{count:484},Hoogvliet:{count:66},"Hruška":{count:54},"Hy-Vee":{count:121},ICA:{count:255},"ICA Kvantum":{count:51},IDEA:{count:52},IGA:{count:568},Iceland:{count:538},Indomaret:{count:124},"Intermarché":{count:1477},"Intermarché Contact":{count:122},"Intermarché Super":{count:261},Interspar:{count:117},Irma:{count:69},"Jewel-Osco":{count:72},Jumbo:{count:476},"K+K":{count:119},Kaufland:{count:1172},"King Soopers":{count:99},Kiwi:{count:178},Konsum:{count:144},Konzum:{count:370},Kroger:{count:627},Kvickly:{count:60},"La Vie Claire":{count:65},Landi:{count:54},"Leader Price":{count:502},"Leclerc Drive":{count:120},Lewiatan:{count:255},Lider:{count:78},Lidl:{count:8927},Londis:{count:52},Lupa:{count:79},"M&S Simply Food":{count:52},MPREIS:{count:187},Makro:{count:226},Markant:{count:98},"Market Basket":{count:57},Marktkauf:{count:117},Match:{count:139},Maxi:{count:198},"Maxi Dia":{count:52},Maxima:{count:111},"Maxima X":{count:158},"Maxima XX":{count:69},"Mega Image":{count:97},Mego:{count:52},Meijer:{count:129},Meny:{count:105},"Mercado Municipal":{count:52},"Mercado de Abastos":{count:57},Mercadona:{count:1228},Mercator:{count:155},Merkur:{count:132},Metro:{count:395},Migros:{count:641},Mila:{count:90},"Mini Market":{count:81},"Minipreço":{count:213},"Mix Markt":{count:60},Monoprix:{count:283},More:{count:61},Morrisons:{count:443},NORMA:{count:144},NP:{count:251},"Nah & Frisch":{count:107},Nahkauf:{count:324},Netto:{count:4429},"Netto Marken-Discount":{count:706},"New World":{count:89},"No Frills":{count:177},"Norfa XL":{count:66},Norma:{count:1162},Oxxo:{count:278},PENNY:{count:89},PLUS:{count:92},POLOmarket:{count:172},"Palí":{count:69},Pam:{count:77},Penny:{count:2819},"Penny Markt":{count:77},"Petit Casino":{count:146},"Pick n Pay":{count:268},"Piggly Wiggly":{count:103},"Pingo Doce":{count:308},"Piotr i Paweł":{count:112},"Plaza Vea":{count:68},Plodine:{count:67},Poiesz:{count:53},"Price Chopper":{count:132},Prix:{count:53},Profi:{count:203},Proxi:{count:75},"Proxy Delhaize":{count:63},Publix:{count:645},"Punto Simply":{count:54},Puregold:{count:75},"Pão de Açúcar":{count:76},QFC:{count:54},"REMA 1000":{count:89},Ralphs:{count:81},Real:{count:210},"Real Canadian Superstore":{count:69},"Reliance Fresh":{count:95},"Rema 1000":{count:394},Rewe:{count:2808},"Rewe City":{count:78},Rimi:{count:115},"S-Market":{count:110},Safeway:{count:619},"Sainsbury's":{count:595},"Sainsbury's Local":{count:248},"Sam's Club":{count:303},"Santa Isabel":{count:174},"Save-A-Lot":{count:100,tags:{shop:"supermarket"}},ShopRite:{count:53},Shoprite:{count:337},Sigma:{count:107},"Simply Market":{count:541},Sky:{count:113},"Smith's":{count:56},Sobeys:{count:186},Soriana:{count:194},Spar:{count:3381},"Społem":{count:120},"Sprouts Farmers Market":{count:71},Stokrotka:{count:227},"Stop & Shop":{count:147},"Super C":{count:57},"Super U":{count:654},SuperBrugsen:{count:183},SuperValu:{count:80},Superama:{count:51},Supersol:{count:51},Superspar:{count:54},Tegut:{count:118},Tengelmann:{count:155},Tesco:{count:1373},"Tesco Express":{count:566},"Tesco Extra":{count:200},"Tesco Lotus":{count:95},"Tesco Metro":{count:153},"The Co-operative":{count:79},"The Co-operative Food":{count:1261},Tommy:{count:56},Tottus:{count:82},"Trader Joe's":{count:345},"Treff 3000":{count:134},"U Express":{count:129},Unimarc:{count:256},Unimarkt:{count:104},Utile:{count:68},Vea:{count:67},Vival:{count:80},Volg:{count:231},Waitrose:{count:301},Walmart:{count:1164},"Walmart Neighborhood Market":{count:171},"Walmart Supercenter":{count:688},Wasgau:{count:51},Wegmans:{count:89},Wellcome:{count:51},"Whole Foods Market":{count:379,tags:{shop:"supermarket"}},Willys:{count:89},"WinCo Foods":{count:53},"Winn Dixie":{count:168},Woolworths:{count:816},"denn's Biomarkt":{count:147},fakta:{count:296},real:{count:58},tegut:{count:89},"Şok":{count:271},"ΑΒ Βασιλόπουλος":{count:82},"Γαλαξίας":{count:54},"Μασούτης":{count:85},"Σκλαβενίτης":{count:92},"АТБ":{count:618},"Абсолют":{count:51},"Авоська":{count:60},"Азбука Вкуса":{count:66},"Атак":{count:85},"Ашан":{count:80},"Верный":{count:226},"Виктория":{count:74},"Вопак":{count:59},"Гастроном":{count:54},"Гроздь":{count:63},"Десяточка":{count:52},"Дикси":{count:1670},"Евроопт":{count:201},"Карусель":{count:68},"Квартал":{count:77},"Кировский":{count:54},"Командор":{count:75},"Красный Яр":{count:58},"Лента":{count:165},"Магнит":{count:4289},"Магнолия":{count:121},"Мария-Ра":{count:159},"Монетка":{count:363},"Народная 7Я семьЯ":{count:199},"Перекресток":{count:501},"Покупочка":{count:73},"Полушка":{count:213},"Пятёрочка":{count:3622},"Радеж":{count:64},"Рукавичка":{count:78},"Светофор":{count:73},"Седьмой континент":{count:69},"Семейный":{count:52},"Семья":{count:85},"Супермаркет":{count:65},"Сільпо":{count:203},"Таврія‑В":{count:66},"Универсам":{count:77},"Фора":{count:162},"Фуршет":{count:86},"Хүнсний дэлгүүр":{count:63},"Эдельвейс":{count:55},"хүнсний дэлгүүр":{count:73},"بقالة":{count:74},"سوپر مارکت":{count:75},"سوپرمارکت":{count:79},"いなげや":{count:66},"まいばすけっと":{count:162},"イオン":{count:95},"イトーヨーカドー":{count:67},"カスミ":{count:56},"マックスバリュ":{count:143},"マルエツ":{count:99},"ライフ":{count:125},"全聯":{count:74},"全聯福利中心":{count:241},"惠康 Wellcome":{count:57},"業務スーパー":{count:176},"美廉社":{count:74},"西友":{count:137}},tailor:{"Atelier de couture":{count:63}},ticket:{"Boutique Grandes Lignes":{count:60},"Guichet Transilien":{count:243},"Касса":{count:61},"Проездные билеты":{count:65}},tobacco:{"Dohánybolt":{count:109},Estanco:{count:134},"Nemzeti Dohánybolt":{count:926},Tabacos:{count:62},"Табакерка":{count:73}},toys:{"Dráčik":{count:63},Intertoys:{count:242},"King Jouet":{count:102},"La Grande Récré":{count:112},"Maxi Toys":{count:63},"Toys R Us":{count:410,tags:{shop:"toys"}},"Детский мир":{count:186},"Игрушки":{count:95}},travel_agency:{"D-reizen":{count:64},"DER Reisebüro":{count:52},"First Reisebüro":{count:57},"Flight Centre":{count:159},Reiseland:{count:52},TUI:{count:262},"The Co-operative Travel":{count:58},"Thomas Cook":{count:298},Thomson:{count:144}},tyres:{Borracharia:{count:98},Bridgestone:{count:65},"Discount Tire":{count:94},Euromaster:{count:76},Firestone:{count:57},Gomeria:{count:71},"Les Schwab Tire Center":{count:59},Vianor:{count:52},"Вулканизация":{count:113},"Шиномонтаж":{count:419}},variety_store:{Action:{count:147},Bazar:{count:56},"Big Bazar":{count:60},"Big Lots":{count:65},"Dollar General":{count:345},"Dollar Tree":{count:753},Dollarama:{count:404},EuroShop:{count:59},"Family Dollar":{count:590},"Fix Price":{count:97},"Fix price":{count:127},FixPrice:{count:62},GiFi:{count:229},"Home Bargains":{count:68},"Mäc-Geiz":{count:59},NOZ:{count:82},Poundland:{count:197},Poundworld:{count:70},Tedi:{count:611},"ダイソー":{count:226}},video:{Blockbuster:{count:75},"Family Video":{count:113},TSUTAYA:{count:122},"World of Video":{count:53},"ゲオ":{count:81}},video_games:{"EB Games":{count:101},Game:{count:76},GameStop:{count:676},Micromania:{count:83}}};
23615   var tourism = {alpine_hut:{"КОШ":{count:105}},apartment:{"Двухкомнатная квартира на сутки":{count:52}},attraction:{Arch:{count:51},"Kursächsische Postmeilensäule":{count:54},Maibaum:{count:52},"Moab trail":{count:55},Moai:{count:702},"OWŚ":{count:102},Sommerrodelbahn:{count:54},"path contiunes":{count:75},"white blaze":{count:53},"Кладбище еврейское":{count:89},"Колесо обозрения":{count:69},"Приусадебный парк":{count:69},"Усадьба":{count:53},"Хозяйственный двор":{count:72},"Часовня":{count:64},"дольмен":{count:86}},camp_site:{"Camping Municipal":{count:198},"Camping municipal":{count:80}},guest_house:{Casa:{count:61},Home:{count:68},"OW \"Bielanka\"":{count:54}},hostel:{"Albergue de Peregrinos":{count:67},Hospedaje:{count:70},Hostal:{count:124}},hotel:{"B&B Hôtel":{count:104},"B&b Hôtel":{count:78},"Best Western":{count:242},Campanile:{count:145},"Central Hotel":{count:51},"City Hotel":{count:74},"Comfort Inn":{count:283},"Comfort Inn & Suites":{count:67},"Comfort Suites":{count:148},"Country Inn & Suites":{count:83},"Courtyard by Marriott":{count:155},"Crowne Plaza":{count:85},"Days Inn":{count:245},"Econo Lodge":{count:70},"Embassy Suites":{count:68},"Extended Stay America":{count:102},"Fairfield Inn":{count:60},"Fairfield Inn & Suites":{count:67},"Formule 1":{count:74},"Grand Hotel":{count:90},"Hampton Inn":{count:376},"Hampton Inn & Suites":{count:96},"Hilton Garden Inn":{count:183},"Holiday Inn":{count:411},"Holiday Inn Express":{count:479},"Holiday Inn Express & Suites":{count:72},"Homewood Suites":{count:61},"Hotel Central":{count:92},"Hotel Europa":{count:91},"Hotel Ibis":{count:67},"Hotel Krone":{count:58},"Hotel Panorama":{count:61},"Hotel Plaza":{count:62},"Hotel Post":{count:60},"Hotel Royal":{count:62},"Hotel Victoria":{count:71},"Hotel zur Post":{count:60},"Hôtel Ibis":{count:70},"Hôtel de France":{count:61},Ibis:{count:215},"Ibis Budget":{count:188},"Ibis Styles":{count:53},Krone:{count:68},Kyriad:{count:65},"La Quinta":{count:54},Marriott:{count:57},Mercure:{count:109},"Motel 6":{count:83},Novotel:{count:180},"Palace Hotel":{count:54},"Park Hotel":{count:88},Parkhotel:{count:64},"Premier Inn":{count:400},"Première Classe":{count:62},"Quality Inn":{count:178},"Quality Inn & Suites":{count:80},Ramada:{count:97},"Residence Inn":{count:89},"Royal Hotel":{count:94},Sheraton:{count:56},"Sleep Inn":{count:68},"Staybridge Suites":{count:54},"Super 8":{count:229},Travelodge:{count:284},"Гостиница":{count:166},"Уют":{count:58},"東横イン":{count:57}},motel:{"Best Western":{count:59},"Budget Inn":{count:76},"Comfort Inn":{count:131},"Days Inn":{count:103},"Econo Lodge":{count:117},"Motel 6":{count:214},"Quality Inn":{count:113},"Rodeway Inn":{count:102},"Super 8":{count:173},Travelodge:{count:68}},museum:{Heimatmuseum:{count:336},Stadtmuseum:{count:86},"Tájház":{count:93},"Краеведческий музей":{count:247},"Музей":{count:99}}};
23616   var dataSuggestions = {
23617   amenity: amenity,
23618   leisure: leisure,
23619   man_made: man_made,
23620   shop: shop,
23621   tourism: tourism
23622   };
23623
23624   var dataAddressFormats = [{format:[["housenumber","street"],["city","postcode"]]},{countryCodes:["au"],format:[["unit","housenumber","street"],["suburb","state","postcode"]]},{countryCodes:["gb"],format:[["housename"],["housenumber","street"],["city","postcode"]]},{countryCodes:["ie"],format:[["housename"],["housenumber","street"],["city"],["postcode"]]},{countryCodes:["at","ch","de","si","pl"],format:[["street","housenumber"],["postcode","city"]]},{countryCodes:["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","sk","sm","va"],format:[["street","housenumber","unit"],["postcode","city"]]},{countryCodes:["fr","lu","mo"],format:[["housenumber","street"],["postcode","city"]]},{countryCodes:["br"],format:[["street"],["housenumber","suburb"],["city","postcode"]]},{countryCodes:["vn"],format:[["housenumber","street"],["subdistrict"],["district"],["city"],["province","postcode"]]},{countryCodes:["ca"],format:[["housenumber","street","unit"],["city","province","postcode"]]},{countryCodes:["us"],format:[["housenumber","street","unit"],["city","state","postcode"]]},{countryCodes:["tw"],format:[["postcode","city","district"],["place","street"],["housenumber","floor","unit"]]},{countryCodes:["jp"],format:[["postcode","province","county"],["city","suburb"],["quarter","neighbourhood"],["block_number","housenumber"]],dropdowns:["postcode","province","county","city","suburb","quarter","neighbourhood","block_number"],widths:{postcode:0.3,province:0.35,county:0.35,city:0.65,suburb:0.35,quarter:0.5,neighbourhood:0.5,block_number:0.5,housenumber:0.5}},{countryCodes:["tr"],format:[["neighbourhood"],["street","housenumber"],["postcode","district","city"]]},{countryCodes:["ua"],format:[["housenumber","postcode"],["street"]]},{countryCodes:["cn"],format:[["postcode","province"],["city","district"],["street","housenumber"]]}];
23625
23626   var dataDeprecated = [{old:{amenity:"firepit"},replace:{leisure:"firepit"}},{old:{barrier:"wire_fence"},replace:{barrier:"fence",fence_type:"chain"}},{old:{barrier:"wood_fence"},replace:{barrier:"fence",fence_type:"wood"}},{old:{highway:"ford"},replace:{ford:"yes"}},{old:{highway:"stile"},replace:{barrier:"stile"}},{old:{highway:"incline"},replace:{highway:"road",incline:"up"}},{old:{highway:"incline_steep"},replace:{highway:"road",incline:"up"}},{old:{highway:"unsurfaced"},replace:{highway:"road",incline:"unpaved"}},{old:{landuse:"wood"},replace:{landuse:"forest",natural:"wood"}},{old:{natural:"marsh"},replace:{natural:"wetland",wetland:"marsh"}},{old:{power_source:"*"},replace:{"generator:source":"$1"}},{old:{power_rating:"*"},replace:{"generator:output":"$1"}},{old:{shop:"organic"},replace:{shop:"supermarket",organic:"only"}}];
23627
23628   var dataDiscarded = {created_by:true,odbl:true,"odbl:note":true,"tiger:upload_uuid":true,"tiger:tlid":true,"tiger:source":true,"tiger:separated":true,"geobase:datasetName":true,"geobase:uuid":true,"sub_sea:type":true,"KSJ2:ADS":true,"KSJ2:ARE":true,"KSJ2:AdminArea":true,"KSJ2:COP_label":true,"KSJ2:DFD":true,"KSJ2:INT":true,"KSJ2:INT_label":true,"KSJ2:LOC":true,"KSJ2:LPN":true,"KSJ2:OPC":true,"KSJ2:PubFacAdmin":true,"KSJ2:RAC":true,"KSJ2:RAC_label":true,"KSJ2:RIC":true,"KSJ2:RIN":true,"KSJ2:WSC":true,"KSJ2:coordinate":true,"KSJ2:curve_id":true,"KSJ2:curve_type":true,"KSJ2:filename":true,"KSJ2:lake_id":true,"KSJ2:lat":true,"KSJ2:long":true,"KSJ2:river_id":true,"SK53_bulk:load":true,"yh:LINE_NAME":true,"yh:LINE_NUM":true,"yh:STRUCTURE":true,"yh:TOTYUMONO":true,"yh:TYPE":true,"yh:WIDTH":true,"yh:WIDTH_RANK":true};
23629
23630   var dataLocales = {af:{rtl:false},ar:{rtl:true},"ar-AA":{rtl:true},ast:{rtl:false},be:{rtl:false},bg:{rtl:false},bn:{rtl:false},bs:{rtl:false},ca:{rtl:false},ckb:{rtl:true},cs:{rtl:false},cy:{rtl:false},da:{rtl:false},de:{rtl:false},dv:{rtl:true},el:{rtl:false},"en-AU":{rtl:false},"en-GB":{rtl:false},eo:{rtl:false},es:{rtl:false},et:{rtl:false},eu:{rtl:false},fa:{rtl:true},fi:{rtl:false},fr:{rtl:false},gan:{rtl:false},gl:{rtl:false},gu:{rtl:false},he:{rtl:true},hi:{rtl:false},hr:{rtl:false},hu:{rtl:false},hy:{rtl:false},ia:{rtl:false},id:{rtl:false},is:{rtl:false},it:{rtl:false},ja:{rtl:false},jv:{rtl:false},km:{rtl:false},kn:{rtl:false},ko:{rtl:false},ku:{rtl:false},lij:{rtl:false},lt:{rtl:false},lv:{rtl:false},mg:{rtl:false},mk:{rtl:false},ml:{rtl:false},mn:{rtl:false},ms:{rtl:false},ne:{rtl:false},nl:{rtl:false},nn:{rtl:false},no:{rtl:false},nv:{rtl:false},pl:{rtl:false},pt:{rtl:false},"pt-BR":{rtl:false},rm:{rtl:false},ro:{rtl:false},ru:{rtl:false},sc:{rtl:false},si:{rtl:false},sk:{rtl:false},sl:{rtl:false},so:{rtl:false},sq:{rtl:false},sr:{rtl:false},sv:{rtl:false},ta:{rtl:false},te:{rtl:false},th:{rtl:false},tl:{rtl:false},tr:{rtl:false},uk:{rtl:false},ur:{rtl:true},vi:{rtl:false},yue:{rtl:false},zh:{rtl:false},"zh-CN":{rtl:false},"zh-HK":{rtl:false},"zh-TW":{rtl:false}};
23631
23632   var dataPhoneFormats = {ag:"+1-268-555-1234",ai:"+1-264-555-1234",as:"+1-684-555-1234",at:"+43 1 123 45 67",bb:"+1-246-555-1234",bj:"+229 20 12 34 56",bm:"+1-441-555-1234",br:"+55 11 0982 1098",bs:"+1-242-555-1234",ca:"+1-226-555-1234",ci:"+225 20 12 34 56",cn:"+86 10 12345678",de:"+49 89 1234567",dm:"+1-767-555-1234","do":"+1-809-555-1234",es:"+34 989 12 34 56",fi:"+358 40 123 4567",fr:"+33 1 23 45 67 89",gb:"+44 1632 961234",gd:"+1-473-555-1234",gg:"+44 1632 961234",gu:"+1-671-555-1234",hk:"+852 1234 5678",hr:"+385 01 123 4567",hu:"+36 1 123 45 67",ie:"+353 20 912 3456",im:"+44 1632 961234",it:"+39 01 123 456",je:"+44 1632 961234",jm:"+1-876-555-1234",kn:"+1-869-555-1234",ky:"+1-345-555-1234",kz:"+7 495 1234567",lc:"+1-758-555-1234",mp:"+1-670-555-1234",ms:"+1-664-555-1234",nl:"+31 42 123 4567",no:"+47 22 12 34 56",pl:"+48 42 123 4567",pr:"+1-787-555-1234",pt:"+351 211 123456",ru:"+7 495 1234567",se:"+46 31 123 4567",si:"+386 31 123 4567",sj:"+47 22 12 34 56",sx:"+1-721-555-1234",tc:"+1-649-555-1234",tr:"+90 312 123 4567",tt:"+1-868-555-1234",tw:"+886 1 2345 6789",ua:"+380 44 123 4567",us:"+1-202-555-1234",va:"+39 01 123 456",vc:"+1-784-555-1234",vg:"+1-284-555-1234",vi:"+1-340-555-1234",vn:"+84 1 234 5678",za:"+27 11 907 1111"};
23633
23634   var dataShortcuts = [{tab:"browsing",text:"shortcuts.browsing.title",columns:[{rows:[{section:"navigation",text:"shortcuts.browsing.navigation.title"},{shortcuts:["↓","↑","←","→"],text:"shortcuts.browsing.navigation.pan",separator:","},{modifiers:["⌘"],shortcuts:["↓","↑","←","→"],text:"shortcuts.browsing.navigation.pan_more",separator:","},{shortcuts:["+","-"],text:"shortcuts.browsing.navigation.zoom",separator:","},{modifiers:["⌘"],shortcuts:["+","-"],text:"shortcuts.browsing.navigation.zoom_more",separator:","},{section:"help",text:"shortcuts.browsing.help.title"},{shortcuts:["help.key"],text:"shortcuts.browsing.help.help"},{shortcuts:["shortcuts.toggle.key"],text:"shortcuts.browsing.help.keyboard"},{section:"display_options",text:"shortcuts.browsing.display_options.title"},{shortcuts:["background.key"],text:"shortcuts.browsing.display_options.background"},{modifiers:["⌘"],shortcuts:["background.key"],text:"shortcuts.browsing.display_options.background_switch"},{shortcuts:["map_data.key"],text:"shortcuts.browsing.display_options.map_data"},{modifiers:["⌃","⌘"],shortcuts:["F","F11"],text:"shortcuts.browsing.display_options.fullscreen"},{shortcuts:["area_fill.wireframe.key"],text:"shortcuts.browsing.display_options.wireframe"},{shortcuts:["background.minimap.key"],text:"shortcuts.browsing.display_options.minimap"}]},{rows:[{section:"selecting",text:"shortcuts.browsing.selecting.title"},{shortcuts:["Left-click"],text:"shortcuts.browsing.selecting.select_one"},{modifiers:["⇧"],shortcuts:["Left-click"],text:"shortcuts.browsing.selecting.select_multi"},{modifiers:["⇧"],shortcuts:["Left-click"],gesture:"shortcuts.gesture.drag",text:"shortcuts.browsing.selecting.lasso"},{modifiers:["⌘"],shortcuts:["F"],text:"shortcuts.browsing.selecting.search"},{section:"with_selected",text:"shortcuts.browsing.with_selected.title"},{shortcuts:["Right-click","shortcuts.key.space"],text:"shortcuts.browsing.with_selected.edit_menu"},{shortcuts:[],text:""},{section:"vertex_selected",text:"shortcuts.browsing.vertex_selected.title"},{shortcuts:["[","↖"],text:"shortcuts.browsing.vertex_selected.previous"},{shortcuts:["]","↘"],text:"shortcuts.browsing.vertex_selected.next"},{shortcuts:["{","⇞"],text:"shortcuts.browsing.vertex_selected.first"},{shortcuts:["}","⇟"],text:"shortcuts.browsing.vertex_selected.last"},{shortcuts:["\\","shortcuts.key.pause"],text:"shortcuts.browsing.vertex_selected.change_parent"}]}]},{tab:"editing",text:"shortcuts.editing.title",columns:[{rows:[{section:"drawing",text:"shortcuts.editing.drawing.title"},{shortcuts:["1"],text:"shortcuts.editing.drawing.add_point"},{shortcuts:["2"],text:"shortcuts.editing.drawing.add_line"},{shortcuts:["3"],text:"shortcuts.editing.drawing.add_area"},{shortcuts:["4"],text:"shortcuts.editing.drawing.add_note"},{shortcuts:["Left-click","shortcuts.key.space"],text:"shortcuts.editing.drawing.place_point"},{shortcuts:["⌥"],text:"shortcuts.editing.drawing.disable_snap"},{shortcuts:["↵","⎋"],text:"shortcuts.editing.drawing.stop_line"},{section:"commands",text:"shortcuts.editing.commands.title"},{modifiers:["⌘"],shortcuts:["C"],text:"shortcuts.editing.commands.copy"},{modifiers:["⌘"],shortcuts:["V"],text:"shortcuts.editing.commands.paste"},{modifiers:["⌘"],shortcuts:["Z"],text:"shortcuts.editing.commands.undo"},{modifiers:["⌘","⇧"],shortcuts:["Z"],text:"shortcuts.editing.commands.redo"},{modifiers:["⌘"],shortcuts:["S"],text:"shortcuts.editing.commands.save"}]},{rows:[{section:"operations",text:"shortcuts.editing.operations.title"},{shortcuts:["operations.continue.key"],text:"shortcuts.editing.operations.continue_line"},{shortcuts:["operations.merge.key"],text:"shortcuts.editing.operations.merge"},{shortcuts:["operations.disconnect.key"],text:"shortcuts.editing.operations.disconnect"},{shortcuts:["operations.detach_node.key"],text:"shortcuts.editing.operations.detach_node"},{shortcuts:["operations.split.key"],text:"shortcuts.editing.operations.split"},{shortcuts:["operations.reverse.key"],text:"shortcuts.editing.operations.reverse"},{shortcuts:["operations.move.key"],text:"shortcuts.editing.operations.move"},{shortcuts:["operations.rotate.key"],text:"shortcuts.editing.operations.rotate"},{shortcuts:["operations.orthogonalize.key"],text:"shortcuts.editing.operations.orthogonalize"},{shortcuts:["operations.circularize.key"],text:"shortcuts.editing.operations.circularize"},{shortcuts:["operations.reflect.key.long"],text:"shortcuts.editing.operations.reflect_long"},{shortcuts:["operations.reflect.key.short"],text:"shortcuts.editing.operations.reflect_short"},{modifiers:["⌘"],shortcuts:["⌫"],text:"shortcuts.editing.operations.delete"}]}]},{tab:"tools",text:"shortcuts.tools.title",columns:[{rows:[{section:"info",text:"shortcuts.tools.info.title"},{modifiers:["⌘"],shortcuts:["info_panels.key"],text:"shortcuts.tools.info.all"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.background.key"],text:"shortcuts.tools.info.background"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.history.key"],text:"shortcuts.tools.info.history"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.location.key"],text:"shortcuts.tools.info.location"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.measurement.key"],text:"shortcuts.tools.info.measurement"}]}]}];
23635
23636   var type$2 = "FeatureCollection";
23637   var features = [{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[1.97754,51.13111],[1.8457,63.45051],[-10.45898,57.01681],[-6.82251,55.26503],[-7.25583,55.06525],[-7.26546,55.0665],[-7.26992,55.06419],[-7.2725,55.06346],[-7.27818,55.05362],[-7.2893,55.04735],[-7.29939,55.0561],[-7.31835,55.04475],[-7.3447,55.05079],[-7.38831,55.02389],[-7.40547,55.00292],[-7.39157,54.99507],[-7.40075,54.98892],[-7.40706,54.98291],[-7.40363,54.97963],[-7.40633,54.97813],[-7.39835,54.97013],[-7.40745,54.96357],[-7.40178,54.95961],[-7.40727,54.95515],[-7.3944,54.94376],[-7.44444,54.93858],[-7.45216,54.89793],[-7.44204,54.87532],[-7.4713,54.83431],[-7.48092,54.83093],[-7.49216,54.82185],[-7.55121,54.79054],[-7.5443,54.78609],[-7.54958,54.75653],[-7.5349,54.74917],[-7.54881,54.74068],[-7.55941,54.74556],[-7.57894,54.74221],[-7.57507,54.7494],[-7.58606,54.75039],[-7.58872,54.74377],[-7.60031,54.74603],[-7.60632,54.74405],[-7.61662,54.74459],[-7.63593,54.75108],[-7.68854,54.72968],[-7.72064,54.72155],[-7.75094,54.70469],[-7.79094,54.71942],[-7.8051,54.71932],[-7.83497,54.73632],[-7.85419,54.72745],[-7.91496,54.67582],[-7.90174,54.66182],[-7.83832,54.63401],[-7.7433,54.6188],[-7.70863,54.63485],[-7.70682,54.6189],[-7.69386,54.6188],[-7.69631,54.61125],[-7.75845,54.59509],[-7.78708,54.58],[-7.79446,54.58141],[-7.79969,54.57704],[-7.79673,54.56915],[-7.8184,54.56315],[-7.83334,54.55227],[-7.82737,54.54299],[-7.85007,54.53363],[-7.90741,54.53722],[-7.93213,54.53388],[-8.00487,54.54568],[-8.03727,54.51162],[-8.04285,54.48759],[-8.08027,54.48829],[-8.09988,54.48395],[-8.09126,54.4765],[-8.111,54.47807],[-8.11512,54.46904],[-8.16542,54.46914],[-8.1776,54.46485],[-8.14293,54.45003],[-8.16284,54.4413],[-8.08731,54.4002],[-8.06062,54.37051],[-8.03289,54.35711],[-8.00054,54.34835],[-7.93333,54.30561],[-7.85849,54.29151],[-7.87067,54.28794],[-7.87265,54.26648],[-7.86123,54.25931],[-7.85917,54.21256],[-7.71043,54.20307],[-7.70193,54.20776],[-7.68828,54.202],[-7.67644,54.18906],[-7.66082,54.1871],[-7.62554,54.16545],[-7.62541,54.15319],[-7.61026,54.14353],[-7.57421,54.14142],[-7.57181,54.13287],[-7.56228,54.12704],[-7.51379,54.12998],[-7.47944,54.122],[-7.47169,54.12665],[-7.47075,54.13318],[-7.44684,54.15168],[-7.40792,54.156],[-7.42579,54.14092],[-7.41903,54.13629],[-7.3744,54.14172],[-7.37234,54.13881],[-7.39509,54.12624],[-7.39182,54.12017],[-7.36341,54.13157],[-7.34518,54.11577],[-7.32471,54.12123],[-7.32003,54.11379],[-7.3078,54.11718],[-7.30548,54.12347],[-7.31591,54.12697],[-7.31213,54.13162],[-7.3187,54.13411],[-7.31857,54.13745],[-7.32222,54.13836],[-7.32737,54.13544],[-7.3399,54.14585],[-7.30827,54.16716],[-7.30024,54.16625],[-7.29029,54.1715],[-7.28158,54.16839],[-7.2863,54.14919],[-7.29874,54.14904],[-7.30162,54.14411],[-7.28411,54.13971],[-7.29192,54.13071],[-7.29737,54.133],[-7.30883,54.13242],[-7.30333,54.12251],[-7.29218,54.11929],[-7.27844,54.12282],[-7.27707,54.12986],[-7.26613,54.13624],[-7.2566,54.16354],[-7.24015,54.17125],[-7.2575,54.17678],[-7.2581,54.19257],[-7.25179,54.19403],[-7.23608,54.1935],[-7.23338,54.19792],[-7.24317,54.20076],[-7.24892,54.1977],[-7.25183,54.20201],[-7.24119,54.20623],[-7.23094,54.20578],[-7.23269,54.20912],[-7.22188,54.21607],[-7.20643,54.2117],[-7.18506,54.22485],[-7.17055,54.21742],[-7.14721,54.22488],[-7.14633,54.23008],[-7.15051,54.23165],[-7.14613,54.23983],[-7.15802,54.24434],[-7.13985,54.25298],[-7.15255,54.26235],[-7.16064,54.27405],[-7.17991,54.27144],[-7.17201,54.28627],[-7.21252,54.2985],[-7.19888,54.31117],[-7.17918,54.30946],[-7.1812,54.3397],[-7.15339,54.33514],[-7.10253,54.35811],[-7.10811,54.36677],[-7.06927,54.3899],[-7.05593,54.41056],[-7.02898,54.42135],[-7.00198,54.40832],[-6.98683,54.40829],[-6.97562,54.40014],[-6.96774,54.40145],[-6.90682,54.36966],[-6.89772,54.35075],[-6.87527,54.33853],[-6.86512,54.32568],[-6.85163,54.29137],[-6.87452,54.28677],[-6.87791,54.27918],[-6.86673,54.27522],[-6.85177,54.26489],[-6.83693,54.26658],[-6.82165,54.24346],[-6.81633,54.22299],[-6.80045,54.22108],[-6.80122,54.21338],[-6.77599,54.19965],[-6.75573,54.1987],[-6.74316,54.18258],[-6.73406,54.18566],[-6.72445,54.18127],[-6.70295,54.20036],[-6.69166,54.20018],[-6.68673,54.19398],[-6.669,54.19584],[-6.65248,54.18102],[-6.6433,54.17801],[-6.63467,54.16449],[-6.63179,54.14766],[-6.64081,54.14238],[-6.63935,54.13599],[-6.66149,54.1205],[-6.6481,54.10153],[-6.66119,54.0934],[-6.66458,54.06629],[-6.64681,54.05873],[-6.62501,54.03737],[-6.59291,54.04755],[-6.58905,54.05808],[-6.5597,54.0481],[-6.52897,54.05888],[-6.50442,54.05566],[-6.47824,54.07004],[-6.47919,54.07762],[-6.43601,54.05959],[-6.36314,54.07057],[-6.36589,54.09338],[-6.36293,54.09758],[-6.37104,54.11497],[-6.3522,54.11084],[-6.34242,54.1114],[-6.33589,54.10833],[-6.33636,54.09469],[-6.31808,54.09096],[-6.30903,54.10463],[-6.29165,54.11235],[-6.28246,54.11145],[-6.26272,54.09786],[-5.35583,53.72597],[-7.0752,49.23912],[-1.83472,49.02346],[-2.12036,49.94415],[1.97754,51.13111]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-65.2,18.7],[-65,16.3],[-63.7,19.2],[-65.2,18.7]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-63,-50.5],[-55,-51],[-60,-54],[-63,-50.5]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-139.19952,60.08402],[-141,60.30621],[-141,76],[-169,68.63655],[-169,65.20147],[-180,61],[-180,-4],[-154,9],[-133.76404,54.54021],[-130.73868,54.71986],[-129.96277,55.29163],[-130.15228,55.7758],[-130.01787,55.90688],[-130.00362,56.00798],[-130.10284,56.12336],[-130.24498,56.09656],[-130.42625,56.14249],[-131.87439,56.79787],[-135.02884,59.56285],[-135.11759,59.62306],[-135.15827,59.6261],[-135.47928,59.79822],[-136.28677,59.57955],[-136.30531,59.46462],[-136.36836,59.44898],[-136.47697,59.46558],[-137.19727,59.01935],[-139.19952,60.08402]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-111.96064,48.99841],[-121.22623,49.00049],[-122.26513,49.00246],[-122.7565,49.00208],[-123.32218,49.00218],[-122.97821,48.76524],[-123.2666,48.69821],[-123.21991,48.21186],[-125.80444,48.60749],[-124.32129,31.54109],[-117.125,32.53429],[-116.82417,32.55996],[-115.88036,32.63735],[-115.49738,32.66486],[-114.71984,32.71877],[-114.7649,32.64602],[-114.80885,32.60959],[-114.81481,32.49451],[-112.81743,31.88004],[-111.07481,31.33224],[-109.56051,31.33402],[-108.20847,31.33384],[-108.20838,31.78363],[-106.52847,31.78391],[-106.52781,31.78086],[-106.52249,31.77501],[-106.51249,31.76933],[-106.50988,31.7612],[-106.50709,31.76123],[-106.48896,31.74806],[-106.48473,31.74769],[-106.4719,31.75101],[-106.46816,31.75897],[-106.45434,31.76466],[-106.45035,31.76426],[-106.43516,31.75492],[-106.41484,31.75101],[-106.37864,31.73021],[-106.37225,31.71174],[-106.34924,31.69633],[-106.33289,31.66178],[-106.3068,31.62459],[-106.28079,31.56179],[-106.24775,31.54226],[-106.2329,31.49982],[-106.2105,31.46857],[-106.08201,31.39863],[-106.00554,31.39233],[-105.76401,31.17051],[-105.58548,31.06117],[-105.56419,30.98526],[-104.99153,30.6639],[-104.97162,30.60896],[-104.90639,30.57822],[-104.83772,30.38117],[-104.70177,30.20567],[-104.68048,29.92399],[-104.57611,29.77838],[-104.51157,29.63674],[-104.39758,29.57047],[-104.39278,29.55293],[-104.05769,29.32173],[-103.79883,29.2581],[-103.78196,29.26555],[-103.76759,29.22799],[-103.14102,28.93666],[-102.86087,29.2217],[-102.65076,29.79418],[-101.41068,29.73457],[-101.26511,29.51372],[-101.05997,29.452],[-101.04083,29.38038],[-100.96303,29.34735],[-100.94406,29.34369],[-100.94071,29.33351],[-100.92775,29.32663],[-100.89814,29.30957],[-100.87818,29.28086],[-100.80076,29.2238],[-100.76437,29.15981],[-100.67047,29.08663],[-100.6412,28.91299],[-100.63236,28.90255],[-100.61296,28.89939],[-100.534,28.75622],[-100.51495,28.74531],[-100.50705,28.7143],[-100.51203,28.70666],[-100.51014,28.69127],[-100.50048,28.66186],[-100.45547,28.6381],[-100.44697,28.60743],[-100.35599,28.45239],[-100.34946,28.39653],[-100.29488,28.31315],[-100.29591,28.27324],[-100.17197,28.17493],[-99.93645,27.9568],[-99.87722,27.80173],[-99.79671,27.73338],[-99.772,27.72532],[-99.74556,27.69979],[-99.71947,27.65981],[-99.5957,27.59974],[-99.54094,27.60537],[-99.53055,27.57973],[-99.52034,27.55782],[-99.52802,27.49773],[-99.50141,27.49986],[-99.48755,27.49518],[-99.47897,27.48421],[-99.48661,27.46453],[-99.49534,27.44861],[-99.48927,27.40941],[-99.53957,27.31565],[-99.43588,27.19678],[-99.46404,27.01968],[-99.16698,26.56039],[-99.17474,26.53939],[-99.12698,26.51958],[-99.1135,26.42954],[-99.08355,26.39625],[-99.06007,26.39737],[-99.03634,26.41255],[-99.02042,26.40598],[-99.01291,26.39364],[-98.95686,26.38641],[-98.9566,26.37365],[-98.94523,26.36949],[-98.90013,26.36419],[-98.89905,26.35454],[-98.80305,26.36626],[-98.78254,26.30511],[-98.66667,26.23457],[-98.58496,26.24647],[-98.57951,26.23434],[-98.56519,26.23987],[-98.56294,26.22464],[-98.50599,26.20858],[-98.44806,26.21236],[-98.38617,26.15721],[-98.34176,26.15278],[-98.33579,26.1388],[-98.30626,26.10003],[-98.28841,26.10512],[-98.26524,26.0914],[-98.19898,26.06411],[-98.09577,26.05698],[-98.07568,26.06667],[-98.08302,26.03396],[-97.9771,26.04136],[-97.9532,26.06179],[-97.81643,26.04475],[-97.77017,26.02439],[-97.73884,26.02902],[-97.5289,25.90648],[-97.52151,25.88625],[-97.50615,25.89031],[-97.49851,25.89903],[-97.49637,25.89641],[-97.49748,25.88008],[-97.49422,25.87981],[-97.48847,25.88564],[-97.46409,25.88174],[-97.42607,25.842],[-97.36856,25.8396],[-97.26231,25.94724],[-80.81543,24.00633],[-66.87378,44.77794],[-67.16148,45.16715],[-67.2286,45.16739],[-67.26246,45.18797],[-67.28311,45.19175],[-67.28959,45.18784],[-67.29332,45.17568],[-67.29049,45.17317],[-67.3001,45.16776],[-67.3025,45.16122],[-67.29761,45.14766],[-67.33975,45.1255],[-67.40524,45.16122],[-67.40387,45.17139],[-67.4818,45.27682],[-67.42172,45.38543],[-67.45262,45.41008],[-67.50498,45.4889],[-67.41623,45.50105],[-67.42219,45.55661],[-67.42902,45.56833],[-67.42331,45.57154],[-67.42498,45.57836],[-67.45193,45.60323],[-67.77981,45.6738],[-67.79019,47.06776],[-67.88006,47.1067],[-67.91319,47.14793],[-67.92598,47.15418],[-67.95181,47.1875],[-68.02374,47.23915],[-68.13017,47.29309],[-68.17669,47.32893],[-68.24046,47.35354],[-68.32809,47.36005],[-68.36363,47.35476],[-68.38054,47.34167],[-68.38509,47.30321],[-68.37367,47.28796],[-68.4377,47.28232],[-68.47916,47.29623],[-68.51074,47.29885],[-68.54593,47.28441],[-68.58408,47.28482],[-68.59777,47.27134],[-68.59271,47.25762],[-68.61889,47.24148],[-68.68936,47.24125],[-68.71768,47.23676],[-68.80128,47.21423],[-68.89629,47.17676],[-69.05354,47.24847],[-69.04924,47.41798],[-69.22425,47.45961],[-69.99729,46.69558],[-70.0569,46.4149],[-70.25551,46.10871],[-70.29001,46.09431],[-70.39919,45.80667],[-70.83229,45.40062],[-70.80794,45.37878],[-70.82663,45.2367],[-70.87538,45.23453],[-70.92138,45.28099],[-70.90645,45.30918],[-71.0109,45.34798],[-71.08429,45.30556],[-71.1454,45.24226],[-71.20525,45.25278],[-71.28925,45.30097],[-71.41405,45.23513],[-71.43044,45.12381],[-71.49692,45.06991],[-71.50623,45.04878],[-71.49284,45.03629],[-71.50027,45.01372],[-71.79359,45.01075],[-72.08774,45.00581],[-72.14155,45.00568],[-72.15282,45.00609],[-72.17142,45.00584],[-72.25847,45.00436],[-72.38795,45.00626],[-72.4496,45.00863],[-72.5356,45.00936],[-72.66257,45.01523],[-72.82537,45.01642],[-73.08466,45.01561],[-73.45219,45.00875],[-74.14699,44.99145],[-74.33753,44.9923],[-74.50786,44.99798],[-74.66158,44.99949],[-74.71244,44.99734],[-74.75887,44.98708],[-74.76368,45.00632],[-74.78977,45.00365],[-74.82376,45.01773],[-74.94186,44.98229],[-75.30098,44.83883],[-75.30304,44.82836],[-75.59418,44.6457],[-75.97269,44.33502],[-75.97295,44.34595],[-76.00059,44.34797],[-76.17645,44.2865],[-76.18744,44.22158],[-76.88782,43.82759],[-79.16851,43.32168],[-79.05487,43.25371],[-79.05092,43.169],[-79.04603,43.16093],[-79.04208,43.13942],[-79.07002,43.12038],[-79.06015,43.114],[-79.0568,43.10474],[-79.0774,43.07861],[-78.9996,43.05484],[-79.02311,43.02071],[-79.02552,42.99473],[-78.96235,42.9573],[-78.91188,42.9426],[-78.90398,42.89181],[-82.42767,41.47978],[-83.14316,42.03807],[-83.12805,42.23843],[-83.09715,42.29052],[-83.07252,42.31515],[-82.94575,42.34332],[-82.59676,42.5479],[-82.51368,42.61785],[-82.5108,42.66464],[-82.4675,42.76415],[-82.48055,42.80573],[-82.45497,42.9284],[-82.41334,42.97099],[-82.42596,42.99536],[-82.15851,43.39507],[-83.53729,46.098],[-83.96301,46.05036],[-84.11021,46.23851],[-84.09794,46.25656],[-84.11613,46.26878],[-84.11905,46.31516],[-84.10721,46.3218],[-84.14394,46.41076],[-84.11682,46.51576],[-84.13536,46.53218],[-84.16162,46.5284],[-84.21621,46.53891],[-84.26994,46.49189],[-84.36092,46.50997],[-84.55284,46.4407],[-84.95178,46.77185],[-89.59179,48.00307],[-89.67547,48.00371],[-90.87204,48.25943],[-91.41312,48.06753],[-92.99377,48.62474],[-93.34877,48.62604],[-93.35529,48.61124],[-93.37074,48.60584],[-93.39812,48.60369],[-93.40542,48.61089],[-93.43846,48.59478],[-93.46859,48.59205],[-93.45735,48.56667],[-93.46533,48.54593],[-93.64763,48.51751],[-93.80625,48.51888],[-93.80642,48.58047],[-93.83328,48.62582],[-93.84865,48.63064],[-93.93388,48.6326],[-94.01327,48.64471],[-94.16176,48.64697],[-94.25025,48.65463],[-94.24931,48.67827],[-94.26046,48.69816],[-94.30578,48.71073],[-94.32758,48.70433],[-94.36123,48.70478],[-94.38406,48.71135],[-94.41629,48.71067],[-94.44294,48.69266],[-94.53615,48.7024],[-94.55031,48.71419],[-94.58894,48.71928],[-94.69425,48.77938],[-94.70129,48.83376],[-94.68996,48.83953],[-94.68395,48.99914],[-111.96064,48.99841]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[180,55],[170,53],[180,49],[180,55]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[143,22],[147,22],[147,12],[143,12],[143,22]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-171.5,-10],[-171,-15],[-167,-15],[-171.5,-10]]]}}];
23638   var dataImperial = {
23639   type: type$2,
23640   features: features
23641   };
23642
23643   var type$3 = "FeatureCollection";
23644   var features$1 = [{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[113.573,22.186],[114,22.5],[114.05534,22.503],[114.0595,22.51422],[114.07345,22.51934],[114.0786,22.53012],[114.08512,22.53228],[114.09034,22.53717],[114.09611,22.53486],[114.10602,22.53472],[114.1115,22.52929],[114.11522,22.5308],[114.11649,22.53418],[114.11979,22.53511],[114.1244,22.5393],[114.12729,22.53947],[114.13018,22.54132],[114.13807,22.5432],[114.14429,22.54176],[114.14441,22.54114],[114.14846,22.54179],[114.14855,22.54397],[114.15042,22.54593],[114.14964,22.54954],[114.15166,22.55168],[114.15192,22.55438],[114.15642,22.55495],[114.15841,22.55909],[114.16032,22.56153],[114.16162,22.56187],[114.1634,22.55931],[114.16553,22.5593],[114.16733,22.56119],[114.16934,22.56093],[114.17061,22.5597],[114.17702,22.56],[114.17798,22.55546],[114.18401,22.5552],[114.18673,22.55468],[114.1878,22.55545],[114.18979,22.55446],[114.1955,22.55564],[114.19674,22.55691],[114.20005,22.55717],[114.20376,22.55623],[114.20884,22.55672],[114.22438,22.55055],[114.2264,22.5476],[114.22545,22.54528],[114.22661,22.54339],[114.32,22.576],[114.45,22.43],[114.45,22.14],[113.9,22.14],[113.75,22.22],[113.553,22.095],[113.54678,22.1207],[113.5456,22.1207],[113.54076,22.12373],[113.54016,22.13618],[113.54701,22.13651],[113.5475,22.14583],[113.52456,22.17978],[113.53623,22.20191],[113.53299,22.21232],[113.53497,22.21351],[113.53735,22.21377],[113.54156,22.21315],[113.54385,22.21709],[113.55849,22.21565],[113.573,22.186]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-75,18],[-80,20.5],[-83,19],[-77,16],[-75,18]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-64.33594,32.86113],[-79.39819,27.21067],[-80.63965,23.71998],[-73.39966,20.40642],[-65.1709,19.20743],[-65.09399,16.23577],[-59.13391,16.80454],[-62.64404,15.16228],[-59.43054,14.85985],[-62.83081,13.64599],[-61.80359,10.73752],[-62.08649,10.04729],[-61.06201,9.85522],[-59.81369,8.31274],[-59.8027,8.27469],[-59.83498,8.22712],[-59.94141,8.21149],[-59.99771,8.15576],[-59.97986,8.13265],[-59.99771,8.12041],[-60.00183,8.07147],[-60.05127,8.02524],[-60.09933,8.03747],[-60.12268,8.02388],[-60.14053,7.98988],[-60.36163,7.83345],[-60.53467,7.81713],[-60.5896,7.6375],[-60.72144,7.54493],[-60.5896,7.31888],[-60.63904,7.24532],[-60.54703,7.12542],[-60.46875,7.20309],[-60.37262,7.18401],[-60.29984,7.1445],[-60.2916,7.06819],[-60.39871,6.95097],[-60.66513,6.83235],[-60.71869,6.75053],[-60.91232,6.81735],[-60.94254,6.72053],[-61.14441,6.72326],[-61.23093,6.5773],[-61.1554,6.45314],[-61.14441,6.20199],[-61.39709,5.95619],[-60.71045,5.20036],[-60.21606,5.23319],[-59.99634,5.06906],[-60.13916,4.51071],[-59.69971,4.40118],[-59.5459,3.93002],[-59.87549,3.56825],[-59.7876,3.37086],[-60.01831,2.83332],[-59.90845,2.38335],[-59.69971,2.2626],[-59.77661,1.87833],[-59.65302,1.85087],[-59.69147,1.75754],[-59.61456,1.71361],[-59.55139,1.73283],[-59.36188,1.49123],[-59.26575,1.39238],[-58.92242,1.30726],[-58.83728,1.17271],[-58.71918,1.23037],[-58.71094,1.29902],[-58.49121,1.26058],[-58.461,1.37591],[-58.50494,1.38689],[-58.51044,1.46102],[-58.38135,1.4775],[-58.32642,1.57359],[-58.00507,1.49946],[-57.99133,1.65321],[-57.79907,1.69165],[-57.70844,1.71087],[-57.54364,1.68341],[-57.41455,1.94421],[-57.10693,1.97715],[-56.8103,1.85636],[-56.48071,1.92225],[-55.90942,1.81244],[-55.90942,2.04302],[-56.14014,2.26534],[-55.94788,2.53701],[-55.70892,2.39981],[-55.37933,2.43274],[-55.19257,2.53976],[-54.98108,2.57268],[-54.88495,2.43548],[-54.71191,2.46293],[-54.69543,2.34767],[-54.58832,2.32846],[-54.43451,2.43548],[-54.20654,2.76748],[-54.17358,3.12955],[-53.96484,3.57921],[-54.33838,4.00674],[-54.44412,4.52577],[-54.46884,4.91036],[-54.36653,5.13061],[-54.27727,5.26191],[-54.19968,5.3084],[-54.01222,5.54457],[-54.0239,5.64605],[-53.86322,5.94936],[-64.33594,32.86113]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-14.5,-6],[11.79657,-17.27197],[12.03415,-17.14866],[12.38159,-17.22213],[12.58484,-17.22476],[13.01193,-16.97405],[13.24951,-17.00098],[13.38135,-16.98522],[13.93341,-17.38734],[18.42476,-17.38996],[18.47763,-17.46857],[18.62663,-17.64599],[18.79211,-17.76177],[18.92944,-17.82061],[19.33044,-17.84806],[19.66278,-17.8644],[19.74792,-17.90557],[19.85161,-17.87486],[20.10361,-17.90296],[20.18394,-17.88401],[20.34737,-17.88466],[20.44693,-17.91733],[20.51697,-17.96698],[20.83008,-18.03032],[20.95711,-17.97285],[21.16997,-17.93497],[21.42677,-18.0264],[23.45032,-17.63879],[22.00012,-16.38866],[21.99944,-13.00523],[24.03809,-12.99118],[24.03809,-10.91962],[24.43359,-11.09217],[24.45557,-11.48002],[25.37842,-11.19996],[25.42236,-11.60919],[26.96045,-11.97484],[27.18018,-11.60919],[28.125,-12.42048],[29.11377,-13.36824],[29.1687,-13.43771],[29.55872,-13.19716],[29.68506,-13.2239],[29.62463,-13.41099],[29.80591,-13.44305],[29.81415,-12.14809],[29.31152,-12.55456],[28.41064,-11.78133],[28.63037,-10.70379],[28.65234,-9.73071],[28.37219,-9.24309],[28.89748,-8.47916],[30.78644,-8.26857],[29.39941,-6.05316],[29.4873,-4.45595],[29.75922,-4.46759],[29.81415,-4.36421],[29.88007,-4.36832],[30.04074,-4.26699],[30.07919,-4.1629],[30.18356,-4.08311],[30.1918,-4.05126],[30.21566,-4.04595],[30.22923,-4.01136],[30.21326,-3.99612],[30.25978,-3.88755],[30.29274,-3.86288],[30.34424,-3.77245],[30.39848,-3.79095],[30.40878,-3.76765],[30.39548,-3.7304],[30.39054,-3.72821],[30.3896,-3.71918],[30.39093,-3.7101],[30.39514,-3.70444],[30.42028,-3.64963],[30.46886,-3.53501],[30.67108,-3.41335],[30.63297,-3.34892],[30.84206,-3.25535],[30.84549,-3.16108],[30.83485,-3.09698],[30.7933,-3.06235],[30.82111,-3.02258],[30.84515,-2.9739],[30.74764,-2.99618],[30.7037,-2.97013],[30.66422,-2.98967],[30.57632,-2.90738],[30.49393,-2.94441],[30.41016,-2.87172],[30.52002,-2.39432],[30.77545,-2.38883],[30.8606,-2.31199],[30.84961,-2.19398],[30.89081,-2.07322],[30.81116,-1.96068],[30.83862,-1.6587],[30.73425,-1.4418],[30.56259,-1.33884],[30.4541,-1.05737],[30.35797,-1.06287],[30.34149,-1.13152],[30.16571,-1.34296],[29.91852,-1.48024],[29.83887,-1.31824],[29.58344,-1.39238],[29.729,0.05493],[29.96796,0.5136],[29.9707,0.8569],[30.22339,0.92281],[30.24536,1.15349],[30.47745,1.20772],[31.30966,2.15693],[31.20255,2.22211],[31.20255,2.29278],[31.16409,2.27906],[31.13937,2.28318],[31.13113,2.26534],[31.07826,2.30033],[31.0714,2.34767],[31.00479,2.4005],[30.97183,2.40461],[30.94711,2.38746],[30.94849,2.36276],[30.9375,2.33532],[30.88531,2.34012],[30.83038,2.42176],[30.74112,2.43274],[30.76035,2.5864],[30.90179,2.88132],[30.76447,3.04178],[30.93613,3.40239],[30.94059,3.50588],[30.85236,3.48601],[30.90866,3.5936],[30.95055,3.63918],[30.94677,3.65391],[30.9866,3.70187],[31.00582,3.70701],[31.02058,3.69708],[31.16547,3.7954],[31.28838,3.79643],[31.52699,3.66282],[31.7038,3.72449],[31.82671,3.82794],[31.96198,3.65596],[31.95854,3.57099],[32.04987,3.59155],[32.07733,3.57099],[32.0842,3.53672],[32.20093,3.50657],[32.21672,3.56448],[32.19578,3.59977],[32.41516,3.74504],[32.72055,3.76782],[32.89307,3.81219],[33.02782,3.89371],[33.18146,3.7793],[33.51173,3.75258],[33.98758,4.23309],[34.05762,4.28342],[34.38721,4.61065],[35.94452,4.62023],[35.95688,4.53467],[36.04134,4.44568],[36.89621,4.4491],[38.14728,3.62992],[38.55927,3.62033],[38.92181,3.51068],[39.56039,3.43392],[39.87076,3.87522],[40.76752,4.28753],[41.16371,3.94372],[41.89774,3.97797],[41.31271,3.14463],[40.98896,2.82869],[40.99548,-0.84042],[41.7,-1.8],[41.7,-49],[-27,-60],[-65.7,-52.5],[-14.5,-6]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[31.33301,35.47856],[33.0249,33.75175],[35.44189,36.02245],[31.33301,35.47856]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[14,36.5],[15,36],[14,35],[14,36.5]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[0,62],[2.5,51.3],[-2,50],[-1.9,49],[-20,53],[0,62]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[180,-35],[161,-19],[167,-12],[180,-22],[180,4],[170,3.7],[127,5.7],[118,2.7],[119.5,5.4],[117.2,7.5],[102.6,8],[102.9158,11.74099],[102.76268,12.07357],[102.70226,12.17158],[102.74139,12.46474],[102.53128,12.68857],[102.49557,12.9256],[102.49763,13.0064],[102.4597,13.08199],[102.43412,13.09026],[102.39155,13.16407],[102.35481,13.29341],[102.35893,13.30945],[102.34503,13.34837],[102.35928,13.39797],[102.3567,13.48095],[102.36168,13.50582],[102.33559,13.53787],[102.33971,13.56023],[102.35498,13.5649],[102.36511,13.5785],[102.40047,13.5679],[102.42537,13.56891],[102.44614,13.56123],[102.48047,13.57091],[102.53849,13.56757],[102.5699,13.58526],[102.57806,13.60486],[102.62501,13.60845],[102.62132,13.61295],[102.60767,13.61562],[102.57231,13.63331],[102.56922,13.64082],[102.54879,13.658],[102.56252,13.68552],[102.5972,13.70803],[102.67084,13.74472],[102.68818,13.75172],[102.7014,13.7684],[102.73161,13.77082],[102.76543,13.85541],[102.78397,13.93207],[102.80388,13.94406],[102.81607,13.96639],[102.90705,14.02119],[102.89726,14.0535],[102.90095,14.0838],[102.92421,14.10744],[102.92378,14.12838],[102.94147,14.15035],[102.92953,14.17952],[103.17535,14.33774],[103.19939,14.32992],[103.68553,14.44],[103.94508,14.34157],[104.05756,14.34589],[104.06636,14.3419],[104.26025,14.37749],[104.50058,14.36984],[104.57817,14.36019],[104.6422,14.42387],[104.66632,14.40234],[104.68357,14.39877],[104.71138,14.43169],[104.72305,14.42188],[104.71687,14.40043],[104.75344,14.40459],[104.80408,14.43867],[104.83429,14.41573],[104.99239,14.3838],[105.05402,14.19783],[105.47905,14.49186],[105.60883,15.0005],[105.46703,15.13005],[105.48866,15.20237],[105.59269,15.2716],[105.58617,15.32823],[105.50308,15.31912],[105.46703,15.33948],[105.49175,15.37921],[105.59372,15.42869],[105.59372,15.50927],[105.60986,15.54871],[105.62616,15.56492],[105.62702,15.59129],[105.63518,15.62742],[105.63612,15.66056],[105.5975,15.72088],[105.49965,15.76681],[105.46291,15.74517],[105.43819,15.75459],[105.40489,15.79424],[105.34241,15.92039],[105.37811,15.98344],[105.39167,15.99136],[105.41931,15.98608],[105.42652,15.99764],[105.41468,16.01661],[105.21263,16.05076],[105.04955,16.10552],[105.01316,16.24401],[104.88235,16.37812],[104.8391,16.45782],[104.77936,16.49041],[104.73919,16.53287],[104.74228,16.62205],[104.76391,16.70953],[104.73953,16.80323],[104.76425,16.85088],[104.73782,16.90968],[104.744,17.0128],[104.81266,17.21853],[104.79841,17.39274],[104.70348,17.52833],[104.46384,17.65515],[104.34368,17.83564],[104.27776,17.8559],[104.22661,17.98069],[104.1116,18.10735],[104.06525,18.21174],[103.97392,18.33823],[103.9286,18.33237],[103.88809,18.29456],[103.85582,18.28673],[103.83659,18.32715],[103.79128,18.3467],[103.70201,18.34214],[103.60931,18.40405],[103.57292,18.40437],[103.51593,18.42978],[103.45963,18.42587],[103.41568,18.44802],[103.30479,18.43206],[103.24265,18.37082],[103.24333,18.34133],[103.29123,18.32357],[103.28899,18.29521],[103.23595,18.28299],[103.16608,18.25511],[103.02429,17.98135],[102.6535,17.83237],[102.40631,17.99963],[102.10968,18.22413],[101.548,17.81538],[101.30493,17.64991],[101.14563,17.46595],[100.95886,17.61654],[101.01757,17.88858],[101.18752,18.05121],[101.16863,18.10409],[101.18134,18.33595],[101.08727,18.38287],[101.05499,18.43988],[101.23215,18.73015],[101.35265,19.04524],[101.25927,19.12733],[101.2373,19.32637],[101.25824,19.58438],[101.11954,19.56836],[101.08898,19.58777],[101.08624,19.59715],[101.03165,19.6185],[100.89844,19.62125],[100.77827,19.49249],[100.63751,19.56432],[100.58258,19.49313],[100.47478,19.5944],[100.42929,19.67152],[100.43341,19.7024],[100.4147,19.7255],[100.40525,19.7646],[100.43907,19.80345],[100.45555,19.84843],[100.50636,19.87264],[100.51709,19.93027],[100.58653,20.1599],[100.56576,20.1757],[100.54945,20.17473],[100.52731,20.14379],[100.51065,20.14895],[100.48697,20.17956],[100.46774,20.196],[100.45246,20.20147],[100.45521,20.22129],[100.44783,20.23546],[100.41607,20.25286],[100.40594,20.28184],[100.38397,20.31082],[100.37556,20.35187],[100.36165,20.35638],[100.35736,20.37408],[100.33195,20.39902],[100.27805,20.40224],[100.25917,20.39677],[100.2475,20.37263],[100.22535,20.35509],[100.22346,20.31839],[100.16579,20.29988],[100.17162,20.24545],[100.10845,20.25221],[100.09266,20.2696],[100.09798,20.31485],[100.07961,20.3678],[99.9567,20.46417],[99.91636,20.44925],[99.90765,20.44977],[99.89121,20.44511],[99.87276,20.44406],[99.86212,20.44326],[99.80186,20.33948],[99.46472,20.3884],[99.56085,20.20035],[99.43691,20.08882],[99.27727,20.11623],[99.06921,20.1101],[98.97789,19.74538],[98.24387,19.68656],[97.85934,19.57014],[97.76733,18.57336],[97.39655,18.47179],[97.62451,18.30238],[97.73849,17.97743],[97.66502,17.87943],[97.90947,17.56745],[98.52951,16.82557],[98.51303,16.69276],[98.69293,16.26873],[98.87421,16.43609],[98.93394,16.3353],[98.84743,16.13356],[98.74512,16.12037],[98.58307,16.07287],[98.5762,15.79754],[98.54736,15.37557],[98.17383,15.15167],[98.3606,14.63674],[99.08295,13.89208],[99.16534,13.72204],[99.18182,13.00723],[99.39331,12.56797],[99.64153,11.78973],[99.32156,11.30266],[98.77859,10.67849],[98.80597,10.47642],[98.76657,10.40459],[98.74924,10.34194],[96.85547,6.40265],[92.42523,20.54794],[92.2728,20.96272],[92.187,21.16],[92.26,21.36],[92.27,21.4328],[92.62,21.43],[92.6,22],[93.22,22.25],[93.4,23.7],[93.34,23.95],[94.155,23.847],[94.17,23.92],[94.25171,24.07405],[94.28,24.23],[94.30175,24.2371],[94.3256,24.2731],[94.6,24.7],[94.78,25.47],[95.2,26],[95.1,26.6],[97.3,27.9],[96.14,29.38],[95.4,29.1],[94.8,29.2],[92.5,27.8],[91.64,27.76],[91.4,28],[89.58,28.18],[88.9,27.32],[88.74,27.47],[88.9,27.86],[88.7,28.1],[88.1,27.87],[85.93,27.942],[81.6,30.5],[81.2,30],[78.73,31.5],[78.77,31.99],[78.4,32.5],[79.3,32.5],[79,34.3],[78.3,34.6],[78,35.5],[76.1,35.8],[76,36.55],[75.15,37],[72.5,36.9],[71.1,36.1],[71.65,35.44],[71.45,35],[70.985,34.54],[71.18,34.36],[71.092,34.118],[70.88,33.97],[70.5,33.94],[69.908,34.04],[69.869,33.96],[70,33.75],[70.13,33.73],[70.34,33.34],[70.013,33.14],[69.57,33.09],[69.24,32.45],[69.3,31.9],[68.1,31.6],[66.393,30.934],[66.2,29.8],[62.5,29.4],[60.87,29.86],[61.53,29.0165],[61.66,28.77],[61.96,28.54],[62.43,28.42],[62.6,28.25],[62.795,28.28],[62.86,27.25],[63.24,27.25],[63.327,27.13],[63.25,27.1],[63.25,26.84],[63.18,26.83],[63.18,26.65],[62.3,26.5],[62.2,26.28],[61.85,26.22],[61.84,25.75],[61.68,25.67],[56.5,-21],[180,-65],[180,-35]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[138.7,46.7],[145.5,44.5],[145.2,43.7],[146,43.3],[142,18],[122,24.3],[138.7,46.7]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-180,7],[-148,7],[-151,-12],[-171.5,-10.75],[-171,-16],[-152,-19],[-180,-55],[-180,7]]]}}];
23645   var dataDriveLeft = {
23646   type: type$3,
23647   features: features$1
23648   };
23649
23650   var en = {icons:{information:"info",remove:"remove",undo:"undo"},modes:{add_area:{title:"Area",description:"Add parks, buildings, lakes or other areas to the map.",tail:"Click on the map to start drawing an area, like a park, lake, or building."},add_line:{title:"Line",description:"Add highways, streets, pedestrian paths, canals or other lines to the map.",tail:"Click on the map to start drawing a road, path, or route."},add_point:{title:"Point",description:"Add restaurants, monuments, postal boxes or other points to the map.",tail:"Click on the map to add a point."},add_note:{title:"Note",description:"Spotted an issue? Let other mappers know.",tail:"Click on the map to add a note."},browse:{title:"Browse",description:"Pan and zoom the map."},draw_area:{tail:"Click to add nodes to your area. Click the first node to finish the area."},draw_line:{tail:"Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."},drag_node:{connected_to_hidden:"This can't be edited because it is connected to a hidden feature."}},operations:{add:{annotation:{point:"Added a point.",vertex:"Added a node to a way.",relation:"Added a relation.",note:"Added a note."}},start:{annotation:{line:"Started a line.",area:"Started an area."}},"continue":{key:"A",title:"Continue",description:"Continue this line.",not_eligible:"No line can be continued here.",multiple:"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.",annotation:{line:"Continued a line.",area:"Continued an area."}},cancel_draw:{annotation:"Canceled drawing."},change_role:{annotation:"Changed the role of a relation member."},change_tags:{annotation:"Changed tags."},circularize:{title:"Circularize",description:{line:"Make this line circular.",area:"Make this area circular."},key:"O",annotation:{line:"Made a line circular.",area:"Made an area circular."},not_closed:"This can't be made circular because it's not a loop.",too_large:"This can't be made circular because not enough of it is currently visible.",connected_to_hidden:"This can't be made circular because it is connected to a hidden feature."},orthogonalize:{title:"Square",description:{line:"Square the corners of this line.",area:"Square the corners of this area."},key:"S",annotation:{line:"Squared the corners of a line.",area:"Squared the corners of an area."},not_squarish:"This can't be made square because it is not squarish.",too_large:"This can't be made square because not enough of it is currently visible.",connected_to_hidden:"This can't be made square because it is connected to a hidden feature."},straighten:{title:"Straighten",description:"Straighten this line.",key:"S",annotation:"Straightened a line.",too_bendy:"This can't be straightened because it bends too much.",connected_to_hidden:"This line can't be straightened because it is connected to a hidden feature."},"delete":{title:"Delete",description:{single:"Delete this feature permanently.",multiple:"Delete these features permanently."},annotation:{point:"Deleted a point.",vertex:"Deleted a node from a way.",line:"Deleted a line.",area:"Deleted an area.",relation:"Deleted a relation.",multiple:"Deleted {n} features."},too_large:{single:"This feature can't be deleted because not enough of it is currently visible.",multiple:"These features can't be deleted because not enough of them are currently visible."},incomplete_relation:{single:"This feature can't be deleted because it hasn't been fully downloaded.",multiple:"These features can't be deleted because they haven't been fully downloaded."},part_of_relation:{single:"This feature can't be deleted because it is part of a larger relation. You must remove it from the relation first.",multiple:"These features can't be deleted because they are part of larger relations. You must remove them from the relations first."},connected_to_hidden:{single:"This feature can't be deleted because it is connected to a hidden feature.",multiple:"These features can't be deleted because some are connected to hidden features."}},add_member:{annotation:"Added a member to a relation."},delete_member:{annotation:"Removed a member from a relation."},connect:{annotation:{point:"Connected a way to a point.",vertex:"Connected a way to another.",line:"Connected a way to a line.",area:"Connected a way to an area."},relation:"These features can't be connected because they have conflicting relation roles.",restriction:"These features can't be connected because it would damage a \"{relation}\" relation."},disconnect:{title:"Disconnect",description:"Disconnect these lines/areas from each other.",key:"D",annotation:"Disconnected lines/areas.",not_connected:"There aren't enough lines/areas here to disconnect.",connected_to_hidden:"This can't be disconnected because it is connected to a hidden feature.",relation:"This can't be disconnected because it connects members of a relation."},merge:{title:"Merge",description:"Merge these features.",key:"C",annotation:"Merged {n} features.",not_eligible:"These features can't be merged.",not_adjacent:"These features can't be merged because their endpoints aren't connected.",restriction:"These features can't be merged because it would damage a \"{relation}\" relation.",relation:"These features can't be merged because they have conflicting relation roles.",incomplete_relation:"These features can't be merged because at least one hasn't been fully downloaded.",conflicting_tags:"These features can't be merged because some of their tags have conflicting values."},move:{title:"Move",description:{single:"Move this feature to a different location.",multiple:"Move these features to a different location."},key:"M",annotation:{point:"Moved a point.",vertex:"Moved a node in a way.",line:"Moved a line.",area:"Moved an area.",multiple:"Moved multiple features."},incomplete_relation:{single:"This feature can't be moved because it hasn't been fully downloaded.",multiple:"These features can't be moved because they haven't been fully downloaded."},too_large:{single:"This feature can't be moved because not enough of it is currently visible.",multiple:"These features can't be moved because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be moved because it is connected to a hidden feature.",multiple:"These features can't be moved because some are connected to hidden features."}},reflect:{title:{long:"Reflect Long",short:"Reflect Short"},description:{long:{single:"Reflect this feature across its long axis.",multiple:"Reflect these features across their long axis."},short:{single:"Reflect this feature across its short axis.",multiple:"Reflect these features across their short axis."}},key:{long:"T",short:"Y"},annotation:{long:{single:"Reflected a feature across its long axis.",multiple:"Reflected multiple features across their long axis."},short:{single:"Reflected a feature across its short axis.",multiple:"Reflected multiple features across their short axis."}},incomplete_relation:{single:"This feature can't be reflected because it hasn't been fully downloaded.",multiple:"These features can't be reflected because they haven't been fully downloaded."},too_large:{single:"This feature can't be reflected because not enough of it is currently visible.",multiple:"These features can't be reflected because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be reflected because it is connected to a hidden feature.",multiple:"These features can't be reflected because some are connected to hidden features."}},rotate:{title:"Rotate",description:{single:"Rotate this feature around its center point.",multiple:"Rotate these features around their center point."},key:"R",annotation:{line:"Rotated a line.",area:"Rotated an area.",multiple:"Rotated multiple features."},incomplete_relation:{single:"This feature can't be rotated because it hasn't been fully downloaded.",multiple:"These features can't be rotated because they haven't been fully downloaded."},too_large:{single:"This feature can't be rotated because not enough of it is currently visible.",multiple:"These features can't be rotated because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be rotated because it is connected to a hidden feature.",multiple:"These features can't be rotated because some are connected to hidden features."}},reverse:{title:"Reverse",description:"Make this line go in the opposite direction.",key:"V",annotation:"Reversed a line."},split:{title:"Split",description:{line:"Split this line into two at this node.",area:"Split the boundary of this area into two.",multiple:"Split the lines/area boundaries at this node into two."},key:"X",annotation:{line:"Split a line.",area:"Split an area boundary.",multiple:"Split {n} lines/area boundaries."},not_eligible:"Lines can't be split at their beginning or end.",multiple_ways:"There are too many lines here to split.",connected_to_hidden:"This can't be split because it is connected to a hidden feature."},restriction:{annotation:{create:"Added a turn restriction","delete":"Deleted a turn restriction"}},detach_node:{title:"Detach",key:"E",description:"Detach this node from these lines/areas.",annotation:"Detached a node from parent lines/areas.",restriction:"This node can't be detached because it would damage a \"{relation}\" relation.",connected_to_hidden:"This node can't be detached because it is connected to a hidden feature."}},restriction:{controls:{distance:"Distance",distance_up_to:"Up to {distance}",via:"Via",via_node_only:"Node only",via_up_to_one:"Up to 1 way",via_up_to_two:"Up to 2 ways"},help:{indirect:"(indirect)",turn:{no_left_turn:"NO Left Turn {indirect}",no_right_turn:"NO Right Turn {indirect}",no_u_turn:"NO U-Turn {indirect}",no_straight_on:"NO Straight On {indirect}",only_left_turn:"ONLY Left Turn {indirect}",only_right_turn:"ONLY Right Turn {indirect}",only_u_turn:"ONLY U-Turn {indirect}",only_straight_on:"ONLY Straight On {indirect}",allowed_left_turn:"Left Turn Allowed {indirect}",allowed_right_turn:"Right Turn Allowed {indirect}",allowed_u_turn:"U-Turn Allowed {indirect}",allowed_straight_on:"Straight On Allowed {indirect}"},from:"FROM",via:"VIA",to:"TO",from_name:"{from} {fromName}",from_name_to_name:"{from} {fromName} {to} {toName}",via_names:"{via} {viaNames}",select_from:"Click to select a {from} segment",select_from_name:"Click to select {from} {fromName}",toggle:"Click for \"{turn}\""}},undo:{tooltip:"Undo: {action}",nothing:"Nothing to undo."},redo:{tooltip:"Redo: {action}",nothing:"Nothing to redo."},tooltip_keyhint:"Shortcut:",browser_notice:"This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.",translate:{translate:"Translate",localized_translation_label:"Multilingual name",localized_translation_language:"Choose language",localized_translation_name:"Name"},zoom_in_edit:"Zoom in to edit",login:"Log In",logout:"Log Out",loading_auth:"Connecting to OpenStreetMap...",report_a_bug:"Report a bug",help_translate:"Help translate",feature_info:{hidden_warning:"{count} hidden features",hidden_details:"These features are currently hidden: {details}"},status:{error:"Unable to connect to API.",offline:"The API is offline. Please try editing later.",readonly:"The API is read-only. You will need to wait to save your changes.",rateLimit:"The API is limiting anonymous connections.  You can fix this by logging in."},commit:{title:"Upload to OpenStreetMap",upload_explanation:"The changes you upload will be visible on all maps that use OpenStreetMap data.",upload_explanation_with_user:"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.",request_review:"I would like someone to review my edits.",save:"Upload",cancel:"Cancel",changes:"{count} Changes",download_changes:"Download osmChange file",warnings:"Warnings",modified:"Modified",deleted:"Deleted",created:"Created",about_changeset_comments:"About changeset comments",about_changeset_comments_link:"//wiki.openstreetmap.org/wiki/Good_changeset_comments",google_warning:"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.",google_warning_link:"https://www.openstreetmap.org/copyright"},contributors:{list:"Edits by {users}",truncated_list:"Edits by {users} and {count} others"},info_panels:{key:"I",background:{key:"B",title:"Background",zoom:"Zoom",vintage:"Vintage",source:"Source",description:"Description",resolution:"Resolution",accuracy:"Accuracy",unknown:"Unknown",show_tiles:"Show Tiles",hide_tiles:"Hide Tiles",show_vintage:"Show Vintage",hide_vintage:"Hide Vintage"},history:{key:"H",title:"History",selected:"{n} selected",no_history:"No History (New Feature)",version:"Version",last_edit:"Last Edit",edited_by:"Edited By",changeset:"Changeset",unknown:"Unknown",link_text:"History on openstreetmap.org",note_no_history:"No History (New Note)",note_comments:"Comments",note_created_date:"Created Date",note_created_user:"Created By",note_link_text:"Note on openstreetmap.org"},location:{key:"L",title:"Location",unknown_location:"Unknown Location"},measurement:{key:"M",title:"Measurement",selected:"{n} selected",geometry:"Geometry",closed_line:"closed line",closed_area:"closed area",center:"Center",perimeter:"Perimeter",length:"Length",area:"Area",centroid:"Centroid",location:"Location",metric:"Metric",imperial:"Imperial",node_count:"Number of nodes"}},geometry:{point:"point",vertex:"vertex",line:"line",area:"area",relation:"relation",note:"note"},geocoder:{search:"Search worldwide...",no_results_visible:"No results in visible map area",no_results_worldwide:"No results found"},geolocate:{title:"Show My Location",locating:"Locating, please wait..."},inspector:{no_documentation_combination:"There is no documentation available for this tag combination",no_documentation_key:"There is no documentation available for this key",documentation_redirect:"This documentation has been redirected to a new page",show_more:"Show More",view_on_osm:"View on openstreetmap.org",all_fields:"All fields",all_tags:"All tags",all_members:"All members",all_relations:"All relations",new_relation:"New relation...",role:"Role",choose:"Select feature type",results:"{n} results for {search}",reference:"View on OpenStreetMap Wiki",back_tooltip:"Change feature",remove:"Remove",search:"Search",multiselect:"Selected features",unknown:"Unknown",incomplete:"<not downloaded>",feature_list:"Search features",edit:"Edit feature",check:{yes:"Yes",no:"No",reverser:"Change Direction"},radio:{structure:{type:"Type","default":"Default",layer:"Layer"}},add:"Add",none:"None",node:"Node",way:"Way",relation:"Relation",location:"Location",add_fields:"Add field:"},background:{title:"Background",description:"Background settings",key:"B",backgrounds:"Backgrounds",none:"None",best_imagery:"Best known imagery source for this location","switch":"Switch back to this background",custom:"Custom",overlays:"Overlays",imagery_source_faq:"Imagery Info / Report a Problem",reset:"reset",display_options:"Display Options",brightness:"Brightness",contrast:"Contrast",saturation:"Saturation",sharpness:"Sharpness",minimap:{description:"Show Minimap",tooltip:"Show a zoomed out map to help locate the area currently displayed.",key:"/"},fix_misalignment:"Adjust imagery offset",offset:"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters."},map_data:{title:"Map Data",description:"Map Data",key:"F",data_layers:"Data Layers",layers:{osm:{tooltip:"Map data from OpenStreetMap",title:"OpenStreetMap data"},notes:{tooltip:"Note data from OpenStreetMap",title:"OpenStreetMap notes"},custom:{tooltip:"Drag and drop a data file onto the page, or click the button to setup",title:"Custom Map Data",zoom:"Zoom to data"}},fill_area:"Fill Areas",map_features:"Map Features",autohidden:"These features have been automatically hidden because too many would be shown on the screen.  You can zoom in to edit them.",osmhidden:"These features have been automatically hidden because the OpenStreetMap layer is hidden."},feature:{points:{description:"Points",tooltip:"Points of Interest"},traffic_roads:{description:"Traffic Roads",tooltip:"Highways, Streets, etc."},service_roads:{description:"Service Roads",tooltip:"Service Roads, Parking Aisles, Tracks, etc."},paths:{description:"Paths",tooltip:"Sidewalks, Foot Paths, Cycle Paths, etc."},buildings:{description:"Buildings",tooltip:"Buildings, Shelters, Garages, etc."},landuse:{description:"Landuse Features",tooltip:"Forests, Farmland, Parks, Residential, Commercial, etc."},boundaries:{description:"Boundaries",tooltip:"Administrative Boundaries"},water:{description:"Water Features",tooltip:"Rivers, Lakes, Ponds, Basins, etc."},rail:{description:"Rail Features",tooltip:"Railways"},power:{description:"Power Features",tooltip:"Power Lines, Power Plants, Substations, etc."},past_future:{description:"Past/Future",tooltip:"Proposed, Construction, Abandoned, Demolished, etc."},others:{description:"Others",tooltip:"Everything Else"}},area_fill:{wireframe:{description:"No Fill (Wireframe)",tooltip:"Enabling wireframe mode makes it easy to see the background imagery.",key:"W"},partial:{description:"Partial Fill",tooltip:"Areas are drawn with fill only around their inner edges. (Recommended for beginner mappers)"},full:{description:"Full Fill",tooltip:"Areas are drawn fully filled."}},settings:{custom_background:{tooltip:"Edit custom background",header:"Custom Background Settings",instructions:"Enter a tile URL template. Valid tokens are:\n   {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n   {-y} or {ty} for flipped TMS-style Y coordinates\n   {u} for quadtile scheme\n   {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}",template:{placeholder:"Enter a url template"}},custom_data:{tooltip:"Edit custom data layer",header:"Custom Map Data Settings",file:{instructions:"Choose a local data file. Supported types are:\n   .gpx, .kml, .geojson, .json",label:"Browse files"},or:"Or",url:{instructions:"Enter a data file URL or vector tile URL template. Valid tokens are:\n   {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme",placeholder:"Enter a url"}}},restore:{heading:"You have unsaved changes",description:"Do you wish to restore unsaved changes from a previous editing session?",restore:"Restore my changes",reset:"Discard my changes"},save:{title:"Save",help:"Review your changes and upload them to OpenStreetMap, making them visible to other users.",no_changes:"No changes to save.",error:"Errors occurred while trying to save",status_code:"Server returned status code {code}",unknown_error_details:"Please ensure you are connected to the internet.",uploading:"Uploading changes to OpenStreetMap...",conflict_progress:"Checking for conflicts: {num} of {total}",unsaved_changes:"You have unsaved changes",conflict:{header:"Resolve conflicting edits",count:"Conflict {num} of {total}",previous:"< Previous",next:"Next >",keep_local:"Keep mine",keep_remote:"Use theirs",restore:"Restore","delete":"Leave Deleted",download_changes:"Or download osmChange file",done:"All conflicts resolved!",help:"Another user changed some of the same map features you changed.\nClick on each feature below for more details about the conflict, and choose whether to keep\nyour changes or the other user's changes.\n"}},merge_remote_changes:{conflict:{deleted:"This feature has been deleted by {user}.",location:"This feature was moved by both you and {user}.",nodelist:"Nodes were changed by both you and {user}.",memberlist:"Relation members were changed by both you and {user}.",tags:"You changed the <b>{tag}</b> tag to \"{local}\" and {user} changed it to \"{remote}\"."}},success:{just_edited:"You just edited OpenStreetMap!",thank_you:"Thank you for improving the map.",thank_you_location:"Thank you for improving the map around {where}.",help_html:"Your changes should appear on OpenStreetMap within a few minutes. It may take longer for maps elsewhere to receive updates.",help_link_text:"Details",help_link_url:"https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F",view_on_osm:"View Changes on OSM",changeset_id:"Your changeset #: {changeset_id}",like_osm:"Like OpenStreetMap? Connect with others:",more:"More",events:"Events",languages:"Languages: {languages}",missing:"Is something missing from this list?",tell_us:"Tell us!"},confirm:{okay:"OK",cancel:"Cancel"},splash:{welcome:"Welcome to the iD OpenStreetMap editor",text:"iD is a friendly but powerful tool for contributing to the world's best free world map. This is version {version}. For more information see {website} and report bugs at {github}.",walkthrough:"Start the Walkthrough",start:"Edit now"},source_switch:{live:"live",lose_changes:"You have unsaved changes. Switching the map server will discard them. Are you sure you want to switch servers?",dev:"dev"},version:{whats_new:"What's new in iD {version}"},tag_reference:{description:"Description",on_wiki:"{tag} on wiki.osm.org",used_with:"used with {type}"},validations:{disconnected_highway:"Disconnected highway",disconnected_highway_tooltip:"Roads should be connected to other roads or building entrances.",old_multipolygon:"Multipolygon tags on outer way",old_multipolygon_tooltip:"This style of multipolygon is deprecated. Please assign the tags to the parent multipolygon instead of the outer way.",untagged_point:"Untagged point",untagged_point_tooltip:"Select a feature type that describes what this point is.",untagged_line:"Untagged line",untagged_line_tooltip:"Select a feature type that describes what this line is.",untagged_area:"Untagged area",untagged_area_tooltip:"Select a feature type that describes what this area is.",untagged_relation:"Untagged relation",untagged_relation_tooltip:"Select a feature type that describes what this relation is.",many_deletions:"You're deleting {n} features: {p} nodes, {l} lines, {a} areas, {r} relations. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.",tag_suggests_area:"The tag {tag} suggests line should be area, but it is not an area",deprecated_tags:"Deprecated tags: {tags}"},zoom:{"in":"Zoom in",out:"Zoom out"},cannot_zoom:"Cannot zoom out further in current mode.",full_screen:"Toggle Full Screen",streetside:{tooltip:"Streetside photos from Microsoft",title:"Photo Overlay (Bing Streetside)",report:"Report a privacy concern with this image",view_on_bing:"View on Bing Maps",hires:"High resolution"},mapillary_images:{tooltip:"Street-level photos from Mapillary",title:"Photo Overlay (Mapillary)"},mapillary_signs:{tooltip:"Traffic signs from Mapillary (must enable Photo Overlay)",title:"Traffic Sign Overlay (Mapillary)"},mapillary:{view_on_mapillary:"View this image on Mapillary"},openstreetcam_images:{tooltip:"Street-level photos from OpenStreetCam",title:"Photo Overlay (OpenStreetCam)"},openstreetcam:{view_on_openstreetcam:"View this image on OpenStreetCam"},note:{note:"Note",title:"Edit note",anonymous:"anonymous",closed:"(Closed)",commentTitle:"Comments",status:{opened:"opened {when}",reopened:"reopened {when}",commented:"commented {when}",closed:"closed {when}"},newComment:"New Comment",inputPlaceholder:"Enter a comment to share with other users.",close:"Close Note",open:"Reopen Note",comment:"Comment",close_comment:"Close and Comment",open_comment:"Reopen and Comment",report:"Report","new":"New Note",newDescription:"Describe the issue.",save:"Save Note",login:"You must log in to change or comment on this note.",upload_explanation:"Your comments will be publicly visible to all OpenStreetMap users.",upload_explanation_with_user:"Your comments as {user} will be publicly visible to all OpenStreetMap users."},help:{title:"Help",key:"H",help:{title:"Help",welcome:"Welcome to the iD editor for [OpenStreetMap](https://www.openstreetmap.org/). With this editor you can update OpenStreetMap right from your web browser.",open_data_h:"Open Data",open_data:"Edits that you make on this map will be visible to everyone who uses OpenStreetMap. Your edits can be based on personal knowledge, on-the-ground surveying, or imagery collected from aerial or street level photos. Copying from commercial sources, like Google Maps, [is strictly forbidden](https://www.openstreetmap.org/copyright).",before_start_h:"Before you start",before_start:"You should be familiar with OpenStreetMap and this editor before you start editing. iD contains a walkthrough to teach you the basics of editing OpenStreetMap. Click \"Start the Walkthrough\" on this screen to take the tutorial - it takes only about 15 minutes.",open_source_h:"Open Source",open_source:"The iD editor is a collaborative open source project, and you are using version {version} now. The source code is available [on GitHub](https://github.com/openstreetmap/iD).",open_source_help:"You can help iD by [translating](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) or [reporting bugs](https://github.com/openstreetmap/iD/issues)."},overview:{title:"Overview",navigation_h:"Navigation",navigation_drag:"You can drag the map by pressing and holding down the {leftclick} left mouse button and moving the mouse around. You can also use the `↓`, `↑`, `←`, `→` arrow keys on your keyboard.",navigation_zoom:"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons along the side of the map. You can also use the `+`, `-` keys on your keyboard.",features_h:"Map Features",features:"We use the word *features* to describe things that appear on the map, such as roads, buildings, or points of interest. Anything in the real world can be mapped as a feature on OpenStreetMap. Map features are represented on the map using *points*, *lines*, or *areas*.",nodes_ways:"In OpenStreetmap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*."},editing:{title:"Editing & Saving",select_h:"Select",select_left_click:"{leftclick} Left-click on a feature to select it. This will highlight it with a pulsing glow, and the sidebar will display details about that feature, such as its name or address.",select_right_click:"{rightclick} Right-click on a feature to display the editing menu, which shows the commands that are available, such as rotating, moving, and deleting.",multiselect_h:"Multiselect",multiselect_shift_click:"`{shift}`+{leftclick} left-click to select several features together.  This makes it easier to move or delete multiple items.",multiselect_lasso:"Another way to select multiple features is to hold down the `{shift}` key, then press and hold down the {leftclick} left mouse button and drag the mouse to draw a selection lasso. All of the points inside the lasso area will be selected.",undo_redo_h:"Undo & Redo",undo_redo:"Your edits are stored locally in your browser until you choose to save them to the OpenStreetMap server. You can undo edits by clicking the {undo} **Undo** button, and redo them by clicking the {redo} **Redo** button.",save_h:"Save",save:"Click {save} **Save** to finish your edits and send them to OpenStreetMap. You should remember to save your work frequently!",save_validation:"On the save screen, you'll have a chance to review what you've done. iD will also perform some basic checks for missing data and may offer helpful suggestions and warnings if something doesn't seem right.",upload_h:"Upload",upload:"Before uploading your changes you must enter a [changeset comment](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Then click **Upload** to send your changes to OpenStreetMap, where they will be merged into the map and publicly visible to everyone.",backups_h:"Automatic Backups",backups:"If you can't finish your edits in one sitting, for example if your computer crashes or you close the browser tab, your edits are still saved in your browser's storage. You can come back later (on the same browser and computer), and iD will offer to restore your work.",keyboard_h:"Keyboard Shortcuts",keyboard:"You can view a list of keyboard shortcuts by pressing the `?` key."},feature_editor:{title:"Feature Editor",intro:"The *feature editor* appears alongside the map, and allows you to see and edit all of the information for the selected feature.",definitions:"The top section displays the feature's type. The middle section contains *fields* showing the feature's attributes, such as its name or address.",type_h:"Feature Type",type:"You can click on the feature type to change the feature to a different type. Everything that exists in the real world can be added to OpenStreetMap, so there are thousands of feature types to choose from.",type_picker:"The type picker displays the most common feature types, such as parks, hospitals, restaurants, roads, and buildings. You can search for anything by typing what you're looking for in the search box. You can also click the {inspect} **Info** icon next to the feature type to learn more about it.",fields_h:"Fields",fields_all_fields:"The \"All fields\" section contains all of the feature's details that you may edit. In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.",fields_example:"Each feature type will display different fields. For example, a road may display fields for its surface and speed limit, but a restaurant may display fields for the type of food it serves and the hours it is open.",fields_add_field:"You can also click the \"Add field\" dropdown to add more fields, such as a description, Wikipedia link, wheelchair access, and more.",tags_h:"Tags",tags_all_tags:"Below the fields section, you can expand the \"All tags\" section to edit any of the OpenStreetMap *tags* for the selected feature. Each tag consists of a *key* and *value*, data elements that define all of the features stored in OpenStreetMap.",tags_resources:"Editing a feature's tags requires intermediate knowledge about OpenStreetMap. You should consult resources like the [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) or [Taginfo](https://taginfo.openstreetmap.org/) to learn more about accepted OpenStreetMap tagging practices."},points:{title:"Points",intro:"*Points* can be used to represent features such as shops, restaurants, and monuments. They mark a specific location, and describe what's there.",add_point_h:"Adding Points",add_point:"To add a point, click the {point} **Point** button on the toolbar above the map, or press the shortcut key `1`. This will change the mouse cursor to a cross symbol.",add_point_finish:"To place the new point on the map, position the mouse cursor where the point should go, then {leftclick} left-click or press `Space`.",move_point_h:"Moving Points",move_point:"To move a point, place the mouse cursor over the point, then press and hold the {leftclick} left mouse button while dragging the point to its new location.",delete_point_h:"Deleting Points",delete_point:"It's OK to delete features that don't exist in the real world. Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it.",delete_point_command:"To delete a point, {rightclick} right-click on the point to select it and show the edit menu, then use the {delete} **Delete** command."},lines:{title:"Lines",intro:"*Lines* are used to represent features such as roads, railroads, and rivers. Lines should be drawn down the center of the feature that they represent.",add_line_h:"Adding Lines",add_line:"To add a line, click the {line} **Line** button on the toolbar above the map, or press the shortcut key `2`. This will change the mouse cursor to a cross symbol.",add_line_draw:"Next, position the mouse cursor where the line should begin and {leftclick} left-click or press `Space` to begin placing nodes along the line. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",add_line_finish:"To finish a line, press `{return}` or click again on the last node.",modify_line_h:"Modifying Lines",modify_line_dragnode:"Often you'll see lines that aren't shaped correctly, for example a road that does not match up with the background imagery. To adjust the shape of a line, first {leftclick} left-click to select it. All nodes of the line will be drawn as small circles. You can then drag the nodes to better locations.",modify_line_addnode:"You can also create new nodes along a line either by {leftclick}**x2** double-clicking on the line or by dragging the small triangles at the midpoints between nodes.",connect_line_h:"Connecting Lines",connect_line:"Having roads connected properly is important for the map and essential for providing driving directions.",connect_line_display:"The connections between roads are drawn with gray circles. The endpoints of a line are drawn with larger white circles if they don't connect to anything.",connect_line_drag:"To connect a line to another feature, drag one of the line's nodes onto the other feature until both features snap together. Tip: You can hold down the `{alt}` key to prevent nodes from connecting to other features.",connect_line_tag:"If you know that the connection has traffic lights or crosswalks, you can add them by selecting the connecting node and using the feature editor to select the correct feature's type.",disconnect_line_h:"Disconnecting Lines",disconnect_line_command:"To disconnect a road from another feature, {rightclick} right-click the connecting node and select the {disconnect} **Disconnect** command from the editing menu.",move_line_h:"Moving Lines",move_line_command:"To move an entire line, {rightclick} right-click the line and select the {move} **Move** command from the editing menu. Then move the mouse, and {leftclick} left-click to place the line in a new location.",move_line_connected:"Lines that are connected to other features will stay connected as you move the line to a new location. iD may prevent you from moving a line across another connected line.",delete_line_h:"Deleting Lines",delete_line:"If a line is entirely incorrect, for example a road that doesn't exist in the real world, it's OK to delete it. Be careful when deleting features: the background imagery you are using might be outdated, and a road that looks wrong could simply be newly built.",delete_line_command:"To delete a line, {rightclick} right-click on the line to select it and show the edit menu, then use the {delete} **Delete** command."},areas:{title:"Areas",intro:"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas. Areas should be traced around the edge of the feature that they represent, for example, around the base of a building.",point_or_area_h:"Points or Areas?",point_or_area:"Many features can be represented as points or areas. You should map buildings and property outlines as areas whenever possible. Place points inside a building area to represent businesses, amenities, and other features located inside the building.",add_area_h:"Adding Areas",add_area_command:"To add an area, click the {area} **Area** button on the toolbar above the map, or press the shortcut key `3`. This will change the mouse cursor to a cross symbol.",add_area_draw:"Next, position the mouse cursor at one of the corners of the feature and {leftclick} left-click or press `Space` to begin placing nodes around the outer edge of the area. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",add_area_finish:"To finish an area, press `{return}` or click again on either the first or last node.",square_area_h:"Square Corners",square_area_command:"Many area features like buildings have square corners. To square the corners of an area, {rightclick} right-click the edge of the area and select the {orthogonalize} **Square** command from the editing menu.",modify_area_h:"Modifying Areas",modify_area_dragnode:"Often you'll see areas that aren't shaped correctly, for example a building that does not match up with the background imagery. To adjust the shape of an area, first {leftclick} left-click to select it. All nodes of the area will be drawn as small circles. You can then drag the nodes to better locations.",modify_area_addnode:"You can also create new nodes along an area either by {leftclick}**x2** double-clicking on the edge of the area or by dragging the small triangles at the midpoints between nodes.",delete_area_h:"Deleting Areas",delete_area:"If an area is entirely incorrect, for example a building that doesn't exist in the real world, it's OK to delete it. Be cautious when deleting features - the background imagery you are using might be outdated, and a building that looks wrong could simply be newly built.",delete_area_command:"To delete an area, {rightclick} right-click on the area to select it and show the edit menu, then use the {delete} **Delete** command."},relations:{title:"Relations",intro:"A *relation* is a special type of feature in OpenStreetMap that groups together other features. The features that belong to a relation are called *members*, and each member can have a *role* in the relation.",edit_relation_h:"Editing Relations",edit_relation:"At the bottom of the feature editor, you can expand the \"All relations\" section to see if the selected feature is a member of any relations. You can then click on the relation to select and edit it.",edit_relation_add:"To add a feature to a relation, select the feature, then click the {plus} add button in the \"All relations\" section of the feature editor. You can choose from a list of nearby relations, or choose the \"New relation...\" option.",edit_relation_delete:"You can also click the {delete} **Delete** button to remove the selected feature from the relation. If you remove all of the members from a relation, the relation will be deleted automatically.",maintain_relation_h:"Maintaining Relations",maintain_relation:"For the most part, iD will maintain relations automatically as you edit. You should take care when replacing features that might be members of relations. For example if you delete a section of road and draw a new section of road to replace it, you should add the new section to the same relations (routes, turn restrictions, etc.) as the original.",relation_types_h:"Relation Types",multipolygon_h:"Multipolygons",multipolygon:"A *multipolygon* relation is a group of one or more *outer* features and one or more inner features. The outer features define the outer edges of the multipolygon, and the inner features define sub-areas or holes cut out from the inside of the multipolygon.",multipolygon_create:"To create a multipolygon, for example a building with a hole in it, draw the outer edge as an area and the inner edge as a line or different kind of area. Then `{shift}`+{leftclick} left-click to select both features, {rightclick} right-click to show the edit menu, and select the {merge} **Merge** command.",multipolygon_merge:"Merging several lines or areas will create a new multipolygon relation with all selected areas as members. iD will choose the inner and outer roles automatically, based on which features are contained inside other features.",turn_restriction_h:"Turn restrictions",turn_restriction:"A *turn restriction* relation is a group of several road segments in an intersection. Turn restrictions consist of a *from* road, *via* node or roads, and a *to* road.",turn_restriction_field:"To edit turn restrictions, select a junction node where two or more roads meet. The feature editor will display a special \"Turn Restrictions\" field containing a model of the intersection.",turn_restriction_editing:"In the \"Turn Restrictions\" field, click to select a \"from\" road, and see whether turns are allowed or restricted to any of the \"to\" roads. You can click on the turn icons to toggle them between allowed and restricted. iD will create relations automatically and set the from, via, and to roles based on your choices.",route_h:"Routes",route:"A *route* relation is a group of one or more line features that together form a route network, like a bus route, train route, or highway route.",route_add:"To add a feature to a route relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation.",boundary_h:"Boundaries",boundary:"A *boundary* relation is a group of one or more line features that together form an administrative boundary.",boundary_add:"To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation."},notes:{title:"Notes",intro:"*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel to enable the OpenStreetMap notes layer.",add_note_h:"Adding Notes",add_note:"To add a new note, click the {note} **Note** button on the toolbar above the map, or press the shortcut key `4`. This will change the mouse cursor to a cross symbol. To place the new note on the map, position the mouse cursor where the note should go, then {leftclick} left-click or press `Space`.",move_note:"Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location.",update_note_h:"Closing, Reopening, and Commenting",update_note:"An existing note can be updated by closing it, reopening it, or adding a comment to it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original issue is not resolved.",save_note_h:"Saving Notes",save_note:"You must save any note edits individually by clicking the buttons below the note comments. Note edits are **not** included in changesets that you upload to OpenStreetMap."},imagery:{title:"Background Imagery",intro:"The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data.",sources_h:"Imagery Sources",choosing:"To see which imagery sources are available for editing, click the {layers} **Background settings** button on the side of the map.",sources:"By default, a [Bing Maps](https://www.bing.com/maps/) satellite layer is chosen as the background image. Depending on where you are editing, other imagery sources will be available. Some may be newer or have higher resolution, so it is always useful to check and see which layer is the best one to use as a mapping reference.",offsets_h:"Adjusting Imagery Offset",offset:"Imagery is sometimes offset slightly from accurate map data. If you see a lot of roads or buildings shifted from the background imagery, it may be the imagery that's incorrect, so don't move them all to match the background. Instead, you can adjust the background so that it matches the existing data by expanding the \"Adjust Imagery Offset\" section at the bottom of the Background Settings pane.",offset_change:"Click on the small triangles to adjust the imagery offset in small steps, or hold the left mouse button and drag within the gray square to slide the imagery into alignment."},streetlevel:{title:"Street Level Photos",intro:"Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com), and [OpenStreetCam](https://www.openstreetcam.org).",using_h:"Using Street Level Photos",using:"To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.",photos:"When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.",viewer:"When you click on one of the photo locations, a photo viewer appears in the bottom corner of the map. The photo viewer contains controls to step forward and backward in the image sequence. It also shows the username of the person who captured the image, the date it was captured, and a link to view the image on the original site."},gps:{title:"GPS Traces",intro:"Collected GPS traces are a valuable source of data for OpenStreetMap. This editor supports *.gpx*, *.geojson*, and *.kml* files on your local computer. You can collect GPS traces with a smartphone, sports watch, or other GPS device.",survey:"For information on how to perform a GPS survey, read [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).",using_h:"Using GPS Traces",using:"To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data.",tracing:"The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add.",upload:"You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use."},field:{restrictions:{title:"Turn Restrictions Help",about:{title:"About",about:"This field allows you to inspect and modify turn restrictions. It displays a model of the selected intersection including other nearby connected roads.",from_via_to:"A turn restriction always contains: one **FROM way**, one **TO way**, and either one **VIA node** or one or more **VIA ways**.",maxdist:"The \"{distField}\" slider controls how far to search for additional connected roads.",maxvia:"The \"{viaField}\" slider adjusts how many via ways may be included in the search. (Tip: simple is better)"},inspecting:{title:"Inspecting",about:"Hover over any **FROM** segment to see whether it has any turn restrictions. Each possible **TO** destination will be drawn with a colored shadow showing whether a restriction exists.",from_shadow:"{fromShadow} **FROM segment**",allow_shadow:"{allowShadow} **TO Allowed**",restrict_shadow:"{restrictShadow} **TO Restricted**",only_shadow:"{onlyShadow} **TO Only**",restricted:"\"Restricted\" means that there is a turn restriction, for example \"No Left Turn\".",only:"\"Only\" means that a vehicle taking that path may only make that choice, for example \"Only Straight On\"."},modifying:{title:"Modifying",about:"To modify turn restrictions, first click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols.",indicators:"Then, click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\".",allow_turn:"{allowTurn} **TO Allowed**",restrict_turn:"{restrictTurn} **TO Restricted**",only_turn:"{onlyTurn} **TO Only**"},tips:{title:"Tips",simple:"**Prefer simple restrictions over complex ones.**",simple_example:"For example, avoid creating a via-way restriction if a simpler via-node turn restriction will do.",indirect:"**Some restrictions display the text \"(indirect)\" and are drawn lighter.**",indirect_example:"These restrictions exist because of another nearby restriction. For example, an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection.",indirect_noedit:"You may not edit indirect restrictions. Instead, edit the nearby direct restriction."}}}},intro:{done:"done",ok:"OK",graph:{block_number:"<value for addr:block_number>",city:"Three Rivers",county:"<value for addr:county>",district:"<value for addr:district>",hamlet:"<value for addr:hamlet>",neighbourhood:"<value for addr:neighbourhood>",postcode:"49093",province:"<value for addr:province>",quarter:"<value for addr:quarter>",state:"MI",subdistrict:"<value for addr:subdistrict>",suburb:"<value for addr:suburb>",countrycode:"us",name:{"1st-avenue":"1st Avenue","2nd-avenue":"2nd Avenue","4th-avenue":"4th Avenue","5th-avenue":"5th Avenue","6th-avenue":"6th Avenue","6th-street":"6th Street","7th-avenue":"7th Avenue","8th-avenue":"8th Avenue","9th-avenue":"9th Avenue","10th-avenue":"10th Avenue","11th-avenue":"11th Avenue","12th-avenue":"12th Avenue","access-point-employment":"Access Point Employment","adams-street":"Adams Street","andrews-elementary-school":"Andrews Elementary School","andrews-street":"Andrews Street","armitage-street":"Armitage Street","barrows-school":"Barrows School","battle-street":"Battle Street","bennett-street":"Bennett Street","bowman-park":"Bowman Park","collins-drive":"Collins Drive","conrail-railroad":"Conrail Railroad","conservation-park":"Conservation Park","constantine-street":"Constantine Street","cushman-street":"Cushman Street","dollar-tree":"Dollar Tree","douglas-avenue":"Douglas Avenue","east-street":"East Street","elm-street":"Elm Street","flower-street":"Flower Street","foster-street":"Foster Street","french-street":"French Street","garden-street":"Garden Street","gem-pawnbroker":"Gem Pawnbroker","golden-finch-framing":"Golden Finch Framing","grant-avenue":"Grant Avenue","hoffman-pond":"Hoffman Pond","hoffman-street":"Hoffman Street","hook-avenue":"Hook Avenue","jefferson-street":"Jefferson Street","kelsey-street":"Kelsey Street","lafayette-park":"LaFayette Park","las-coffee-cafe":"L.A.'s Coffee Cafe","lincoln-avenue":"Lincoln Avenue","lowrys-books":"Lowry's Books","lynns-garage":"Lynn's Garage","main-street-barbell":"Main Street Barbell","main-street-cafe":"Main Street Cafe","main-street-fitness":"Main Street Fitness","main-street":"Main Street","maple-street":"Maple Street","marina-park":"Marina Park","market-street":"Market Street","memory-isle-park":"Memory Isle Park","memory-isle":"Memory Isle","michigan-avenue":"Michigan Avenue","middle-street":"Middle Street","millard-street":"Millard Street","moore-street":"Moore Street","morris-avenue":"Morris Avenue","mural-mall":"Mural Mall","paisanos-bar-and-grill":"Paisano's Bar and Grill","paisley-emporium":"Paisley Emporium","paparazzi-tattoo":"Paparazzi Tattoo","pealer-street":"Pealer Street","pine-street":"Pine Street","pizza-hut":"Pizza Hut","portage-avenue":"Portage Avenue","portage-river":"Portage River","preferred-insurance-services":"Preferred Insurance Services","railroad-drive":"Railroad Drive","river-city-appliance":"River City Appliance","river-drive":"River Drive","river-road":"River Road","river-street":"River Street","riverside-cemetery":"Riverside Cemetery","riverwalk-trail":"Riverwalk Trail","riviera-theatre":"Riviera Theatre","rocky-river":"Rocky River","saint-joseph-river":"Saint Joseph River","scidmore-park-petting-zoo":"Scidmore Park Petting Zoo","scidmore-park":"Scidmore Park","scouter-park":"Scouter Park","sherwin-williams":"Sherwin-Williams","south-street":"South Street","southern-michigan-bank":"Southern Michigan Bank","spring-street":"Spring Street","sturgeon-river-road":"Sturgeon River Road","three-rivers-city-hall":"Three Rivers City Hall","three-rivers-elementary-school":"Three Rivers Elementary School","three-rivers-fire-department":"Three Rivers Fire Department","three-rivers-high-school":"Three Rivers High School","three-rivers-middle-school":"Three Rivers Middle School","three-rivers-municipal-airport":"Three Rivers Municipal Airport","three-rivers-post-office":"Three Rivers Post Office","three-rivers-public-library":"Three Rivers Public Library","three-rivers":"Three Rivers","unique-jewelry":"Unique Jewelry","walnut-street":"Walnut Street","washington-street":"Washington Street","water-street":"Water Street","west-street":"West Street","wheeler-street":"Wheeler Street","william-towing":"William Towing","willow-drive":"Willow Drive","wood-street":"Wood Street","world-fare":"World Fare"}},welcome:{title:"Welcome",welcome:"Welcome! This walkthrough will teach you the basics of editing on OpenStreetMap.",practice:"All of the data in this walkthrough is just for practicing, and any edits that you make in the walkthrough will not be saved.",words:"This walkthrough will introduce some new words and concepts. When we introduce a new word, we'll use *italics*.",mouse:"You can use any input device to edit the map, but this walkthrough assumes you have a mouse with left and right buttons. **If you want to attach a mouse, do so now, then click OK.**",leftclick:"When this tutorial asks you to click or double-click, we mean with the left button. On a trackpad it might be a single-click or single-finger tap. **Left-click {num} times.**",rightclick:"Sometimes we'll also ask you to right-click. This might be the same as control-click, or two-finger tap on a trackpad. Your keyboard might even have a 'menu' key that works like right-click. **Right-click {num} times.**",chapters:"So far, so good! You can use the buttons below to skip chapters at any time or to restart a chapter if you get stuck. Let's begin! **Click '{next}' to continue.**"},navigation:{title:"Navigation",drag:"The main map area shows OpenStreetMap data on top of a background.{br}You can drag the map by pressing and holding the left mouse button while moving the mouse around. You can also use the arrow keys on your keyboard. **Drag the map!**",zoom:"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons. **Zoom the map!**",features:"We use the word *features* to describe the things that appear on the map. Anything in the real world can be mapped as a feature on OpenStreetMap.",points_lines_areas:"Map features are represented using *points, lines, or areas.*",nodes_ways:"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*.",click_townhall:"All features on the map can be selected by clicking on them. **Click on the point to select it.**",selected_townhall:"Great! The point is now selected. Selected features are drawn with a pulsing glow.",editor_townhall:"When a feature is selected, the *feature editor* is displayed alongside the map.",preset_townhall:"The top part of the feature editor shows the feature's type. This point is a {preset}.",fields_townhall:"The middle part of the feature editor contains *fields* showing the feature's attributes, such as its name and address.",close_townhall:"**Close the feature editor by hitting escape or pressing the {button} button in the upper corner.**",search_street:"You can also search for features in the current view, or worldwide. **Search for '{name}'.**",choose_street:"**Choose {name} from the list to select it.**",selected_street:"Great! {name} is now selected.",editor_street:"The fields shown for a street are different than the fields that were shown for the town hall.{br}For this selected street, the feature editor shows fields like '{field1}' and '{field2}'. **Close the feature editor by hitting escape or pressing the {button} button.**",play:"Try moving the map and clicking on some other features to see what kinds of things can be added to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},points:{title:"Points",add_point:"*Points* can be used to represent features such as shops, restaurants, and monuments.{br}They mark a specific location, and describe what's there. **Click the {button} Point button to add a new point.**",place_point:"To place the new point on the map, position your mouse cursor where the point should go, then left-click or press the spacebar. **Move the mouse pointer over this building, then left-click or press the spacebar.**",search_cafe:"There are many different features that can be represented by points. The point you just added is a cafe. **Search for '{preset}'.**",choose_cafe:"**Choose {preset} from the list.**",feature_editor:"The point is now marked as a cafe. Using the feature editor, we can add more information about the cafe.",add_name:"In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.{br}Let's pretend that you have local knowledge of this cafe, and you know its name. **Add a name for the cafe.**",add_close:"The feature editor will remember all of your changes automatically. **When you are finished adding the name, hit escape, enter, or click the {button} button to close the feature editor.**",reselect:"Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Click to select the cafe you just created.**",update:"Let's fill in some more details for this cafe. You can change its name, add a cuisine, or add an address. **Change the cafe details.**",update_close:"**When you are finished updating the cafe, hit escape, enter, or click the {button} button to close the feature editor.**",rightclick:"You can right-click on any feature to see the *edit menu*, which shows a list of editing operations that can be performed. **Right-click to select the point you created and show the edit menu.**","delete":"It's OK to delete features that don't exist in the real world.{br}Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it. **Click on the {button} button to delete the point.**",undo:"You can always undo any changes up until you save your edits to OpenStreetMap. **Click on the {button} button to undo the delete and get the point back.**",play:"Now that you know how to create and edit points, try creating a few more points for practice! **When you are ready to continue to the next chapter, click '{next}'.**"},areas:{title:"Areas",add_playground:"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**",start_playground:"Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**",continue_playground:"Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**",finish_playground:"Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**",search_playground:"**Search for '{preset}'.**",choose_playground:"**Choose {preset} from the list.**",add_field:"This playground doesn't have an official name, so we won't add anything in the Name field.{br}Instead let's add some additional details about the playground to the Description field. **Open the Add Field list.**",choose_field:"**Choose {field} from the list.**",retry_add_field:"You didn't select the {field} field. Let's try again.",describe_playground:"**Add a description, then click the {button} button to close the feature editor.**",play:"Good job! Try drawing a few more areas, and see what other kinds of area features you can add to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},lines:{title:"Lines",add_line:"*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**",start_line:"Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the center of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**",intersect:"Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**",retry_intersect:"The road needs to intersect {name}. Let's try again!",continue_line:"Continue drawing the line for the new road. Remember that you can drag and zoom the map if needed.{br}When you are finished drawing, click on the last node again. **Finish drawing the road.**",choose_category_road:"**Select {category} from the list.**",choose_preset_residential:"There are many different types of roads, but this one is a residential road. **Choose the {preset} type.**",retry_preset_residential:"You didn't select the {preset} type. **Click here to choose again.**",name_road:"**Give this road a name, then hit escape, enter, or click the {button} button to close the feature editor.**",did_name_road:"Looks good! Next we will learn how to update the shape of a line.",update_line:"Sometimes you will need to change the shape of an existing line. Here is a road that doesn't look quite right.",add_node:"We can add some nodes to this line to improve its shape. One way to add a node is to double-click the line where you want to add a node. **Double-click on the line to create a new node.**",start_drag_endpoint:"When a line is selected, you can drag any of its nodes by clicking and holding down the left mouse button while you drag. **Drag the endpoint to the place where these roads should intersect.**",finish_drag_endpoint:"This spot looks good. **Release the left mouse button to finish dragging.**",start_drag_midpoint:"Small triangles are drawn at the *midpoints* between nodes. Another way to create a new node is to drag a midpoint to a new location. **Drag the midpoint triangle to create a new node along the curve of the road.**",continue_drag_midpoint:"This line is looking much better! Continue to adjust this line by double-clicking or dragging midpoints until the curve matches the road shape. **When you're happy with how the line looks, click OK.**",delete_lines:"It's OK to delete lines for roads that don't exist in the real world.{br}Here's an example where the city planned a {street} but never built it. We can improve this part of the map by deleting the extra lines.",rightclick_intersection:"The last real street is {street1}, so we will *split* {street2} at this intersection and remove everything above it. **Right click on the intersection node.**",split_intersection:"**Click on the {button} button to split {street}.**",retry_split:"You didn't click the Split button. Try again.",did_split_multi:"Good job! {street1} is now split into two pieces. The top part can be removed. **Click the top part of {street2} to select it.**",did_split_single:"**Click the top part of {street2} to select it.**",multi_select:"{selected} is now selected. Let's also select {other1}. You can shift-click to select multiple things. **Shift-click on {other2}.**",multi_rightclick:"Good! Both lines to delete are now selected. **Right-click on one of the lines to show the edit menu.**",multi_delete:"**Click on the {button} button to delete the extra lines.**",retry_delete:"You didn't click the Delete button. Try again.",play:"Great! Use the skills that you've learned in this chapter to practice editing some more lines. **When you are ready to continue to the next chapter, click '{next}'.**"},buildings:{title:"Buildings",add_building:"OpenStreetMap is the world's largest database of buildings.{br}You can help improve this database by tracing buildings that aren't already mapped. **Click the {button} Area button to add a new area.**",start_building:"Let's add this house to the map by tracing its outline.{br}Buildings should be traced around their footprint as accurately as possible. **Click or press spacebar to place a starting node on one of the corners of the building.**",continue_building:"Continue adding more nodes to trace the outline of the building. Remember that you can zoom in if you want to add more details.{br}Finish the building by pressing enter, or clicking again on either the first or last node. **Finish tracing the building.**",retry_building:"It looks like you had some trouble placing the nodes at the building corners. Try again!",choose_category_building:"**Choose {category} from the list.**",choose_preset_house:"There are many different types of buildings, but this one is clearly a house.{br}If you're not sure of the type, it's OK to just choose the generic Building type. **Choose the {preset} type.**",close:"**Hit escape or click the {button} button to close the feature editor.**",rightclick_building:"**Right-click to select the building you created and show the edit menu.**",square_building:"The house that you just added will look even better with perfectly square corners. **Click on the {button} button to square the building shape.**",retry_square:"You didn't click the Square button. Try again.",done_square:"See how the corners of the building moved into place? Let's learn another useful trick.",add_tank:"Next we'll trace this circular storage tank. **Click the {button} Area button to add a new area.**",start_tank:"Don't worry, you won't need to draw a perfect circle. Just draw an area inside the tank that touches its edge. **Click or press spacebar to place a starting node on the edge of the tank.**",continue_tank:"Add a few more nodes around the edge. The circle will be created outside the nodes that you draw.{br}Finish the area by pressing enter, or clicking again on either the first or last node. **Finish tracing the tank.**",search_tank:"**Search for '{preset}'.**",choose_tank:"**Choose {preset} from the list.**",rightclick_tank:"**Right-click to select the storage tank you created and show the edit menu.**",circle_tank:"**Click on the {button} button to make the tank a circle.**",retry_circle:"You didn't click the Circularize button. Try again.",play:"Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"},startediting:{title:"Start Editing",help:"You're now ready to edit OpenStreetMap!{br}You can replay this walkthrough anytime or view more documentation by clicking the {button} Help button or pressing the '{key}' key.",shortcuts:"You can view a list of commands along with their keyboard shortcuts by pressing the '{key}' key.",save:"Don't forget to regularly save your changes!",start:"Start mapping!"}},shortcuts:{title:"Keyboard shortcuts",tooltip:"Show the keyboard shortcuts screen.",toggle:{key:"?"},key:{alt:"Alt",backspace:"Backspace",cmd:"Cmd",ctrl:"Ctrl","delete":"Delete",del:"Del",end:"End",enter:"Enter",esc:"Esc",home:"Home",option:"Option",pause:"Pause",pgdn:"PgDn",pgup:"PgUp","return":"Return",shift:"Shift",space:"Space"},gesture:{drag:"drag"},or:"-or-",browsing:{title:"Browsing",navigation:{title:"Navigation",pan:"Pan map",pan_more:"Pan map by one screenful",zoom:"Zoom in / Zoom out",zoom_more:"Zoom in / Zoom out by a lot"},help:{title:"Help",help:"Show help/documentation",keyboard:"Show keyboard shortcuts"},display_options:{title:"Display options",background:"Show background options",background_switch:"Switch back to last background",map_data:"Show map data options",fullscreen:"Enter full screen mode",wireframe:"Toggle wireframe mode",minimap:"Toggle minimap"},selecting:{title:"Selecting features",select_one:"Select a single feature",select_multi:"Select multiple features",lasso:"Draw a selection lasso around features",search:"Find features matching search text"},with_selected:{title:"With feature selected",edit_menu:"Toggle edit menu"},vertex_selected:{title:"With node selected",previous:"Jump to previous node",next:"Jump to next node",first:"Jump to first node",last:"Jump to last node",change_parent:"Switch parent way"}},editing:{title:"Editing",drawing:{title:"Drawing",add_point:"'Add point' mode",add_line:"'Add line' mode",add_area:"'Add area' mode",add_note:"'Add note' mode",place_point:"Place a point or note",disable_snap:"Hold to disable point snapping",stop_line:"Finish drawing a line or area"},operations:{title:"Operations",continue_line:"Continue a line at the selected node",merge:"Combine (merge) selected features",disconnect:"Disconnect features at the selected node",detach_node:"Detach selected node from parent lines/areas",split:"Split a line into two at the selected node",reverse:"Reverse a line",move:"Move selected features",rotate:"Rotate selected features",orthogonalize:"Straighten line / Square area corners",circularize:"Circularize a closed line or area",reflect_long:"Reflect features across the longer axis",reflect_short:"Reflect features across the shorter axis","delete":"Delete selected features"},commands:{title:"Commands",copy:"Copy selected features",paste:"Paste copied features",undo:"Undo last action",redo:"Redo last action",save:"Save changes"}},tools:{title:"Tools",info:{title:"Information",all:"Toggle all information panels",background:"Toggle background panel",history:"Toggle history panel",location:"Toggle location panel",measurement:"Toggle measurement panel"}}},units:{feet:"{quantity} ft",miles:"{quantity} mi",square_feet:"{quantity} sq ft",square_miles:"{quantity} sq mi",acres:"{quantity} ac",meters:"{quantity} m",kilometers:"{quantity} km",square_meters:"{quantity} m²",square_kilometers:"{quantity} km²",hectares:"{quantity} ha",area_pair:"{area1} ({area2})",arcdegrees:"{quantity}°",arcminutes:"{quantity}′",arcseconds:"{quantity}″",north:"N",south:"S",east:"E",west:"W",coordinate:"{coordinate}{direction}",coordinate_pair:"{latitude}, {longitude}"},presets:{categories:{"category-barrier":{name:"Barrier Features"},"category-building":{name:"Building Features"},"category-golf":{name:"Golf Features"},"category-landuse":{name:"Land Use Features"},"category-natural-area":{name:"Natural Features"},"category-natural-line":{name:"Natural Features"},"category-natural-point":{name:"Natural Features"},"category-path":{name:"Path Features"},"category-rail":{name:"Rail Features"},"category-restriction":{name:"Restriction Features"},"category-road":{name:"Road Features"},"category-route":{name:"Route Features"},"category-water-area":{name:"Water Features"},"category-water-line":{name:"Water Features"}},fields:{access_simple:{label:"Allowed Access"},access:{label:"Allowed Access",placeholder:"Not Specified",types:{access:"All",foot:"Foot",motor_vehicle:"Motor Vehicles",bicycle:"Bicycles",horse:"Horses"},options:{yes:{title:"Allowed",description:"Access allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}},address:{label:"Address",placeholders:{block_number:"Block Number","block_number!jp":"Block No.",city:"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town",conscriptionnumber:"123",country:"Country",county:"County","county!jp":"District",district:"District","district!vn":"Arrondissement/Town/District",floor:"Floor",hamlet:"Hamlet",housename:"Housename",housenumber:"123","housenumber!jp":"Building No./Lot No.",neighbourhood:"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza",place:"Place",postcode:"Postcode",province:"Province","province!jp":"Prefecture",quarter:"Quarter","quarter!jp":"Ōaza/Machi",state:"State",street:"Street",subdistrict:"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet",suburb:"Suburb","suburb!jp":"Ward",unit:"Unit"}},admin_level:{label:"Admin Level"},aerialway:{label:"Type"},"aerialway/access":{label:"Access",options:{entry:"Entry",exit:"Exit",both:"Both"}},"aerialway/bubble":{label:"Bubble"},"aerialway/capacity":{label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{label:"Heated"},"aerialway/occupancy":{label:"Occupancy",placeholder:"2, 4, 8..."},"aerialway/summer/access":{label:"Access (summer)",options:{entry:"Entry",exit:"Exit",both:"Both"}},aeroway:{label:"Type"},agrarian:{label:"Products"},amenity:{label:"Type"},animal_boarding:{label:"For Animals"},animal_breeding:{label:"For Animals"},animal_shelter:{label:"For Animals"},"area/highway":{label:"Type"},artist:{label:"Artist"},artwork_type:{label:"Type"},atm:{label:"ATM"},backrest:{label:"Backrest"},barrier:{label:"Type"},"bath/open_air":{label:"Open Air"},"bath/sand_bath":{label:"Sand Bath"},"bath/type":{label:"Specialty",options:{onsen:"Japanese Onsen",foot_bath:"Foot Bath",hot_spring:"Hot Spring"}},beauty:{label:"Shop Type"},bench:{label:"Bench"},bicycle_parking:{label:"Type"},bin:{label:"Waste Bin"},blood_components:{label:"Blood Components",options:{whole:"whole blood",plasma:"plasma",platelets:"platelets",stemcells:"stem cell samples"}},board_type:{label:"Type"},booth:{label:"Booth"},boules:{label:"Type"},boundary:{label:"Type"},brand:{label:"Brand"},brewery:{label:"Draft Beers"},bridge:{label:"Type",placeholder:"Default"},building_area:{label:"Building"},building:{label:"Building"},bunker_type:{label:"Type"},cables:{label:"Cables",placeholder:"1, 2, 3..."},"camera/direction":{label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},"camera/mount":{label:"Camera Mount"},"camera/type":{label:"Camera Type",options:{fixed:"Fixed",panning:"Panning",dome:"Dome"}},capacity:{label:"Capacity",placeholder:"50, 100, 200..."},cash_in:{label:"Cash In"},castle_type:{label:"Type"},clothes:{label:"Clothes"},club:{label:"Type"},collection_times:{label:"Collection Times"},comment:{label:"Changeset Comment",placeholder:"Brief description of your contributions (required)"},communication_multi:{label:"Communication Types"},construction:{label:"Type"},"contact/webcam":{label:"Webcam URL",placeholder:"http://example.com/"},content:{label:"Content"},country:{label:"Country"},covered:{label:"Covered"},craft:{label:"Type"},"crane/type":{label:"Crane Type",options:{portal_crane:"Portal Crane","floor-mounted_crane":"Floor-mounted Crane",travel_lift:"Travel Lift"}},crop:{label:"Crops"},crossing:{label:"Type"},cuisine:{label:"Cuisines"},currency_multi:{label:"Currency Types"},cutting:{label:"Type",placeholder:"Default"},cycle_network:{label:"Network"},cycleway:{label:"Bike Lanes",placeholder:"none",types:{"cycleway:left":"Left side","cycleway:right":"Right side"},options:{none:{title:"None",description:"No bike lane"},lane:{title:"Standard bike lane",description:"A bike lane separated from auto traffic by a painted line"},shared_lane:{title:"Shared bike lane",description:"A bike lane with no separation from auto traffic"},track:{title:"Bike track",description:"A bike lane separated from traffic by a physical barrier"},share_busway:{title:"Bike lane shared with bus",description:"A bike lane shared with a bus lane"},opposite_lane:{title:"Opposite bike lane",description:"A bike lane that travels in the opposite direction of traffic"},opposite:{title:"Contraflow bike lane",description:"A bike lane that travels in both directions on a one-way street"}}},"dance/style":{label:"Dance Styles"},date:{label:"Date"},delivery:{label:"Delivery"},denomination:{label:"Denomination"},denotation:{label:"Denotation"},description:{label:"Description"},devices:{label:"Devices",placeholder:"1, 2, 3..."},diaper:{label:"Diaper Changing Available"},direction_cardinal:{label:"Direction",options:{N:"North",E:"East",S:"South",W:"West",NE:"Northeast",SE:"Southeast",SW:"Southwest",NW:"Northwest",NNE:"North-northeast",ENE:"East-northeast",ESE:"East-southeast",SSE:"South-southeast",SSW:"South-southwest",WSW:"West-southwest",WNW:"West-northwest",NNW:"North-northwest"}},direction_clock:{label:"Direction",options:{clockwise:"Clockwise",anticlockwise:"Counterclockwise"}},direction_vertex:{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},direction:{label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},dispensing:{label:"Dispenses Prescriptions"},display:{label:"Display"},distance:{label:"Total Distance"},dock:{label:"Type"},drive_through:{label:"Drive-Through"},duration:{label:"Duration",placeholder:"00:00"},electrified:{label:"Electrification",placeholder:"Contact Line, Electrified Rail...",options:{contact_line:"Contact Line",rail:"Electrified Rail",yes:"Yes (unspecified)",no:"No"}},elevation:{label:"Elevation"},email:{label:"Email",placeholder:"example@example.com"},embankment:{label:"Type",placeholder:"Default"},emergency:{label:"Emergency"},entrance:{label:"Type"},except:{label:"Exceptions"},faces:{label:"Faces"},fax:{label:"Fax",placeholder:"+31 42 123 4567"},fee:{label:"Fee"},fence_type:{label:"Type"},"fire_hydrant/position":{label:"Position",options:{lane:"Lane",parking_lot:"Parking Lot",sidewalk:"Sidewalk",green:"Green"}},"fire_hydrant/type":{label:"Type",options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pond:"Pond"}},fitness_station:{label:"Equipment Type"},fixme:{label:"Fix Me"},ford:{label:"Type",placeholder:"Default"},frequency:{label:"Operating Frequency"},fuel_multi:{label:"Fuel Types"},fuel:{label:"Fuel"},gauge:{label:"Gauge"},gender:{label:"Gender",placeholder:"Unknown",options:{male:"Male",female:"Female",unisex:"Unisex"}},"generator/method":{label:"Method"},"generator/output/electricity":{label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW..."},"generator/source":{label:"Source"},"generator/type":{label:"Type"},government:{label:"Type"},grape_variety:{label:"Grape Varieties"},handicap:{label:"Handicap",placeholder:"1-18"},handrail:{label:"Handrail"},hashtags:{label:"Suggested Hashtags",placeholder:"#example"},healthcare:{label:"Type"},"healthcare/speciality":{label:"Specialties"},height:{label:"Height (Meters)"},highway:{label:"Type"},historic:{label:"Type"},"historic/civilization":{label:"Historic Civilization"},hoops:{label:"Hoops",placeholder:"1, 2, 4..."},horse_dressage:{label:"Dressage Riding",options:{"undefined":"No",equestrian:"Yes"}},horse_riding:{label:"Horseback Riding",options:{"undefined":"No",horse_riding:"Yes"}},horse_scale:{label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}},horse_stables:{label:"Riding Stable",options:{"undefined":"No",stables:"Yes"}},iata:{label:"IATA"},icao:{label:"ICAO"},incline_steps:{label:"Incline",options:{up:"Up",down:"Down"}},incline:{label:"Incline"},indoor:{label:"Indoor"},industrial:{label:"Type"},information:{label:"Type"},inscription:{label:"Inscription"},intermittent:{label:"Intermittent"},internet_access:{label:"Internet Access",options:{yes:"Yes",no:"No",wlan:"Wifi",wired:"Wired",terminal:"Terminal"}},"internet_access/fee":{label:"Internet Access Fee"},"internet_access/ssid":{label:"SSID (Network Name)"},kerb:{label:"Curb"},label:{label:"Label"},lamp_type:{label:"Type"},landuse:{label:"Type"},lanes:{label:"Lanes",placeholder:"1, 2, 3..."},layer:{label:"Layer",placeholder:"0"},leaf_cycle_singular:{label:"Leaf Cycle",options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous"}},leaf_cycle:{label:"Leaf Cycle",options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous",mixed:"Mixed"}},leaf_type_singular:{label:"Leaf Type",options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",leafless:"Leafless"}},leaf_type:{label:"Leaf Type",options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",mixed:"Mixed",leafless:"Leafless"}},leisure:{label:"Type"},length:{label:"Length (Meters)"},level:{label:"Level"},levels:{label:"Levels",placeholder:"2, 4, 6..."},lit:{label:"Lit"},location:{label:"Location"},man_made:{label:"Type"},manhole:{label:"Type"},map_size:{label:"Coverage"},map_type:{label:"Type"},maxheight:{label:"Max Height",placeholder:"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},maxspeed:{label:"Speed Limit",placeholder:"40, 50, 60..."},"maxspeed/advisory":{label:"Advisory Speed Limit",placeholder:"40, 50, 60..."},maxstay:{label:"Max Stay"},maxweight:{label:"Max Weight"},memorial:{label:"Type"},monitoring_multi:{label:"Monitoring"},"mtb/scale":{label:"Mountain Biking Difficulty",placeholder:"0, 1, 2, 3...",options:{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}},"mtb/scale/imba":{label:"IMBA Trail Difficulty",placeholder:"Easy, Medium, Difficult...",options:{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}},"mtb/scale/uphill":{label:"Mountain Biking Uphill Difficulty",placeholder:"0, 1, 2, 3...",options:{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}},name:{label:"Name",placeholder:"Common name (if any)"},natural:{label:"Natural"},network_bicycle:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lcn:"Local",rcn:"Regional",ncn:"National",icn:"International"}},network_foot:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lwn:"Local",rwn:"Regional",nwn:"National",iwn:"International"}},network_horse:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lhn:"Local",rhn:"Regional",nhn:"National",ihn:"International"}},network_road:{label:"Network"},network:{label:"Network"},note:{label:"Note"},office:{label:"Type"},oneway_yes:{label:"One Way",options:{"undefined":"Assumed to be Yes",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}},oneway:{label:"One Way",options:{"undefined":"Assumed to be No",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}},opening_hours:{label:"Hours"},operator:{label:"Operator"},outdoor_seating:{label:"Outdoor Seating"},par:{label:"Par",placeholder:"3, 4, 5..."},park_ride:{label:"Park and Ride"},parking:{label:"Type",options:{surface:"Surface","multi-storey":"Multilevel",underground:"Underground",sheds:"Sheds",carports:"Carports",garage_boxes:"Garage Boxes",lane:"Roadside Lane"}},passenger_information_display:{label:"Passenger information display"},payment_multi:{label:"Payment Types"},phases:{label:"Phases",placeholder:"1, 2, 3..."},phone:{label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice (instructional)",easy:"Easy (green circle)",intermediate:"Intermediate (blue square)",advanced:"Advanced (black diamond)",expert:"Expert (double black diamond)",freeride:"Freeride (off-piste)",extreme:"Extreme (climbing equipment required)"}},"piste/grooming":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"piste/type":{label:"Type",options:{downhill:"Downhill",nordic:"Nordic",skitour:"Skitour",sled:"Sled",hike:"Hike",sleigh:"Sleigh",ice_skate:"Ice Skate",snow_park:"Snow Park",playground:"Playground"}},place:{label:"Type"},plant:{label:"Plant"},"plant/output/electricity":{label:"Power Output",placeholder:"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{label:"Baby Seat"},"playground/max_age":{label:"Maximum Age"},"playground/min_age":{label:"Minimum Age"},population:{label:"Population"},power_supply:{label:"Power Supply"},power:{label:"Type"},produce:{label:"Produce"},product:{label:"Products"},railway:{label:"Type"},"railway/position":{label:"Milestone Position",placeholder:"Distance to one decimal (123.4)"},"railway/signal/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},rating:{label:"Power Rating"},recycling_accepts:{label:"Accepts"},ref_aeroway_gate:{label:"Gate Number"},ref_golf_hole:{label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{label:"Junction Number"},ref_platform:{label:"Platform Number"},ref_road_number:{label:"Road Number"},ref_route:{label:"Route Number"},ref_runway:{label:"Runway Number",placeholder:"e.g. 01L/19R"},ref_stop_position:{label:"Stop Number"},ref_taxiway:{label:"Taxiway Name",placeholder:"e.g. A5"},ref:{label:"Reference Code"},"ref/isil":{label:"ISIL Code"},relation:{label:"Type"},religion:{label:"Religion"},restriction:{label:"Type"},restrictions:{label:"Turn Restrictions"},rooms:{label:"Rooms"},route_master:{label:"Type"},route:{label:"Type"},sac_scale:{label:"Hiking Difficulty",placeholder:"Mountain Hiking, Alpine Hiking...",options:{hiking:"T1: Hiking",mountain_hiking:"T2: Mountain Hiking",demanding_mountain_hiking:"T3: Demanding Mountain Hiking",alpine_hiking:"T4: Alpine Hiking",demanding_alpine_hiking:"T5: Demanding Alpine Hiking",difficult_alpine_hiking:"T6: Difficult Alpine Hiking"}},sanitary_dump_station:{label:"Toilet Disposal"},seasonal:{label:"Seasonal"},second_hand:{label:"Sells Used",placeholder:"Yes, No, Only",options:{yes:"Yes",no:"No",only:"Only"}},service_rail:{label:"Service Type",options:{spur:"Spur",yard:"Yard",siding:"Siding",crossover:"Crossover"}},service_times:{label:"Service Times"},service:{label:"Type"},"service/bicycle":{label:"Services"},"service/vehicle":{label:"Services"},shelter_type:{label:"Type"},shelter:{label:"Shelter"},shop:{label:"Type"},"siren/purpose":{label:"Purpose"},"siren/type":{label:"Type",options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}},site_type:{label:"Site Type"},site:{label:"Type"},smoking:{label:"Smoking",placeholder:"No, Separated, Yes...",options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}},smoothness:{label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}},social_facility_for:{label:"People Served"},social_facility:{label:"Type"},source:{label:"Sources"},sport_ice:{label:"Sports"},sport_racing_motor:{label:"Sports"},sport_racing_nonmotor:{label:"Sports"},sport:{label:"Sports"},stars:{label:"Stars"},start_date:{label:"Start Date"},step_count:{label:"Number of Steps"},stop:{label:"Stop Type",options:{all:"All Ways",minor:"Minor Road"}},structure_waterway:{label:"Structure",placeholder:"Unknown",options:{tunnel:"Tunnel"}},structure:{label:"Structure",placeholder:"Unknown",options:{bridge:"Bridge",tunnel:"Tunnel",embankment:"Embankment",cutting:"Cutting",ford:"Ford"}},studio:{label:"Type"},substance:{label:"Substance"},substation:{label:"Type"},supervised:{label:"Supervised"},support:{label:"Support"},surface:{label:"Surface"},surveillance:{label:"Surveillance Kind"},"surveillance/type":{label:"Surveillance Type",options:{camera:"Camera",guard:"Guard",ALPR:"Automatic License Plate Reader"}},"surveillance/zone":{label:"Surveillance Zone"},"switch":{label:"Type",options:{mechanical:"Mechanical",circuit_breaker:"Circuit Breaker",disconnector:"Disconnector",earthing:"Earthing"}},tactile_paving:{label:"Tactile Paving"},takeaway:{label:"Takeaway",placeholder:"Yes, No, Takeaway Only...",options:{yes:"Yes",no:"No",only:"Takeaway Only"}},"toilets/disposal":{label:"Disposal",options:{flush:"Flush",pitlatrine:"Pit/Latrine",chemical:"Chemical",bucket:"Bucket"}},toll:{label:"Toll"},tomb:{label:"Type"},tourism_attraction:{label:"Tourism"},tourism:{label:"Type"},"tower/construction":{label:"Construction",placeholder:"Guyed, Lattice, Concealed, ..."},"tower/type":{label:"Type"},tracktype:{label:"Track Type",placeholder:"Solid, Mostly Solid, Soft...",options:{grade1:"Solid: paved or heavily compacted hardcore surface",grade2:"Mostly Solid: gravel/rock with some soft material mixed in",grade3:"Even mixture of hard and soft materials",grade4:"Mostly Soft: soil/sand/grass with some hard material mixed in",grade5:"Soft: soil/sand/grass"}},trade:{label:"Type"},traffic_calming:{label:"Type"},traffic_signals:{label:"Type"},"traffic_signals/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},trail_visibility:{label:"Trail Visibility",placeholder:"Excellent, Good, Bad...",options:{excellent:"Excellent: unambiguous path or markers everywhere",good:"Good: markers visible, sometimes require searching",intermediate:"Intermediate: few markers, path mostly visible",bad:"Bad: no markers, path sometimes invisible/pathless",horrible:"Horrible: often pathless, some orientation skills required",no:"No: pathless, excellent orientation skills required"}},transformer:{label:"Type",options:{distribution:"Distribution",generator:"Generator",converter:"Converter",traction:"Traction",auto:"Autotransformer",phase_angle_regulator:"Phase Angle Regulator",auxiliary:"Auxiliary",yes:"Unknown"}},trees:{label:"Trees"},tunnel:{label:"Type",placeholder:"Default"},usage_rail:{label:"Usage Type",options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}},vending:{label:"Types of Goods"},visibility:{label:"Visibility",options:{house:"Up to 5m (16ft)",street:"5 to 20m (16 to 65ft)",area:"Over 20m (65ft)"}},"volcano/status":{label:"Volcano Status",options:{active:"Active",dormant:"Dormant",extinct:"Extinct"}},"volcano/type":{label:"Volcano Type",options:{stratovolcano:"Stratovolcano",shield:"Shield",scoria:"Scoria"}},voltage:{label:"Voltage"},"voltage/primary":{label:"Primary Voltage"},"voltage/secondary":{label:"Secondary Voltage"},"voltage/tertiary":{label:"Tertiary Voltage"},wall:{label:"Type"},water_point:{label:"Water Point"},water:{label:"Type"},waterway:{label:"Type"},website:{label:"Website",placeholder:"http://example.com/"},wetland:{label:"Type"},wheelchair:{label:"Wheelchair Access"},wholesale:{label:"Wholesale"},width:{label:"Width (Meters)"},wikipedia:{label:"Wikipedia"},windings:{label:"Windings",placeholder:"1, 2, 3..."},"windings/configuration":{label:"Windings Configuration",options:{star:"Star / Wye",delta:"Delta","open-delta":"Open Delta",zigzag:"Zig Zag",open:"Open",scott:"Scott",leblanc:"Leblanc"}}},presets:{aerialway:{name:"Aerialway",terms:"ski lift,funifor,funitel"},aeroway:{name:"Aeroway",terms:""},amenity:{name:"Amenity",terms:""},circular:{name:"Traffic Circle",terms:""},highway:{name:"Highway",terms:""},place:{name:"Place",terms:""},power:{name:"Power",terms:""},railway:{name:"Railway",terms:""},roundabout:{name:"Roundabout",terms:""},waterway:{name:"Waterway",terms:""},address:{name:"Address",terms:""},"advertising/billboard":{name:"Billboard",terms:""},"advertising/column":{name:"Advertising Column",terms:""},"aerialway/station":{name:"Aerialway Station",terms:""},"aerialway/cable_car":{name:"Cable Car",terms:"tramway,ropeway"},"aerialway/chair_lift":{name:"Chair Lift",terms:""},"aerialway/drag_lift":{name:"Drag Lift",terms:""},"aerialway/gondola":{name:"Gondola",terms:""},"aerialway/goods":{name:"Goods Aerialway",terms:""},"aerialway/magic_carpet":{name:"Magic Carpet Lift",terms:""},"aerialway/mixed_lift":{name:"Mixed Lift",terms:""},"aerialway/platter":{name:"Platter Lift",terms:"button lift,poma lift"},"aerialway/pylon":{name:"Aerialway Pylon",terms:""},"aerialway/rope_tow":{name:"Rope Tow Lift",terms:"handle tow,bugel lift"},"aerialway/t-bar":{name:"T-bar Lift",terms:"tbar"},"aeroway/aerodrome":{name:"Airport",terms:"aerodrome,aeroway,airplane,airport,jet,plane"},"aeroway/apron":{name:"Apron",terms:"ramp"},"aeroway/gate":{name:"Airport Gate",terms:""},"aeroway/hangar":{name:"Hangar",terms:""},"aeroway/helipad":{name:"Helipad",terms:"helicopter,helipad,heliport"},"aeroway/runway":{name:"Runway",terms:"landing strip"},"aeroway/taxiway":{name:"Taxiway",terms:""},"aeroway/terminal":{name:"Airport Terminal",terms:"airport,aerodrome"},"allotments/plot":{name:"Community Garden Plot",terms:""},"amenity/bus_station":{name:"Bus Station / Terminal",terms:""},"amenity/coworking_space":{name:"Coworking Space",terms:""},"amenity/ferry_terminal":{name:"Ferry Station / Terminal",terms:""},"amenity/nursing_home":{name:"Nursing Home",terms:""},"amenity/register_office":{name:"Register Office",terms:""},"amenity/scrapyard":{name:"Scrap Yard",terms:""},"amenity/swimming_pool":{name:"Swimming Pool",terms:""},"amenity/animal_boarding":{name:"Animal Boarding Facility",terms:"boarding,cat,cattery,dog,horse,kennel,kitten,pet,pet boarding,pet care,pet hotel,puppy,reptile"},"amenity/animal_breeding":{name:"Animal Breeding Facility",terms:"breeding,bull,cat,cow,dog,horse,husbandry,kitten,livestock,pet breeding,puppy,reptile"},"amenity/animal_shelter":{name:"Animal Shelter",terms:"adoption,aspca,cat,dog,horse,kitten,pet care,pet rescue,puppy,raptor,reptile,rescue,spca"},"amenity/arts_centre":{name:"Arts Center",terms:""},"amenity/atm":{name:"ATM",terms:"money,cash,machine"},"amenity/bank":{name:"Bank",terms:"credit union,check,deposit,fund,investment,repository,reserve,safe,savings,stock,treasury,trust,vault"},"amenity/bar":{name:"Bar",terms:"dive,beer,bier,booze"},"amenity/bbq":{name:"Barbecue/Grill",terms:"bbq,grill"},"amenity/bench":{name:"Bench",terms:"seat"},"amenity/bicycle_parking":{name:"Bicycle Parking",terms:"bike"},"amenity/bicycle_rental":{name:"Bicycle Rental",terms:"bike"},"amenity/bicycle_repair_station":{name:"Bicycle Repair Tool Stand",terms:"bike,repair,chain,pump"},"amenity/biergarten":{name:"Biergarten",terms:"beer,bier,booze"},"amenity/boat_rental":{name:"Boat Rental",terms:""},"amenity/bureau_de_change":{name:"Currency Exchange",terms:"bureau de change,money changer"},"amenity/cafe":{name:"Cafe",terms:"bistro,coffee,tea"},"amenity/car_pooling":{name:"Car Pooling",terms:""},"amenity/car_rental":{name:"Car Rental",terms:""},"amenity/car_sharing":{name:"Car Sharing",terms:""},"amenity/car_wash":{name:"Car Wash",terms:""},"amenity/casino":{name:"Casino",terms:"gambling,roulette,craps,poker,blackjack"},"amenity/charging_station":{name:"Charging Station",terms:"EV,Electric Vehicle,Supercharger"},"amenity/childcare":{name:"Nursery/Childcare",terms:"daycare,orphanage,playgroup"},"amenity/cinema":{name:"Cinema",terms:"drive-in,film,flick,movie,theater,picture,show,screen"},"amenity/clinic":{name:"Clinic",terms:"medical,urgentcare"},"amenity/clinic/abortion":{name:"Abortion Clinic",terms:""},"amenity/clinic/fertility":{name:"Fertility Clinic",terms:"egg,fertility,reproductive,sperm,ovulation"},"amenity/clock":{name:"Clock",terms:""},"amenity/college":{name:"College Grounds",terms:"university"},"amenity/community_centre":{name:"Community Center",terms:"event,hall"},"amenity/compressed_air":{name:"Compressed Air",terms:""},"amenity/courthouse":{name:"Courthouse",terms:""},"amenity/crematorium":{name:"Crematorium",terms:"cemetery,funeral"},"amenity/dentist":{name:"Dentist",terms:"tooth,teeth"},"amenity/doctors":{name:"Doctor",terms:"medic*,physician"},"amenity/dojo":{name:"Dojo / Martial Arts Academy",terms:"martial arts,dojang"},"amenity/drinking_water":{name:"Drinking Water",terms:"fountain,potable"},"amenity/driving_school":{name:"Driving School",terms:""},"amenity/embassy":{name:"Embassy",terms:""},"amenity/fast_food":{name:"Fast Food",terms:"restaurant,takeaway"},"amenity/fire_station":{name:"Fire Station",terms:""},"amenity/food_court":{name:"Food Court",terms:"fast food,restaurant,food"},"amenity/fountain":{name:"Fountain",terms:""},"amenity/fuel":{name:"Gas Station",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{name:"Graveyard",terms:""},"amenity/grit_bin":{name:"Grit Bin",terms:"salt,sand"},"amenity/hospital":{name:"Hospital Grounds",terms:"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{name:"Hunting Stand",terms:"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{name:"Ice Cream Shop",terms:"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{name:"Internet Cafe",terms:"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/kindergarten":{name:"Preschool/Kindergarten Grounds",terms:"kindergarden,pre-school"},"amenity/library":{name:"Library",terms:"book"},"amenity/love_hotel":{name:"Love Hotel",terms:""},"amenity/marketplace":{name:"Marketplace",terms:""},"amenity/monastery":{name:"Monastery Grounds",terms:"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,monastery,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/motorcycle_parking":{name:"Motorcycle Parking",terms:""},"amenity/music_school":{name:"Music School",terms:"school of music"},"amenity/nightclub":{name:"Nightclub",terms:"disco*,night club,dancing,dance club"},"amenity/parking_entrance":{name:"Parking Garage Entrance/Exit",terms:""},"amenity/parking_space":{name:"Parking Space",terms:""},"amenity/parking":{name:"Car Parking",terms:""},"amenity/pavilion":{name:"Pavilion",terms:""},"amenity/pharmacy":{name:"Pharmacy",terms:"apothecary,drug*,med*,prescription"},"amenity/place_of_worship":{name:"Place of Worship",terms:"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/place_of_worship/buddhist":{name:"Buddhist Temple",terms:"stupa,vihara,monastery,temple,pagoda,zendo,dojo"},"amenity/place_of_worship/christian":{name:"Church",terms:"christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"},"amenity/place_of_worship/hindu":{name:"Hindu Temple",terms:"kovil,devasthana,mandir,kshetram,alayam,shrine,temple"},"amenity/place_of_worship/jewish":{name:"Synagogue",terms:"jewish"},"amenity/place_of_worship/muslim":{name:"Mosque",terms:"muslim"},"amenity/place_of_worship/shinto":{name:"Shinto Shrine",terms:"kami,torii"},"amenity/place_of_worship/sikh":{name:"Sikh Temple",terms:"gurudwara,temple"},"amenity/place_of_worship/taoist":{name:"Taoist Temple",terms:"daoist,monastery,temple"},"amenity/planetarium":{name:"Planetarium",terms:"museum,astronomy,observatory"},"amenity/police":{name:"Police",terms:"badge,constable,constabulary,cop,detective,fed,law,enforcement,officer,patrol"},"amenity/post_box":{name:"Mailbox",terms:"letter,post"},"amenity/post_office":{name:"Post Office",terms:"letter,mail"},"amenity/prison":{name:"Prison Grounds",terms:"cell,jail"},"amenity/pub":{name:"Pub",terms:"alcohol,drink,dive,beer,bier,booze"},"amenity/public_bath":{name:"Public Bath",terms:"onsen,foot bath,hot springs"},"amenity/public_bookcase":{name:"Public Bookcase",terms:"library,bookcrossing"},"amenity/ranger_station":{name:"Ranger Station",terms:"visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"},"amenity/recycling_centre":{name:"Recycling Center",terms:"bottle,can,dump,glass,garbage,rubbish,scrap,trash"},"amenity/recycling":{name:"Recycling Container",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/restaurant":{name:"Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/sanitary_dump_station":{name:"RV Toilet Disposal",terms:"Motor Home,Camper,Sanitary,Dump Station,Elsan,CDP,CTDP,Chemical Toilet"},"amenity/school":{name:"School Grounds",terms:"academy,elementary school,middle school,high school"},"amenity/shelter":{name:"Shelter",terms:"lean-to,gazebo,picnic"},"amenity/shower":{name:"Shower",terms:"rain closet"},"amenity/smoking_area":{name:"Smoking Area",terms:""},"amenity/social_facility":{name:"Social Facility",terms:""},"amenity/social_facility/food_bank":{name:"Food Bank",terms:""},"amenity/social_facility/group_home":{name:"Elderly Group Home",terms:"old,senior,living,care home,assisted living"},"amenity/social_facility/homeless_shelter":{name:"Homeless Shelter",terms:"houseless,unhoused,displaced"},"amenity/social_facility/nursing_home":{name:"Nursing Home",terms:"elderly,living,nursing,old,senior,assisted living"},"amenity/studio":{name:"Studio",terms:"recording,radio,television"},"amenity/taxi":{name:"Taxi Stand",terms:"cab"},"amenity/telephone":{name:"Telephone",terms:"phone"},"amenity/theatre":{name:"Theater",terms:"theatre,performance,play,musical"},"amenity/toilets":{name:"Toilets",terms:"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/townhall":{name:"Town Hall",terms:"village,city,government,courthouse,municipal"},"amenity/university":{name:"University Grounds",terms:"college"},"amenity/vending_machine":{name:"Vending Machine",terms:""},"amenity/vending_machine/news_papers":{name:"Newspaper Vending Machine",terms:"newspaper"},"amenity/vending_machine/cigarettes":{name:"Cigarette Vending Machine",terms:"cigarette"},"amenity/vending_machine/coffee":{name:"Coffee Vending Machine",terms:"coffee"},"amenity/vending_machine/condoms":{name:"Condom Vending Machine",terms:"condom"},"amenity/vending_machine/drinks":{name:"Drink Vending Machine",terms:"drink,soda,beverage,juice,pop"},"amenity/vending_machine/electronics":{name:"Electronics Vending Machine",terms:"cable,charger,earbud,headphone,phone,tablet"},"amenity/vending_machine/elongated_coin":{name:"Flat Coin Vending Machine",terms:"coin,crush,elongated,flatten,penny,souvenir"},"amenity/vending_machine/excrement_bags":{name:"Excrement Bag Vending Machine",terms:"excrement bags,poop,dog,animal"},"amenity/vending_machine/feminine_hygiene":{name:"Feminine Hygiene Vending Machine",terms:"condom,tampon,pad,woman,women,menstrual hygiene products,personal care"},"amenity/vending_machine/food":{name:"Food Vending Machine",terms:"food"},"amenity/vending_machine/fuel":{name:"Gas Pump",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/vending_machine/ice_cream":{name:"Ice Cream Vending Machine",terms:"chocolate,ice cream,frozen,popsicle,vanilla"},"amenity/vending_machine/newspapers":{name:"Newspaper Vending Machine",terms:"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{name:"Parcel Pickup/Dropoff Vending Machine",terms:"parcel,mail,pickup"},"amenity/vending_machine/parking_tickets":{name:"Parking Ticket Vending Machine",terms:"parking,ticket"},"amenity/vending_machine/public_transport_tickets":{name:"Transit Ticket Vending Machine",terms:"bus,train,ferry,rail,ticket,transportation"},"amenity/vending_machine/stamps":{name:"Postage Vending Machine",terms:"mail,postage,stamp"},"amenity/vending_machine/sweets":{name:"Snack Vending Machine",terms:"candy,gum,chip,pretzel,cookie,cracker"},"amenity/veterinary":{name:"Veterinary",terms:"pet clinic,veterinarian,animal hospital,pet doctor"},"amenity/waste_basket":{name:"Waste Basket",terms:"bin,garbage,rubbish,litter,trash"},"amenity/waste_disposal":{name:"Garbage Dumpster",terms:"garbage,rubbish,litter,trash"},"amenity/waste_transfer_station":{name:"Waste Transfer Station",terms:"dump,garbage,recycling,rubbish,scrap,trash"},"amenity/waste/dog_excrement":{name:"Dog Excrement Bin",terms:"bin,garbage,rubbish,litter,trash,poo,dog"},"amenity/water_point":{name:"RV Drinking Water",terms:""},"amenity/watering_place":{name:"Animal Watering Place",terms:""},area:{name:"Area",terms:""},"area/highway":{name:"Road Surface",terms:""},"attraction/amusement_ride":{name:"Amusement Ride",terms:"theme park,carnival ride"},"attraction/animal":{name:"Animal",terms:"zoo,theme park,animal park,lion,tiger,bear"},"attraction/big_wheel":{name:"Big Wheel",terms:"ferris wheel,theme park,amusement ride"},"attraction/bumper_car":{name:"Bumper Car",terms:"theme park,dodgem cars,autoscooter"},"attraction/bungee_jumping":{name:"Bungee Jumping",terms:"theme park,bungy jumping,jumping platform"},"attraction/carousel":{name:"Carousel",terms:"theme park,roundabout,merry-go-round,galloper,jumper,horseabout,flying horses"},"attraction/dark_ride":{name:"Dark Ride",terms:"theme park,ghost train"},"attraction/drop_tower":{name:"Drop Tower",terms:"theme park,amusement ride,gondola,tower,big drop"},"attraction/maze":{name:"Maze",terms:"theme park,amusement ride,labyrinth"},"attraction/pirate_ship":{name:"Pirate Ship",terms:"theme park,carnival ride,amusement ride"},"attraction/river_rafting":{name:"River Rafting",terms:"theme park,aquatic park,water park,rafting simulator,river rafting ride,river rapids ride"},"attraction/roller_coaster":{name:"Roller Coaster",terms:"theme park,amusement ride"},"attraction/train":{name:"Tourist Train",terms:"theme park,rackless train,road train,Tschu-Tschu train,dotto train,park train"},"attraction/water_slide":{name:"Water Slide",terms:"theme park,aquatic park,water park,flumes,water chutes,hydroslides"},barrier:{name:"Barrier",terms:""},"barrier/entrance":{name:"Entrance",terms:""},"barrier/block":{name:"Block",terms:""},"barrier/bollard":{name:"Bollard",terms:""},"barrier/border_control":{name:"Border Control",terms:""},"barrier/cattle_grid":{name:"Cattle Grid",terms:""},"barrier/city_wall":{name:"City Wall",terms:""},"barrier/cycle_barrier":{name:"Cycle Barrier",terms:""},"barrier/ditch":{name:"Trench",terms:""},"barrier/fence":{name:"Fence",terms:""},"barrier/gate":{name:"Gate",terms:""},"barrier/hedge":{name:"Hedge",terms:""},"barrier/kerb":{name:"Kerb",terms:""},"barrier/kissing_gate":{name:"Kissing Gate",terms:""},"barrier/lift_gate":{name:"Lift Gate",terms:""},"barrier/retaining_wall":{name:"Retaining Wall",terms:""},"barrier/stile":{name:"Stile",terms:""},"barrier/toll_booth":{name:"Toll Booth",terms:""},"barrier/wall":{name:"Wall",terms:""},"boundary/administrative":{name:"Administrative Boundary",terms:""},building:{name:"Building",terms:""},"building/bunker":{name:"Bunker",terms:""},"building/entrance":{name:"Entrance/Exit",terms:""},"building/train_station":{name:"Train Station",terms:""},"building/apartments":{name:"Apartments",terms:""},"building/barn":{name:"Barn",terms:""},"building/boathouse":{name:"Boathouse",terms:""},"building/bungalow":{name:"Bungalow",terms:"home,detached"},"building/cabin":{name:"Cabin",terms:""},"building/cathedral":{name:"Cathedral Building",terms:""},"building/chapel":{name:"Chapel Building",terms:""},"building/church":{name:"Church Building",terms:""},"building/civic":{name:"Civic Building",terms:""},"building/college":{name:"College Building",terms:"university"},"building/commercial":{name:"Commercial Building",terms:""},"building/construction":{name:"Building Under Construction",terms:""},"building/detached":{name:"Detached House",terms:"home,single,family,residence,dwelling"},"building/dormitory":{name:"Dormitory",terms:""},"building/farm_auxiliary":{name:"Farm Building",terms:""},"building/farm":{name:"Farm House",terms:""},"building/garage":{name:"Garage",terms:""},"building/garages":{name:"Garages",terms:""},"building/grandstand":{name:"Grandstand",terms:"tribune,stand,stands,bleachers"},"building/greenhouse":{name:"Greenhouse",terms:""},"building/hospital":{name:"Hospital Building",terms:""},"building/hotel":{name:"Hotel Building",terms:""},"building/house":{name:"House",terms:"home,family,residence,dwelling"},"building/hut":{name:"Hut",terms:""},"building/industrial":{name:"Industrial Building",terms:""},"building/kindergarten":{name:"Preschool/Kindergarten Building",terms:"kindergarden,pre-school"},"building/mosque":{name:"Mosque Building",terms:""},"building/public":{name:"Public Building",terms:""},"building/residential":{name:"Residential Building",terms:""},"building/retail":{name:"Retail Building",terms:""},"building/roof":{name:"Roof",terms:""},"building/ruins":{name:"Building Ruins",terms:""},"building/school":{name:"School Building",terms:"academy,elementary school,middle school,high school"},"building/semidetached_house":{name:"Semi-Detached House",terms:"home,double,duplex,twin,family,residence,dwelling"},"building/service":{name:"Service Building",terms:""},"building/shed":{name:"Shed",terms:""},"building/stable":{name:"Stable",terms:""},"building/stadium":{name:"Stadium Building",terms:""},"building/static_caravan":{name:"Static Mobile Home",terms:""},"building/temple":{name:"Temple Building",terms:""},"building/terrace":{name:"Row Houses",terms:"home,terrace,brownstone,family,residence,dwelling"},"building/transportation":{name:"Transportation Building",terms:""},"building/university":{name:"University Building",terms:"college"},"building/warehouse":{name:"Warehouse",terms:""},"camp_site/camp_pitch":{name:"Camp Pitch",terms:"tent,rv"},club:{name:"Club",terms:"social"},craft:{name:"Craft",terms:""},"craft/jeweler":{name:"Jeweler",terms:""},"craft/locksmith":{name:"Locksmith",terms:""},"craft/optician":{name:"Optician",terms:""},"craft/tailor":{name:"Tailor",terms:"clothes,suit"},"craft/basket_maker":{name:"Basket Maker",terms:""},"craft/beekeeper":{name:"Beekeeper",terms:""},"craft/blacksmith":{name:"Blacksmith",terms:""},"craft/boatbuilder":{name:"Boat Builder",terms:""},"craft/bookbinder":{name:"Bookbinder",terms:"book repair"},"craft/brewery":{name:"Brewery",terms:"alcohol,beer,beverage,bier,booze,cider"},"craft/carpenter":{name:"Carpenter",terms:"woodworker"},"craft/carpet_layer":{name:"Carpet Layer",terms:""},"craft/caterer":{name:"Caterer",terms:""},"craft/chimney_sweeper":{name:"Chimney Sweeper",terms:""},"craft/clockmaker":{name:"Clockmaker",terms:""},"craft/confectionery":{name:"Candy Maker",terms:"sweet,candy"},"craft/distillery":{name:"Distillery",terms:"alcohol,beverage,bourbon,booze,brandy,gin,hooch,liquor,mezcal,moonshine,rum,scotch,spirits,still,tequila,vodka,whiskey,whisky"},"craft/dressmaker":{name:"Dressmaker",terms:"seamstress"},"craft/electrician":{name:"Electrician",terms:"power,wire"},"craft/electronics_repair":{name:"Electronics Repair Shop",terms:""},"craft/gardener":{name:"Gardener",terms:"landscaper,grounds keeper"},"craft/glaziery":{name:"Glaziery",terms:"glass,stained-glass,window"},"craft/handicraft":{name:"Handicraft",terms:""},"craft/hvac":{name:"HVAC",terms:"heat*,vent*,air conditioning"},"craft/insulator":{name:"Insulator",terms:""},"craft/key_cutter":{name:"Key Cutter",terms:""},"craft/metal_construction":{name:"Metal Construction",terms:""},"craft/painter":{name:"Painter",terms:""},"craft/photographer":{name:"Photographer",terms:""},"craft/photographic_laboratory":{name:"Photographic Laboratory",terms:"film"},"craft/plasterer":{name:"Plasterer",terms:""},"craft/plumber":{name:"Plumber",terms:"pipe"},"craft/pottery":{name:"Pottery",terms:"ceramic"},"craft/rigger":{name:"Rigger",terms:""},"craft/roofer":{name:"Roofer",terms:""},"craft/saddler":{name:"Saddler",terms:""},"craft/sailmaker":{name:"Sailmaker",terms:""},"craft/sawmill":{name:"Sawmill",terms:"lumber"},"craft/scaffolder":{name:"Scaffolder",terms:""},"craft/sculptor":{name:"Sculptor",terms:""},"craft/shoemaker":{name:"Shoemaker",terms:"cobbler"},"craft/stonemason":{name:"Stonemason",terms:"masonry"},"craft/tiler":{name:"Tiler",terms:""},"craft/tinsmith":{name:"Tinsmith",terms:""},"craft/upholsterer":{name:"Upholsterer",terms:""},"craft/watchmaker":{name:"Watchmaker",terms:""},"craft/window_construction":{name:"Window Construction",terms:"glass"},"craft/winery":{name:"Winery",terms:""},embankment:{name:"Embankment",terms:""},"emergency/designated":{name:"Emergency Access Designated",terms:""},"emergency/destination":{name:"Emergency Access Destination",terms:""},"emergency/no":{name:"Emergency Access No",terms:""},"emergency/official":{name:"Emergency Access Official",terms:""},"emergency/private":{name:"Emergency Access Private",terms:""},"emergency/yes":{name:"Emergency Access Yes",terms:""},"emergency/ambulance_station":{name:"Ambulance Station",terms:"EMS,EMT,rescue"},"emergency/defibrillator":{name:"Defibrillator",terms:"AED"},"emergency/fire_alarm":{name:"Fire Alarm Call Box",terms:""},"emergency/fire_extinguisher":{name:"Fire Extinguisher",terms:""},"emergency/fire_hydrant":{name:"Fire Hydrant",terms:"fire plug"},"emergency/first_aid_kit":{name:"First Aid Kit",terms:"bandage,first aid,med,med kit,medic*,medkit"},"emergency/life_ring":{name:"Life Ring",terms:"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/lifeguard":{name:"Lifeguard",terms:"CPR,rescue"},"emergency/phone":{name:"Emergency Phone",terms:""},"emergency/siren":{name:"Siren",terms:"air raid,loud,noise,storm,tornado,warning"},"emergency/water_tank":{name:"Emergency Water Tank",terms:"water tank,cistern,reservoir"},entrance:{name:"Entrance/Exit",terms:"entrance,exit,door"},"footway/crossing-raised":{name:"Raised Street Crossing",terms:"flat top,hump,speed,slow"},"footway/crossing":{name:"Street Crossing",terms:""},"footway/crosswalk-raised":{name:"Raised Pedestrian Crosswalk",terms:"zebra crossing,flat top,hump,speed,slow"},"footway/crosswalk":{name:"Pedestrian Crosswalk",terms:"zebra crossing"},"footway/sidewalk":{name:"Sidewalk",terms:""},ford:{name:"Ford",terms:""},"golf/bunker":{name:"Sand Trap",terms:"hazard,bunker"},"golf/fairway":{name:"Fairway",terms:""},"golf/green":{name:"Putting Green",terms:""},"golf/hole":{name:"Golf Hole",terms:""},"golf/lateral_water_hazard_area":{name:"Lateral Water Hazard",terms:""},"golf/lateral_water_hazard_line":{name:"Lateral Water Hazard",terms:""},"golf/rough":{name:"Rough",terms:""},"golf/tee":{name:"Tee Box",terms:"teeing ground"},"golf/water_hazard_area":{name:"Water Hazard",terms:""},"golf/water_hazard_line":{name:"Water Hazard",terms:""},healthcare:{name:"Healthcare Facility",terms:"clinic,doctor,disease,health,institution,sick,surgery,wellness"},"healthcare/alternative":{name:"Alternative Medicine",terms:"acupuncture,anthroposophical,applied kinesiology,aromatherapy,ayurveda,herbalism,homeopathy,hydrotherapy,hypnosis,naturopathy,osteopathy,reflexology,reiki,shiatsu,traditional,tuina,unani"},"healthcare/alternative/chiropractic":{name:"Chiropractor",terms:"back,pain,spine"},"healthcare/audiologist":{name:"Audiologist",terms:"ear,hearing,sound"},"healthcare/birthing_center":{name:"Birthing Center",terms:"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/blood_donation":{name:"Blood Donor Center",terms:"blood bank,blood donation,blood transfusion,apheresis,plasmapheresis,plateletpheresis,stem cell donation"},"healthcare/hospice":{name:"Hospice",terms:"terminal,illness"},"healthcare/laboratory":{name:"Medical Laboratory",terms:"medical_laboratory,medical_lab,blood_check"},"healthcare/midwife":{name:"Midwife",terms:"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/occupational_therapist":{name:"Occupational Therapist",terms:"therapist,therapy"},"healthcare/optometrist":{name:"Optometrist",terms:"eye,glasses,lasik,lenses,vision"},"healthcare/physiotherapist":{name:"Physiotherapist",terms:"physical,therapist,therapy"},"healthcare/podiatrist":{name:"Podiatrist",terms:"foot,feet,nails"},"healthcare/psychotherapist":{name:"Psychotherapist",terms:"anxiety,counselor,depression,mental health,mind,suicide,therapist,therapy"},"healthcare/rehabilitation":{name:"Rehabilitation Facility",terms:"rehab,therapist,therapy"},"healthcare/speech_therapist":{name:"Speech Therapist",terms:"speech,therapist,therapy,voice"},"highway/bus_stop":{name:"Bus Stop / Platform",terms:""},"highway/bridleway":{name:"Bridle Path",terms:"bridleway,equestrian,horse,trail"},"highway/bus_guideway":{name:"Bus Guideway",terms:""},"highway/corridor":{name:"Indoor Corridor",terms:"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing-raised":{name:"Raised Street Crossing",terms:"flat top,hump,speed,slow"},"highway/crossing":{name:"Street Crossing",terms:""},"highway/crosswalk-raised":{name:"Raised Pedestrian Crosswalk",terms:"zebra crossing,flat top,hump,speed,slow"},"highway/crosswalk":{name:"Pedestrian Crosswalk",terms:"zebra crossing"},"highway/cycleway":{name:"Cycle Path",terms:"bike"},"highway/elevator":{name:"Elevator",terms:"lift"},"highway/footway":{name:"Foot Path",terms:"hike,hiking,trackway,trail,walk"},"highway/give_way":{name:"Yield Sign",terms:"give way,yield,sign"},"highway/living_street":{name:"Living Street",terms:""},"highway/mini_roundabout":{name:"Mini-Roundabout",terms:""},"highway/motorway_junction":{name:"Motorway Junction / Exit",terms:"exit"},"highway/motorway_link":{name:"Motorway Link",terms:"exit,ramp,road,street,on ramp,off ramp"},"highway/motorway":{name:"Motorway",terms:"autobahn,expressway,freeway,highway,interstate,parkway,road,street,thruway,turnpike"},"highway/passing_place":{name:"Passing Place",terms:"turnout, pullout"},"highway/path":{name:"Path",terms:"hike,hiking,trackway,trail,walk"},"highway/pedestrian_area":{name:"Pedestrian Area",terms:"center,centre,plaza,quad,square,walkway"},"highway/pedestrian_line":{name:"Pedestrian Street",terms:"center,centre,plaza,quad,square,walkway"},"highway/primary_link":{name:"Primary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/primary":{name:"Primary Road",terms:"road,street"},"highway/raceway":{name:"Racetrack (Motorsport)",terms:"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{name:"Residential Road",terms:"road,street"},"highway/rest_area":{name:"Rest Area",terms:"rest stop"},"highway/road":{name:"Unknown Road",terms:"road,street"},"highway/secondary_link":{name:"Secondary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/secondary":{name:"Secondary Road",terms:"road,street"},"highway/service":{name:"Service Road",terms:"road,street"},"highway/service/alley":{name:"Alley",terms:""},"highway/service/drive-through":{name:"Drive-Through",terms:""},"highway/service/driveway":{name:"Driveway",terms:""},"highway/service/emergency_access":{name:"Emergency Access",terms:""},"highway/service/parking_aisle":{name:"Parking Aisle",terms:""},"highway/services":{name:"Service Area",terms:"services,travel plaza,service station"},"highway/speed_camera":{name:"Speed Camera",terms:""},"highway/steps":{name:"Steps",terms:"stairs,staircase"},"highway/stop":{name:"Stop Sign",terms:"stop,halt,sign"},"highway/street_lamp":{name:"Street Lamp",terms:"streetlight,street light,lamp,light,gaslight"},"highway/tertiary_link":{name:"Tertiary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/tertiary":{name:"Tertiary Road",terms:"road,street"},"highway/track":{name:"Unmaintained Track Road",terms:"woods road,forest road,logging road,fire road,farm road,agricultural road,ranch road,carriage road,primitive,unmaintained,rut,offroad,4wd,4x4,four wheel drive,atv,quad,jeep,double track,two track"},"highway/traffic_mirror":{name:"Traffic Mirror",terms:"blind spot,convex,corner,curved,roadside,round,safety,sphere,visibility"},"highway/traffic_signals":{name:"Traffic Signals",terms:"light,stoplight,traffic light"},"highway/trunk_link":{name:"Trunk Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/trunk":{name:"Trunk Road",terms:"road,street"},"highway/turning_circle":{name:"Turning Circle",terms:"cul-de-sac"},"highway/turning_loop":{name:"Turning Loop (Island)",terms:"cul-de-sac"},"highway/unclassified":{name:"Minor/Unclassified Road",terms:"road,street"},historic:{name:"Historic Site",terms:""},"historic/archaeological_site":{name:"Archaeological Site",terms:""},"historic/boundary_stone":{name:"Boundary Stone",terms:""},"historic/castle":{name:"Castle",terms:""},"historic/memorial":{name:"Memorial",terms:"dedicatory,epitaph,remember,remembrance,memory,monument,stolperstein"},"historic/monument":{name:"Monument",terms:""},"historic/ruins":{name:"Ruins",terms:""},"historic/tomb":{name:"Tomb",terms:""},"historic/wayside_cross":{name:"Wayside Cross",terms:""},"historic/wayside_shrine":{name:"Wayside Shrine",terms:""},junction:{name:"Junction",terms:""},landuse:{name:"Land Use",terms:""},"landuse/farm":{name:"Farmland",terms:""},"landuse/allotments":{name:"Community Garden",terms:"allotment,garden"},"landuse/aquaculture":{name:"Aquaculture",terms:"fish farm,crustacean,algae,aquafarming,shrimp farm,oyster farm,mariculture,algaculture"},"landuse/basin":{name:"Basin",terms:""},"landuse/brownfield":{name:"Brownfield",terms:""},"landuse/cemetery":{name:"Cemetery",terms:""},"landuse/churchyard":{name:"Churchyard",terms:""},"landuse/commercial":{name:"Commercial Area",terms:""},"landuse/construction":{name:"Construction",terms:""},"landuse/farmland":{name:"Farmland",terms:"crop,grow,plant"},"landuse/farmyard":{name:"Farmyard",terms:"crop,grow,plant"},"landuse/forest":{name:"Forest",terms:"cut,forest,lumber,tree"},"landuse/garages":{name:"Garage Landuse",terms:""},"landuse/grass":{name:"Grass",terms:""},"landuse/greenfield":{name:"Greenfield",terms:""},"landuse/greenhouse_horticulture":{name:"Greenhouse Horticulture",terms:"flower,greenhouse,horticulture,grow,vivero"},"landuse/harbour":{name:"Harbor",terms:"boat"},"landuse/industrial":{name:"Industrial Area",terms:""},"landuse/industrial/scrap_yard":{name:"Scrap Yard",terms:"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"landuse/industrial/slaughterhouse":{name:"Slaughterhouse",terms:"abattoir,beef,butchery,calf,chicken,cow,killing house,meat,pig,pork,poultry,shambles,stockyard"},"landuse/landfill":{name:"Landfill",terms:"dump"},"landuse/meadow":{name:"Meadow",terms:""},"landuse/military":{name:"Military Area",terms:""},"landuse/military/airfield":{name:"Military Airfield",terms:"aerodrome,aeroway,air force,airplane,airport,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war"},"landuse/military/barracks":{name:"Barracks",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/bunker":{name:"Military Bunker",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/checkpoint":{name:"Checkpoint",terms:"air force,army,base,force,guard,marine,navy,troop,war"},"landuse/military/danger_area":{name:"Danger Area",terms:"air force,army,base,blast,bomb,explo*,force,guard,mine,marine,navy,troop,war"},"landuse/military/naval_base":{name:"Naval Base",terms:"base,fight,force,guard,marine,navy,ship,sub,troop,war"},"landuse/military/nuclear_explosion_site":{name:"Nuclear Explosion Site",terms:"atom,blast,bomb,detonat*,nuke,site,test"},"landuse/military/obstacle_course":{name:"Obstacle Course",terms:"army,base,force,guard,marine,navy,troop,war"},"landuse/military/office":{name:"Military Office",terms:"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"landuse/military/range":{name:"Military Range",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/military/training_area":{name:"Training Area",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/orchard":{name:"Orchard",terms:"fruit"},"landuse/plant_nursery":{name:"Plant Nursery",terms:"flower,garden,grow,vivero"},"landuse/quarry":{name:"Quarry",terms:""},"landuse/railway":{name:"Railway Corridor",terms:"rail,train,track"},"landuse/recreation_ground":{name:"Recreation Ground",terms:"playing fields"},"landuse/religious":{name:"Religious Area",terms:""},"landuse/residential":{name:"Residential Area",terms:""},"landuse/retail":{name:"Retail Area",terms:""},"landuse/vineyard":{name:"Vineyard",terms:"grape,wine"},leisure:{name:"Leisure",terms:""},"leisure/adult_gaming_centre":{name:"Adult Gaming Center",terms:"gambling,slot machine"},"leisure/amusement_arcade":{name:"Amusement Arcade",terms:"pay-to-play games,video games,driving simulators,pinball machines"},"leisure/beach_resort":{name:"Beach Resort",terms:""},"leisure/bird_hide":{name:"Bird Hide",terms:"machan,ornithology"},"leisure/bleachers":{name:"Bleachers",terms:"crowd,bench,sports,stand,stands,seat,seating"},"leisure/bowling_alley":{name:"Bowling Alley",terms:"bowling center"},"leisure/common":{name:"Common",terms:"open space"},"leisure/dance":{name:"Dance Hall",terms:"ballroom,jive,swing,tango,waltz"},"leisure/dancing_school":{name:"Dance School",terms:"jive,swing,tango,waltz,dance teaching"},"leisure/dog_park":{name:"Dog Park",terms:""},"leisure/firepit":{name:"Firepit",terms:"fireplace,campfire"},"leisure/fitness_centre":{name:"Gym / Fitness Center",terms:"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{name:"Yoga Studio",terms:"studio"},"leisure/fitness_station":{name:"Outdoor Fitness Station",terms:"exercise,fitness,gym,trim trail"},"leisure/fitness_station/balance_beam":{name:"Exercise Balance Beam",terms:"balance,exercise,fitness,gym,trim trail"},"leisure/fitness_station/box":{name:"Exercise Box",terms:"box,exercise,fitness,gym,jump,trim trail"},"leisure/fitness_station/horizontal_bar":{name:"Exercise Horizontal Bar",terms:"bar,chinup,chin up,exercise,fitness,gym,pullup,pull up,trim trail"},"leisure/fitness_station/horizontal_ladder":{name:"Exercise Monkey Bars",terms:"bar,chinup,chin up,exercise,fitness,gym,ladder,monkey bars,pullup,pull up,trim trail"},"leisure/fitness_station/hyperextension":{name:"Hyperextension Station",terms:"back,exercise,extension,fitness,gym,roman chair,trim trail"},"leisure/fitness_station/parallel_bars":{name:"Parallel Bars",terms:"bar,dip,exercise,fitness,gym,trim trail"},"leisure/fitness_station/push-up":{name:"Push-Up Station",terms:"bar,exercise,fitness,gym,pushup,push up,trim trail"},"leisure/fitness_station/rings":{name:"Exercise Rings",terms:"exercise,fitness,gym,muscle up,pullup,pull up,trim trail"},"leisure/fitness_station/sign":{name:"Exercise Instruction Sign",terms:"exercise,fitness,gym,trim trail"},"leisure/fitness_station/sit-up":{name:"Sit-Up Station",terms:"crunch,exercise,fitness,gym,situp,sit up,trim trail"},"leisure/fitness_station/stairs":{name:"Exercise Stairs",terms:"exercise,fitness,gym,steps,trim trail"},"leisure/garden":{name:"Garden",terms:""},"leisure/golf_course":{name:"Golf Course",terms:"links"},"leisure/hackerspace":{name:"Hackerspace",terms:"makerspace,hackspace,hacklab"},"leisure/horse_riding":{name:"Horseback Riding Facility",terms:"equestrian,stable"},"leisure/ice_rink":{name:"Ice Rink",terms:"hockey,skating,curling"},"leisure/marina":{name:"Marina",terms:"boat"},"leisure/miniature_golf":{name:"Miniature Golf",terms:"crazy golf,mini golf,putt-putt"},"leisure/nature_reserve":{name:"Nature Reserve",terms:"protected,wildlife"},"leisure/outdoor_seating":{name:"Outdoor Seating Area",terms:"al fresco,beer garden,dining,cafe,restaurant,pub,bar,patio"},"leisure/park":{name:"Park",terms:"esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"},"leisure/picnic_table":{name:"Picnic Table",terms:"bench"},"leisure/pitch":{name:"Sport Pitch",terms:"field"},"leisure/pitch/american_football":{name:"American Football Field",terms:""},"leisure/pitch/badminton":{name:"Badminton Court",terms:""},"leisure/pitch/baseball":{name:"Baseball Diamond",terms:""},"leisure/pitch/basketball":{name:"Basketball Court",terms:""},"leisure/pitch/beachvolleyball":{name:"Beach Volleyball Court",terms:"volleyball"},"leisure/pitch/boules":{name:"Boules/Bocce Court",terms:"bocce,lyonnaise,pétanque"},"leisure/pitch/bowls":{name:"Bowling Green",terms:""},"leisure/pitch/cricket":{name:"Cricket Field",terms:""},"leisure/pitch/equestrian":{name:"Riding Arena",terms:"dressage,equestrian,horse,horseback,riding"},"leisure/pitch/rugby_league":{name:"Rugby League Field",terms:""},"leisure/pitch/rugby_union":{name:"Rugby Union Field",terms:""},"leisure/pitch/skateboard":{name:"Skate Park",terms:""},"leisure/pitch/soccer":{name:"Soccer Field",terms:"football"},"leisure/pitch/table_tennis":{name:"Ping Pong Table",terms:"table tennis,ping pong"},"leisure/pitch/tennis":{name:"Tennis Court",terms:""},"leisure/pitch/volleyball":{name:"Volleyball Court",terms:""},"leisure/playground":{name:"Playground",terms:"jungle gym,play area"},"leisure/resort":{name:"Resort",terms:""},"leisure/running_track":{name:"Racetrack (Running)",terms:"race*,running,sprint,track"},"leisure/sauna":{name:"Sauna",terms:""},"leisure/slipway":{name:"Slipway",terms:"boat launch,boat ramp"},"leisure/sports_centre":{name:"Sports Center / Complex",terms:""},"leisure/sports_centre/swimming":{name:"Swimming Pool Facility",terms:"dive,water"},"leisure/stadium":{name:"Stadium",terms:""},"leisure/swimming_pool":{name:"Swimming Pool",terms:"dive,water"},"leisure/track":{name:"Racetrack (Non-Motorsport)",terms:"cycle,dog,greyhound,horse,race*,track"},"leisure/water_park":{name:"Water Park",terms:"swim,pool,dive"},line:{name:"Line",terms:""},man_made:{name:"Man Made",terms:""},"man_made/embankment":{name:"Embankment",terms:""},"man_made/adit":{name:"Adit",terms:"entrance,underground,mine,cave"},"man_made/antenna":{name:"Antenna",terms:"broadcast,cell phone,cell,communication,mobile phone,radio,television,transmission,tv"},"man_made/breakwater":{name:"Breakwater",terms:""},"man_made/bridge":{name:"Bridge",terms:""},"man_made/bunker_silo":{name:"Bunker Silo",terms:"Silage,Storage"},"man_made/chimney":{name:"Chimney",terms:""},"man_made/clearcut":{name:"Clearcut Forest",terms:"cut,forest,lumber,tree,wood"},"man_made/crane":{name:"Crane",terms:""},"man_made/cutline":{name:"Cut line",terms:""},"man_made/flagpole":{name:"Flagpole",terms:""},"man_made/gasometer":{name:"Gasometer",terms:"gas holder"},"man_made/groyne":{name:"Groyne",terms:""},"man_made/lighthouse":{name:"Lighthouse",terms:""},"man_made/mast":{name:"Mast",terms:"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/monitoring_station":{name:"Monitoring Station",terms:"weather,earthquake,seismology,air,gps"},"man_made/observation":{name:"Observation Tower",terms:"lookout tower,fire tower"},"man_made/observatory":{name:"Observatory",terms:"astronomical,meteorological"},"man_made/petroleum_well":{name:"Oil Well",terms:"drilling rig,oil derrick,oil drill,oil horse,oil rig,oil pump,petroleum well,pumpjack"},"man_made/pier":{name:"Pier",terms:"dock,jetty"},"man_made/pipeline":{name:"Pipeline",terms:""},"man_made/pumping_station":{name:"Pumping Station",terms:""},"man_made/silo":{name:"Silo",terms:"grain,corn,wheat"},"man_made/storage_tank":{name:"Storage Tank",terms:"water,oil,gas,petrol"},"man_made/surveillance_camera":{name:"Surveillance Camera",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/surveillance":{name:"Surveillance",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/survey_point":{name:"Survey Point",terms:"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{name:"Tower",terms:""},"man_made/wastewater_plant":{name:"Wastewater Plant",terms:"sewage*,water treatment plant,reclamation plant"},"man_made/water_tower":{name:"Water Tower",terms:""},"man_made/water_well":{name:"Water Well",terms:""},"man_made/water_works":{name:"Water Works",terms:""},"man_made/watermill":{name:"Watermill",terms:"water,wheel,mill"},"man_made/windmill":{name:"Windmill",terms:"wind,wheel,mill"},"man_made/works":{name:"Factory",terms:"assembly,build,brewery,car,plant,plastic,processing,manufacture,refinery"},manhole:{name:"Manhole",terms:"cover,hole,sewer,sewage,telecom"},"manhole/drain":{name:"Storm Drain",terms:"cover,drain,hole,rain,sewer,sewage,storm"},"manhole/telecom":{name:"Telecom Manhole",terms:"cover,phone,hole,telecom,telephone,bt"},natural:{name:"Natural",terms:""},"natural/bare_rock":{name:"Bare Rock",terms:"rock"},"natural/bay":{name:"Bay",terms:""},"natural/beach":{name:"Beach",terms:"shore"},"natural/cave_entrance":{name:"Cave Entrance",terms:"cavern,hollow,grotto,shelter,cavity"},"natural/cliff":{name:"Cliff",terms:"crag,escarpment,rock face,scarp"},"natural/coastline":{name:"Coastline",terms:"shore"},"natural/fell":{name:"Fell",terms:""},"natural/glacier":{name:"Glacier",terms:""},"natural/grassland":{name:"Grassland",terms:"prairie,savanna"},"natural/heath":{name:"Heath",terms:""},"natural/mud":{name:"Mud",terms:"wetland"},"natural/peak":{name:"Peak",terms:"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/reef":{name:"Reef",terms:"barrier,coral,ocean,sand,shoal"},"natural/ridge":{name:"Ridge",terms:"crest"},"natural/saddle":{name:"Saddle",terms:"pass,mountain pass,top"},"natural/sand":{name:"Sand",terms:"desert"},"natural/scree":{name:"Scree",terms:"loose rocks"},"natural/scrub":{name:"Scrub",terms:"bush,shrubs"},"natural/spring":{name:"Spring",terms:""},"natural/tree_row":{name:"Tree row",terms:""},"natural/tree":{name:"Tree",terms:""},"natural/volcano":{name:"Volcano",terms:"mountain,crater"},"natural/water":{name:"Water",terms:""},"natural/water/lake":{name:"Lake",terms:"lakelet,loch,mere"},"natural/water/pond":{name:"Pond",terms:"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{name:"Reservoir",terms:""},"natural/wetland":{name:"Wetland",terms:"bog,marsh,reedbed,swamp,tidalflat"},"natural/wood":{name:"Wood",terms:"tree"},"noexit/yes":{name:"No Exit",terms:"no exit,road end,dead end"},office:{name:"Office",terms:""},"office/administrative":{name:"Administrative Office",terms:""},"office/physician":{name:"Physician",terms:""},"office/travel_agent":{name:"Travel Agency",terms:""},"office/accountant":{name:"Accountant Office",terms:""},"office/adoption_agency":{name:"Adoption Agency",terms:""},"office/advertising_agency":{name:"Advertising Agency",terms:"ad,ad agency,advert agency,advertising,marketing"},"office/architect":{name:"Architect Office",terms:""},"office/association":{name:"Nonprofit Organization Office",terms:"association,non-profit,nonprofit,organization,society"},"office/charity":{name:"Charity Office",terms:"charitable organization"},"office/company":{name:"Corporate Office",terms:""},"office/coworking":{name:"Coworking Space",terms:"coworking,office"},"office/educational_institution":{name:"Educational Institution",terms:""},"office/employment_agency":{name:"Employment Agency",terms:"job"},"office/energy_supplier":{name:"Energy Supplier Office",terms:"electricity,energy company,energy utility,gas utility"},"office/estate_agent":{name:"Real Estate Office",terms:""},"office/financial":{name:"Financial Office",terms:""},"office/forestry":{name:"Forestry Office",terms:"forest,ranger"},"office/foundation":{name:"Foundation Office",terms:""},"office/government":{name:"Government Office",terms:""},"office/government/register_office":{name:"Register Office",terms:"clerk,marriage,death,birth,certificate"},"office/government/tax":{name:"Tax and Revenue Office",terms:"fiscal authorities,revenue office,tax office"},"office/guide":{name:"Tour Guide Office",terms:"dive guide,mountain guide,tour guide"},"office/insurance":{name:"Insurance Office",terms:""},"office/it":{name:"Information Technology Office",terms:"computer,information,software,technology"},"office/lawyer":{name:"Law Office",terms:""},"office/lawyer/notary":{name:"Notary Office",terms:""},"office/moving_company":{name:"Moving Company Office",terms:"relocation"},"office/newspaper":{name:"Newspaper Office",terms:""},"office/ngo":{name:"NGO Office",terms:"ngo,non government,non-government,organization,organisation"},"office/notary":{name:"Notary Office",terms:"clerk,deeds,estate,signature,wills"},"office/political_party":{name:"Political Party",terms:""},"office/private_investigator":{name:"Private Investigator Office",terms:"PI,private eye,private detective"},"office/quango":{name:"Quasi-NGO Office",terms:"ngo,non government,non-government,organization,organisation,quasi autonomous,quasi-autonomous"},"office/research":{name:"Research Office",terms:""},"office/surveyor":{name:"Surveyor Office",terms:""},"office/tax_advisor":{name:"Tax Advisor Office",terms:"tax,tax consultant"},"office/telecommunication":{name:"Telecom Office",terms:"communication,internet,phone,voice"},"office/therapist":{name:"Therapist Office",terms:"therapy"},"office/water_utility":{name:"Water Utility Office",terms:"water board,utility"},piste:{name:"Piste/Ski Trail",terms:"ski,sled,sleigh,snowboard,nordic,downhill,snowmobile"},"place/farm":{name:"Farm",terms:""},"place/city":{name:"City",terms:""},"place/hamlet":{name:"Hamlet",terms:""},"place/island":{name:"Island",terms:"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/islet":{name:"Islet",terms:"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/isolated_dwelling":{name:"Isolated Dwelling",terms:""},"place/locality":{name:"Locality",terms:""},"place/neighbourhood":{name:"Neighborhood",terms:"neighbourhood"},"place/plot":{name:"Plot",terms:"tract,land,lot,parcel"},"place/quarter":{name:"Sub-Borough / Quarter",terms:"boro,borough,quarter"},"place/square":{name:"Square",terms:""},"place/suburb":{name:"Borough / Suburb",terms:"boro,borough,quarter"},"place/town":{name:"Town",terms:""},"place/village":{name:"Village",terms:""},"playground/balance_beam":{name:"Play Balance Beam",terms:""},"playground/basket_spinner":{name:"Basket Spinner",terms:"basket rotator"},"playground/basket_swing":{name:"Basket Swing",terms:""},"playground/climbing_frame":{name:"Climbing Frame",terms:""},"playground/cushion":{name:"Bouncy Cushion",terms:""},"playground/horizontal_bar":{name:"Play Horizontal Bar",terms:"high bar"},"playground/rocker":{name:"Spring Rider",terms:"spring rocker,springy rocker"},"playground/roundabout":{name:"Play Roundabout",terms:"merry-go-round"},"playground/sandpit":{name:"Sandpit",terms:""},"playground/seesaw":{name:"Seesaw",terms:""},"playground/slide":{name:"Slide",terms:""},"playground/structure":{name:"Play Structure",terms:""},"playground/swing":{name:"Swing",terms:""},"playground/zipwire":{name:"Zip Wire",terms:""},point:{name:"Point",terms:""},"power/sub_station":{name:"Substation",terms:""},"power/generator":{name:"Power Generator",terms:"hydro,solar,turbine,wind"},"power/generator/source_nuclear":{name:"Nuclear Reactor",terms:"fission,generator,nuclear,nuke,reactor"},"power/generator/source_wind":{name:"Wind Turbine",terms:"generator,turbine,windmill,wind"},"power/line":{name:"Power Line",terms:""},"power/minor_line":{name:"Minor Power Line",terms:""},"power/plant":{name:"Power Station Grounds",terms:"coal,gas,generat*,hydro,nuclear,power,station"},"power/pole":{name:"Power Pole",terms:""},"power/substation":{name:"Substation",terms:""},"power/switch":{name:"Power Switch",terms:""},"power/tower":{name:"High-Voltage Tower",terms:""},"power/transformer":{name:"Transformer",terms:""},"public_transport/linear_platform_aerialway":{name:"Aerialway Stop / Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_bus":{name:"Bus Stop / Platform",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_ferry":{name:"Ferry Stop / Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_light_rail":{name:"Light Rail Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_monorail":{name:"Monorail Stop / Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/linear_platform_subway":{name:"Subway Stop / Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/linear_platform_train":{name:"Train Stop / Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/linear_platform_tram":{name:"Tram Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_trolleybus":{name:"Trolleybus Stop / Platform",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/linear_platform":{name:"Transit Stop / Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/platform_aerialway":{name:"Aerialway Stop / Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_bus":{name:"Bus Stop / Platform",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_ferry":{name:"Ferry Stop / Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_light_rail":{name:"Light Rail Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform_monorail":{name:"Monorail Stop / Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform_subway":{name:"Subway Stop / Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform_train":{name:"Train Stop / Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform_tram":{name:"Tram Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform_trolleybus":{name:"Trolleybus Stop / Platform",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/platform":{name:"Transit Stop / Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/station_aerialway":{name:"Aerialway Station",terms:"aerialway,cable car,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_bus":{name:"Bus Station / Terminal",terms:"bus,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_ferry":{name:"Ferry Station / Terminal",terms:"boat,dock,ferry,pier,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_light_rail":{name:"Light Rail Station",terms:"electric,light rail,public transit,public transportation,rail,station,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_monorail":{name:"Monorail Station",terms:"monorail,public transit,public transportation,rail,station,terminal,transit,transportation"},"public_transport/station_subway":{name:"Subway Station",terms:"metro,public transit,public transportation,rail,station,subway,terminal,track,transit,transportation,underground"},"public_transport/station_train_halt":{name:"Train Station (Halt / Request)",terms:"halt,public transit,public transportation,rail,station,track,train,transit,transportation,whistle stop"},"public_transport/station_train":{name:"Train Station",terms:"public transit,public transportation,rail,station,terminal,track,train,transit,transportation"},"public_transport/station_tram":{name:"Tram Station",terms:"electric,light rail,public transit,public transportation,rail,station,streetcar,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_trolleybus":{name:"Trolleybus Station / Terminal",terms:"bus,electric,public transit,public transportation,station,streetcar,terminal,trackless,tram,trolley,transit,transportation"},"public_transport/station":{name:"Transit Station",terms:"public transit,public transportation,station,terminal,transit,transportation"},"public_transport/stop_area":{name:"Transit Stop Area",terms:""},"public_transport/stop_position_aerialway":{name:"Aerialway Stopping Location",terms:"aerialway,cable car,public transit,public transportation,transit,transportation"},"public_transport/stop_position_bus":{name:"Bus Stopping Location",terms:"bus,public transit,public transportation,transit,transportation"},"public_transport/stop_position_ferry":{name:"Ferry Stopping Location",terms:"boat,dock,ferry,pier,public transit,public transportation,transit,transportation"},"public_transport/stop_position_light_rail":{name:"Light Rail Stopping Location",terms:"electric,light rail,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/stop_position_monorail":{name:"Monorail Stopping Location",terms:"monorail,public transit,public transportation,rail,transit,transportation"},"public_transport/stop_position_subway":{name:"Subway Stopping Location",terms:"metro,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/stop_position_train":{name:"Train Stopping Location",terms:"public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/stop_position_tram":{name:"Tram Stopping Location",terms:"electric,light rail,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/stop_position_trolleybus":{name:"Trolleybus Stopping Location",terms:"bus,electric,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/stop_position":{name:"Transit Stopping Location",terms:"public transit,public transportation,transit,transportation"},"railway/halt":{name:"Train Station (Halt / Request)",terms:"break,interrupt,rest,wait,interruption"},"railway/platform":{name:"Train Stop / Platform",terms:""},"railway/station":{name:"Train Station",terms:"train station,station"},"railway/tram_stop":{name:"Tram Stopping Position",terms:"light rail,streetcar,tram,trolley"},"railway/abandoned":{name:"Abandoned Railway",terms:""},"railway/buffer_stop":{name:"Buffer Stop",terms:"stop,halt,buffer"},"railway/crossing":{name:"Railway Crossing (Path)",terms:"crossing,pedestrian crossing,railroad crossing,level crossing,grade crossing,path through railroad,train crossing"},"railway/derail":{name:"Railway Derailer",terms:"derailer"},"railway/disused":{name:"Disused Railway",terms:""},"railway/funicular":{name:"Funicular",terms:"venicular,cliff railway,cable car,cable railway,funicular railway"},"railway/level_crossing":{name:"Railway Crossing (Road)",terms:"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/light_rail":{name:"Light Rail",terms:"light rail,streetcar,trolley"},"railway/milestone":{name:"Railway Milestone",terms:"milestone,marker"},"railway/miniature":{name:"Miniature Railway",terms:"rideable miniature railway,narrow gauge railway,minimum gauge railway"},"railway/monorail":{name:"Monorail",terms:""},"railway/narrow_gauge":{name:"Narrow Gauge Rail",terms:"narrow gauge railway,narrow gauge railroad"},"railway/rail":{name:"Rail",terms:""},"railway/signal":{name:"Railway Signal",terms:"signal,lights"},"railway/subway_entrance":{name:"Subway Entrance",terms:"metro,transit"},"railway/subway":{name:"Subway",terms:"metro,transit"},"railway/switch":{name:"Railway Switch",terms:"switch,points"},"railway/train_wash":{name:"Train Wash",terms:"wash,clean"},"railway/tram":{name:"Tram",terms:"light rail,streetcar,tram,trolley"},relation:{name:"Relation",terms:""},"route/ferry":{name:"Ferry Route",terms:""},shop:{name:"Shop",terms:""},"shop/fishmonger":{name:"Fishmonger",terms:""},"shop/furnace":{name:"Furnace Store",terms:"oven,stove"},"shop/vacant":{name:"Vacant Shop",terms:""},"shop/agrarian":{name:"Farm Supply Shop",terms:"agricultural inputs,agricultural machines,seeds,pesticides,fertilizer,agricultural tools"},"shop/alcohol":{name:"Liquor Store",terms:"alcohol,beer,booze,wine"},"shop/anime":{name:"Anime Shop",terms:"manga,japan,cosplay,figurine,dakimakura"},"shop/antiques":{name:"Antiques Shop",terms:""},"shop/appliance":{name:"Appliance Store",terms:"air conditioner,appliance,dishwasher,dryer,freezer,fridge,grill,kitchen,oven,refrigerator,stove,washer,washing machine"},"shop/art":{name:"Art Store",terms:"art*,exhibit*,gallery"},"shop/baby_goods":{name:"Baby Goods Store",terms:""},"shop/bag":{name:"Bag/Luggage Store",terms:"handbag,purse"},"shop/bakery":{name:"Bakery",terms:""},"shop/bathroom_furnishing":{name:"Bathroom Furnishing Store",terms:""},"shop/beauty":{name:"Beauty Shop",terms:"spa,salon,tanning"},"shop/beauty/nails":{name:"Nail Salon",terms:"manicure,pedicure"},"shop/beauty/tanning":{name:"Tanning Salon",terms:""},"shop/bed":{name:"Bedding/Mattress Store",terms:""},"shop/beverages":{name:"Beverage Store",terms:""},"shop/bicycle":{name:"Bicycle Shop",terms:"bike,repair"},"shop/bookmaker":{name:"Bookmaker",terms:"betting"},"shop/books":{name:"Book Store",terms:""},"shop/boutique":{name:"Boutique",terms:""},"shop/butcher":{name:"Butcher",terms:"meat"},"shop/candles":{name:"Candle Shop",terms:""},"shop/car_parts":{name:"Car Parts Store",terms:"auto"},"shop/car_repair":{name:"Car Repair Shop",terms:"auto,garage,service"},"shop/car":{name:"Car Dealership",terms:"auto"},"shop/carpet":{name:"Carpet Store",terms:"rug"},"shop/charity":{name:"Charity Store",terms:"thrift,op shop,nonprofit"},"shop/cheese":{name:"Cheese Store",terms:""},"shop/chemist":{name:"Drugstore",terms:"apothecary,med*,drug*,gift"},"shop/chocolate":{name:"Chocolate Store",terms:""},"shop/clothes":{name:"Clothing Store",terms:""},"shop/coffee":{name:"Coffee Store",terms:""},"shop/computer":{name:"Computer Store",terms:""},"shop/confectionery":{name:"Candy Store",terms:"sweet"},"shop/convenience":{name:"Convenience Store",terms:""},"shop/copyshop":{name:"Copy Store",terms:""},"shop/cosmetics":{name:"Cosmetics Store",terms:""},"shop/craft":{name:"Arts and Crafts Store",terms:"art*,paint*,frame"},"shop/curtain":{name:"Curtain Store",terms:"drape*,window"},"shop/dairy":{name:"Dairy Store",terms:"milk,egg,cheese"},"shop/deli":{name:"Deli",terms:"lunch,meat,sandwich"},"shop/department_store":{name:"Department Store",terms:""},"shop/doityourself":{name:"DIY Store",terms:""},"shop/dry_cleaning":{name:"Dry Cleaner",terms:""},"shop/e-cigarette":{name:"E-Cigarette Shop",terms:"electronic,vapor"},"shop/electronics":{name:"Electronics Store",terms:"appliance,audio,blueray,camera,computer,dvd,home theater,radio,speaker,tv,video"},"shop/erotic":{name:"Erotic Store",terms:"sex,porn"},"shop/fabric":{name:"Fabric Store",terms:"sew"},"shop/farm":{name:"Produce Stand",terms:"farm shop,farm stand"},"shop/fashion":{name:"Fashion Store",terms:""},"shop/florist":{name:"Florist",terms:"flower"},"shop/frame":{name:"Framing Shop",terms:"art*,paint*,photo*,frame"},"shop/funeral_directors":{name:"Funeral Home",terms:"undertaker,memorial home"},"shop/furniture":{name:"Furniture Store",terms:"chair,sofa,table"},"shop/garden_centre":{name:"Garden Center",terms:"landscape,mulch,shrub,tree"},"shop/gas":{name:"Bottled Gas Shop",terms:"cng,lpg,natural gas,propane,refill,tank"},"shop/gift":{name:"Gift Shop",terms:"souvenir"},"shop/greengrocer":{name:"Greengrocer",terms:"fruit,vegetable"},"shop/hairdresser":{name:"Hairdresser",terms:"barber"},"shop/hardware":{name:"Hardware Store",terms:""},"shop/health_food":{name:"Health Food Shop",terms:"wholefood,vitamins,vegetarian,vegan"},"shop/hearing_aids":{name:"Hearing Aids Store",terms:""},"shop/herbalist":{name:"Herbalist",terms:""},"shop/hifi":{name:"Hifi Store",terms:"stereo,video"},"shop/houseware":{name:"Houseware Store",terms:"home,household"},"shop/interior_decoration":{name:"Interior Decoration Store",terms:""},"shop/jewelry":{name:"Jeweler",terms:"diamond,gem,ring"},"shop/kiosk":{name:"Kiosk",terms:""},"shop/kitchen":{name:"Kitchen Design Store",terms:""},"shop/laundry":{name:"Laundry",terms:""},"shop/leather":{name:"Leather Store",terms:""},"shop/locksmith":{name:"Locksmith",terms:"key,lockpick"},"shop/lottery":{name:"Lottery Shop",terms:""},"shop/mall":{name:"Mall",terms:"shopping"},"shop/massage":{name:"Massage Shop",terms:""},"shop/medical_supply":{name:"Medical Supply Store",terms:""},"shop/mobile_phone":{name:"Mobile Phone Store",terms:""},"shop/money_lender":{name:"Money Lender",terms:""},"shop/motorcycle_repair":{name:"Motorcycle Repair Shop",terms:"auto,bike,garage,motorcycle,repair,service"},"shop/motorcycle":{name:"Motorcycle Dealership",terms:"bike"},"shop/music":{name:"Music Store",terms:"CD,vinyl"},"shop/musical_instrument":{name:"Musical Instrument Store",terms:"guitar"},"shop/newsagent":{name:"Newspaper/Magazine Shop",terms:""},"shop/nutrition_supplements":{name:"Nutrition Supplements Store",terms:""},"shop/optician":{name:"Optician",terms:"eye,glasses"},"shop/organic":{name:"Organic Goods Store",terms:""},"shop/outdoor":{name:"Outdoors Store",terms:"camping,climbing,hiking"},"shop/paint":{name:"Paint Store",terms:""},"shop/pastry":{name:"Pastry Shop",terms:"patisserie,cake shop,cakery"},"shop/pawnbroker":{name:"Pawn Shop",terms:""},"shop/perfumery":{name:"Perfume Store",terms:""},"shop/pet_grooming":{name:"Pet Grooming Store",terms:"dog"},"shop/pet":{name:"Pet Store",terms:"animal,cat,dog,fish,kitten,puppy,reptile"},"shop/photo":{name:"Photography Store",terms:"camera,film"},"shop/pyrotechnics":{name:"Fireworks Store",terms:""},"shop/radiotechnics":{name:"Radio/Electronic Component Store",terms:""},"shop/religion":{name:"Religious Store",terms:""},"shop/scuba_diving":{name:"Scuba Diving Shop",terms:""},"shop/seafood":{name:"Seafood Shop",terms:"fishmonger"},"shop/second_hand":{name:"Consignment/Thrift Store",terms:"secondhand,second hand,resale,thrift,used"},"shop/shoes":{name:"Shoe Store",terms:""},"shop/sports":{name:"Sporting Goods Store",terms:""},"shop/stationery":{name:"Stationery Store",terms:"card,paper"},"shop/storage_rental":{name:"Storage Rental",terms:""},"shop/supermarket":{name:"Supermarket",terms:"grocery,store,shop"},"shop/tailor":{name:"Tailor",terms:"clothes,suit"},"shop/tattoo":{name:"Tattoo Parlor",terms:""},"shop/tea":{name:"Tea Store",terms:""},"shop/ticket":{name:"Ticket Seller",terms:""},"shop/tiles":{name:"Tile Shop",terms:""},"shop/tobacco":{name:"Tobacco Shop",terms:""},"shop/toys":{name:"Toy Store",terms:""},"shop/trade":{name:"Trade Shop",terms:""},"shop/travel_agency":{name:"Travel Agency",terms:""},"shop/tyres":{name:"Tire Store",terms:""},"shop/vacuum_cleaner":{name:"Vacuum Cleaner Store",terms:""},"shop/variety_store":{name:"Variety Store",terms:""},"shop/video_games":{name:"Video Game Store",terms:""},"shop/video":{name:"Video Store",terms:"DVD"},"shop/watches":{name:"Watches Shop",terms:""},"shop/water_sports":{name:"Watersport/Swim Shop",terms:""},"shop/weapons":{name:"Weapon Shop",terms:"ammo,gun,knife,knives"},"shop/wholesale":{name:"Wholesale Store",terms:"warehouse club,cash and carry"},"shop/window_blind":{name:"Window Blind Store",terms:""},"shop/wine":{name:"Wine Shop",terms:""},tourism:{name:"Tourism",terms:""},"tourism/alpine_hut":{name:"Alpine Hut",terms:"climbing hut"},"tourism/apartment":{name:"Guest Apartment / Condo",terms:""},"tourism/aquarium":{name:"Aquarium",terms:"fish,sea,water"},"tourism/artwork":{name:"Artwork",terms:"mural,sculpture,statue"},"tourism/attraction":{name:"Tourist Attraction",terms:""},"tourism/camp_site":{name:"Campground",terms:"tent,rv"},"tourism/caravan_site":{name:"RV Park",terms:"Motor Home,Camper"},"tourism/chalet":{name:"Holiday Cottage",terms:"holiday,holiday cottage,holiday home,vacation,vacation home"},"tourism/gallery":{name:"Art Gallery",terms:"art*,exhibit*,paint*,photo*,sculpt*"},"tourism/guest_house":{name:"Guest House",terms:"B&B,Bed and Breakfast"},"tourism/hostel":{name:"Hostel",terms:""},"tourism/hotel":{name:"Hotel",terms:""},"tourism/information":{name:"Information",terms:""},"tourism/information/board":{name:"Information Board",terms:""},"tourism/information/guidepost":{name:"Guidepost",terms:"signpost"},"tourism/information/map":{name:"Map",terms:""},"tourism/information/office":{name:"Tourist Information Office",terms:""},"tourism/motel":{name:"Motel",terms:""},"tourism/museum":{name:"Museum",terms:"art*,exhibit*,gallery,foundation,hall,institution,paint*,photo*,sculpt*"},"tourism/picnic_site":{name:"Picnic Site",terms:"camp"},"tourism/theme_park":{name:"Theme Park",terms:""},"tourism/trail_riding_station":{name:"Trail Riding Station",terms:""},"tourism/viewpoint":{name:"Viewpoint",terms:""},"tourism/wilderness_hut":{name:"Wilderness Hut",terms:"wilderness hut,backcountry hut,bothy"},"tourism/zoo":{name:"Zoo",terms:"animal"},traffic_calming:{name:"Traffic Calming",terms:"bump,hump,slow,speed"},"traffic_calming/bump":{name:"Speed Bump",terms:"hump,speed,slow"},"traffic_calming/chicane":{name:"Traffic Chicane",terms:"driveway link,speed,slow"},"traffic_calming/choker":{name:"Traffic Choker",terms:"speed,slow"},"traffic_calming/cushion":{name:"Speed Cushion",terms:"bump,hump,speed,slow"},"traffic_calming/dip":{name:"Dip",terms:"speed,slow"},"traffic_calming/hump":{name:"Speed Hump",terms:"bump,speed,slow"},"traffic_calming/island":{name:"Traffic Island",terms:"circle,roundabout,slow"},"traffic_calming/rumble_strip":{name:"Rumble Strip",terms:"audible lines,sleeper lines,growlers"},"traffic_calming/table":{name:"Speed Table",terms:"flat top,hump,speed,slow"},"type/multipolygon":{name:"Multipolygon",terms:""},"type/boundary":{name:"Boundary",terms:""},"type/boundary/administrative":{name:"Administrative Boundary",terms:""},"type/restriction":{name:"Restriction",terms:""},"type/restriction/no_left_turn":{name:"No Left Turn",terms:""},"type/restriction/no_right_turn":{name:"No Right Turn",terms:""},"type/restriction/no_straight_on":{name:"No Straight On",terms:""},"type/restriction/no_u_turn":{name:"No U-turn",terms:""},"type/restriction/only_left_turn":{name:"Only Left Turn",terms:""},"type/restriction/only_right_turn":{name:"Only Right Turn",terms:""},"type/restriction/only_straight_on":{name:"Only Straight On",terms:""},"type/restriction/only_u_turn":{name:"Only U-turn",terms:""},"type/route_master":{name:"Route Master",terms:""},"type/route":{name:"Route",terms:""},"type/route/bicycle":{name:"Cycle Route",terms:""},"type/route/bus":{name:"Bus Route",terms:""},"type/route/detour":{name:"Detour Route",terms:""},"type/route/ferry":{name:"Ferry Route",terms:""},"type/route/foot":{name:"Foot Route",terms:""},"type/route/hiking":{name:"Hiking Route",terms:""},"type/route/horse":{name:"Riding Route",terms:""},"type/route/light_rail":{name:"Light Rail Route",terms:""},"type/route/pipeline":{name:"Pipeline Route",terms:""},"type/route/piste":{name:"Piste/Ski Route",terms:""},"type/route/power":{name:"Power Route",terms:""},"type/route/road":{name:"Road Route",terms:""},"type/route/subway":{name:"Subway Route",terms:""},"type/route/train":{name:"Train Route",terms:""},"type/route/tram":{name:"Tram Route",terms:""},"type/site":{name:"Site",terms:""},"type/waterway":{name:"Waterway",terms:""},vertex:{name:"Other",terms:""},"waterway/boatyard":{name:"Boatyard",terms:""},"waterway/canal":{name:"Canal",terms:""},"waterway/dam":{name:"Dam",terms:""},"waterway/ditch":{name:"Ditch",terms:""},"waterway/dock":{name:"Wet Dock / Dry Dock",terms:"boat,ship,vessel,marine"},"waterway/drain":{name:"Drain",terms:""},"waterway/fuel":{name:"Marine Fuel Station",terms:"petrol,gas,diesel,boat"},"waterway/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"waterway/riverbank":{name:"Riverbank",terms:""},"waterway/sanitary_dump_station":{name:"Marine Toilet Disposal",terms:"Boat,Watercraft,Sanitary,Dump Station,Pumpout,Pump out,Elsan,CDP,CTDP,Chemical Toilet"},"waterway/stream_intermittent":{name:"Intermittent Stream",terms:"arroyo,beck,branch,brook,burn,course,creek,drift,flood,flow,gully,run,runnel,rush,spate,spritz,tributary,wadi,wash,watercourse"},"waterway/stream":{name:"Stream",terms:"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"waterway/water_point":{name:"Marine Drinking Water",terms:""},"waterway/waterfall":{name:"Waterfall",terms:"fall"},"waterway/weir":{name:"Weir",terms:""}}},imagery:{AGIV:{attribution:{text:"Orthophoto Flanders most recent © AGIV"},name:"AGIV Flanders most recent aerial imagery"},AGIV10cm:{attribution:{text:"Orthophoto Flanders © AGIV"},name:"AGIV Flanders 2013-2015 aerial imagery 10cm"},AGIVFlandersGRB:{attribution:{text:"GRB Flanders © AGIV"},name:"AGIV Flanders GRB"},Bing:{description:"Satellite and aerial imagery.",name:"Bing aerial imagery"},"DigitalGlobe-Premium":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",name:"DigitalGlobe Premium Imagery"},"DigitalGlobe-Premium-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",name:"DigitalGlobe Premium Imagery Vintage"},"DigitalGlobe-Standard":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",name:"DigitalGlobe Standard Imagery"},"DigitalGlobe-Standard-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",name:"DigitalGlobe Standard Imagery Vintage"},EsriWorldImagery:{attribution:{text:"Terms & Feedback"},description:"Esri world imagery.",name:"Esri World Imagery"},EsriWorldImageryClarity:{attribution:{text:"Terms & Feedback"},description:"Esri archive imagery that may be clearer and more accurate than the default layer.",name:"Esri World Imagery (Clarity) Beta"},MAPNIK:{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},description:"The default OpenStreetMap layer.",name:"OpenStreetMap (Standard)"},Mapbox:{attribution:{text:"Terms & Feedback"},description:"Satellite and aerial imagery.",name:"Mapbox Satellite"},"OSM_Inspector-Addresses":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Addresses"},"OSM_Inspector-Geometry":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Geometry"},"OSM_Inspector-Highways":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Highways"},"OSM_Inspector-Multipolygon":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Area"},"OSM_Inspector-Places":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Places"},"OSM_Inspector-Routing":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Routing"},"OSM_Inspector-Tagging":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Tagging"},SPW_ORTHO_LAST:{name:"SPW(allonie) most recent aerial imagery"},SPW_PICC:{name:"SPW(allonie) PICC numerical imagery"},"US-TIGER-Roads-2012":{name:"TIGER Roads 2012"},"US-TIGER-Roads-2014":{description:"At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap",name:"TIGER Roads 2014"},"US-TIGER-Roads-2017":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2017"},US_Forest_Service_roads_overlay:{description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",name:"U.S. Forest Roads Overlay"},UrbISOrtho2016:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2016"},UrbISOrtho2017:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2017"},UrbisAdmFR:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm FR"},UrbisAdmNL:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm NL"},"Waymarked_Trails-Cycling":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Winter Sports"},"basemap.at":{attribution:{text:"basemap.at"},description:"Basemap of Austria, based on government data.",name:"basemap.at"},"basemap.at-orthofoto":{attribution:{text:"basemap.at"},description:"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.",name:"basemap.at Orthofoto"},hike_n_bike:{attribution:{text:"© OpenStreetMap contributors"},name:"Hike & Bike"},kelkkareitit:{attribution:{text:"© Kelkkareitit.fi"},description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",name:"Nordic snowmobile overlay"},"lantmateriet-orto1960":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",name:"Lantmäteriet Historic Orthophoto 1960"},"lantmateriet-orto1975":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",name:"Lantmäteriet Historic Orthophoto 1975"},mapbox_locator_overlay:{attribution:{text:"Terms & Feedback"},description:"Shows major features to help orient you.",name:"Locator Overlay"},openpt_map:{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenPT Map (overlay)"},"osm-gps":{attribution:{text:"© OpenStreetMap contributors"},description:"Public GPS traces uploaded to OpenStreetMap.",name:"OpenStreetMap GPS traces"},"osm-mapnik-black_and_white":{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenStreetMap (Standard Black & White)"},"osm-mapnik-german_style":{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenStreetMap (German Style)"},"osmse-ekonomiska":{attribution:{text:"© Lantmäteriet"},description:"Scan of \"Economic maps\" ca. 1950–1980",name:"Lantmäteriet Economic Map 1950–1980"},qa_no_address:{attribution:{text:"Simon Poole, Data ©OpenStreetMap contributors"},name:"QA No Address"},skobbler:{attribution:{text:"© Tiles: skobbler Map data: OpenStreetMap contributors"},name:"skobbler"},skoterleder:{attribution:{text:"© Skoterleder.org"},description:"Snowmobile trails",name:"Snowmobile map Sweden"},"stamen-terrain-background":{attribution:{text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL"},name:"Stamen Terrain"},"tf-cycle":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest OpenCycleMap"},"tf-landscape":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest Landscape"},"trafikverket-baninfo":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network, including sidings",name:"Trafikverket Railway Network"},"trafikverket-baninfo-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network with several options for map layers",name:"Trafikverket Railway Network options"},"trafikverket-vagnat":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network",name:"Trafikverket Road Network"},"trafikverket-vagnat-extra":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",name:"Trafikverket Road Network extra"},"trafikverket-vagnat-navn":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB street names",name:"Trafikverket Street Names"},"trafikverket-vagnat-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network with several options for map layers",name:"Trafikverket Road Network options"}},community:{"bw-facebook":{name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana"},"bw-twitter":{name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana"},"cape-coast-youthmappers":{name:"University of Cape Coast YouthMappers",description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable."},"osm-gh-facebook":{name:"OpenStreetMap Ghana on Facebook",description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us."},"osm-gh-twitter":{name:"OpenStreetMap Ghana on Twitter",description:"Follow us on Twitter: {url}"},"talk-gh":{name:"Talk-gh Mailing List",description:"Talk-gh is the official mailing list for Ghana OSM community."},"osm-mg-facebook":{name:"OpenStreetMap Madagascar Facebook Group",description:"Malagasy Facebook group for people interested in OpenStreetMap."},"talk-mg":{name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss."},"OSM-BGD-facebook":{name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"OSM-India-facebook":{name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",events:{sotmasia2018:{name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India"}}},"OSM-india-mailinglist":{name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community"},"OSM-india-twitter":{name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}"},"OSM-India-Puducherry-Facebook":{name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events."},"OSM-India-Puducherry-Matrix":{name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism."},"OSM-IDN-facebook":{name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-japan-facebook":{name:"OpenStreetMap Japan Community",description:"Mappers and OpenStreetMap users in Japan"},"OSM-japan-mailinglist":{name:"OpenStreetMap Japan Mailinglist",description:"Talk-ja is an Official Mailinglist for Japanese Community"},"OSM-japan-twitter":{name:"OpenStreetMap Japan Twitter",description:"Hashtag on Twitter: {url}"},"OSM-japan-website":{name:"OpenStreetMap Japan",description:"Mappers and OpenStreetMap users in Japan"},"OSM-korea-telegram":{name:"OSM Korea Telegram Channel",description:"Unofficial Channnel for OpenStreetMap contributors, communities and users in Korea to share and discuss."},"OSM-MY-facebook":{name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!"},"OSM-MY-forum":{name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum"},"OSM-MY-matrix":{name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}"},"OSM-MNG-facebook":{name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-MMR-facebook":{name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-Nepal-facebook":{name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-PH-facebook":{name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project."},"OSM-PH-mailinglist":{name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines"},"OSM-PH-slack":{name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-PH-telegram":{name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines"},"OSM-RU-forum":{name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum"},"OSM-RU-telegram":{name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat"},"OSM-LKA-facebook":{name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-TW-facebook":{name:"OpenStreetMap Taiwan Community",description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan."},"OSM-TW-mailinglist":{name:"OpenStreetMap Taiwan Mailinglist",description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan"},"OSM-TH-CNX-meetup":{name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled"},"OSM-TH-facebook":{name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand"},"OSM-TH-forum":{name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum"},"al-forum":{name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum"},"al-maptime-tirana":{name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time."},"al-telegram":{name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel"},"at-forum":{name:"OpenStreetMap Austria Forum",description:"The official forum for OpenStreetMap questions in and around Austria"},"at-mailinglist":{name:"Talk-at Mailing List",description:"Talk-at is the official mailing list for the Austrian OSM community"},"at-twitter":{name:"OpenStreetMap Austria Twitter",description:"OpenStreetMap Austria On Twitter: {url}"},"osmgraz-meetup":{name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz"},"osmgraz-twitter":{name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter"},"osm-at":{name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria"},byosm:{name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat"},"be-facebook":{name:"OpenStreetMap BE Community",description:"Mappers and OpenStreetMap on Facebook in Belgium"},"be-forum":{name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum"},"be-irc":{name:"OpenStreetMap Belgium IRC",description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel"},"be-mailinglist":{name:"Talk-be Mailing List",description:"Talk-be is the official mailing list for the Belgian OSM community"},"be-maptime":{name:"Maptime Belgium",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time."},"be-matrix":{name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects."},"be-meetup":{name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!"},"be-twitter":{name:"OpenStreetMap Belgium Twitter",description:"OSM Belgium on Twitter: @osm_be"},"hr-facebook":{name:"OpenStreetMap Croatia Facebook group",description:"OpenStreetMap Croatia Facebook group"},"hr-irc":{name:"OpenStreetMap Croatia on IRC",description:"Join #osm-hr on irc.freenode.org (port 6667)"},"hr-mailinglist":{name:"Talk-hr Mailing List",description:"Talk-hr mailing list"},"czech-community":{name:"Czech OSM community",description:"Map portal, website and contacts on OSM members in Czechia"},"osmcz-facebook":{name:"OpenStreetMap CZ on Facebook",description:"Follow czech community on Facebook - including translated WeeklyOSM!"},"osmcz-twitter":{name:"Czech twitter @osmcz",description:"Follow czech community on Twitter - including translated WeeklyOSM!"},"talk-cz-mailinglist":{name:"Czech mailing list (talk-cz)",description:"Talk-cz is the official mailing list for Czech community"},"dk-forum":{name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum"},"dk-irc":{name:"OpenStreetMap Denmark IRC",description:"Join #osm-dk on irc.oftc.net (port 6667)"},"dk-mailinglist":{name:"Talk-dk Mailing List",description:"A mailing list to discuss OpenStreetMap in Denmark"},"fi-forum":{name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum"},"fi-irc":{name:"OpenStreetMap Finland IRC",description:"Join #osm-fi on irc.oftc.net (port 6667)"},"fi-mailinglist":{name:"Talk-fi Mailing List",description:"Talk-fi is the official mailing list for the Finnish OSM community"},"fr-facebook":{name:"OpenStreetMap France Facebook page",description:"OpenStreetMap France Facebook page"},"fr-forum":{name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum"},"fr-irc":{name:"OpenStreetMap France on IRC",description:"Join #osm-fr on irc.oftc.net (port 6667)"},"fr-mailinglist":{name:"Talk-fr Mailing List",description:"Talk-fr mailing list"},"fr-twitter":{name:"OpenStreetMap France on Twitter",description:"OpenStreetMap France on Twitter: {url}"},"de-berlin-mailinglist":{name:"Berlin Mailing List",description:"This is the mailing list for the Berlin OSM community"},"de-berlin-meetup":{name:"OpenStreetMap Berlin-Brandenburg Meetup",description:"Mappers and OpenStreetMap users in the Berlin area"},"de-berlin-telegram":{name:"@osmberlin on Telegram",description:"OpenStreetMap Berlin Telegram chat"},"de-berlin-twitter":{name:"OpenStreetMap Berlin Twitter",description:"Follow us on Twitter: {url}"},"de-forum":{name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum"},"de-irc":{name:"OpenStreetMap Germany IRC",description:"Join #osm-de on irc.oftc.net (port 6667)"},"de-mailinglist":{name:"Talk-de Mailing List",description:"Talk-de is the official mailing list for the German OSM community"},"de-ostwestfalen-lippe-mailinglist":{name:"OWL Mailing List",description:"This is the mailing list for the Ostwestfalen-Lippe OSM community"},"de-telegram":{name:"OpenStreetMap Germany Telegram",description:"Join the OpenStreetMap Germany Telegram supergroup at {url}"},"osm-de":{name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany"},"hu-facebook":{name:"OpenStreetMap HU on Facebook",description:"Mappers and OpenStreetMap Facebook in Hungary"},"hu-forum":{name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum"},"hu-meetup":{name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary"},"is-facebook":{name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland"},"is-mailinglist":{name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community"},"is-twitter":{name:"OSM Iceland on Twittter",description:"Twitter of OpenStreetMap in Iceland"},"it-facebook":{name:"OpenStreetMap Italy Facebook",description:"Join the OpenStreetMap Italy community on Facebook"},"it-irc":{name:"OpenStreetMap Italy IRC",description:"Join #osm-it on irc.oftc.net (port 6667)"},"it-mailinglist":{name:"Talk-it Mailing List",description:"Talk-it is the official mailing list for the Italian OSM community"},"it-telegram":{name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat"},"it-twitter":{name:"OpenStreetMap Italy Twitter",description:"Follow us on Twitter at {url}"},"OSM-Rome-meetup":{name:"Incontro Mappatori Romani",description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio."},"South-Tyrol-Mailing-List":{name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol"},"talk-it-lazio":{name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area."},"Trentino-Mailing-List":{name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino"},"no-forum":{name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum"},"no-irc":{name:"OpenStreetMap Norway on IRC",description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"no-mailinglist":{name:"OpenStreetMap Norway mailing list",description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"OSM-PL-facebook-group":{name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland"},"OSM-PL-forum":{name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community"},"si-forum":{name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia"},"si-mailinglist":{name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia"},"OSM-ES-mailinglist":{name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain"},"OSM-ES-telegram":{name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat"},"osm-se":{name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden"},"se-facebook":{name:"OpenStreetMap Sweden Facebook",description:"OpenStreetMap Sweden on Facebook"},"se-forum":{name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum"},"se-irc":{name:"OpenStreetMap Sweden IRC",description:"Join #osm.se on irc.oftc.net (port 6667)"},"se-mailinglist":{name:"Talk-se Mailing List",description:"A mailing list to discuss OpenStreetMap in Sweden"},"se-twitter":{name:"OpenStreetMap Sweden on Twitter",description:"Follow us on Twitter: {url}"},"Nottingham-OSM-pub-meetup":{name:"East Midlands (Nottingham) Monthly pub meet-up",description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose."},"gb-mailinglist":{name:"Talk-gb Mailing List",description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community"},"mappa-mercia-group":{name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data."},"gb-irc":{name:"OpenStreetMap United Kingdom IRC",description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question"},"OSM-CA-Slack":{name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}."},"OSM-Vancouver-meetup":{name:"OpenStreetMap Vancouver",description:"Mappers and OpenStreetMap users in the Vancouver, BC area"},"OSM-CU-telegram":{name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat"},"OSM-NI-telegram":{name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat"},"Bay-Area-OpenStreetMappers":{name:"Bay Area OpenStreetMappers",description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events."},"Central-Pennsylvania-OSM":{name:"Central Pennsylvania OSM",description:"Online mapping community based out of State College, PA"},"Code-for-San-Jose-Slack":{name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel."},"Dallas-Fort-Worth-OSM":{name:"Dallas-Fort Worth OSM",description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM."},GeoPhilly:{name:"GeoPhilly",description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you!  Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!"},MapMinnesota:{name:"MapMinnesota",description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!"},"Mapping-DC-meetup":{name:"Mapping DC",description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city."},"Maptime-ME-meetup":{name:"MaptimeME",description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking.  Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies."},"us-ma-mailinglist":{name:"Talk-us-massachusetts Mailing List",description:"Email mailing list for the Massachusetts OSM community"},"OpenCleveland-meetup":{name:"Open Cleveland",description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)"},"OSM-Boston":{name:"OpenStreetMap Boston",description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!"},"OSM-Central-Salish-Sea":{name:"OpenStreetMap Central Salish Sea",description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!"},"OSM-Chattanooga":{name:"OSM Chattanooga",description:"The OpenStreetMap user group for Chattanooga"},"OSM-Colorado":{name:"OpenStreetMap Colorado",description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"OSM-NYC":{name:"OpenStreetMap NYC",description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area"},"OSM-Portland-forum":{name:"OpenStreetMap PDX Google Group",description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner."},"OSM-Portland":{name:"OpenStreetMap Portland",description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!"},"OSM-Seattle":{name:"OpenStreetMap Seattle",description:"Mappers and OpenStreetMap users in the Seattle area"},"OSM-SoCal":{name:"OpenStreetMap Southern California",description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap.  OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe.  Everyone is welcome.  If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!"},"OSM-South-Bay":{name:"OSM South Bay",description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required."},"OSM-Tampa-Bay":{name:"OpenStreetMap Tampa Bay",description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world.  If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so."},"OSM-US-Slack":{name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-US":{name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",events:{sotmus2018:{name:"State of the Map US 2018",description:"Join the OpenStreetMap community at State of the Map US in Detroit, Michigan. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Detroit, Michigan"}}},"OSM-Utah":{name:"OpenStreetMap Utah",description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially.  We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!"},"OSM-Wyoming":{name:"OpenStreetMap Wyoming",description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"PHXGeo-meetup":{name:"PHXGeo Meetup",description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between."},"PHXGeo-twitter":{name:"PHXGeo Twitter",description:"Follow us on Twitter at {url}"},"Western-Slope-facebook":{name:"Western Slope OSM Facebook",description:"Mappers and OpenStreetMap users around Grand Junction, CO"},"Western-Slope-meetup":{name:"Western Slope OSM Meetup",description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!"},"Maptime-Australia-Slack":{name:"Maptime Australia Slack",description:"Sign up at {signupUrl}"},"talk-au":{name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat"},"OSM-AR-facebook":{name:"OpenStreetMap Argentina Facebook",description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community"},"OSM-AR-forum":{name:"OpenStreetMap Argentina web forum",description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time."},"OSM-AR-irc":{name:"OpenStreetMap Argentina IRC",description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community."},"OSM-AR-mailinglist":{name:"Talk-ar Mailing List",description:"Historic mailing list. Almost unused today."},"OSM-AR-telegram":{name:"OpenStreetMap Argentina Telegram",description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!"},"OSM-AR-twitter":{name:"OpenStreetMap Argentina Twitter",description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general."},"OSM-BO-mailinglist":{name:"Talk-bo Mailing List",description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"Bahia-telegram":{name:"OpenStreetMap Bahia Telegram Group",description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"DF-telegram":{name:"OpenStreetMap Brasília Telegram Group",description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-mailinglist":{name:"Talk-br Mailing List",description:"A mailing list to discuss OpenStreetMap in Brazil"},"OSM-br-telegram":{name:"OpenStreetMap Brasil Telegram",description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-twitter":{name:"OpenStreetMap Brasil Twitter",description:"Follow us on Twitter at {url}"},"RS-telegram":{name:"OpenStreetMap Rio Grande do Sul Telegram Group",description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-facebook":{name:"OpenStreetMap Chile Facebook",description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-mailinglist":{name:"Talk-cl Mailing List",description:"A mailing list to discuss OpenStreetMap in Chile"},"OSM-CL-telegram":{name:"OpenStreetMap Chile Telegram",description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-twitter":{name:"OpenStreetMap Chile Twitter",description:"Follow us on Twitter at {url}"},"Maptime-Bogota":{name:"Maptime Bogotá",description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap.  It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun."},"OSM-CO-facebook":{name:"OpenStreetMap Colombia Facebook",description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!"},"OSM-CO-mailinglist":{name:"Talk-co Mailing List",description:"A mailing list to discuss OpenStreetMap in Colombia"},"OSM-CO-telegram":{name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat"},"OSM-CO-twitter":{name:"OpenStreetMap Colombia Twitter",description:"Follow us on Twitter at {url}"},"OSM-CO":{name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation"},"OSM-EC-telegram":{name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat"},"OSM-PY-telegram":{name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat"},"OSM-PE-facebook":{name:"OpenStreetMap Peru Facebook",description:"Join the OpenStreetMap Peru community on Facebook"},"OSM-PE-mailinglist":{name:"Talk-pe Mailing List",description:"The official mailing list for the OpenStreetMap Peru community"},"OSM-PE-matrix":{name:"OpenStreetMap Peru Matrix Chat",description:"Chat with other members of the OpenStreetMap Peru community in Matrix."},"OSM-PE-telegram":{name:"OpenStreetMap Peru Telegram",description:"Join the OpenStreetMap Peru community on Telegram"},"OSM-PE-twitter":{name:"OpenStreetMap Peru Twitter",description:"Follow us on Twitter at {url}"},"OSM-PE":{name:"OpenStreetMap Peru",description:"News and resources for the OpenStreetMap Peru community"},"LATAM-Facebook":{name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook"},"LATAM-Telegram":{name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America"},"LATAM-Twitter":{name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}"},"osm-latam":{name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",events:{"sotm-latam-2018":{name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina"}}},"OSM-Facebook":{name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap."},"OSM-help":{name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap.  Whether you are a beginner mapper or have a technical question, we're here to help!"},"OSM-Reddit":{name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap.  Ask us anything!"},"OSM-Telegram":{name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}"},"OSM-Twitter":{name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}"},OSMF:{name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",events:{sotm2018:{name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy"}}}}};
23651
23652   var features$2 = {botswana:{type:"Feature",id:"botswana",properties:{},geometry:{type:"Polygon",coordinates:[[[25.65423,-18.48085],[25.70131,-18.56629],[25.79198,-18.60814],[25.83557,-18.82958],[25.95414,-18.89236],[26.00296,-19.02313],[25.9925,-19.058],[26.17908,-19.52356],[26.25057,-19.57064],[26.32554,-19.57064],[26.37611,-19.62121],[26.35344,-19.64562],[26.70741,-19.87404],[26.73356,-19.91763],[26.97419,-20.00133],[27.04394,-19.99784],[27.13984,-20.06585],[27.22005,-20.07456],[27.30723,-20.22626],[27.31769,-20.45643],[27.73269,-20.4913],[27.74664,-20.70926],[27.71525,-21.07718],[27.9088,-21.2777],[28.02562,-21.55668],[28.19825,-21.5933],[28.37261,-21.59679],[28.50339,-21.65433],[28.58011,-21.62643],[28.8033,-21.71362],[29.08577,-21.80603],[29.03346,-21.90193],[29.06659,-22.02399],[29.17645,-22.07107],[29.25665,-22.05189],[29.38569,-22.19312],[29.32117,-22.21231],[29.0387,-22.23323],[29.01428,-22.27159],[28.97941,-22.31344],[28.98115,-22.34482],[28.94105,-22.45991],[28.52257,-22.59766],[28.36041,-22.58371],[28.18255,-22.70053],[28.18255,-22.74761],[28.06747,-22.89931],[27.95239,-22.9708],[27.96285,-23.03532],[27.74838,-23.24107],[27.68561,-23.21666],[27.62109,-23.23758],[27.56006,-23.36836],[27.2741,-23.49565],[27.08578,-23.66304],[27.00034,-23.70489],[26.88875,-24.10593],[26.87654,-24.26635],[26.74228,-24.31343],[26.57663,-24.45292],[26.42842,-24.64821],[25.8844,-24.77724],[25.89486,-24.88012],[25.76585,-25.17485],[25.66467,-25.48682],[25.58448,-25.64908],[25.3456,-25.78509],[25.11021,-25.76939],[25.02517,-25.71967],[24.92538,-25.81822],[24.69696,-25.83042],[24.46156,-25.74324],[24.37786,-25.76765],[24.21127,-25.67022],[23.92974,-25.64036],[23.66819,-25.44158],[23.3121,-25.26869],[22.88179,-25.50087],[22.72835,-26.01351],[22.63768,-26.10767],[22.56793,-26.2367],[22.48424,-26.21054],[22.35521,-26.33609],[22.24971,-26.35352],[22.07317,-26.63251],[21.9668,-26.67131],[21.79767,-26.66956],[21.77761,-26.69223],[21.80377,-26.78465],[21.6913,-26.87096],[21.59889,-26.8605],[21.5274,-26.86224],[21.32339,-26.84349],[21.14248,-26.87375],[21.00386,-26.84873],[20.98729,-26.81621],[20.85826,-26.80575],[20.68477,-26.92022],[20.61677,-26.79293],[20.61589,-26.68718],[20.622,-26.60461],[20.5941,-26.47558],[20.82252,-26.153],[20.78939,-25.92458],[20.63769,-25.63862],[20.63595,-25.55143],[20.36045,-25.06321],[20.25583,-24.93766],[20.11982,-24.89756],[19.98556,-24.76853],[19.99602,-21.99435],[20.9934,-22.00132],[20.99514,-18.30648],[21.45547,-18.31171],[23.10324,-17.98913],[23.31422,-17.98913],[23.43105,-18.18268],[23.54439,-18.26289],[23.60542,-18.48085],[23.77455,-18.36577],[23.91928,-18.20884],[24.18606,-18.01355],[24.36915,-17.94031],[24.47377,-17.956],[24.51038,-18.03621],[24.57839,-18.05714],[24.615,-17.98565],[24.71439,-17.89498],[24.97594,-17.77466],[25.09102,-17.82174],[25.15903,-17.76246],[25.27411,-17.79559],[25.25493,-17.91241],[25.31596,-18.06062],[25.40489,-18.1077],[25.5374,-18.37972],[25.65423,-18.48085]]]}},cape_coast_gh:{type:"Feature",id:"cape_coast_gh",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.6,5],[-1.6,5.4],[-1,5.4],[-1,5],[-1.6,5]]]}},ghana:{type:"Feature",properties:{},id:"ghana",geometry:{type:"Polygon",coordinates:[[[-3.11256,5.13335],[-2.97215,5.11112],[-2.94811,5.12753],[-2.75757,5.10599],[-2.7253,5.14087],[-2.78641,5.28242],[-2.78297,5.29541],[-2.76993,5.2937],[-2.76546,5.31797],[-2.77748,5.33079],[-2.77319,5.35557],[-2.72495,5.34224],[-2.78023,5.60642],[-2.86022,5.65049],[-2.92889,5.61838],[-2.96631,5.64127],[-2.95292,5.71643],[-3.02639,5.7096],[-3.01987,5.8575],[-3.07411,5.98624],[-3.10226,6.15284],[-3.15514,6.25114],[-3.17574,6.25182],[-3.17162,6.29755],[-3.23753,6.54183],[-3.23341,6.60049],[-3.26157,6.61959],[-3.21007,6.73417],[-3.24028,6.83031],[-2.95326,7.23817],[-2.97558,7.27018],[-2.92236,7.61436],[-2.77611,7.94432],[-2.60513,8.03747],[-2.62985,8.11769],[-2.48978,8.20877],[-2.64221,9.00988],[-2.77679,9.03972],[-2.76581,9.15633],[-2.66968,9.26478],[-2.93884,10.66601],[-2.82898,11.0113],[-0.68939,11.00051],[-0.60974,10.91962],[-0.43121,11.04095],[-0.43396,11.10295],[-0.27843,11.17672],[-0.13424,11.13967],[-0.14214,11.10632],[-0.05905,11.08341],[-0.0388,11.10733],[-0.01339,11.11204],[0.02369,11.05308],[0.03296,10.97793],[-0.00549,10.96411],[-0.02266,10.81914],[-0.07141,10.76856],[-0.07999,10.69806],[-0.05905,10.63294],[0.04257,10.60257],[0.0618,10.56207],[0.14351,10.52629],[0.17097,10.42265],[0.26711,10.41151],[0.28633,10.42096],[0.34264,10.31357],[0.39757,10.31492],[0.39722,10.30546],[0.37148,10.28283],[0.35225,10.10746],[0.41817,10.06487],[0.40924,10.01822],[0.36461,10.03174],[0.34676,9.66506],[0.26779,9.64678],[0.24994,9.44771],[0.42847,9.48564],[0.56168,9.40977],[0.48203,8.80501],[0.3804,8.74122],[0.47653,8.59324],[0.65369,8.49546],[0.65781,8.42347],[0.70862,8.38339],[0.72784,8.28964],[0.60425,8.21693],[0.62004,7.70623],[0.59464,7.70283],[0.5809,7.62253],[0.52322,7.5953],[0.52734,7.45099],[0.56168,7.39243],[0.62759,7.40741],[0.66055,7.30935],[0.59395,7.11248],[0.61317,7.09306],[0.59601,7.00549],[0.52322,6.97823],[0.52322,6.94006],[0.56442,6.92234],[0.53284,6.82962],[0.65094,6.73962],[0.63446,6.63733],[0.74707,6.57048],[0.71411,6.51864],[0.90242,6.33355],[1.00405,6.33543],[1.02516,6.25319],[1.05537,6.22964],[1.1,6.17],[1.2,6.17],[1.2,4],[-3,4.5],[-3.11256,5.13335]]]}},madagascar:{type:"Feature",id:"madagascar",properties:{},geometry:{type:"Polygon",coordinates:[[[51,-15],[47.5,-26],[42,-26],[43.5,-16],[49.5,-11],[51,-15]]]}},BGD:{type:"Feature",id:"BGD",properties:{name:"Bangladesh"},geometry:{type:"Polygon",coordinates:[[[92.67272,22.04124],[92.65226,21.32405],[92.30323,21.47548],[92.36855,20.67088],[92.08289,21.1922],[92.02522,21.70157],[91.83489,22.18294],[91.41709,22.76502],[90.49601,22.80502],[90.58696,22.39279],[90.27297,21.83637],[89.84747,22.03915],[89.70205,21.85712],[89.41886,21.96618],[89.03196,22.05571],[88.87631,22.87915],[88.52977,23.63114],[88.69994,24.23372],[88.08442,24.50166],[88.30637,24.86608],[88.93155,25.23869],[88.20979,25.76807],[88.56305,26.44653],[89.35509,26.01441],[89.83248,25.96508],[89.92069,25.26975],[90.87221,25.1326],[91.7996,25.14743],[92.3762,24.97669],[91.91509,24.13041],[91.46773,24.07264],[91.15896,23.50353],[91.70647,22.98526],[91.86993,23.62435],[92.14603,23.6275],[92.67272,22.04124]]]}},india_full:{type:"Feature",id:"india_full",properties:{name:"India"},geometry:{type:"MultiPolygon",coordinates:[[[[77.83745,35.49401],[78.91227,34.32194],[78.81109,33.5062],[79.20889,32.99439],[79.17613,32.48378],[78.45845,32.61816],[78.73889,31.51591],[79.72137,30.88272],[81.11126,30.18348],[80.47672,29.72987],[80.08843,28.79447],[81.0572,28.41609],[81.99999,27.92548],[83.30425,27.36451],[84.67502,27.2349],[85.25178,26.7262],[86.02439,26.63098],[87.22747,26.3979],[88.06024,26.41462],[88.1748,26.8104],[88.04313,27.44582],[88.12044,27.87654],[88.73033,28.08686],[88.81425,27.29932],[88.83564,27.09897],[89.74453,26.7194],[90.37328,26.87572],[91.21751,26.80865],[92.03348,26.83831],[92.10371,27.45261],[91.69666,27.77174],[92.50312,27.89688],[93.41335,28.64063],[94.56599,29.27744],[95.4048,29.03172],[96.11768,29.4528],[96.58659,28.83098],[96.24883,28.41103],[97.32711,28.26158],[97.40256,27.88254],[97.05199,27.69906],[97.134,27.08377],[96.41937,27.26459],[95.12477,26.57357],[95.15515,26.00131],[94.60325,25.16249],[94.55266,24.67524],[94.10674,23.85074],[93.32519,24.07856],[93.28633,23.04366],[93.06029,22.70311],[93.16613,22.27846],[92.67272,22.04124],[92.14603,23.6275],[91.86993,23.62435],[91.70647,22.98526],[91.15896,23.50353],[91.46773,24.07264],[91.91509,24.13041],[92.3762,24.97669],[91.7996,25.14743],[90.87221,25.1326],[89.92069,25.26975],[89.83248,25.96508],[89.35509,26.01441],[88.56305,26.44653],[88.20979,25.76807],[88.93155,25.23869],[88.30637,24.86608],[88.08442,24.50166],[88.69994,24.23372],[88.52977,23.63114],[88.87631,22.87915],[89.03196,22.05571],[88.88877,21.69059],[88.2085,21.70317],[86.9757,21.49556],[87.03317,20.74331],[86.49935,20.15164],[85.06027,19.47858],[83.94101,18.30201],[83.18922,17.67122],[82.19279,17.01664],[82.19124,16.55666],[81.69272,16.31022],[80.792,15.95197],[80.3249,15.89918],[80.02507,15.13641],[80.23327,13.83577],[80.28629,13.00626],[79.86255,12.05621],[79.858,10.35727],[79.34051,10.30885],[78.88535,9.54614],[79.18972,9.21654],[78.27794,8.93305],[77.94116,8.25296],[77.5399,7.96554],[76.59298,8.89928],[76.13006,10.29963],[75.74647,11.30825],[75.3961,11.78125],[74.86482,12.74194],[74.61672,13.99258],[74.44386,14.61722],[73.5342,15.99065],[73.11991,17.92857],[72.82091,19.20823],[72.82448,20.4195],[72.63053,21.35601],[71.17527,20.75744],[70.47046,20.87733],[69.16413,22.0893],[69.64493,22.45078],[69.3496,22.84318],[68.17664,23.69196],[68.8426,24.35913],[71.04324,24.35652],[70.8447,25.2151],[70.28287,25.72223],[70.16893,26.49187],[69.51439,26.94097],[70.6165,27.9892],[71.77767,27.91318],[72.82375,28.96159],[73.45064,29.97641],[74.42138,30.97981],[74.40593,31.69264],[75.25864,32.2711],[74.45156,32.7649],[74.10429,33.44147],[73.74995,34.3177],[74.2402,34.74889],[75.75706,34.50492],[76.87172,34.65354],[77.83745,35.49401]]]]}},india_puducherry:{type:"Feature",id:"india_puducherry",properties:{name:"Puducherry"},geometry:{type:"Polygon",coordinates:[[[79.87782,12.04973],[79.84726,11.95536],[79.83593,11.90229],[79.81979,11.85761],[79.81464,11.79006],[79.79645,11.7736],[79.77036,11.77191],[79.74564,11.78065],[79.6804,11.7988],[79.61655,11.82434],[79.58702,11.88549],[79.65672,11.93152],[79.64745,11.9594],[79.6423,12.0138],[79.66599,12.03865],[79.72813,12.04201],[79.79885,12.0457],[79.8452,12.05644],[79.87782,12.04973]]]}},IDN:{type:"Feature",id:"IDN",properties:{},geometry:{type:"Polygon",coordinates:[[[109.538,1.92671],[109.58606,1.79192],[109.68554,1.78179],[109.66224,1.61881],[109.82759,1.48148],[109.93117,1.42466],[109.97919,1.29865],[110.09758,1.19756],[110.1922,1.18303],[110.30096,0.99575],[110.39497,0.99668],[110.49064,0.87637],[110.59486,0.858],[110.85815,0.94998],[110.9055,1.02835],[111.19759,1.06475],[111.22607,1.08799],[111.40504,1.0094],[111.48916,1.03442],[111.52219,0.95868],[111.66704,1.04281],[111.82599,0.98538],[111.934,1.10284],[112.13391,1.13752],[112.22581,1.39272],[112.20003,1.43709],[112.5171,1.57395],[112.77536,1.56153],[112.87744,1.58118],[113.05767,1.55877],[113.106,1.44495],[113.35493,1.35908],[113.41908,1.28549],[113.53549,1.32127],[113.63068,1.21597],[113.81508,1.30294],[113.85093,1.38715],[113.97573,1.45005],[114.14945,1.46149],[114.2027,1.4213],[114.41581,1.51111],[114.52646,1.44179],[114.58583,1.44665],[114.61498,1.57508],[114.71115,1.67148],[114.69469,1.81063],[114.74372,1.86954],[114.87834,1.91463],[114.80632,2.02438],[114.78024,2.14454],[114.79949,2.24936],[114.90604,2.25697],[114.95039,2.35132],[115.09508,2.41123],[115.13965,2.4776],[115.23743,2.50599],[115.09278,2.69409],[115.14115,2.74432],[115.11387,2.83327],[115.15001,2.90895],[115.24912,2.9667],[115.48328,3.01964],[115.56423,3.17109],[115.51617,3.26111],[115.53779,3.36201],[115.6344,3.45571],[115.57652,3.6094],[115.57965,3.74752],[115.61864,3.84247],[115.58177,3.88792],[115.64991,3.98828],[115.70731,4.19935],[115.8296,4.24118],[115.8779,4.39102],[116.00607,4.34818],[116.07901,4.27643],[116.18028,4.38255],[116.34851,4.39138],[116.43275,4.32567],[116.53602,4.37566],[116.61942,4.33622],[116.89887,4.36704],[116.97351,4.34488],[117.28899,4.31595],[117.52934,4.1615],[117.8992,4.16585],[117.95861,4.19058],[118.26478,4.09696],[127.3,5.2],[129,2.7],[141,-2.4],[141,-6.3],[140.83,-6.7],[141.02,-6.95],[141.02,-9.5],[128.5,-9.5],[127.3,-8.2],[125,-8.5],[123.96,-9.2],[124.11,-9.42],[124.22,-9.37],[124.269,-9.4],[124.287,-9.5],[124.358,-9.48564],[124.355,-9.43281],[124.383,-9.361],[124.444,-9.31899],[124.48,-9.15],[124.95,-8.9],[124.94064,-9.03565],[124.99695,-9.06413],[125.11368,-8.98275],[125.18234,-9.03293],[125.18234,-9.17396],[124.98459,-9.19429],[124.99283,-9.28646],[125.04913,-9.33254],[125.16,-9.7],[123,-11.4],[100,-7],[93.5,6.3],[96.6,6.1],[103,1.4],[103.75,1.14],[103.9,1.2],[104.5,1.3],[105,3],[108,5.1],[109.64501,2.08141],[109.62041,1.98321],[109.538,1.92671]]]}},japan:{type:"Feature",id:"japan",properties:{},geometry:{type:"Polygon",coordinates:[[[141.11938,45.69083],[142.28497,45.56863],[145.39307,44.48867],[145.57983,44.11125],[145.27222,43.79291],[145.47821,43.46289],[145.68695,43.4589],[145.91217,43.39108],[145.44903,42.69934],[143.91094,41.8376],[142.48272,39.3181],[142.1751,38.15265],[141.38409,35.69383],[140.94463,35.21056],[140.55908,32.1198],[139.38457,31.87843],[138.98907,33.1752],[138.01025,34.29807],[135.99976,33.17434],[133.53882,32.71336],[132.48516,32.06483],[131.56128,31.04352],[131.03497,29.53613],[129.94629,27.50827],[127.78301,25.4442],[126.47461,25.42343],[125.86487,24.52713],[124.92657,23.88678],[123.37921,23.82053],[122.67883,24.31456],[122.7293,24.64795],[124.67834,25.02588],[125.36602,25.52354],[126.24493,26.35342],[127.56329,27.13828],[128.57403,28.73003],[128.74981,31.46703],[128.36426,32.62087],[128.92559,33.76174],[129.21021,34.62417],[129.56177,34.84086],[136.69739,37.9312],[139.1209,38.85762],[139.04297,42.04929],[140.13165,43.58114],[140.5711,45.64549],[141.11938,45.69083]]]}},korea:{type:"Feature",id:"korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,33],[124,39.5],[124.38171,40.12429],[124.87061,40.47202],[126.04614,40.95294],[126.60095,41.57231],[126.90308,41.79179],[127.24915,41.50446],[128.19397,41.41802],[128.28186,41.56614],[128.0127,42.0097],[128.8751,42.04521],[129.2926,42.43967],[129.67438,42.45589],[129.87762,43],[130.19348,42.92023],[130.31433,42.66224],[130.50385,42.59555],[130.68237,42.2895],[131.3,36.6],[127.3,33],[125,33]]]}},malaysia:{type:"Feature",id:"malaysia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[109.538,1.92671],[109.62041,1.98321],[109.64501,2.08141],[113.8,4.8],[114.26015,4.50701],[114.33278,4.34889],[114.31645,4.26363],[114.45418,4.24183],[114.49579,4.14668],[114.6492,4.00624],[114.80762,4.14929],[114.85775,4.26957],[114.87758,4.42656],[114.82955,4.42966],[114.80229,4.67536],[114.85851,4.79751],[114.97133,4.80824],[115.02238,4.74977],[115.09879,4.4685],[115.15547,4.38302],[115.24582,4.34118],[115.28924,4.60384],[115.2375,4.79584],[115.15038,4.87204],[115.15825,5.02512],[115,5.3],[116.9,7.6],[117.5,7.4],[119.35011,5.53088],[119.43909,5.11578],[118.83773,4.45269],[118.26478,4.09696],[117.95861,4.19058],[117.8992,4.16585],[117.52934,4.1615],[117.28899,4.31595],[116.97351,4.34488],[116.89887,4.36704],[116.61942,4.33622],[116.53602,4.37566],[116.43275,4.32567],[116.34851,4.39138],[116.18028,4.38255],[116.07901,4.27643],[116.00607,4.34818],[115.8779,4.39102],[115.8296,4.24118],[115.70731,4.19935],[115.64991,3.98828],[115.58177,3.88792],[115.61864,3.84247],[115.57965,3.74752],[115.57652,3.6094],[115.6344,3.45571],[115.53779,3.36201],[115.51617,3.26111],[115.56423,3.17109],[115.48328,3.01964],[115.24912,2.9667],[115.15001,2.90895],[115.11387,2.83327],[115.14115,2.74432],[115.09278,2.69409],[115.23743,2.50599],[115.13965,2.4776],[115.09508,2.41123],[114.95039,2.35132],[114.90604,2.25697],[114.79949,2.24936],[114.78024,2.14454],[114.80632,2.02438],[114.87834,1.91463],[114.74372,1.86954],[114.69469,1.81063],[114.71115,1.67148],[114.61498,1.57508],[114.58583,1.44665],[114.52646,1.44179],[114.41581,1.51111],[114.2027,1.4213],[114.14945,1.46149],[113.97573,1.45005],[113.85093,1.38715],[113.81508,1.30294],[113.63068,1.21597],[113.53549,1.32127],[113.41908,1.28549],[113.35493,1.35908],[113.106,1.44495],[113.05767,1.55877],[112.87744,1.58118],[112.77536,1.56153],[112.5171,1.57395],[112.20003,1.43709],[112.22581,1.39272],[112.13391,1.13752],[111.934,1.10284],[111.82599,0.98538],[111.66704,1.04281],[111.52219,0.95868],[111.48916,1.03442],[111.40504,1.0094],[111.22607,1.08799],[111.19759,1.06475],[110.9055,1.02835],[110.85815,0.94998],[110.59486,0.858],[110.49064,0.87637],[110.39497,0.99668],[110.30096,0.99575],[110.1922,1.18303],[110.09758,1.19756],[109.97919,1.29865],[109.93117,1.42466],[109.82759,1.48148],[109.66224,1.61881],[109.68554,1.78179],[109.58606,1.79192],[109.538,1.92671]]],[[[99.45833,6.30667],[99.51167,6.48167],[99.68908,6.47146],[99.91691,6.5233],[100.07588,6.40615],[100.15906,6.48065],[100.17157,6.69376],[100.32605,6.6597],[100.36648,6.53967],[100.4962,6.52128],[100.66237,6.45103],[100.73937,6.49207],[100.81258,6.44219],[100.83515,6.29654],[100.90398,6.23379],[100.98414,6.27884],[101.0943,6.26044],[101.12667,6.19264],[101.0868,5.9109],[101.03707,5.91804],[100.98946,5.78393],[101.1192,5.67031],[101.25999,5.71155],[101.27615,5.81155],[101.39691,5.87241],[101.48454,5.86993],[101.58131,5.93436],[101.66236,5.86871],[101.69082,5.75576],[101.79332,5.75066],[101.94402,5.87247],[101.94265,5.98109],[102.05204,6.0785],[102.08029,6.22537],[102.2,6.5],[103.6,5.8],[104.8,2.5],[104.5,1.5],[104.31571,1.28352],[104.12518,1.27582],[104.07647,1.43092],[103.89786,1.42794],[103.81267,1.47847],[103.67389,1.42814],[103.56667,1.1955],[103,1.325],[99,4.5],[99.45833,6.30667]]]]}},MNG:{type:"Feature",id:"MNG",properties:{name:"Mongolia"},geometry:{type:"Polygon",coordinates:[[[87.75126,49.2972],[88.80557,49.47052],[90.71367,50.33181],[92.23471,50.80217],[93.10422,50.49529],[94.14757,50.48054],[94.81595,50.01343],[95.81403,49.97747],[97.25973,49.72606],[98.23176,50.4224],[97.82574,51.011],[98.86149,52.04737],[99.98173,51.63401],[100.88948,51.51686],[102.06522,51.25992],[102.25591,50.51056],[103.67655,50.08997],[104.62155,50.27533],[105.88659,50.40602],[106.8888,50.2743],[107.86818,49.79371],[108.47517,49.28255],[109.40245,49.29296],[110.66201,49.13013],[111.58123,49.37797],[112.89774,49.54357],[114.36246,50.2483],[114.96211,50.14025],[115.4857,49.80518],[116.6788,49.88853],[116.1918,49.1346],[115.48528,48.13538],[115.74284,47.72655],[116.30895,47.85341],[117.29551,47.69771],[118.06414,48.06673],[118.86657,47.74706],[119.77282,47.04806],[119.66327,46.69268],[118.87433,46.80541],[117.4217,46.67273],[116.71787,46.3882],[115.9851,45.72724],[114.46033,45.33982],[113.46391,44.80889],[112.43606,45.01165],[111.87331,45.10208],[111.34838,44.45744],[111.66774,44.07318],[111.82959,43.74312],[111.12968,43.40683],[110.4121,42.87123],[109.2436,42.51945],[107.74477,42.48152],[106.12932,42.13433],[104.96499,41.59741],[104.52228,41.90835],[103.31228,41.90747],[101.83304,42.51487],[100.84587,42.6638],[99.51582,42.52469],[97.45176,42.74889],[96.3494,42.72563],[95.76246,43.31945],[95.30688,44.24133],[94.68893,44.35233],[93.48073,44.97547],[92.13389,45.11508],[90.94554,45.28607],[90.58577,45.71972],[90.97081,46.88815],[90.28083,47.69355],[88.8543,48.06908],[88.01383,48.59946],[87.75126,49.2972]]]}},MMR:{type:"Feature",id:"MMR",properties:{name:"Myanmar"},geometry:{type:"Polygon",coordinates:[[[92.10937,20.85881],[92.3291,21.49396],[92.68066,21.28937],[92.63672,22.08564],[92.98828,22.06528],[93.18604,22.22809],[93.14209,23.09994],[93.38379,23.22115],[93.36182,24.1267],[94.19678,23.92601],[94.70215,25.04579],[94.57031,25.26457],[95.20752,26.03704],[95.05371,26.49024],[97.66846,28.51697],[98.65723,27.50827],[98.56934,25.85922],[97.62451,24.8665],[97.73438,23.88584],[98.83301,24.14675],[98.85498,23.18076],[99.49219,23.05952],[99.1626,22.04491],[100.0415,21.96342],[100.32715,21.49396],[101.09619,21.71868],[101.16211,21.41216],[99.99756,20.36523],[97.91016,19.49766],[97.53662,18.29195],[98.83301,16.21467],[98.50342,15.32657],[98.21777,15.11455],[98.65723,14.24309],[99.18457,13.66734],[99.22852,12.85465],[99.66797,11.65224],[98.4375,9.90392],[97.77832,14.34955],[97.00928,16.80454],[95.42725,15.55954],[94.021,16.04581],[94.21875,18.0832],[92.10937,20.85881]]]}},NPL:{type:"Feature",id:"NPL",properties:{name:"Nepal"},geometry:{type:"Polygon",coordinates:[[[88.12044,27.87654],[88.04313,27.44582],[88.1748,26.8104],[88.06024,26.41462],[87.22747,26.3979],[86.02439,26.63098],[85.25178,26.7262],[84.67502,27.2349],[83.30425,27.36451],[81.99999,27.92548],[81.0572,28.41609],[80.08843,28.79447],[80.47672,29.72987],[81.11126,30.18348],[81.5258,30.42272],[82.32751,30.11527],[83.33711,29.46373],[83.89899,29.32023],[84.23458,28.83989],[85.01164,28.64277],[85.82332,28.20358],[86.95452,27.97426],[88.12044,27.87654]]]}},philippines:{type:"Feature",id:"philippines",properties:{},geometry:{type:"Polygon",coordinates:[[[114.93896,8.23324],[122.01416,21.71868],[127.6062,7.39515],[125.50781,5.14566],[118.89954,4.41761],[119.49829,5.28789],[117.53174,7.39515],[114.93896,8.23324]]]}},russia:{type:"Feature",id:"russia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[22.7311,54.32754],[20.89224,54.31253],[19.66064,54.42608],[19.88848,54.86616],[21.26845,55.19048],[22.31572,55.0153],[22.75776,54.85657],[22.65105,54.58274],[22.7311,54.32754]]],[[[-180,83],[-169,66.5],[-171,64],[-180,64],[-180,83]]],[[[180,83],[180,64.97971],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.78,42.22],[130.64,42.395],[130.63387,42.90302],[131.14469,42.92999],[131.28856,44.11152],[131.02519,44.96796],[131.88345,45.32116],[133.09712,45.14409],[133.76964,46.11693],[134.11235,47.21248],[134.50081,47.57845],[135.02631,48.47823],[133.3736,48.18344],[132.50669,47.78896],[130.98726,47.79013],[130.58229,48.72969],[129.39782,49.4406],[127.6574,49.76027],[127.28746,50.7398],[126.93916,51.35389],[126.5644,51.78426],[125.94635,52.7928],[125.06821,53.16105],[123.57147,53.4588],[122.24575,53.43173],[121.00308,53.2514],[120.17709,52.75389],[120.72579,52.51623],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.28846,50.14288],[117.87924,49.51098],[116.6788,49.88853],[115.4857,49.80518],[114.96211,50.14025],[114.36246,50.2483],[112.89774,49.54357],[111.58123,49.37797],[110.66201,49.13013],[109.40245,49.29296],[108.47517,49.28255],[107.86818,49.79371],[106.8888,50.2743],[105.88659,50.40602],[104.62158,50.27532],[103.67655,50.08997],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.51686],[99.98173,51.63401],[98.86149,52.04737],[97.82574,51.011],[98.23176,50.4224],[97.25976,49.72605],[95.81402,49.97746],[94.81595,50.01343],[94.14757,50.48054],[93.10421,50.49529],[92.23471,50.80217],[90.71367,50.33181],[88.80557,49.47052],[87.75126,49.2972],[87.35997,49.21498],[86.82936,49.82668],[85.54127,49.69286],[85.11556,50.1173],[84.41638,50.3114],[83.93511,50.88925],[83.383,51.06918],[81.94599,50.8122],[80.56845,51.38834],[80.03556,50.86475],[77.80092,53.40442],[76.52518,54.177],[76.8911,54.49052],[74.38482,53.54685],[73.42568,53.48981],[73.50852,54.03562],[72.22415,54.37665],[71.18013,54.13329],[70.86527,55.16973],[69.06817,55.38525],[68.1691,54.97039],[65.66687,54.60125],[65.17853,54.35423],[61.4366,54.00625],[60.97807,53.66499],[61.69999,52.98],[60.73999,52.71999],[60.92727,52.44755],[59.96753,51.96042],[61.588,51.27266],[61.33742,50.79907],[59.93281,50.84219],[59.64228,50.54544],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.53288,51.02624],[52.32872,51.71865],[50.76665,51.69276],[48.70238,50.60513],[48.57784,49.87476],[47.54948,50.4547],[46.7516,49.35601],[47.04367,49.15204],[46.46645,48.39415],[47.31524,47.71585],[48.05725,47.74377],[48.69473,47.07563],[48.59325,46.56104],[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[47.98728,41.40582],[47.81567,41.15142],[47.37331,41.21973],[46.68607,41.82714],[46.40495,41.86068],[45.7764,42.09244],[45.47028,42.50278],[44.53762,42.71199],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.07697,43.5531],[39.95501,43.435],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.22354,47.10219],[38.25511,47.5464],[38.77057,47.82562],[39.73828,47.89894],[39.89562,48.23241],[39.67465,48.78382],[40.08079,49.30743],[40.06904,49.60105],[38.59499,49.92646],[38.01063,49.91566],[37.39346,50.38395],[36.62617,50.22559],[35.35612,50.5772],[35.37791,50.77394],[35.02218,51.20757],[34.22482,51.25599],[34.14198,51.56641],[34.39173,51.76888],[33.7527,52.33508],[32.71576,52.23846],[32.41206,52.28869],[32.15944,52.06125],[31.78597,52.10168],[31.54002,52.74205],[31.3052,53.074],[31.49764,53.16743],[32.30452,53.13273],[32.69364,53.35142],[32.4056,53.61805],[31.73127,53.79403],[31.79142,53.97464],[31.38447,54.15706],[30.75753,54.81177],[30.97184,55.08155],[30.87391,55.55098],[29.89629,55.78946],[29.37157,55.67009],[29.22951,55.91834],[28.17671,56.16913],[27.85528,56.75933],[27.77002,57.24426],[27.28818,57.47453],[27.71669,57.7919],[27.42015,58.72457],[28.1317,59.30083],[27.98112,59.47537],[29.1177,60.02805],[28.07,60.50352],[30.21111,61.78003],[31.13999,62.35769],[31.51609,62.86769],[30.03587,63.55281],[30.44468,64.20445],[29.54443,64.94867],[30.21765,65.80598],[29.05459,66.94429],[29.97743,67.6983],[28.44594,68.36461],[28.59193,69.06478],[35,71],[40,83],[180,83]]]]}},LKA:{type:"Feature",id:"LKA",properties:{name:"Sri Lanka"},geometry:{type:"Polygon",coordinates:[[[81.78796,7.52306],[81.63732,6.48177],[81.21802,6.19714],[80.34836,5.96837],[79.87247,6.76346],[79.69517,8.20084],[80.1478,9.82408],[80.83882,9.26843],[81.30432,8.56421],[81.78796,7.52306]]]}},taiwan:{type:"Feature",id:"taiwan",properties:{},geometry:{type:"Polygon",coordinates:[[[119,23.5],[121.7,26],[122.5,25.5],[121.8,21.8],[120,21.5],[119,23.5]]]}},thailand_cnx:{type:"Feature",id:"thailand_cnx",properties:{},geometry:{type:"Polygon",coordinates:[[[98.4375,18.2319],[98.4375,19.2255],[99.5306,19.2255],[99.5306,18.2319],[98.4375,18.2319]]]}},thailand_full:{type:"Feature",id:"thailand_full",properties:{},geometry:{type:"Polygon",coordinates:[[[97.50366,8.39358],[97.7124,9.60075],[99.47021,11.8566],[98.05298,14.84923],[98.32764,16.15137],[97.21802,18.39623],[97.38281,19.73568],[100.2832,20.66363],[101.37085,19.69431],[101.40381,18.27109],[104.08447,18.58377],[105.76538,16.06693],[105.52368,14.15788],[102.854,13.82741],[103.00781,11.69527],[102.12891,5.81276],[101.11542,5.4875],[100.66498,6.42448],[99.13788,6.34806],[97.50366,8.39358]]]}},"al-tirana":{type:"Feature",id:"al-tirana",properties:{},geometry:{type:"Polygon",coordinates:[[[19.77796,41.36244],[19.78028,41.36267],[19.78123,41.36014],[19.78004,41.35915],[19.78099,41.35803],[19.77752,41.35682],[19.78082,41.35409],[19.77658,41.35122],[19.78029,41.34936],[19.7832,41.35026],[19.7899,41.34976],[19.79536,41.34793],[19.80046,41.3502],[19.81074,41.35213],[19.81874,41.35044],[19.82238,41.35173],[19.83428,41.35186],[19.84174,41.35434],[19.84682,41.3589],[19.84829,41.35842],[19.85095,41.36008],[19.85159,41.35903],[19.8561,41.35843],[19.85488,41.3545],[19.85784,41.35167],[19.85518,41.35228],[19.85275,41.35145],[19.85276,41.34956],[19.85151,41.34955],[19.85462,41.34419],[19.85876,41.33995],[19.8642,41.33947],[19.86465,41.33789],[19.86829,41.33772],[19.86999,41.33882],[19.87262,41.33794],[19.87259,41.33606],[19.87543,41.3355],[19.87644,41.33126],[19.87554,41.33042],[19.87232,41.33102],[19.87095,41.32999],[19.86659,41.33088],[19.86535,41.32664],[19.86164,41.32543],[19.85813,41.3214],[19.85489,41.32066],[19.85575,41.31876],[19.84532,41.314],[19.84458,41.31212],[19.85095,41.30156],[19.84975,41.29748],[19.8457,41.29559],[19.83906,41.29791],[19.82955,41.29568],[19.82738,41.29791],[19.82504,41.29827],[19.82605,41.29986],[19.82333,41.30509],[19.82032,41.30525],[19.81821,41.3037],[19.81168,41.30787],[19.81162,41.31002],[19.80709,41.31302],[19.79827,41.31487],[19.79767,41.31238],[19.79374,41.313],[19.78954,41.31035],[19.7852,41.31117],[19.78057,41.3142],[19.77976,41.31244],[19.78765,41.30887],[19.78369,41.30473],[19.77721,41.30247],[19.77515,41.30039],[19.77077,41.30363],[19.76019,41.29972],[19.75706,41.30651],[19.75854,41.30874],[19.75473,41.31208],[19.75643,41.31314],[19.75571,41.31548],[19.76586,41.3199],[19.76813,41.32266],[19.77017,41.32139],[19.76811,41.31882],[19.76922,41.31754],[19.77559,41.31854],[19.77323,41.32284],[19.77378,41.32422],[19.77893,41.32349],[19.77968,41.32518],[19.78451,41.32399],[19.78734,41.32541],[19.78321,41.33328],[19.78343,41.33578],[19.77659,41.33783],[19.78083,41.34567],[19.76839,41.35239],[19.75832,41.35489],[19.76053,41.35931],[19.75484,41.3598],[19.75767,41.36542],[19.76169,41.36185],[19.76434,41.36249],[19.76411,41.36393],[19.76775,41.36369],[19.76857,41.36459],[19.77145,41.364],[19.77204,41.36125],[19.77796,41.36244]]]}},albania:{type:"Feature",id:"albania",properties:{},geometry:{type:"Polygon",coordinates:[[[19.39087,41.86138],[19.40186,42.09007],[19.27002,42.18376],[19.69849,42.67436],[19.81384,42.46399],[20.07202,42.55713],[20.25879,42.33824],[20.34668,42.32606],[20.51697,42.23665],[20.61584,41.92272],[20.52795,41.71803],[20.56091,41.57847],[20.44556,41.54559],[20.56091,41.40566],[20.50049,41.3397],[20.58289,41.09177],[20.65979,41.07521],[20.71472,40.90521],[20.95642,40.92181],[20.98389,40.7431],[21.07178,40.60978],[20.95093,40.47202],[20.85205,40.47202],[20.68726,40.10329],[20.43457,40.07387],[20.33569,39.99396],[20.43457,39.82119],[20.38513,39.77899],[20.28625,39.8001],[20.31921,39.72831],[20.20386,39.63954],[19.97314,39.69451],[20.0116,39.86759],[19.86328,40.04444],[19.35791,40.2921],[19.25354,40.51798],[19.4458,40.3298],[19.50073,40.43859],[19.31396,40.65564],[19.41833,40.90936],[19.53918,40.92181],[19.4458,41.00063],[19.43481,41.15384],[19.50623,41.2489],[19.4458,41.32733],[19.41284,41.4139],[19.51721,41.52092],[19.45129,41.60312],[19.52271,41.57847],[19.58862,41.62366],[19.59961,41.7836],[19.39087,41.86138]]]}},austria:{type:"Feature",id:"austria",properties:{},geometry:{type:"Polygon",coordinates:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]]}},graz:{type:"Feature",id:"graz",properties:{},geometry:{type:"Polygon",coordinates:[[[15.26276,46.94182],[15.26276,47.16918],[15.62943,47.16918],[15.62943,46.94182],[15.26276,46.94182]]]}},belarus:{type:"Feature",id:"belarus",properties:{},geometry:{type:"Polygon",coordinates:[[[23.19351,52.37811],[23.38715,52.57134],[23.67554,52.61806],[23.87329,52.72215],[23.75656,53.20027],[23.42148,53.83956],[23.43521,53.97467],[24.33609,53.99082],[24.73022,54.03762],[24.70825,54.16967],[24.95682,54.18253],[25.48004,54.37176],[25.63385,54.95239],[26.53748,55.24468],[26.27655,55.26973],[26.48804,55.71009],[26.89728,55.87993],[27.56195,55.82597],[27.56195,55.97226],[27.98218,56.20976],[29.64935,55.96304],[30.28107,55.89303],[30.95398,55.64815],[31.20941,54.67065],[32.47009,53.7617],[32.83539,53.3866],[32.22839,53.02635],[31.51978,53.16159],[31.84662,52.06262],[30.8139,51.93411],[30.4953,51.21032],[27.71301,51.46085],[25.85083,51.88666],[24.5874,51.81541],[23.51898,51.41634],[23.45581,51.99841],[23.15918,52.1874],[23.19351,52.37811]]]}},belgium:{type:"Feature",id:"belgium",properties:{},geometry:{type:"Polygon",coordinates:[[[3.08167,51.55146],[3.30963,51.43346],[3.36834,51.36996],[3.37761,51.35956],[3.37589,51.34841],[3.38482,51.34337],[3.38722,51.33887],[3.38688,51.33286],[3.36096,51.31527],[3.3819,51.30207],[3.37641,51.29928],[3.36782,51.29681],[3.38293,51.28726],[3.38327,51.2806],[3.37915,51.27824],[3.38121,51.27598],[3.39031,51.27416],[3.39598,51.26686],[3.40439,51.26449],[3.40937,51.25923],[3.41795,51.26127],[3.42138,51.25848],[3.4267,51.25482],[3.42894,51.24709],[3.44679,51.24279],[3.52592,51.24677],[3.51425,51.2878],[3.52927,51.28935],[3.53434,51.28474],[3.53811,51.28479],[3.54266,51.29177],[3.55717,51.29187],[3.5588,51.2959],[3.56163,51.29644],[3.56489,51.29569],[3.5727,51.29225],[3.57253,51.29107],[3.57571,51.28946],[3.57905,51.28951],[3.58206,51.28876],[3.58214,51.29247],[3.58618,51.29316],[3.58026,51.29869],[3.58987,51.30663],[3.62626,51.29413],[3.64145,51.28914],[3.64411,51.29069],[3.6581,51.29096],[3.6781,51.28345],[3.67905,51.28168],[3.69063,51.28173],[3.69424,51.27668],[3.71801,51.27217],[3.71827,51.27368],[3.72273,51.274],[3.75054,51.27061],[3.75286,51.27104],[3.75681,51.26986],[3.76342,51.26261],[3.76848,51.26106],[3.77123,51.26218],[3.77355,51.2646],[3.79698,51.25665],[3.79071,51.24553],[3.79063,51.21608],[3.80453,51.2143],[3.80796,51.21398],[3.82479,51.21086],[3.8356,51.21516],[3.85225,51.21484],[3.85895,51.21291],[3.89002,51.22473],[3.89568,51.21968],[3.89482,51.2143],[3.88298,51.20764],[3.88762,51.20301],[3.89345,51.20527],[3.89929,51.20398],[3.91542,51.20989],[3.91388,51.21764],[3.92349,51.21989],[3.93105,51.22194],[3.9374,51.21398],[3.94323,51.21721],[3.95748,51.21764],[3.96023,51.22527],[3.97654,51.22667],[3.9846,51.2357],[3.99473,51.23914],[4.00469,51.24311],[4.01636,51.24623],[4.03851,51.24687],[4.04125,51.24397],[4.05842,51.24505],[4.06082,51.24773],[4.16365,51.29391],[4.23815,51.35345],[4.22373,51.35881],[4.21686,51.36878],[4.21635,51.37435],[4.33685,51.37842],[4.34235,51.35988],[4.35093,51.35967],[4.36861,51.35795],[4.38543,51.35592],[4.39505,51.35753],[4.42114,51.36707],[4.42818,51.36642],[4.42337,51.37242],[4.42904,51.37521],[4.38852,51.40702],[4.38097,51.42137],[4.38904,51.42597],[4.39093,51.43304],[4.3935,51.43486],[4.39161,51.44416],[4.37891,51.44502],[4.37719,51.44716],[4.38131,51.45165],[4.38509,51.4508],[4.44157,51.47005],[4.46354,51.4723],[4.47487,51.47978],[4.48654,51.4786],[4.53856,51.48416],[4.55074,51.47283],[4.53238,51.44877],[4.53701,51.42522],[4.57512,51.43411],[4.63469,51.42651],[4.64087,51.42372],[4.65048,51.42747],[4.6673,51.42779],[4.66473,51.44556],[4.69236,51.45326],[4.70146,51.46845],[4.71416,51.47026],[4.71519,51.47304],[4.72781,51.48486],[4.74524,51.48988],[4.74721,51.49368],[4.74781,51.49651],[4.75047,51.49945],[4.75648,51.50196],[4.77253,51.50682],[4.79485,51.5034],[4.82025,51.49784],[4.82643,51.48609],[4.84737,51.48352],[4.84291,51.46449],[4.84909,51.46085],[4.84463,51.4478],[4.83089,51.44438],[4.83742,51.42683],[4.8563,51.41805],[4.88171,51.43325],[4.91741,51.4127],[4.93389,51.42083],[4.90162,51.44053],[4.9387,51.46192],[4.97646,51.44545],[5.02419,51.48523],[5.03225,51.48919],[5.04187,51.4878],[5.04135,51.48053],[5.04856,51.47433],[5.08032,51.47475],[5.10658,51.43047],[5.07294,51.39358],[5.11765,51.36149],[5.12074,51.35592],[5.13268,51.3475],[5.13525,51.31608],[5.1622,51.31135],[5.17241,51.31688],[5.19001,51.32069],[5.19585,51.32123],[5.19988,51.32348],[5.24331,51.30594],[5.2276,51.26841],[5.23842,51.26208],[5.26357,51.26782],[5.29584,51.26267],[5.31567,51.26449],[5.33755,51.26428],[5.34107,51.26686],[5.34399,51.27309],[5.34554,51.27668],[5.4172,51.2632],[5.43222,51.27706],[5.43806,51.27695],[5.44132,51.2827],[5.46398,51.28549],[5.47608,51.29209],[5.47608,51.29536],[5.48226,51.29923],[5.48201,51.301],[5.51625,51.29612],[5.52011,51.28957],[5.54363,51.27298],[5.55711,51.26718],[5.55874,51.2631],[5.55745,51.25316],[5.55651,51.24472],[5.56131,51.22301],[5.63667,51.20355],[5.65401,51.19812],[5.65513,51.1936],[5.65212,51.1929],[5.65753,51.1865],[5.66834,51.18671],[5.67624,51.18548],[5.67761,51.18435],[5.6856,51.18542],[5.68946,51.18623],[5.69815,51.1842],[5.70201,51.18397],[5.70165,51.18275],[5.70645,51.18248],[5.70815,51.18223],[5.70987,51.1812],[5.71431,51.1839],[5.7177,51.18475],[5.72948,51.18601],[5.73031,51.18553],[5.73274,51.18564],[5.73274,51.18615],[5.7345,51.18657],[5.73993,51.18757],[5.74576,51.19032],[5.75769,51.18618],[5.75821,51.1851],[5.76731,51.18413],[5.77821,51.1787],[5.77477,51.17337],[5.7801,51.17289],[5.78078,51.17208],[5.77992,51.17052],[5.77673,51.1702],[5.77585,51.17028],[5.77321,51.16967],[5.77274,51.16925],[5.77192,51.16924],[5.77093,51.1698],[5.76993,51.16905],[5.77059,51.16458],[5.77383,51.16453],[5.77385,51.16558],[5.77638,51.16565],[5.77701,51.16306],[5.7775,51.16298],[5.77808,51.16353],[5.77975,51.16356],[5.78025,51.15935],[5.77797,51.15803],[5.77677,51.15554],[5.77829,51.15502],[5.77907,51.15319],[5.78456,51.15421],[5.79005,51.15798],[5.79512,51.15798],[5.80095,51.15954],[5.80027,51.16094],[5.80361,51.1632],[5.80619,51.16352],[5.8134,51.16051],[5.8146,51.16325],[5.82473,51.16874],[5.83434,51.16314],[5.83589,51.15905],[5.84078,51.15819],[5.84129,51.15523],[5.8564,51.15071],[5.86258,51.14446],[5.85674,51.14037],[5.85159,51.13671],[5.84816,51.12938],[5.83374,51.12744],[5.82241,51.12249],[5.81211,51.11387],[5.82275,51.11171],[5.84026,51.10611],[5.83683,51.0936],[5.82584,51.08929],[5.80559,51.09102],[5.81142,51.07851],[5.80421,51.07031],[5.80868,51.06233],[5.797,51.05564],[5.77709,51.05693],[5.76576,51.03384],[5.78568,51.02412],[5.77263,51.01354],[5.77332,51.00555],[5.76885,50.99345],[5.7589,50.98912],[5.74654,50.97767],[5.72765,50.9647],[5.72834,50.95843],[5.73761,50.96145],[5.75306,50.96232],[5.76851,50.9541],[5.7589,50.94567],[5.73521,50.92446],[5.73177,50.91061],[5.7177,50.90563],[5.70362,50.9078],[5.70122,50.89545],[5.68954,50.88224],[5.68096,50.87726],[5.67169,50.87574],[5.65453,50.87054],[5.64766,50.86274],[5.64766,50.84757],[5.65453,50.83435],[5.66448,50.82437],[5.6971,50.81353],[5.71838,50.80333],[5.72113,50.77642],[5.78018,50.79639],[5.82962,50.77294],[5.9079,50.77381],[6.00403,50.76947],[6.04248,50.76252],[6.05621,50.75123],[6.129,50.73385],[6.16745,50.69037],[6.21689,50.66252],[6.2471,50.65991],[6.28143,50.64424],[6.28693,50.62333],[6.27045,50.59631],[6.24847,50.58542],[6.24058,50.56078],[6.22719,50.5538],[6.21586,50.54965],[6.20419,50.53591],[6.21552,50.52063],[6.22993,50.50295],[6.23989,50.50513],[6.2598,50.50338],[6.27766,50.50731],[6.29139,50.50076],[6.3089,50.50513],[6.3216,50.49923],[6.35078,50.49377],[6.35765,50.48722],[6.34838,50.47936],[6.35147,50.46188],[6.37756,50.45925],[6.38065,50.44657],[6.37619,50.40786],[6.36383,50.39561],[6.35387,50.38028],[6.36246,50.37634],[6.41155,50.34415],[6.41499,50.33363],[6.40675,50.31982],[6.38718,50.31763],[6.36829,50.3025],[6.35765,50.30338],[6.33018,50.31565],[6.31645,50.31478],[6.30444,50.30601],[6.29585,50.29044],[6.29414,50.27354],[6.27628,50.26411],[6.22856,50.25511],[6.21483,50.25094],[6.20659,50.24062],[6.19869,50.23403],[6.17947,50.23139],[6.18221,50.22678],[6.17672,50.22151],[6.19251,50.21206],[6.19801,50.18437],[6.19217,50.17646],[6.15166,50.16656],[6.15509,50.15491],[6.16058,50.14633],[6.15578,50.13554],[6.14376,50.13224],[6.13243,50.12454],[6.10737,50.13378],[6.11012,50.16282],[6.09947,50.16502],[6.08677,50.15425],[6.06583,50.14875],[6.02943,50.15579],[6.01639,50.17294],[5.97931,50.16898],[5.96832,50.12542],[5.94566,50.12278],[5.90378,50.10473],[5.89073,50.06948],[5.86876,50.06243],[5.87837,50.03289],[5.83168,50.01039],[5.84404,49.99935],[5.84747,49.98214],[5.81932,49.95785],[5.78773,49.95255],[5.77263,49.91144],[5.74722,49.89994],[5.7843,49.88977],[5.7946,49.87473],[5.76645,49.86012],[5.75203,49.834],[5.76645,49.80121],[5.79941,49.79855],[5.84404,49.74977],[5.83923,49.72847],[5.87906,49.72892],[5.89622,49.70672],[5.87563,49.67963],[5.91176,49.66218],[5.90567,49.65779],[5.9073,49.65479],[5.90429,49.65213],[5.90507,49.64735],[5.90567,49.64262],[5.90876,49.63868],[5.89854,49.63362],[5.89374,49.63573],[5.88524,49.6319],[5.88799,49.62645],[5.87837,49.62],[5.87829,49.61305],[5.8776,49.60737],[5.84996,49.59675],[5.85202,49.58824],[5.86318,49.58773],[5.86524,49.58974],[5.86962,49.59013],[5.87279,49.58913],[5.87502,49.58295],[5.87073,49.58134],[5.87288,49.57961],[5.87314,49.57677],[5.87451,49.5736],[5.86387,49.56965],[5.86164,49.56603],[5.85288,49.56347],[5.85168,49.56185],[5.84661,49.5608],[5.84773,49.55896],[5.84722,49.55567],[5.84224,49.55233],[5.8267,49.54933],[5.82524,49.55066],[5.82026,49.54599],[5.81623,49.54599],[5.81245,49.54582],[5.80765,49.5486],[5.79941,49.54816],[5.78859,49.55194],[5.77263,49.56141],[5.76181,49.55963],[5.75941,49.54203],[5.7407,49.53724],[5.73521,49.53813],[5.72971,49.54225],[5.7189,49.53802],[5.70156,49.5378],[5.6904,49.54392],[5.67993,49.54348],[5.67787,49.54715],[5.66757,49.54682],[5.66002,49.5505],[5.64526,49.54437],[5.62878,49.53579],[5.6262,49.52287],[5.62346,49.5144],[5.61298,49.50292],[5.60217,49.50671],[5.59359,49.51953],[5.56904,49.52565],[5.56372,49.52409],[5.55462,49.52744],[5.54192,49.51384],[5.50329,49.50504],[5.4875,49.50526],[5.48458,49.50113],[5.47085,49.49322],[5.46209,49.49679],[5.46055,49.50738],[5.45214,49.51083],[5.44304,49.51841],[5.46158,49.52788],[5.46209,49.53735],[5.4372,49.55283],[5.45368,49.56542],[5.44458,49.56586],[5.43549,49.56887],[5.42673,49.5899],[5.42862,49.59358],[5.41523,49.59947],[5.40871,49.60748],[5.39892,49.6096],[5.39652,49.6146],[5.3742,49.62128],[5.37025,49.62105],[5.36047,49.62428],[5.34897,49.62895],[5.34279,49.61505],[5.33781,49.61427],[5.32957,49.61494],[5.32064,49.61271],[5.31378,49.6096],[5.31034,49.61071],[5.30863,49.61694],[5.30279,49.62317],[5.30245,49.62962],[5.30794,49.63851],[5.31738,49.64807],[5.33043,49.65318],[5.30708,49.67085],[5.29284,49.67607],[5.27962,49.68496],[5.2791,49.6884],[5.26829,49.69495],[5.25782,49.69295],[5.2482,49.68529],[5.24117,49.68429],[5.24134,49.68851],[5.23104,49.69007],[5.2173,49.6864],[5.21421,49.68784],[5.20666,49.69451],[5.19722,49.69062],[5.18932,49.6924],[5.17542,49.6924],[5.16306,49.69218],[5.1622,49.6995],[5.1646,49.71083],[5.15963,49.71438],[5.15327,49.71671],[5.15087,49.71249],[5.14263,49.70739],[5.14006,49.71194],[5.13147,49.71205],[5.12529,49.71105],[5.12032,49.71704],[5.12358,49.72637],[5.11723,49.73757],[5.09302,49.76297],[5.08796,49.76475],[5.08452,49.76186],[5.07963,49.76164],[5.07611,49.76109],[5.07139,49.75987],[5.06727,49.76081],[5.06144,49.76192],[5.06092,49.76624],[5.04908,49.76741],[5.00599,49.7816],[5.00547,49.7832],[5.00504,49.78719],[5.00041,49.79312],[4.99741,49.79379],[4.99603,49.79506],[4.99715,49.79672],[4.99672,49.79955],[4.9938,49.79977],[4.98539,49.79888],[4.97895,49.79972],[4.96977,49.8011],[4.96779,49.79756],[4.96179,49.79717],[4.95569,49.80027],[4.94865,49.79811],[4.94814,49.79473],[4.94368,49.79035],[4.94213,49.79035],[4.94132,49.79226],[4.93887,49.7926],[4.93286,49.78977],[4.9329,49.78825],[4.93114,49.78661],[4.92939,49.78686],[4.92102,49.78805],[4.91793,49.78708],[4.91269,49.78573],[4.90475,49.78492],[4.89947,49.78597],[4.89741,49.78836],[4.88913,49.78769],[4.88724,49.78786],[4.88244,49.79049],[4.87939,49.79249],[4.87591,49.79282],[4.87068,49.79268],[4.87188,49.78922],[4.87081,49.78839],[4.86227,49.78805],[4.85712,49.78966],[4.85201,49.79035],[4.84909,49.79368],[4.8563,49.79722],[4.86076,49.80354],[4.86214,49.81373],[4.87364,49.81883],[4.86712,49.82071],[4.86712,49.82625],[4.86506,49.83444],[4.8654,49.83964],[4.85304,49.84042],[4.84943,49.84894],[4.84789,49.86278],[4.84463,49.8703],[4.85561,49.87096],[4.87484,49.89618],[4.87347,49.90459],[4.87999,49.90879],[4.87553,49.92006],[4.85424,49.92957],[4.84325,49.94636],[4.82849,49.94724],[4.78558,49.9563],[4.78523,49.9828],[4.80995,49.99626],[4.81647,50.02671],[4.83021,50.04127],[4.81441,50.04788],[4.8127,50.06794],[4.8357,50.07014],[4.83192,50.09085],[4.84291,50.10363],[4.86626,50.10318],[4.85836,50.1164],[4.88274,50.13664],[4.87072,50.14875],[4.8278,50.14963],[4.82025,50.15579],[4.76875,50.1296],[4.75262,50.10539],[4.70352,50.08424],[4.70112,50.01502],[4.69803,49.99229],[4.63383,49.98037],[4.56963,49.96712],[4.53255,49.94857],[4.51401,49.93973],[4.44122,49.93178],[4.35745,49.94327],[4.31145,49.95564],[4.22974,49.94945],[4.18785,49.95034],[4.16725,49.96801],[4.12331,49.97286],[4.12193,50.01215],[4.14734,50.05273],[4.18167,50.05493],[4.22012,50.07301],[4.1906,50.10252],[4.18922,50.1263],[4.16382,50.1219],[4.11644,50.13158],[4.13841,50.21734],[4.20708,50.25555],[4.1827,50.27025],[4.16382,50.28298],[4.15901,50.27596],[4.17309,50.2685],[4.17309,50.25994],[4.16519,50.25401],[4.13258,50.25489],[4.1312,50.26433],[4.13017,50.27091],[4.11644,50.27464],[4.12262,50.2821],[4.1185,50.2957],[4.09653,50.30864],[4.07696,50.30579],[4.07215,50.31807],[4.05533,50.32946],[4.03679,50.33998],[4.02512,50.35291],[3.98598,50.33911],[3.95748,50.33845],[3.8974,50.32267],[3.88264,50.32377],[3.88092,50.33494],[3.85448,50.33911],[3.84933,50.34875],[3.82942,50.35028],[3.82633,50.34217],[3.80711,50.3413],[3.80608,50.35072],[3.74256,50.34393],[3.73604,50.31149],[3.72437,50.30272],[3.70583,50.29921],[3.68076,50.31894],[3.66428,50.34152],[3.65227,50.37087],[3.66634,50.39123],[3.66325,50.42143],[3.65398,50.4551],[3.62995,50.46712],[3.60832,50.49006],[3.59974,50.48657],[3.55476,50.48853],[3.49915,50.47936],[3.48198,50.48635],[3.50945,50.52085],[3.4758,50.52478],[3.45726,50.50513],[3.43735,50.49945],[3.36662,50.48416],[3.27324,50.52609],[3.25951,50.60154],[3.2341,50.65251],[3.24097,50.67862],[3.24783,50.70037],[3.19565,50.70776],[3.1311,50.77642],[3.06725,50.76296],[2.99652,50.74428],[2.95807,50.67035],[2.82898,50.68602],[2.68341,50.77816],[2.57629,50.81114],[2.5708,50.93939],[2.51862,51.05866],[2.36755,51.2516],[3.08167,51.55146]]]}},be_brussels:{type:"Feature",id:"be_brussels",properties:{},geometry:{type:"Polygon",coordinates:[[[4.37973,50.76382],[4.37853,50.76811],[4.34522,50.77337],[4.34205,50.77164],[4.32952,50.77381],[4.31621,50.78624],[4.31458,50.79454],[4.30282,50.79709],[4.29802,50.80593],[4.28901,50.80691],[4.2854,50.80506],[4.27579,50.80696],[4.27218,50.81011],[4.25802,50.80935],[4.25519,50.8151],[4.24403,50.81548],[4.24343,50.82182],[4.25227,50.82697],[4.25107,50.83288],[4.25467,50.83695],[4.27193,50.84036],[4.28094,50.84215],[4.28042,50.85721],[4.27802,50.85911],[4.27699,50.86713],[4.28274,50.87227],[4.29561,50.88094],[4.29553,50.88262],[4.29149,50.88495],[4.29004,50.88982],[4.30634,50.89274],[4.31647,50.89605],[4.32892,50.90249],[4.34025,50.90411],[4.34857,50.90341],[4.36213,50.9033],[4.3726,50.90032],[4.38119,50.90319],[4.38462,50.91093],[4.39578,50.91407],[4.41543,50.91342],[4.41655,50.90757],[4.4296,50.90103],[4.43595,50.89502],[4.43106,50.89014],[4.44007,50.87845],[4.43183,50.87628],[4.4253,50.86615],[4.44599,50.85992],[4.44968,50.85591],[4.46238,50.85396],[4.46899,50.84573],[4.46959,50.83537],[4.47972,50.82036],[4.45947,50.81661],[4.45921,50.80626],[4.48238,50.79617],[4.4817,50.79134],[4.46427,50.78645],[4.435,50.775],[4.43028,50.77517],[4.38917,50.76377],[4.37973,50.76382]]]}},be_flanders:{type:"Feature",id:"be_flanders",properties:{},geometry:{type:"Polygon",coordinates:[[[2.52239,51.10172],[3.12606,51.34118],[3.17493,51.38246],[3.37615,51.38784],[3.41065,51.3304],[3.40202,51.28548],[3.49114,51.2567],[3.48251,51.30345],[3.57737,51.32322],[3.81309,51.27289],[3.82172,51.23691],[3.93095,51.23691],[4.05456,51.27469],[4.20116,51.35195],[4.16954,51.38067],[4.34202,51.39502],[4.36502,51.46491],[4.53749,51.50072],[4.57199,51.47924],[4.56049,51.44879],[4.63811,51.45058],[4.75022,51.52397],[4.83645,51.50787],[5.0808,51.49893],[5.13541,51.447],[5.10667,51.39143],[5.26477,51.31783],[5.26477,51.28727],[5.4085,51.29267],[5.48612,51.32501],[5.58098,51.28368],[5.58385,51.23511],[5.76783,51.2045],[5.87706,51.16125],[5.70459,50.80293],[5.90581,50.78657],[5.93743,50.73202],[5.90293,50.70108],[5.81382,50.69379],[5.61547,50.76112],[5.50049,50.712],[5.2044,50.7029],[5.16416,50.67558],[5.03768,50.70108],[4.98881,50.75021],[4.91694,50.72656],[4.79046,50.76658],[4.68122,50.77021],[4.66973,50.73566],[4.2874,50.67922],[3.91083,50.6774],[3.71823,50.75203],[3.65499,50.712],[3.53426,50.71018],[3.51413,50.74112],[3.45664,50.74384],[3.37328,50.69562],[3.31004,50.70745],[3.28991,50.73657],[3.16487,50.74294],[3.13181,50.77203],[3.08007,50.76021],[2.87453,50.7393],[2.89609,50.71109],[2.87453,50.69562],[2.79692,50.7029],[2.69918,50.8002],[2.62013,50.79747],[2.56982,50.8583],[2.56695,50.92358],[2.60288,50.94985],[2.5497,50.99601],[2.52239,51.10172]]]}},be_wallonia:{type:"Feature",id:"be_wallonia",properties:{},geometry:{type:"Polygon",coordinates:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]]]}},croatia:{type:"Feature",id:"croatia",properties:{},geometry:{type:"LineString",coordinates:[[18.55316,42.39709],[18.43575,42.48273],[18.44437,42.56076],[18.3609,42.61526],[18.24898,42.61375],[17.90239,42.81647],[17.85896,42.89458],[17.80815,42.92073],[17.7903,42.89961],[17.67975,42.92174],[17.64267,42.88351],[17.53967,42.93531],[17.71339,42.97351],[17.63424,43.09863],[17.43805,43.18365],[17.44734,43.1998],[17.37488,43.2502],[17.26227,43.39108],[17.30151,43.4393],[17.282,43.47769],[17.22656,43.49776],[17.1476,43.49677],[16.39709,44.06983],[16.15253,44.38405],[16.14789,44.48088],[15.90458,44.75089],[15.82858,44.72686],[15.74818,44.81311],[15.78598,44.84029],[15.7338,44.9371],[15.78598,44.96966],[15.75505,45.05587],[15.80439,45.1121],[15.77283,45.16143],[15.81894,45.2072],[15.99747,45.21978],[16.11145,45.08758],[16.29175,44.9865],[16.36047,44.99622],[16.40374,45.10639],[16.46738,45.13326],[16.5105,45.20898],[16.81812,45.17296],[16.92275,45.23503],[17.16882,45.13674],[17.59713,45.09425],[17.66404,45.12204],[17.84756,45.03242],[17.93891,45.07086],[17.93745,45.09903],[18.0011,45.14282],[18.11746,45.06832],[18.2011,45.0684],[18.22841,45.09274],[18.41889,45.09637],[18.46602,45.05359],[18.66267,45.04785],[18.72157,44.98326],[18.77858,44.98426],[18.78491,44.94261],[18.75375,44.95245],[18.73803,44.94119],[18.75065,44.90197],[18.83764,44.84591],[19.01991,44.84386],[18.99843,44.89696],[19.06865,44.88961],[19.16343,44.94855],[19.1011,44.98811],[19.11231,45.08359],[19.08464,45.11852],[19.09331,45.13091],[19.14345,45.119],[19.2041,45.17236],[19.45198,45.16219],[19.42108,45.23622],[19.2687,45.24886],[19.10972,45.30469],[19.09424,45.3367],[18.9792,45.37883],[19.03735,45.40735],[18.99315,45.44969],[19.00341,45.48553],[19.08125,45.47585],[19.10858,45.5144],[19.01686,45.56369],[18.94817,45.54136],[18.89717,45.56551],[18.96652,45.66972],[18.9164,45.70714],[18.82507,45.91724],[18.77838,45.88666],[18.68019,45.91486],[18.43522,45.74655],[18.15765,45.79625],[17.86118,45.77993],[17.66574,45.84483],[17.58087,45.93874],[17.31102,45.97167],[17.17232,46.1551],[16.97456,46.22688],[16.86058,46.35783],[16.72462,46.39715],[16.66077,46.45725],[16.36894,46.55083],[16.24191,46.49508],[16.30028,46.38152],[16.15145,46.40378],[16.04759,46.3891],[16.073,46.34266],[15.79422,46.26439],[15.78049,46.21928],[15.67131,46.23068],[15.60059,46.16509],[15.61913,46.08657],[15.71043,46.04506],[15.68573,45.84315],[15.55939,45.85272],[15.24587,45.72718],[15.34584,45.65341],[15.28061,45.60731],[15.36301,45.48661],[15.16462,45.43061],[14.55276,45.65149],[14.4841,45.54339],[14.33098,45.47073],[14.23361,45.51383],[14.19361,45.48114],[14.07402,45.49231],[13.99868,45.52812],[13.95607,45.5049],[13.98354,45.46061],[13.87695,45.43477],[13.78445,45.47445],[13.67282,45.45244],[13.6,45.46],[13.48,45.55],[13,45],[16,42.2],[18.487,42.33],[18.55316,42.39709]]}},czechia:{type:"Feature",id:"czechia",properties:{},geometry:{type:"Polygon",coordinates:[[[14.3811,51.06902],[15.13916,51.08282],[16.42456,50.70863],[16.68823,50.32442],[16.78711,50.49246],[17.75391,50.35247],[18.58887,49.96536],[18.92944,49.51808],[18.1604,48.98022],[17.00684,48.61839],[15.13916,48.85749],[14.67773,48.55298],[13.85376,48.58206],[12.00806,50.05008],[11.92017,50.35948],[14.3811,51.06902]]]}},denmark:{type:"Feature",id:"denmark",properties:{},geometry:{type:"Polygon",coordinates:[[[7.99805,55.11608],[7.9541,56.94497],[10.62378,57.94401],[12.65625,56.01681],[12.65625,55.91535],[12.82928,55.5566],[12.60956,55.42122],[12.66449,55.25095],[14.82605,55.37911],[15.28198,55.22902],[15.11719,54.85448],[12.87598,54.85922],[12.07672,54.44769],[10.849,54.73414],[10.67871,54.58002],[9.88083,54.83708],[9.73972,54.82265],[9.60823,54.8525],[9.63158,54.87996],[9.59038,54.88668],[9.4994,54.83886],[9.43176,54.82601],[9.41013,54.84242],[9.38198,54.83827],[9.37443,54.82047],[9.34422,54.80108],[9.25152,54.80979],[9.23985,54.84993],[9.13822,54.87483],[9.06338,54.87048],[8.90167,54.90386],[8.85532,54.89517],[8.82408,54.90662],[8.79765,54.90445],[8.77602,54.893],[8.72761,54.89181],[8.67645,54.91195],[8.66066,54.90859],[8.55698,54.92063],[8.47355,55.05537],[7.99805,55.11608]]]}},finland:{type:"Feature",id:"finland",properties:{},geometry:{type:"Polygon",coordinates:[[[24.16992,65.34851],[23.90625,66.14274],[23.68652,66.44311],[23.99414,66.80922],[23.51074,67.27204],[23.37891,67.44123],[23.73047,67.97463],[20.74219,69.03714],[21.18164,69.28726],[21.70898,69.27171],[22.45605,68.73638],[23.15918,68.65655],[23.90625,68.8318],[25.00488,68.59249],[25.40039,68.87936],[25.75195,68.95839],[25.97168,69.70287],[26.45508,69.96044],[27.20215,69.90012],[27.50977,70.0506],[27.86133,70.08056],[28.38867,69.82447],[29.04785,69.71811],[29.26758,69.53452],[28.87207,69.225],[29.0918,69.02141],[28.52051,68.89519],[28.78418,68.84767],[28.52051,68.56038],[28.69629,68.17156],[29.26758,68.0733],[30.05859,67.69277],[29.17969,67.0503],[29.0918,66.8956],[30.14648,65.73063],[29.66309,65.20147],[29.70703,64.79285],[30.05859,64.79285],[30.10254,64.41592],[30.4541,64.30182],[30.05859,63.74363],[31.59668,63.01511],[30.27832,61.89758],[27.81738,60.56538],[27.33398,60.19616],[24.65332,59.88894],[21.84082,59.46741],[20.43457,59.46741],[19.11621,60.19616],[19.2041,60.58697],[20.08301,60.75916],[20.69824,61.14324],[20.96191,61.73153],[19.99512,63.27318],[21.44531,63.66576],[22.93945,64.20638],[23.24707,64.51064],[23.81836,64.66152],[24.16992,65.34851]]]}},france:{type:"Feature",id:"france",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[9.9,42.64836],[9.9,42.02785],[9.63227,41.43244],[9.36968,41.35052],[9.32602,41.3036],[9.27311,41.29196],[9.07196,41.26129],[8.94186,41.27688],[8.8742,41.26232],[8.84542,41.26311],[8.78782,41.25725],[7.3114,41.4242],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24593,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.26331,50.92504],[1.76605,51.17762],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.26696,43.39308],[9.8,43.1],[9.9,42.64836]]]]}},"de-berlin-brandenburg":{type:"Feature",id:"de-berlin-brandenburg",properties:{},geometry:{type:"Polygon",coordinates:[[[11.32141,53.11711],[12.09595,53.36694],[12.88147,53.20274],[13.78235,53.50765],[14.16687,53.41608],[14.10645,53.28164],[14.29871,53.27507],[14.41956,53.32431],[14.19434,52.93871],[14.19434,52.82932],[14.57336,52.60972],[14.57336,52.36218],[14.71619,52.05249],[14.61182,51.84257],[14.76563,51.54975],[14.36462,51.519],[14.1449,51.54975],[13.99109,51.36835],[13.2605,51.39578],[13.07373,51.65211],[13.13965,51.86971],[12.67273,52.01532],[12.40356,52.03222],[12.22229,52.14697],[12.32117,52.50619],[12.16736,52.51956],[12.23877,52.87245],[11.60156,52.96849],[11.32141,53.11711]]]}},"de-ostwestfalen-lippe":{type:"Feature",id:"de-ostwestfalen-lippe",properties:{},geometry:{type:"Polygon",coordinates:[[[8.04337,52.05756],[8.42583,52.19919],[8.43846,52.35394],[8.30866,52.39929],[8.28438,52.4581],[8.67096,52.56967],[9.22028,52.49616],[9.06097,52.28328],[9.47365,51.86716],[9.46266,51.64103],[9.26285,51.46641],[9.15648,51.43569],[8.80348,51.43218],[8.54444,51.46003],[8.42239,51.55658],[8.31076,51.72252],[8.12645,51.86844],[8.04337,52.05756]]]}},germany:{type:"Feature",id:"germany",properties:{},geometry:{type:"Polygon",coordinates:[[[7.05048,52.62973],[7.21252,53.20274],[6.56982,53.61858],[8.30772,55.1467],[8.6483,54.96421],[9.45305,54.83313],[9.95018,54.82838],[11.99913,54.44689],[13.3889,54.89162],[14.15245,54.47562],[14.26231,53.78037],[14.44359,53.27096],[14.36119,53.0668],[14.16344,52.97097],[14.13597,52.84508],[14.62486,52.60555],[14.5919,52.35463],[14.71825,52.24042],[14.74571,52.06516],[14.60838,51.83153],[14.74571,51.69554],[14.76768,51.54206],[14.98741,51.43261],[15.03136,51.27824],[14.94347,51.04744],[14.85558,50.88138],[14.77867,50.81548],[14.64684,50.85017],[14.5974,50.99215],[14.32823,51.07506],[14.32823,50.88138],[13.01537,50.49508],[12.48253,50.38663],[12.33421,50.18305],[12.1804,50.30952],[12.12547,50.25686],[12.22984,50.09856],[12.55394,49.92912],[12.4276,49.75199],[12.5045,49.68807],[12.77916,49.35286],[12.93297,49.36002],[13.03185,49.28841],[13.57018,48.96489],[13.80089,48.81319],[13.75694,48.52297],[13.52074,48.58842],[13.45482,48.57388],[13.40538,48.36994],[13.23509,48.28959],[12.99889,48.24571],[12.75169,48.12118],[12.9879,47.86385],[12.91649,47.71623],[13.04832,47.72362],[13.09776,47.67186],[13.0648,47.50885],[12.93846,47.47173],[12.77367,47.5793],[12.8286,47.60894],[12.70226,47.70144],[12.1859,47.70514],[12.16942,47.62005],[11.86729,47.60524],[11.63109,47.59412],[11.25755,47.40114],[10.98839,47.40486],[10.88402,47.52369],[10.67528,47.55707],[10.45006,47.54594],[10.46654,47.41973],[10.34019,47.3081],[10.19737,47.27457],[10.21385,47.38998],[10.10948,47.3751],[10.08202,47.46431],[9.84581,47.55336],[9.40636,47.55336],[9.09874,47.68388],[8.90236,47.65521],[8.85292,47.70329],[8.80348,47.74025],[8.76915,47.71993],[8.80486,47.70329],[8.79524,47.68388],[8.7307,47.69867],[8.73482,47.7227],[8.71284,47.7384],[8.7513,47.76887],[8.69637,47.76425],[8.65654,47.8067],[8.63594,47.76518],[8.61122,47.80947],[8.57002,47.79286],[8.48763,47.77902],[8.41621,47.71808],[8.41347,47.68111],[8.46428,47.65891],[8.53706,47.67001],[8.60985,47.67741],[8.63457,47.64966],[8.59886,47.64319],[8.61122,47.6219],[8.56865,47.60061],[8.56865,47.6219],[8.52745,47.64041],[8.45879,47.60801],[8.50273,47.58672],[8.38463,47.57004],[8.33107,47.57375],[8.29399,47.61542],[8.2061,47.62653],[8.10173,47.56819],[7.96852,47.5617],[7.92046,47.55429],[7.89024,47.59505],[7.8257,47.58949],[7.81197,47.56726],[7.6815,47.54038],[7.6403,47.56448],[7.69386,47.5756],[7.6815,47.59412],[7.64854,47.60061],[7.61421,47.58394],[7.50641,47.70237],[7.79205,48.60749],[8.22876,48.97481],[6.84174,49.17093],[6.37482,49.48597],[6.53961,49.80963],[6.1441,50.01833],[6.19835,50.21119],[6.41808,50.35159],[6.19835,50.63117],[6.02257,50.77034],[6.02257,51.07506],[6.24229,51.37778],[5.97862,51.81456],[6.1496,51.90022],[6.44073,51.85105],[6.828,51.95611],[6.68518,52.05587],[7.04773,52.23957],[6.99554,52.45768],[6.70166,52.48445],[6.72913,52.64973],[7.05048,52.62973]]]}},hungary:{type:"Feature",id:"hungary",properties:{},geometry:{type:"Polygon",coordinates:[[[18.43643,45.73111],[17.67426,45.83454],[17.57675,45.92823],[17.35153,45.94303],[17.14966,46.16081],[16.52756,46.50028],[16.3147,46.86582],[16.11969,46.86582],[16.28448,46.99337],[16.48224,47.01584],[16.5152,47.1505],[16.42731,47.2177],[16.43829,47.41136],[16.66763,47.44852],[16.67587,47.60616],[16.43829,47.65614],[16.54816,47.75964],[16.71844,47.73563],[16.75003,47.68111],[17.08099,47.70791],[17.04254,47.86293],[17.09473,47.96234],[17.20734,48.02484],[17.75665,47.74486],[18.71246,47.76702],[18.85529,47.82606],[18.77838,47.87767],[18.75641,47.98808],[18.82233,48.04687],[19.50348,48.1056],[19.55566,48.25028],[19.92096,48.14227],[20.34943,48.30329],[20.54718,48.54389],[20.82184,48.58751],[21.14044,48.50751],[21.47003,48.58751],[21.70074,48.36902],[21.8367,48.34073],[22.2171,48.42282],[22.38327,48.24205],[22.50549,48.24845],[22.61948,48.1056],[22.83371,48.11843],[22.90649,47.95406],[22.59064,47.75779],[22.48077,47.81131],[22.42584,47.74486],[22.32147,47.75779],[22.02759,47.51442],[22.03033,47.38161],[21.9397,47.3658],[21.48926,46.75868],[21.52908,46.73233],[21.4151,46.61737],[21.33133,46.61549],[21.10611,46.23875],[20.79575,46.27863],[20.7106,46.15035],[20.25055,46.13227],[19.82758,46.16461],[19.54742,46.17793],[19.51447,46.1018],[18.80997,45.87567],[18.70285,45.91294],[18.43643,45.73111]]]}},iceland:{type:"Feature",id:"iceland",properties:{},geometry:{type:"Polygon",coordinates:[[[-25.21,65.81],[-23.17,66.89],[-19.51,66.29],[-19.09,67.46],[-17.98,67.34],[-17.38,66.83],[-14.01,66.72],[-12.36,64.54],[-17.21,62.92],[-23.63,63.15],[-25.21,65.81]]]}},italy:{type:"Feature",id:"italy",properties:{},geometry:{type:"Polygon",coordinates:[[[7.6,43.5],[7.49542,43.86523],[7.69043,44.0718],[7.69043,44.19796],[7.42676,44.15068],[6.9873,44.26094],[6.85547,44.55916],[7.03125,44.73113],[7.00928,44.87144],[6.72363,44.91814],[6.5918,45.12005],[7.09717,45.25942],[7.14111,45.41388],[6.96533,45.61404],[6.76758,45.79817],[7.03125,45.9053],[7.55859,45.9817],[7.77832,45.93587],[8.12988,46.13417],[8.08594,46.30141],[8.48145,46.46813],[8.61328,46.13417],[8.81104,46.10371],[9.05273,45.8288],[9.07471,46.11894],[9.27246,46.25585],[9.25049,46.43786],[9.44824,46.49839],[9.49219,46.31658],[9.68994,46.31658],[9.95361,46.36209],[10.06348,46.17983],[10.17334,46.25585],[10.0415,46.453],[10.08545,46.60417],[10.26123,46.66452],[10.45898,46.49839],[10.50293,46.61926],[10.39307,46.70974],[10.41504,46.86019],[10.61279,46.87521],[11.03027,46.76997],[11.16211,46.93526],[11.27197,46.99524],[11.53564,47.01023],[11.7334,46.99524],[12.2168,47.10004],[12.15088,46.93526],[12.43652,46.70974],[12.96387,46.61926],[13.73291,46.54375],[13.71094,46.42271],[13.40332,46.33176],[13.40332,46.22545],[13.66699,46.17983],[13.51318,46.05799],[13.64502,45.96642],[13.5791,45.85941],[13.93066,45.64477],[13.82629,45.5756],[13.6,45.6294],[12.9,45.4],[12.8,45],[18.9,40.3],[18.5,39],[15,36],[11,38],[9.6,43.2],[7.6,43.5]]]}},IT_Lazio:{type:"Feature",id:"IT_Lazio",properties:{},geometry:{type:"Polygon",coordinates:[[[13.23814,42.1301],[13.19363,42.15923],[13.17062,42.15169],[13.12434,42.17797],[13.08798,42.17886],[13.08575,42.14318],[13.0317,42.12309],[13.01946,42.07634],[13.05545,42.01736],[13.10194,42.00898],[13.10589,42.02698],[13.36437,41.92475],[13.384,41.90419],[13.35751,41.8694],[13.38052,41.81709],[13.4169,41.83467],[13.50508,41.8016],[13.52044,41.77297],[13.57182,41.7543],[13.66214,41.81144],[13.70555,41.78747],[13.72956,41.7989],[13.7629,41.7488],[13.81162,41.75426],[13.85645,41.73124],[13.89541,41.73405],[13.98311,41.66238],[14.01182,41.60835],[13.99895,41.57448],[14.02596,41.55567],[14.00526,41.53875],[14.0275,41.52321],[13.97291,41.49404],[13.99278,41.48208],[13.9779,41.46249],[13.90257,41.42273],[13.86123,41.41763],[13.8886,41.40081],[13.8688,41.36272],[13.88974,41.29748],[13.82898,41.28154],[13.83083,41.2502],[13.77126,41.24136],[13.45667,40.77769],[11.52381,41.03693],[11.44922,42.37798],[11.48889,42.43937],[11.61771,42.43604],[11.61626,42.48862],[11.56011,42.51595],[11.58852,42.54226],[11.57917,42.56803],[11.61401,42.55723],[11.64337,42.56635],[11.71111,42.61091],[11.73597,42.60666],[11.74975,42.63965],[11.80478,42.644],[11.77554,42.70951],[11.80156,42.70719],[11.81949,42.74543],[11.74602,42.78576],[11.77424,42.82107],[11.80685,42.79485],[11.8137,42.82267],[11.84851,42.84008],[11.90558,42.8325],[11.92743,42.78092],[11.97948,42.76459],[11.96293,42.72669],[11.9301,42.71295],[11.94133,42.6833],[12.03,42.64324],[12.10666,42.66464],[12.12406,42.64929],[12.16101,42.67691],[12.20434,42.66046],[12.24292,42.62906],[12.22819,42.61077],[12.24626,42.60256],[12.23866,42.57218],[12.27504,42.55991],[12.26676,42.53347],[12.29027,42.51904],[12.27477,42.50921],[12.30735,42.4973],[12.29041,42.49164],[12.32537,42.49476],[12.35123,42.47365],[12.39017,42.49819],[12.41905,42.49765],[12.41244,42.46756],[12.43038,42.45802],[12.41368,42.45517],[12.41365,42.4256],[12.4636,42.42909],[12.44469,42.39882],[12.51169,42.40311],[12.52874,42.36445],[12.60642,42.40245],[12.61481,42.46511],[12.64109,42.4678],[12.6495,42.44331],[12.67465,42.44242],[12.74156,42.47053],[12.71114,42.50079],[12.89273,42.5635],[12.88052,42.60935],[13.00524,42.61622],[13.02522,42.64],[13.06423,42.62427],[13.13,42.66053],[13.14645,42.64714],[13.17506,42.66707],[13.19025,42.73363],[13.25415,42.72145],[13.2645,42.74019],[13.28589,42.74049],[13.35851,42.69533],[13.35059,42.66968],[13.37022,42.6507],[13.4092,42.64383],[13.39493,42.59223],[13.29421,42.5705],[13.28454,42.58349],[13.24686,42.57367],[13.19228,42.58849],[13.15673,42.54102],[13.17934,42.48031],[13.11708,42.44489],[13.19508,42.39017],[13.15427,42.35797],[13.22737,42.32031],[13.23563,42.27871],[13.28229,42.23874],[13.33653,42.22338],[13.34238,42.19939],[13.3808,42.18142],[13.34871,42.17689],[13.35488,42.16769],[13.32819,42.16483],[13.30621,42.13923],[13.23814,42.1301]]]}},IT_Roma_Capitale:{type:"Feature",id:"IT_Roma_Capitale",properties:{},geometry:{type:"Polygon",coordinates:[[[11.6,42.16],[12.28,42.2],[12.52,42.31],[13.27,41.92],[13.15,41.58],[12.6,41.16],[11.6,42.16]]]}},south_tyrol:{type:"Feature",id:"south_tyrol",properties:{},geometry:{type:"Polygon",coordinates:[[[10.45624,46.86582],[10.73639,46.89211],[10.82977,46.80946],[10.96161,46.81322],[11.1319,46.99149],[11.49067,47.01233],[11.68121,47.04018],[11.7691,47.01023],[12.16736,47.115],[12.28546,47.08322],[12.18384,46.98213],[12.30469,46.85831],[12.37335,46.73421],[12.49969,46.67017],[12.34039,46.61737],[12.08771,46.64944],[12.0163,46.52297],[11.8515,46.49272],[11.66336,46.48657],[11.56929,46.34077],[11.399,46.25585],[11.18958,46.21072],[11.13739,46.2867],[11.20193,46.44732],[10.91904,46.42603],[10.61966,46.43833],[10.44113,46.49036],[10.36766,46.68854],[10.45624,46.86582]]]}},trentino:{type:"Feature",id:"trentino",properties:{},geometry:{type:"Polygon",coordinates:[[[10.49332,46.35641],[10.59219,46.46624],[10.76317,46.49697],[10.84076,46.45536],[11.07971,46.54469],[11.23627,46.50123],[11.21086,46.32559],[11.1779,46.27341],[11.23352,46.2473],[11.32416,46.30235],[11.5583,46.40378],[11.62628,46.5069],[11.83502,46.54233],[11.91399,46.44306],[11.85356,46.34124],[11.99158,46.18363],[11.84464,46.08466],[11.72791,46.07704],[11.69907,45.95592],[11.51093,45.97979],[11.28845,45.8814],[11.21567,45.76273],[11.16074,45.68316],[10.90256,45.66013],[10.82016,45.71097],[10.84076,45.81827],[10.51529,45.76752],[10.41504,46.00269],[10.51941,46.2112],[10.49332,46.35641]]]}},norway:{type:"Feature",id:"norway",properties:{},geometry:{type:"Polygon",coordinates:[[[25.98816,69.6179],[25.24109,68.60752],[20.42908,68.97318],[16.9519,67.9499],[13.77686,64.59561],[14.28223,64.47279],[14.08447,63.99524],[13.02979,64.10101],[12.00806,63.2633],[12.14813,61.6586],[12.87323,61.31245],[12.67548,61.0636],[12.26074,61.00241],[12.60681,60.50593],[12.49146,60.08128],[12.17285,59.88756],[11.87622,59.84895],[11.94214,59.69547],[11.6922,59.58998],[11.84601,59.25044],[11.64276,58.89471],[11.45325,58.88194],[11.44775,59.00168],[11.34888,59.11254],[11.18134,59.08009],[11.06186,58.97054],[8,57.5],[3,57.5],[3,83],[40,83],[35,71],[29.61365,69.28629],[27.98767,69.99711],[25.98816,69.6179]]]}},poland:{type:"Feature",id:"poland",properties:{},geometry:{type:"Polygon",coordinates:[[[14.03,52.84],[14.34,53.26],[14.13,54.16],[15.95,54.52],[16.31,54.76],[17.13,54.97],[18.29,55.08],[18.9,54.98],[19.69,54.5],[21.47,54.37],[22.9,54.46],[23.39,54.3],[24.01,53.17],[24.03,52.71],[23.29,52.3],[23.74,52.09],[23.64,51.61],[24.24,50.86],[24.11,50.41],[23.78,50.34],[22.77,49.55],[22.96,48.97],[22.18,49.1],[21.6,49.38],[20.93,49.24],[20.47,49.34],[20.12,49.13],[19.76,49.14],[19.45,49.51],[18.94,49.34],[18.48,49.85],[17.83,49.92],[17.54,50.21],[17.06,50.35],[17.08,50.18],[16.65,50.05],[16.11,50.41],[16.3,50.6],[16.01,50.54],[15.34,50.73],[15.14,50.93],[14.78,50.82],[14.94,51.27],[14.5,51.81],[14.66,52.05],[14.53,52.57],[14.03,52.84]]]}},slovenia:{type:"Feature",id:"slovenia",properties:{},geometry:{type:"Polygon",coordinates:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.37688,45.56647],[13.63953,45.6426],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]]}},spain:{type:"Feature",id:"spain",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-19,29],[-13,30],[-13,29],[-14,27.8],[-19,27],[-19,29]]],[[[-8.89106,41.82289],[-10,44],[-4,44],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[5,40],[4,39],[-2.2,36.5],[-5.6,35.95],[-6,36],[-7.37535,37.15354],[-7.40832,37.16822],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]]}},sweden:{type:"Feature",id:"sweden",properties:{},geometry:{type:"Polygon",coordinates:[[[10.57159,58.2445],[10.63202,58.9245],[11.35712,59.12804],[11.53839,58.91174],[11.62079,58.92308],[11.75812,59.24341],[11.65649,59.61777],[11.85974,59.7121],[11.82129,59.84481],[11.95862,59.91098],[12.15363,59.91235],[12.44476,60.0895],[12.48322,60.32151],[12.56012,60.50458],[12.36511,60.71217],[12.19482,61.01572],[12.64801,61.09415],[12.82928,61.34276],[12.55463,61.55018],[12.42828,61.54495],[12.12341,61.71331],[12.28546,62.26664],[12.03278,62.60851],[12.10968,62.74718],[12.06024,62.89772],[12.18658,62.99765],[11.95587,63.28183],[12.18109,63.47873],[12.1344,63.59012],[12.659,63.9856],[12.90619,64.0722],[13.20831,64.10461],[13.9801,64.03014],[14.06525,64.46214],[13.60382,64.56968],[14.26025,65.11608],[14.31519,65.23831],[14.45251,65.31412],[14.47998,65.62656],[14.57886,65.80953],[14.49097,66.15163],[14.99634,66.17161],[15.4248,66.29337],[15.33691,66.51107],[16.04004,66.93221],[16.37512,67.06743],[16.35864,67.21467],[16.06201,67.42015],[16.1499,67.52957],[16.37512,67.55266],[16.70471,67.91688],[17.25952,68.13067],[17.88025,67.99523],[18.09448,68.19809],[18.06702,68.54432],[18.39661,68.58848],[19.00085,68.52019],[19.89075,68.39109],[20.13245,68.48798],[19.89075,68.55637],[20.28076,68.78613],[19.99512,69.06268],[20.62134,69.08033],[20.86853,69.03518],[21.24756,68.8437],[21.92322,68.60652],[22.90649,68.39514],[23.73596,67.96639],[23.5437,67.8362],[23.62061,67.47492],[23.79639,67.44544],[23.81287,67.26992],[23.63159,67.23806],[24.04358,66.82868],[23.91174,66.57448],[23.71399,66.31986],[24.22485,65.97333],[24.04358,65.64469],[21.00586,63.63894],[18.57239,61.83023],[19.18762,60.53297],[19.11346,60.18387],[19.66827,59.82687],[19.90173,58.07788],[18.78662,56.9869],[16.73218,56.05977],[15.0238,55.72711],[14.36462,55.31977],[13.1163,55.22276],[12.7002,55.30414],[12.82654,55.57834],[12.84851,55.72402],[12.79358,55.83214],[12.6123,56.0751],[12.49146,56.13331],[12.07947,56.30435],[11.35437,57.67185],[10.57159,58.2445]]]}},east_midlands_uk:{type:"Feature",id:"east_midlands_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.03031,53.53488],[0.28564,53.56315],[0.48889,53.10722],[0.27299,52.82421],[0.24507,52.7845],[0.27219,52.77279],[0.18631,52.73533],[0.14206,52.7399],[0.08901,52.72361],[0.06361,52.72737],[0.04413,52.71436],[0.04883,52.68175],[0.02104,52.66476],[-0.03129,52.66151],[-0.06373,52.67521],[-0.08777,52.66676],[-0.10221,52.67218],[-0.14108,52.65149],[-0.18003,52.66054],[-0.19288,52.65242],[-0.20605,52.66805],[-0.26064,52.65139],[-0.28925,52.67025],[-0.335,52.67485],[-0.35023,52.66159],[-0.40569,52.64802],[-0.45065,52.65411],[-0.49897,52.63931],[-0.52006,52.64143],[-0.55014,52.61223],[-0.54419,52.59287],[-0.55813,52.59447],[-0.57192,52.58579],[-0.58149,52.59587],[-0.58865,52.58679],[-0.60303,52.58857],[-0.66093,52.56893],[-0.69783,52.5457],[-0.71564,52.52237],[-0.75723,52.51093],[-0.77488,52.51826],[-0.82013,52.51552],[-0.86871,52.52699],[-0.88346,52.51395],[-0.88214,52.49315],[-0.89806,52.4869],[-0.88241,52.47127],[-0.90065,52.45994],[-0.94219,52.46777],[-0.95192,52.47741],[-1.0007,52.47092],[-1.04452,52.44573],[-1.03429,52.43627],[-1.04987,52.42225],[-1.08439,52.43628],[-1.12928,52.41609],[-1.14947,52.39701],[-1.20141,52.39648],[-1.30715,52.49423],[-1.52226,52.57033],[-1.52716,52.58272],[-1.56075,52.59612],[-1.55447,52.61472],[-1.57139,52.6353],[-1.54714,52.64218],[-1.54245,52.65362],[-1.55281,52.66845],[-1.58965,52.68724],[-1.59082,52.69801],[-1.65505,52.69878],[-1.65662,52.72173],[-1.70372,52.7298],[-1.69687,52.75272],[-1.66654,52.78471],[-1.61113,52.78139],[-1.61435,52.78826],[-1.58887,52.79985],[-1.59183,52.80947],[-1.6105,52.81639],[-1.58536,52.8317],[-1.62672,52.85441],[-1.69028,52.86445],[-1.70061,52.86057],[-1.70435,52.86666],[-1.72527,52.85964],[-1.77712,52.88377],[-1.79092,52.88023],[-1.80186,52.88613],[-1.81171,52.88058],[-1.83295,52.8869],[-1.85422,52.93063],[-1.82982,52.94565],[-1.82678,52.97707],[-1.76257,52.99965],[-1.75775,53.01698],[-1.75978,53.03869],[-1.7847,53.04991],[-1.77566,53.05933],[-1.79424,53.08837],[-1.78373,53.10281],[-1.82144,53.13579],[-1.81254,53.15432],[-1.8393,53.1769],[-1.87403,53.19536],[-1.95671,53.21373],[-1.96237,53.22622],[-1.9896,53.21572],[-1.97486,53.23106],[-2.00948,53.26065],[-2.00679,53.35457],[-2.009,53.36201],[-2.03173,53.36573],[-2.03385,53.37517],[-2.00464,53.38633],[-1.99233,53.41519],[-2.02371,53.42055],[-2.02738,53.43233],[-2.01366,53.43988],[-2.00422,53.43592],[-2.00823,53.44155],[-1.98579,53.45523],[-1.98809,53.48033],[-1.97428,53.48838],[-1.97159,53.50434],[-1.92197,53.50995],[-1.92678,53.52095],[-1.91189,53.53803],[-1.89411,53.5336],[-1.87349,53.54041],[-1.84182,53.51989],[-1.82223,53.52108],[-1.80428,53.537],[-1.77188,53.53384],[-1.74155,53.54105],[-1.72318,53.55991],[-1.66945,53.5532],[-1.65103,53.56166],[-1.61581,53.56305],[-1.59636,53.57692],[-1.59109,53.60677],[-1.55023,53.60421],[-1.53078,53.59311],[-1.51867,53.5997],[-1.49656,53.59736],[-1.49512,53.60317],[-1.48371,53.59485],[-1.44763,53.61272],[-1.40036,53.59865],[-1.3767,53.60646],[-1.35612,53.59535],[-1.35143,53.58106],[-1.30782,53.57535],[-1.25803,53.59198],[-1.24825,53.61634],[-1.21778,53.62429],[-1.21602,53.642],[-1.1886,53.63583],[-1.15503,53.64319],[-1.13504,53.63254],[-1.12095,53.64688],[-0.99046,53.6612],[-0.94448,53.65868],[-0.86533,53.63769],[-0.89792,53.58325],[-0.90111,53.5687],[-0.89099,53.56654],[-0.90126,53.54788],[-0.89233,53.53738],[-0.94654,53.52732],[-0.95001,53.51363],[-0.93209,53.51065],[-0.93557,53.5025],[-0.90047,53.47513],[-0.92046,53.46446],[-0.87373,53.46146],[-0.87192,53.46629],[-0.79748,53.45504],[-0.78436,53.46336],[-0.78439,53.47665],[-0.77157,53.47918],[-0.76811,53.4989],[-0.75211,53.50051],[-0.73959,53.51991],[-0.62449,53.51282],[-0.62975,53.45819],[-0.55179,53.4595],[-0.47175,53.47485],[-0.48663,53.48045],[-0.48838,53.50484],[-0.40507,53.51759],[-0.40814,53.53208],[-0.43066,53.54631],[-0.50123,53.53744],[-0.46702,53.54894],[-0.429,53.5745],[-0.41967,53.56375],[-0.33594,53.5586],[-0.30342,53.59077],[-0.30093,53.61636],[-0.24847,53.59364],[-0.25139,53.58463],[-0.23466,53.58623],[-0.22255,53.56799],[-0.19169,53.56844],[-0.21988,53.53258],[-0.21059,53.53168],[-0.20408,53.51174],[-0.2106,53.48626],[-0.18856,53.48451],[-0.1818,53.46862],[-0.15368,53.46565],[-0.14923,53.44667],[-0.13188,53.43591],[-0.12034,53.43357],[-0.08221,53.45112],[-0.10786,53.46987],[-0.0898,53.47765],[-0.09548,53.48596],[-0.07526,53.48931],[-0.06493,53.51878],[-0.01452,53.51538],[0.03031,53.53488]]]}},"england-west-midlands":{type:"Feature",id:"england-west-midlands",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.28493,52.44175],[-3.12706,52.96995],[-1.95817,53.27605],[-1.1222,52.36367],[-1.59859,51.90733],[-2.65611,51.7761],[-3.10848,51.95414],[-3.28493,52.44175]]]}},london_uk:{type:"Feature",id:"london_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.23926,51.43251],[0.23923,51.43329],[0.23926,51.43251],[0.23717,51.4241],[0.205,51.39919],[0.18385,51.37628],[0.16188,51.36621],[0.15614,51.3539],[0.1603,51.31026],[0.14958,51.30173],[0.14213,51.29098],[0.06692,51.27361],[-0.01594,51.26864],[-0.05766,51.2586],[-0.10949,51.25943],[-0.16628,51.26848],[-0.19872,51.25854],[-0.22666,51.2587],[-0.27352,51.28757],[-0.31813,51.30077],[-0.33644,51.31532],[-0.40313,51.30581],[-0.44436,51.31987],[-0.47985,51.3302],[-0.50762,51.37142],[-0.53414,51.39494],[-0.54109,51.42774],[-0.53264,51.43923],[-0.5152,51.46248],[-0.49617,51.48894],[-0.50203,51.53945],[-0.5278,51.55474],[-0.53166,51.5611],[-0.53569,51.57289],[-0.53596,51.5778],[-0.53455,51.58275],[-0.53376,51.58792],[-0.51516,51.6337],[-0.49776,51.65205],[-0.4901,51.66912],[-0.45924,51.67692],[-0.44684,51.69442],[-0.42579,51.71213],[-0.39306,51.715],[-0.38079,51.71654],[-0.34459,51.70948],[-0.2838,51.71515],[-0.26707,51.71395],[-0.23509,51.69056],[-0.22093,51.68445],[-0.17729,51.68441],[-0.10644,51.69165],[-0.05899,51.68257],[0.02324,51.678],[0.0691,51.68854],[0.10856,51.68336],[0.19863,51.65015],[0.25714,51.61353],[0.28187,51.57813],[0.29039,51.55903],[0.26811,51.50265],[0.26882,51.49783],[0.26782,51.49042],[0.2659,51.47443],[0.25509,51.46053],[0.23586,51.44791],[0.23926,51.43251]]]}},united_kingdom:{type:"Feature",id:"united_kingdom",properties:{name:"United Kingdom",source:"OpenStreetMap"},geometry:{type:"Polygon",coordinates:[[[-7.24863,55.06999],[-6.96705,55.19847],[-6.59182,55.36664],[-9.93166,58.01975],[0.32957,61.43878],[2.43894,51.64531],[0.72508,50.42953],[-7.66848,49.03788],[-5.93264,51.46771],[-5.4053,53.54032],[-6.07527,54.0096],[-6.28173,54.11135],[-6.309,54.10669],[-6.31788,54.09098],[-6.33629,54.09472],[-6.33993,54.11189],[-6.3662,54.11374],[-6.36237,54.0766],[-6.37492,54.06914],[-6.37907,54.06909],[-6.37911,54.06907],[-6.37918,54.06902],[-6.39105,54.05885],[-6.41198,54.06306],[-6.44345,54.05649],[-6.45607,54.07252],[-6.47779,54.07709],[-6.4713,54.0663],[-6.51051,54.05268],[-6.53187,54.05968],[-6.55772,54.04917],[-6.58643,54.05757],[-6.59499,54.04462],[-6.62381,54.03646],[-6.66426,54.06917],[-6.66202,54.09283],[-6.64506,54.096],[-6.66127,54.12266],[-6.64886,54.12138],[-6.63961,54.13187],[-6.63436,54.16317],[-6.66539,54.19316],[-6.70601,54.20005],[-6.72106,54.18197],[-6.74076,54.18192],[-6.75617,54.19926],[-6.77562,54.19895],[-6.80097,54.21317],[-6.80042,54.2211],[-6.81617,54.22302],[-6.82774,54.26149],[-6.87804,54.27924],[-6.87229,54.28794],[-6.859,54.28191],[-6.85087,54.29728],[-6.87594,54.34641],[-6.90626,54.3503],[-6.91129,54.37474],[-6.93074,54.37575],[-6.9237,54.38284],[-6.95963,54.39221],[-6.98165,54.40946],[-6.99601,54.40538],[-7.0291,54.42137],[-7.05724,54.41108],[-7.07234,54.38839],[-7.10979,54.36824],[-7.10388,54.35574],[-7.15344,54.33501],[-7.18882,54.33765],[-7.17974,54.32046],[-7.17949,54.30924],[-7.19789,54.31106],[-7.21219,54.29962],[-7.17302,54.28613],[-7.17937,54.2726],[-7.16092,54.27371],[-7.14225,54.25559],[-7.15893,54.24396],[-7.14594,54.23957],[-7.14503,54.22473],[-7.17104,54.2176],[-7.18808,54.22492],[-7.1986,54.21578],[-7.22085,54.21581],[-7.23182,54.20557],[-7.24806,54.20446],[-7.24915,54.19817],[-7.233,54.19784],[-7.25942,54.19225],[-7.25828,54.17737],[-7.24028,54.1697],[-7.25812,54.16451],[-7.26296,54.13741],[-7.29195,54.11911],[-7.30891,54.13211],[-7.28551,54.13626],[-7.30149,54.14421],[-7.28379,54.15386],[-7.27997,54.16797],[-7.2913,54.17196],[-7.33956,54.14672],[-7.30533,54.12336],[-7.31867,54.11329],[-7.32713,54.12458],[-7.34602,54.11645],[-7.3632,54.1316],[-7.39181,54.12013],[-7.37279,54.13963],[-7.42078,54.13705],[-7.40959,54.15646],[-7.44192,54.15409],[-7.46841,54.14081],[-7.47919,54.12227],[-7.5281,54.13574],[-7.54738,54.12214],[-7.56576,54.12659],[-7.57454,54.14151],[-7.61043,54.14378],[-7.62966,54.1703],[-7.66425,54.18797],[-7.67659,54.18196],[-7.68829,54.20197],[-7.68543,54.20776],[-7.7394,54.20353],[-7.74858,54.20942],[-7.80368,54.20707],[-7.81173,54.20073],[-7.86017,54.21728],[-7.86046,54.26026],[-7.87322,54.27945],[-7.86187,54.29343],[-7.88087,54.29188],[-7.9017,54.30143],[-7.91095,54.29595],[-7.9616,54.31247],[-8.00093,54.35846],[-8.03129,54.35671],[-8.05733,54.36572],[-8.08416,54.39741],[-8.16026,54.44028],[-8.14291,54.45092],[-8.17751,54.46476],[-8.11467,54.46903],[-8.11324,54.4764],[-8.09148,54.47653],[-8.09868,54.48433],[-8.08933,54.48708],[-8.04265,54.48763],[-8.04185,54.50638],[-8.00601,54.54594],[-7.9703,54.54705],[-7.94973,54.53363],[-7.85055,54.53313],[-7.82402,54.54427],[-7.83325,54.55223],[-7.79659,54.57163],[-7.79341,54.58188],[-7.76212,54.58588],[-7.75151,54.59878],[-7.69725,54.61007],[-7.70877,54.63495],[-7.74165,54.61797],[-7.75797,54.62503],[-7.77236,54.62149],[-7.81366,54.64411],[-7.82828,54.63305],[-7.85213,54.63078],[-7.85669,54.65057],[-7.89164,54.65594],[-7.9099,54.66828],[-7.91381,54.67596],[-7.89766,54.68701],[-7.92089,54.69596],[-7.91804,54.70282],[-7.8796,54.70269],[-7.83665,54.73642],[-7.81761,54.73378],[-7.8047,54.7186],[-7.78875,54.71964],[-7.75006,54.70428],[-7.73551,54.71683],[-7.7116,54.72611],[-7.69723,54.72356],[-7.63657,54.75151],[-7.60944,54.74415],[-7.59117,54.74438],[-7.57919,54.75047],[-7.57865,54.74191],[-7.5698,54.74384],[-7.54826,54.74101],[-7.53859,54.751],[-7.54804,54.75711],[-7.54795,54.78835],[-7.52847,54.80757],[-7.47096,54.8348],[-7.44188,54.87561],[-7.45258,54.89849],[-7.44727,54.93524],[-7.39202,54.94545],[-7.4072,54.95521],[-7.4027,54.96689],[-7.40705,54.98294],[-7.39135,54.99774],[-7.40558,55.00332],[-7.37023,55.03476],[-7.34516,55.05083],[-7.31828,55.04507],[-7.29947,55.0561],[-7.28944,55.04771],[-7.27251,55.06357],[-7.24863,55.06999]]]}},canada_full:{type:"Feature",id:"canada_full",properties:{},geometry:{type:"Polygon",coordinates:[[[-140.99854,69.64945],[-120.9375,78.7335],[-91.05469,82.7432],[-75.58594,83.40004],[-63.45703,83.15311],[-59.32617,82.37915],[-63.76465,81.42049],[-67.19238,80.79583],[-73.21289,78.85307],[-74.9707,76.33114],[-61.34766,70.75797],[-50.1416,46.67959],[-65.98389,42.85181],[-66.95892,44.48769],[-66.9397,44.81692],[-67.13745,45.15493],[-67.26379,45.18591],[-67.31873,45.1278],[-67.43958,45.21881],[-67.44507,45.58329],[-67.79114,45.67164],[-67.78015,47.07012],[-68.19763,47.35743],[-68.39539,47.35743],[-68.37891,47.29413],[-68.90625,47.17478],[-69.06006,47.23449],[-69.08203,47.43552],[-69.22485,47.46524],[-70.00488,46.70974],[-70.05981,46.41514],[-70.18066,46.36209],[-70.3125,46.21025],[-70.24658,46.14178],[-70.3125,45.97406],[-70.26855,45.91294],[-70.42236,45.80583],[-70.42236,45.72152],[-70.71899,45.49865],[-70.62012,45.38302],[-70.80688,45.4293],[-70.85083,45.22848],[-71.00464,45.3367],[-71.1145,45.25169],[-71.26831,45.29035],[-71.41113,45.24395],[-71.5155,45.0153],[-74.81689,45.0153],[-75.31128,44.84808],[-75.7782,44.51218],[-75.82214,44.4377],[-76.43188,44.09942],[-76.79993,43.63011],[-78.68683,43.63806],[-79.19495,43.45292],[-79.07204,43.26521],[-79.05693,43.25671],[-79.04594,43.13807],[-79.06998,43.12103],[-79.06311,43.11652],[-79.05693,43.10951],[-79.07616,43.08393],[-79.07684,43.07691],[-79.01505,43.06839],[-78.99719,43.05785],[-79.02672,43.02071],[-79.01779,42.98456],[-78.98003,42.97099],[-78.96423,42.95843],[-78.93402,42.95542],[-78.91136,42.93883],[-78.90518,42.90011],[-78.93127,42.82361],[-80.07935,42.38289],[-81.27686,42.20818],[-82.39197,41.68112],[-82.68311,41.67701],[-83.07861,41.86547],[-83.15552,42.03909],[-83.12531,42.12064],[-83.13904,42.23462],[-83.07587,42.31185],[-82.98523,42.33418],[-82.81219,42.37478],[-82.63916,42.56117],[-82.59521,42.54903],[-82.52655,42.61375],[-82.41669,43.00063],[-82.13379,43.59631],[-82.51831,45.34442],[-83.59772,45.82114],[-83.43567,45.99696],[-83.57162,46.10847],[-83.65402,46.12275],[-83.76663,46.10466],[-83.82843,46.11989],[-83.89984,46.06084],[-83.95615,46.05989],[-83.974,46.1018],[-84.00833,46.11609],[-84.00696,46.14559],[-84.07974,46.18934],[-84.10995,46.24065],[-84.0976,46.25585],[-84.11545,46.26724],[-84.12094,46.31564],[-84.10309,46.32038],[-84.13467,46.36115],[-84.14841,46.42082],[-84.10995,46.50359],[-84.12781,46.531],[-84.14085,46.53241],[-84.17313,46.52722],[-84.19373,46.54092],[-84.226,46.53525],[-84.26582,46.49603],[-84.2926,46.49225],[-84.34135,46.50595],[-84.37225,46.50879],[-84.44023,46.49036],[-84.47662,46.45489],[-84.55353,46.45867],[-84.76776,46.62492],[-84.84741,46.88272],[-88.38501,48.31243],[-89.32983,47.96786],[-93.21899,48.64743],[-93.80127,48.5166],[-93.83423,48.63291],[-94.6637,48.75257],[-94.8175,49.32691],[-95.15259,49.38595],[-95.15533,49.00184],[-123.31879,49.00004],[-122.99469,48.7761],[-123.2666,48.69096],[-123.11279,48.37815],[-123.44238,48.22467],[-124.7168,48.49477],[-128.49609,48.74895],[-131.2207,53.61858],[-130.75928,54.73731],[-129.99023,55.27912],[-130.07813,56.10881],[-131.74805,56.63206],[-135.53833,59.80063],[-137.47192,58.90465],[-138.67493,59.78958],[-138.6969,59.90822],[-139.20227,60.09772],[-139.08142,60.35141],[-139.71863,60.33239],[-139.98779,60.18523],[-140.46021,60.30791],[-140.52063,60.22618],[-141.01501,60.30519],[-140.99854,69.64945]]]}},ottawa_gatineau:{type:"Feature",id:"ottawa_gatineau",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.23413,45.50827],[-76.12839,45.55829],[-75.26184,45.58041],[-75.13412,45.39652],[-75.42938,45.32512],[-75.35385,45.17816],[-75.82489,44.93564],[-76.34537,45.36855],[-76.23413,45.50827]]]}},vancouver_metro:{type:"Feature",id:"vancouver_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.32,49],[-123.45,49.38],[-123.26,49.47],[-122.24,49.27],[-122.2,49],[-123.32,49]]]}},cuba:{type:"Feature",id:"cuba",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.5,21.75],[-83.5,23.5],[-80,23.5],[-73.5,20.4],[-74.5,19.5],[-78,19.5],[-85.5,21.75]]]}},nicaragua:{type:"Feature",id:"nicaragua",properties:{},geometry:{type:"Polygon",coordinates:[[[-88,13],[-87.56104,13.13298],[-87.36877,12.99921],[-86.97876,13.02597],[-86.88538,13.28272],[-86.7041,13.29876],[-86.77002,13.76873],[-86.31409,13.77407],[-86.1438,14.046],[-86.01746,14.05133],[-85.75378,13.89141],[-85.16602,14.31761],[-84.96277,14.80144],[-84.4574,14.63674],[-83.39722,15.03499],[-82.5,14.9],[-82.8,12],[-83.676,10.95],[-83.66,10.8],[-83.92,10.7],[-84.688,11.076],[-84.91,10.945],[-85.615,11.215],[-85.7,11.06],[-86,11.06],[-88,13]]]}},boston_metro:{type:"Feature",id:"boston_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,41.91],[-71,41.91],[-71.42,42.05],[-71.57,42.18],[-71.64,42.4],[-71.57,42.52],[-71.35,42.64],[-71.1,42.7],[-70.5,42.7],[-70.5,41.91]]]}},central_pa:{type:"Feature",id:"central_pa",properties:{},geometry:{type:"Polygon",coordinates:[[[-78.7,41.5],[-77,41.5],[-76,40],[-76,39.72],[-79.3,39.72],[-78.7,41.5]]]}},chattanooga:{type:"Feature",id:"chattanooga",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.634,34.743],[-85.634,35.282],[-84.933,35.282],[-84.933,34.743],[-85.634,34.743]]]}},cleveland:{type:"Feature",id:"cleveland",properties:{},geometry:{type:"Polygon",coordinates:[[[-82.5,41.5],[-80.95,42],[-80.95,41],[-82.5,41],[-82.5,41.5]]]}},colorado:{type:"Feature",id:"colorado",properties:{},geometry:{type:"Polygon",coordinates:[[[-109.05,37],[-109.05,41],[-102.05,41],[-102.05,37],[-109.05,37]]]}},dc_metro:{type:"Feature",id:"dc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04437,38.70266],[-77.27783,38.69409],[-77.57172,38.91668],[-77.61017,39.1258],[-77.27509,39.21523],[-77.08694,39.21204],[-76.87546,39.05119],[-76.69968,38.97863],[-76.71066,38.77657],[-76.84662,38.7048],[-77.04437,38.70266]]]}},dfw_metro:{type:"Feature",id:"dfw_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.75,32.25],[-97.75,33.4],[-96,33.4],[-96,32.25],[-97.75,32.25]]]}},grand_junction_co:{type:"Feature",id:"grand_junction_co",properties:{},geometry:{type:"Polygon",coordinates:[[[-109,39.4],[-108.1,39.4],[-107.8,39.16],[-107.8,38.7],[-108.1,38.5],[-109,39],[-109,39.4]]]}},la_metro:{type:"Feature",id:"la_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-118.5,33.7],[-118.68,34.23],[-118.5,34.35],[-118,34.2],[-117.3,34.2],[-117.2,34.1],[-117.37,33.9],[-117.74,33.5],[-118.5,33.7]]]}},massachusetts:{type:"Feature",id:"massachusetts",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.53149,42.9725],[-69.40063,42.9725],[-69.40063,40.98819],[-71.55396,41.04622],[-71.53198,41.91863],[-73.70728,41.91045],[-73.53149,42.9725]]]}},minneapolis_st_paul_metro:{type:"Feature",id:"minneapolis_st_paul_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-93.801,44.578],[-93.801,45.348],[-92.666,45.348],[-92.666,44.578],[-93.801,44.578]]]}},mt_vernon_wa:{type:"Feature",id:"mt_vernon_wa",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.3,49],[-122,49],[-122,48],[-123.2,48.4],[-123.3,49]]]}},nyc_metro:{type:"Feature",id:"nyc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.73,40.64],[-73.95,41.38],[-73.6,40.95],[-73.25,41],[-73.25,40.6],[-74.43,40.43],[-74.73,40.64]]]}},philly_metro:{type:"Feature",id:"philly_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.7,40.3],[-75.3,40.4],[-74.7,40.3],[-74.45,40.1],[-74.9,39.55],[-75.5,39.55],[-75.8,39.7218],[-76.23,39.7211],[-75.7,40.3]]]}},phoenix:{type:"Feature",id:"phoenix",properties:{},geometry:{type:"Polygon",coordinates:[[[-113,32.7],[-113,34],[-111.1,34],[-111.1,32.7],[-113,32.7]]]}},portland_me:{type:"Feature",id:"portland_me",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,42.9],[-71,43.3],[-71,44.2],[-69.6,44.5],[-69,44],[-70.5,42.9]]]}},portland_or:{type:"Feature",id:"portland_or",properties:{},geometry:{type:"Polygon",coordinates:[[[-124.4,44.8],[-124.4,46.3],[-121.5,46.3],[-121.5,44.8],[-124.4,44.8]]]}},salt_lake_city:{type:"Feature",id:"salt_lake_city",properties:{},geometry:{type:"Polygon",coordinates:[[[-112.6,40.75],[-112.3,41.4],[-111.5,41.4],[-111.1,40.3],[-112,39.75],[-112.6,40.75]]]}},seattle:{type:"Feature",id:"seattle",properties:{},geometry:{type:"Polygon",coordinates:[[[-122.15,47.26],[-122.33,47.26],[-122.54,47.33],[-122.52,47.46],[-122.45,47.55],[-122.45,47.8],[-121.2,47.8],[-121.43,47.38],[-121.43,47.14],[-121.94,47.14],[-122,47.17],[-122,47.17],[-122.1,47.19],[-122.15,47.26]]]}},sf_bay_area:{type:"Feature",id:"sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.5,38.5],[-122.8,38.8],[-121.7,38.2],[-121.5,36.9],[-123,36.9],[-123.5,38.5]]]}},south_sf_bay_area:{type:"Feature",id:"south_sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-121.4566,37.48249],[-121.21628,37.17673],[-121.20529,36.95757],[-121.49368,36.95757],[-121.5596,36.8928],[-121.98257,37.12419],[-122.27234,37.39635],[-122.13501,37.48903],[-121.4566,37.48249]]]}},st_louis:{type:"Feature",id:"st_louis",properties:{},geometry:{type:"Polygon",coordinates:[[[-90.28,39.1],[-89.57,39.05],[-89.57,38.18],[-90.58,38],[-91.37,38.2],[-91.37,38.75],[-90.28,39.1]]]}},tampa_bay:{type:"Feature",id:"tampa_bay",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,28.2],[-82.2,28.2],[-82.2,27.55],[-83,27.55],[-83,28.2]]]}},usa_full:{type:"Feature",id:"usa_full",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-124.76179,48.41301],[-123.22752,48.18499],[-123.32289,49.00429],[-96.01312,49.00605],[-95.11054,49.412],[-93.99811,49.00671],[-89.43531,47.98378],[-88.34922,48.29633],[-87.50645,48.01427],[-83.2814,46.13885],[-82.17616,43.58854],[-82.66248,41.68895],[-79.00601,42.80053],[-79.15798,43.44626],[-78.76239,43.62496],[-76.90231,43.80246],[-75.07988,44.98029],[-72.02225,45.00598],[-71.41227,45.25488],[-70.46149,46.21766],[-69.25051,47.51223],[-67.75966,47.099],[-66.94528,44.71049],[-69.84893,43.26199],[-69.87974,40.99205],[-72.00202,40.99125],[-74.02112,39.57279],[-75.41474,35.05319],[-80.02453,32.01613],[-79.89011,26.85507],[-80.02,24.0071],[-84.01601,24.00527],[-84.01656,25.01258],[-81.99666,25.01349],[-81.9972,25.98268],[-84.01879,28.99618],[-86.02775,30.00475],[-88.01625,30.00389],[-88.01567,28.99443],[-90.90285,28.85645],[-93.74053,29.47421],[-95.55633,28.58761],[-96.80617,27.79782],[-96.95553,25.98216],[-97.43502,25.8266],[-98.01091,25.9928],[-99.23511,26.4476],[-100.00624,28.00822],[-101.25529,29.48105],[-102.1514,29.74757],[-102.71736,29.39206],[-103.25189,28.89087],[-104.58819,29.69979],[-105.02053,30.5361],[-106.20525,31.4467],[-106.28689,31.56133],[-106.42932,31.75206],[-106.48421,31.74645],[-106.53072,31.78209],[-108.18711,31.77551],[-108.19927,31.326],[-111.00893,31.33601],[-114.86123,32.47999],[-117.67593,32.46302],[-119.97759,33.00641],[-122.53697,36.85661],[-124.99343,40.05576],[-124.60595,45.90245],[-124.76179,48.41301]]],[[[-160.57876,22.50629],[-159.00937,22.50702],[-157.50474,21.9985],[-156.29276,21.22259],[-154.68902,19.88057],[-154.62178,18.7587],[-155.99619,18.77902],[-157.50832,20.9958],[-158.74706,21.24398],[-160.57822,21.49846],[-160.57876,22.50629]]],[[[-167.1572,68.722],[-164.9717,68.9947],[-163.0218,69.9707],[-160.4136,70.7398],[-156.1769,71.5633],[-140.9684,69.9535],[-140.9874,61.0119],[-139.1716,60.4127],[-138.0072,59.9918],[-135.123,59.7566],[-131.9759,56.9995],[-130.0071,57.0001],[-130.0044,54.0043],[-133.9948,54.0032],[-138.515,57.9986],[-138.516,58.9953],[-151.5013,58.992],[-151.5003,57.9988],[-151.9963,55.9992],[-158.0191,55.0028],[-159.0076,55.0025],[-162.4025,53.9567],[-171.4689,51.8215],[-177.9993,51.2554],[-178.0001,52.2446],[-173.8197,59.7401],[-172.5143,63.8767],[-169.0075,64.9988],[-169.0087,66.0015],[-168.0022,66.0018],[-164.8554,67.0255],[-167.1572,68.722]]],[[[-68.2,17.8],[-67.9,18.67],[-65.33,18.57],[-64.64,18.36],[-64.32,17.38],[-68.2,17.8]]],[[[146.2,15.4],[144.8,12.9],[144.2,13.2],[145.7,15.6],[146.2,15.4]]],[[[180,52.2],[180,51],[172,52.5],[172,53.5],[180,52.2]]]]}},wyoming:{type:"Feature",id:"wyoming",properties:{},geometry:{type:"Polygon",coordinates:[[[-111.05,41],[-111.05,45],[-104.05,45],[-104.05,41],[-111.05,41]]]}},australia_full:{type:"Feature",id:"australia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[146.07422,-44.43378],[131.66016,-44.65302],[124.54102,-41.44273],[116.45508,-39.36828],[108.80859,-39.16414],[103.18359,-27.60567],[95.27344,-24.04646],[96.30615,-11.15685],[106.25977,-9.92557],[116.47705,-13.98738],[122.77222,-11.65224],[126.43066,-11.48002],[129.26514,-9.92557],[134.89014,-9.92557],[139.46045,-10.14193],[141.55334,-9.99861],[141.7868,-9.77132],[142.229,-9.67115],[142.72614,-9.552],[143.30017,-9.39216],[144.24774,-9.24851],[144.44824,-9.59533],[149.5459,-12.68321],[154.90723,-18.02053],[156.42334,-21.55528],[158.02734,-24.68695],[160.0708,-26.03704],[167.34375,-26.6671],[170.354,-29.11378],[168.2666,-30.63791],[160.15869,-34.03445],[152.18262,-38.41056],[149.94141,-43.51669],[146.07422,-44.43378]]]}},argentina:{type:"Feature",id:"argentina",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.14602,-49.18818],[-72.91615,-48.93261],[-72.53201,-48.80072],[-72.58755,-48.48542],[-72.22624,-48.32339],[-72.49784,-47.96155],[-72.33315,-47.44938],[-71.86801,-47.23376],[-71.94851,-46.80983],[-71.64665,-46.68783],[-71.79939,-46.19141],[-71.6147,-45.97522],[-71.79762,-45.62288],[-71.46813,-45.4921],[-71.32472,-45.306],[-71.56043,-44.97863],[-72.04094,-44.90019],[-72.07396,-44.78023],[-71.46969,-44.73753],[-71.23704,-44.79082],[-71.13226,-44.4711],[-71.36469,-44.38958],[-71.80731,-44.42036],[-71.84736,-44.11002],[-71.64902,-43.94552],[-71.75129,-43.78527],[-71.60784,-43.62836],[-71.93082,-43.45685],[-71.76157,-43.1645],[-72.14281,-42.8979],[-72.1812,-42.69735],[-72.023,-42.41766],[-72.17288,-42.14043],[-71.72931,-42.12447],[-71.91021,-41.34113],[-71.8196,-41.06038],[-71.96387,-40.71955],[-71.8414,-40.4521],[-71.65704,-40.36426],[-71.82818,-40.20778],[-71.59266,-39.90123],[-71.67811,-39.56486],[-71.39497,-39.34179],[-71.42542,-38.92164],[-70.92524,-38.76298],[-70.84044,-38.54138],[-70.97623,-38.44222],[-70.98292,-38.10477],[-71.21191,-37.68901],[-71.11983,-37.4585],[-71.21555,-37.27261],[-71.09237,-37.11444],[-71.11982,-36.69792],[-71.03513,-36.47333],[-70.71285,-36.42687],[-70.70501,-36.27229],[-70.42451,-36.15581],[-70.38755,-35.60868],[-70.43201,-35.31842],[-70.58358,-35.27831],[-70.36203,-35.13645],[-70.21683,-34.61145],[-70.01089,-34.41389],[-70.03094,-34.28805],[-69.79507,-34.24304],[-69.90417,-33.77143],[-69.7705,-33.3611],[-70.00282,-33.32294],[-70.08089,-33.02919],[-70.00121,-32.8846],[-70.17038,-32.62555],[-70.14899,-32.46585],[-70.31918,-32.27335],[-70.35277,-32.0257],[-70.2106,-31.95769],[-70.46072,-31.84116],[-70.56691,-31.60016],[-70.49734,-31.12216],[-70.40805,-31.16633],[-70.23998,-30.61575],[-70.11719,-30.43102],[-69.89853,-30.35557],[-69.87492,-29.7043],[-70.01808,-29.38321],[-69.78724,-29.13008],[-69.68114,-28.47172],[-69.45679,-28.18357],[-69.17254,-27.97088],[-68.94231,-27.52325],[-68.8412,-27.15464],[-68.29854,-27.0389],[-68.2638,-26.91623],[-68.58734,-26.49294],[-68.55754,-26.2871],[-68.38108,-26.17822],[-68.57599,-25.42894],[-68.4999,-25.16149],[-68.34279,-25.1124],[-68.56789,-24.79739],[-68.26201,-24.40457],[-67.32231,-24.0344],[-66.99052,-23.00044],[-67.18066,-22.8138],[-67.02827,-22.54089],[-66.78247,-22.43778],[-66.73899,-22.23893],[-66.28793,-22.08605],[-66.24277,-21.79408],[-66.07589,-21.83493],[-65.74764,-22.10912],[-64.99322,-22.08239],[-64.53579,-22.29137],[-64.29933,-22.86509],[-64.24332,-22.56039],[-63.93139,-22],[-62.80617,-22],[-62.7913,-22.16193],[-62.3009,-22.48659],[-62.20671,-22.70418],[-61.73612,-23.23432],[-61.08824,-23.61393],[-60.9899,-23.81808],[-60.37353,-24.024],[-60.03941,-24.01156],[-59.47554,-24.33261],[-59.35397,-24.47821],[-58.67243,-24.83192],[-58.24167,-24.92801],[-57.76089,-25.17193],[-57.555,-25.4484],[-57.74064,-25.65045],[-57.89112,-25.9662],[-58.08473,-26.11185],[-58.22103,-26.41403],[-58.18996,-26.64518],[-58.31991,-26.85821],[-58.64913,-27.12662],[-58.59905,-27.29984],[-57.87482,-27.27527],[-57.48754,-27.44418],[-56.96564,-27.50202],[-56.84926,-27.6063],[-56.60117,-27.42102],[-56.3749,-27.58903],[-56.29432,-27.42003],[-56.06276,-27.306],[-55.73692,-27.44516],[-55.6057,-27.16241],[-55.42284,-26.99528],[-54.78695,-26.63111],[-54.61874,-26.20893],[-54.67933,-25.99524],[-54.65698,-25.67619],[-54.5842,-25.58952],[-54.4812,-25.62543],[-54.108,-25.495],[-53.86217,-25.65902],[-53.83619,-25.97166],[-53.6411,-26.21559],[-53.73094,-26.5097],[-53.67249,-26.91252],[-53.84355,-27.16453],[-53.959,-27.15804],[-54.21736,-27.38603],[-54.673,-27.57],[-54.814,-27.533],[-54.936,-27.772],[-55.38728,-27.98524],[-55.76677,-28.23982],[-55.69902,-28.42637],[-55.88091,-28.4715],[-56.29651,-28.80272],[-56.42475,-29.07897],[-56.59315,-29.12516],[-56.70164,-29.35913],[-57.328,-29.972],[-57.64923,-30.20184],[-57.63687,-30.33197],[-57.85924,-30.47701],[-57.8096,-30.91332],[-58.08141,-31.45457],[-57.98082,-31.58691],[-58.20653,-31.86773],[-58.10645,-32.24002],[-58.20464,-32.46055],[-58.0841,-32.99782],[-58.36693,-33.12177],[-58.49375,-33.57857],[-58.29507,-34.17809],[-57.9345,-34.4519],[-55.9,-35.6],[-57,-39],[-61,-41],[-63.5,-55],[-66.67094,-55.11906],[-67.27285,-54.90511],[-67.95071,-54.87373],[-68.60967,-54.91369],[-68.60676,-52.65902],[-68.41869,-52.3325],[-69.19014,-52.15044],[-69.48632,-52.15165],[-69.9955,-52.00074],[-71.92259,-51.99991],[-72.29907,-51.69791],[-72.28621,-50.65987],[-72.72636,-50.61667],[-73.06995,-50.78909],[-73.32848,-50.5716],[-73.52199,-50.15397],[-73.44481,-49.79226],[-73.53933,-49.49825],[-73.47299,-49.20464],[-73.14602,-49.18818]]]}},bolivia:{type:"Feature",id:"bolivia",properties:{},geometry:{type:"Polygon",coordinates:[[[-60.17487,-16.26675],[-58.32092,-16.31948],[-58.47336,-16.74472],[-58.39371,-17.18081],[-57.79152,-17.55501],[-57.71187,-17.73103],[-57.55463,-18.22348],[-57.72079,-18.89914],[-57.70775,-19.0381],[-58.11768,-19.75313],[-57.85675,-19.96754],[-58.15338,-20.15201],[-58.17535,-19.83066],[-59.07074,-19.28846],[-59.97025,-19.29494],[-61.78848,-19.65358],[-62.57401,-21.99972],[-63.93082,-22.00736],[-64.24942,-22.60957],[-64.31808,-22.8806],[-64.56528,-22.36595],[-64.62021,-22.21856],[-64.99649,-22.08628],[-65.77446,-22.10027],[-65.92552,-21.93222],[-66.04774,-21.91884],[-66.04225,-21.86022],[-66.2273,-21.78437],[-66.3121,-22.1219],[-66.74057,-22.23635],[-66.7955,-22.44213],[-67.18002,-22.81353],[-67.56351,-22.90085],[-67.81174,-22.87934],[-68.17566,-21.3252],[-68.405,-20.9499],[-68.54095,-20.92681],[-68.55606,-20.7285],[-68.43796,-20.63857],[-68.74557,-20.46369],[-68.72772,-20.08173],[-68.56293,-20.05077],[-68.53134,-19.85779],[-68.69064,-19.74667],[-68.41873,-19.41544],[-68.9296,-18.97448],[-69.12186,-18.14128],[-69.46793,-17.50852],[-69.46793,-17.37489],[-69.63547,-17.27787],[-69.01199,-16.66053],[-69.03877,-16.58487],[-68.93509,-16.2061],[-69.16718,-16.22259],[-69.40201,-15.62634],[-69.13422,-15.23516],[-69.35806,-14.96933],[-68.97903,-14.21979],[-68.87466,-12.88745],[-68.65768,-12.49088],[-69.57264,-10.94456],[-68.74806,-11.00835],[-68.75167,-11.01762],[-68.75201,-11.03716],[-68.76592,-11.04963],[-68.70815,-11.14253],[-68.54576,-11.11036],[-68.24295,-10.95872],[-68.08502,-10.69165],[-67.86736,-10.64036],[-67.71629,-10.71459],[-67.6775,-10.60341],[-67.65947,-10.61792],[-67.58446,-10.50402],[-67.43614,-10.44966],[-67.40593,-10.38314],[-67.31461,-10.37774],[-67.32216,-10.32438],[-67.1953,-10.32277],[-67.18869,-10.33983],[-67.17093,-10.33814],[-66.57921,-9.90392],[-65.86441,-9.75981],[-65.56503,-9.82477],[-65.44968,-9.67318],[-65.29449,-9.85589],[-65.39474,-10.54722],[-65.35629,-10.78474],[-65.2684,-10.88658],[-65.29861,-11.32656],[-65.14481,-11.70939],[-64.36752,-12.4587],[-63.67538,-12.46675],[-61.64841,-13.53453],[-61.06339,-13.52919],[-60.4303,-13.88608],[-60.23804,-15.09864],[-60.57312,-15.09599],[-60.24353,-15.47221],[-60.17487,-16.26675]]]}},bahia:{id:"bahia",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-46.26343,-11.52309],[-46.40625,-11.53923],[-46.51062,-11.50425],[-46.604,-11.3481],[-46.61224,-11.25653],[-46.46668,-11.1811],[-46.42822,-11.02208],[-46.32935,-10.9331],[-46.19751,-10.65521],[-45.84045,-10.47701],[-45.82672,-10.35275],[-45.74707,-10.34194],[-45.70038,-10.26087],[-45.72784,-10.15815],[-45.59326,-10.09326],[-45.41199,-10.43379],[-45.45593,-10.55262],[-45.37903,-10.72538],[-45.15381,-10.8387],[-44.90112,-10.90883],[-44.60999,-10.66601],[-44.34631,-10.54182],[-44.13757,-10.63362],[-44.05518,-10.39057],[-43.96179,-10.42839],[-43.78601,-10.15275],[-43.69263,-10.03918],[-43.69812,-9.95262],[-43.64868,-9.82274],[-43.76404,-9.76861],[-43.8794,-9.54117],[-43.68713,-9.41655],[-43.4729,-9.24851],[-43.3081,-9.37861],[-43.04443,-9.36235],[-42.8302,-9.60617],[-42.33581,-9.31899],[-41.90735,-9.23767],[-41.7865,-9.09125],[-41.40198,-8.71136],[-41.14929,-8.70593],[-41.03943,-8.83351],[-41.01471,-8.82808],[-40.92407,-8.83894],[-40.8197,-9.07226],[-40.68237,-9.14277],[-40.66864,-9.26478],[-40.7428,-9.30002],[-40.75653,-9.42197],[-40.62744,-9.47615],[-40.53131,-9.41384],[-40.47363,-9.39758],[-40.42694,-9.34338],[-40.36102,-9.37319],[-40.29785,-9.09396],[-40.23468,-9.04243],[-40.14679,-9.10481],[-40.07813,-9.05057],[-39.98749,-9.05599],[-39.8996,-8.95833],[-39.90509,-8.82808],[-39.68262,-8.77923],[-39.70459,-8.67063],[-39.65241,-8.65977],[-39.41345,-8.50769],[-39.2926,-8.54843],[-39.23492,-8.6299],[-38.96576,-8.76837],[-38.86963,-8.76837],[-38.71307,-8.83622],[-38.68835,-8.90678],[-38.66913,-8.98275],[-38.61694,-8.96376],[-38.60596,-8.86065],[-38.5675,-8.81723],[-38.47687,-8.84708],[-38.50983,-8.94205],[-38.42194,-9.037],[-38.33679,-8.97461],[-38.28461,-9.00716],[-38.31757,-9.06684],[-38.21045,-9.36235],[-38.04565,-9.4599],[-38.02368,-9.8498],[-37.89185,-9.96885],[-37.74902,-10.31492],[-37.8479,-10.37977],[-37.78198,-10.64981],[-37.93579,-10.73617],[-38.13354,-10.6822],[-38.26538,-10.79014],[-38.02368,-11.31848],[-37.73804,-11.57691],[-37.3645,-11.48002],[-38.50159,-18.11975],[-39.65515,-18.35453],[-40.25391,-17.96828],[-40.23193,-17.79053],[-40.61646,-17.38209],[-40.51758,-16.89917],[-40.13306,-16.45716],[-39.90234,-16.04581],[-40.68237,-15.68651],[-41.08887,-15.73939],[-41.35254,-15.73939],[-41.37451,-15.49603],[-41.80298,-15.09334],[-42.04468,-15.18878],[-43.24219,-14.67925],[-43.50586,-14.78551],[-43.92334,-14.63674],[-43.7915,-14.31761],[-44.35181,-14.24309],[-44.65942,-14.38148],[-45.78003,-15.13576],[-46.10962,-15.29478],[-46.06567,-14.87047],[-45.92285,-14.38148],[-46.24146,-14.14723],[-46.32935,-13.11158],[-46.38428,-12.02858],[-46.26343,-11.52309]]]}},brazil:{type:"Feature",id:"brazil",properties:{},geometry:{type:"Polygon",coordinates:[[[-51.56433,4.29711],[-28.4491,1.04914],[-37.67761,-21.04862],[-52.94861,-34.05721],[-53.56384,-33.71063],[-53.58581,-33.23409],[-53.16833,-32.81036],[-54.11316,-32.08723],[-55.73914,-30.85036],[-56.11267,-31.18931],[-56.11267,-30.90694],[-57.0575,-30.14988],[-57.23328,-30.32073],[-57.73865,-30.26381],[-55.98083,-28.5411],[-54.94812,-27.68839],[-53.80554,-27.18136],[-53.7616,-26.73089],[-53.87146,-26.00249],[-54.20105,-25.88394],[-54.6405,-25.88394],[-54.28894,-24.13171],[-55.43701,-24.18685],[-55.87647,-22.3704],[-58.07373,-22.08564],[-58.24402,-20.06109],[-57.71668,-17.98396],[-58.43628,-17.18278],[-58.50769,-16.38866],[-60.1831,-16.29905],[-60.26001,-15.14637],[-60.49072,-14.09396],[-60.94116,-13.63531],[-61.85303,-13.5926],[-63.58887,-12.56529],[-64.22058,-12.55992],[-65.20386,-11.8996],[-65.4126,-9.74154],[-66.82983,-10.1203],[-68.17566,-10.92501],[-70.6366,-11.18379],[-70.6366,-9.62783],[-71.42761,-9.97426],[-72.74597,-9.88769],[-73.97644,-7.10634],[-72.70752,-4.67498],[-70.15869,-4.23686],[-69.67529,-1.03266],[-70.19714,1.75205],[-67.56042,1.83989],[-66.94519,0.69761],[-63.78113,1.83989],[-64.84131,4.36832],[-63.25378,3.59566],[-60.24353,5.20584],[-60.03479,4.98698],[-59.57886,3.81493],[-59.89746,3.26118],[-60.05676,2.76199],[-59.9469,2.2626],[-59.77661,2.23515],[-59.77661,1.75754],[-58.64502,1.55987],[-55.87647,2.61384],[-53.10791,2.35041],[-51.56433,4.29711]]]}},df_br:{id:"df_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-48.20114,-15.49868],[-47.42111,-15.5],[-47.38953,-15.56484],[-47.32361,-15.58865],[-47.33047,-15.63891],[-47.31125,-15.73278],[-47.36755,-15.83189],[-47.3703,-15.927],[-47.36893,-15.99698],[-47.30988,-16.04317],[-48.27805,-16.04713],[-48.24921,-15.94152],[-48.2753,-15.93096],[-48.29041,-15.83189],[-48.22998,-15.77772],[-48.21899,-15.71163],[-48.24097,-15.70898],[-48.23547,-15.66535],[-48.22449,-15.63097],[-48.20251,-15.62568],[-48.20114,-15.49868]]]}},rs_br:{id:"rs_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-50.56791,-28.32331],[-49.64837,-28.40599],[-49.62152,-28.67722],[-49.82288,-28.81257],[-49.86986,-29.14725],[-49.40674,-29.43409],[-50.66187,-31.5221],[-51.51429,-32.07544],[-52.0244,-32.51232],[-52.32644,-33.22264],[-53.199,-34.04411],[-53.65541,-33.63156],[-53.50103,-32.61414],[-55.57503,-31.01726],[-56.0113,-31.18392],[-56.20595,-30.78112],[-56.93084,-30.18535],[-57.2463,-30.36505],[-57.57519,-30.33029],[-57.71614,-30.18535],[-57.40068,-29.91811],[-57.23959,-29.67347],[-56.02473,-28.4178],[-55.70255,-28.08671],[-54.40043,-27.2008],[-53.38022,-26.97372],[-51.97071,-27.23661],[-51.03103,-27.74271],[-50.56791,-28.32331]]]}},chile:{type:"Feature",id:"chile",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-110,-28],[-110,-26],[-109,-26],[-109,-28],[-110,-28]],[[-69.46999,-17.50394],[-69.67049,-17.66692],[-69.80164,-17.65253],[-69.83047,-17.71337],[-69.82704,-17.75196],[-69.80919,-17.8023],[-69.75494,-17.98135],[-69.82018,-18.1191],[-69.86618,-18.17325],[-69.96918,-18.26065],[-70.19165,-18.33106],[-72.5,-18.3],[-78,-53],[-68,-58],[-65.80412,-55.20392],[-67.30412,-54.90395],[-68.60412,-54.90395],[-68.60412,-52.65417],[-68.42212,-52.39063],[-68.42268,-52.33665],[-68.57786,-52.32931],[-68.58833,-52.31016],[-68.84205,-52.28181],[-69.19421,-52.15445],[-69.49016,-52.15561],[-70.00412,-52.00423],[-71.92097,-52.00391],[-71.95221,-51.97896],[-72.04212,-51.96756],[-71.93324,-51.91854],[-72.03255,-51.8118],[-72.32412,-51.60426],[-72.34531,-50.65403],[-73.32687,-50.52827],[-73.51742,-49.89065],[-72.98733,-48.99351],[-72.68005,-48.89271],[-72.53174,-48.77746],[-72.56195,-48.50569],[-72.24472,-48.34986],[-72.46788,-47.7451],[-72.0504,-47.34557],[-71.87325,-47.12505],[-71.9426,-46.81204],[-71.64974,-46.68289],[-71.82037,-46.1256],[-71.64459,-46.00936],[-71.75291,-45.55168],[-71.47104,-45.49829],[-71.54383,-45.40436],[-71.3895,-45.35287],[-71.33354,-45.28286],[-71.41148,-45.19486],[-71.56494,-44.98326],[-72.03323,-44.88409],[-72.03495,-44.76989],[-71.24908,-44.80425],[-71.07056,-44.47985],[-71.81213,-44.30714],[-71.58417,-43.64303],[-71.8856,-43.45765],[-71.72596,-43.19066],[-72.14344,-42.90363],[-72.04765,-42.54322],[-72.04182,-42.40546],[-72.17194,-42.14686],[-71.73051,-42.11516],[-71.92612,-40.72332],[-71.80252,-40.42081],[-71.70639,-40.425],[-71.66794,-40.30571],[-71.77643,-40.268],[-71.39465,-38.92843],[-70.90816,-38.67251],[-71.189,-37.74167],[-71.04858,-36.49087],[-70.95932,-36.50246],[-70.37876,-36.04743],[-70.43884,-35.32549],[-70.58441,-35.27646],[-70.53875,-35.20551],[-70.3791,-35.17241],[-69.87854,-34.15614],[-69.8703,-33.57458],[-69.78207,-33.33282],[-69.86721,-33.28663],[-69.99561,-33.3268],[-70.08453,-33.03716],[-70.3125,-32.12562],[-70.22736,-31.93934],[-70.46185,-31.84548],[-70.53102,-31.3724],[-70.07904,-30.38828],[-69.88678,-30.35747],[-69.81262,-30.14869],[-69.93347,-30.10118],[-69.94308,-29.24087],[-68.78609,-27.10803],[-68.56567,-27.17525],[-68.25256,-26.96492],[-68.57666,-26.49147],[-68.5437,-26.27987],[-68.37067,-26.17639],[-68.48328,-25.15399],[-68.32397,-25.09928],[-68.5437,-24.79047],[-68.46405,-24.62829],[-68.24432,-24.39338],[-67.32216,-24.03768],[-66.98639,-23.00012],[-67.17728,-22.81416],[-67.55768,-22.89642],[-67.81586,-22.86099],[-68.19489,-21.27018],[-68.405,-20.93964],[-68.53546,-20.8524],[-68.47504,-20.64949],[-68.72772,-20.46948],[-68.73322,-20.38454],[-68.67279,-20.34591],[-68.76549,-20.08237],[-68.56842,-20.05658],[-68.52997,-19.85262],[-68.68309,-19.72793],[-68.40225,-19.41091],[-68.92548,-18.97253],[-69.11087,-18.1328],[-69.06143,-18.06231],[-69.29352,-17.96698],[-69.30931,-17.9121],[-69.30794,-17.83956],[-69.34708,-17.7343],[-69.47205,-17.61065],[-69.46999,-17.50394]]]]}},bogota:{type:"Feature",id:"bogota",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.38,4.7],[-74.17,5],[-73.75,5],[-73.9,4.37],[-74.25,4.31],[-74.38,4.7]]]}},colombia:{type:"Feature",id:"colombia",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.8,11.8],[-71.3,12.7],[-70.9,11.9],[-71.98242,11.65762],[-72.2406,11.14607],[-72.45483,11.10295],[-72.8833,10.43379],[-72.94922,9.83898],[-73.31177,9.20514],[-72.99866,9.29189],[-72.94373,9.09125],[-72.76245,9.12379],[-72.65259,8.61633],[-72.39716,8.36098],[-72.34497,8.00484],[-72.4054,8.04563],[-72.49054,7.945],[-72.4411,7.89875],[-72.45209,7.53676],[-72.43835,7.40605],[-72.18567,7.38426],[-72.14996,7.32161],[-72.18018,7.24532],[-72.03461,7.0273],[-71.12,7.02457],[-71.09528,6.98641],[-70.9964,6.98641],[-70.77942,7.09817],[-70.5542,7.07636],[-70.30701,6.93461],[-70.11475,6.98095],[-69.43016,6.10778],[-69.34914,6.13987],[-69.31,6.0873],[-69.23378,6.08047],[-69.17404,6.15011],[-69.03877,6.22384],[-68.66455,6.14055],[-67.80762,6.288],[-67.45056,6.21155],[-67.47803,6.10232],[-67.40662,6.00946],[-67.60437,5.7909],[-67.63184,5.4629],[-67.82959,5.31524],[-67.79114,4.28068],[-67.62085,3.74915],[-67.5,3.78204],[-67.29126,3.36537],[-67.86255,2.82234],[-67.58789,2.79491],[-67.1759,2.33395],[-66.85181,1.23037],[-67.08801,1.16172],[-67.16766,1.83989],[-67.34894,1.97715],[-67.36816,2.22417],[-67.44781,2.21868],[-67.56866,2.054],[-67.80487,1.98813],[-67.91199,1.81793],[-68.18939,2.01009],[-68.2663,1.85087],[-68.16193,1.73008],[-69.83459,1.71361],[-69.8291,1.08209],[-69.19739,1.06561],[-69.15344,0.62621],[-69.48303,0.73057],[-69.79065,0.58776],[-70.02686,0.57128],[-70.04059,-0.19226],[-69.60937,-0.50262],[-69.55719,-0.65367],[-69.61212,-0.7498],[-69.41986,-1.03541],[-69.40338,-1.37041],[-69.9321,-4.21974],[-69.94995,-4.23275],[-70.06531,-4.08071],[-70.1841,-3.93893],[-70.28641,-3.82246],[-70.35027,-3.80054],[-70.50613,-3.87796],[-70.71075,-3.793],[-70.04883,-2.75102],[-70.8783,-2.23241],[-71.41113,-2.37786],[-71.75171,-2.19124],[-72.36694,-2.48762],[-72.63336,-2.36688],[-72.67456,-2.4595],[-72.93274,-2.4492],[-73.1813,-2.22692],[-73.10028,-2.0842],[-73.14697,-1.79597],[-73.55347,-1.69439],[-73.47382,-1.55437],[-73.64136,-1.26607],[-73.85834,-1.22763],[-74.27582,-0.97774],[-74.42139,-0.51086],[-74.79492,-0.23621],[-75.20142,-0.06592],[-75.27832,-0.12909],[-75.80566,0.04669],[-76.09955,0.32959],[-76.32751,0.42572],[-76.40991,0.37903],[-76.41266,0.23621],[-76.96198,0.27191],[-77.11029,0.36529],[-77.53601,0.40649],[-77.48383,0.65093],[-77.69257,0.73606],[-77.66441,0.81296],[-77.7166,0.85141],[-77.74544,0.83562],[-77.77565,0.83974],[-77.80861,0.82738],[-77.8196,0.80678],[-77.96173,0.82257],[-78.19794,0.94478],[-78.19931,0.99284],[-78.28308,1.05325],[-78.2515,1.08346],[-78.31741,1.19193],[-78.43002,1.1425],[-78.55499,1.2496],[-78.61816,1.24685],[-80,2.5],[-77.7,7.7],[-77.55524,7.51498],[-77.32178,7.87971],[-77.17896,7.93956],[-77.5,8.5],[-75.8,11.8]]]}},ecuador:{type:"Feature",id:"ecuador",properties:{},geometry:{type:"Polygon",coordinates:[[[-82,-3],[-80,2.2],[-77.86079,0.80404],[-77.72072,0.85484],[-77.66287,0.81794],[-77.66424,0.80884],[-77.67385,0.80215],[-77.67729,0.79099],[-77.66184,0.78979],[-77.68587,0.77365],[-77.6972,0.74241],[-77.67523,0.73778],[-77.5573,0.65058],[-77.47353,0.6626],[-77.52159,0.44837],[-76.47583,0.20874],[-76.32202,0.4422],[-76.0199,0.30487],[-75.81665,0.09064],[-75.26733,-0.1181],[-75.31265,-0.16617],[-75.50629,-0.21698],[-75.22888,-0.56441],[-75.20279,-0.97362],[-75.28931,-0.99147],[-75.36072,-0.95027],[-75.64087,-1.62576],[-76.63376,-2.59052],[-77.84637,-3],[-78.2872,-3.42158],[-79.01917,-5.01844],[-79.24301,-4.96581],[-79.62753,-4.42656],[-79.79233,-4.48954],[-80.12535,-4.29784],[-80.36018,-4.49775],[-80.44584,-4.45086],[-80.44739,-4.37692],[-80.33409,-4.21841],[-80.45013,-4.20968],[-80.44928,-4.13024],[-80.48035,-4.09445],[-80.47297,-4.05079],[-80.44739,-3.99719],[-80.39915,-3.98281],[-80.29701,-4.01843],[-80.12878,-3.89718],[-80.16106,-3.86704],[-80.19264,-3.60256],[-80.21633,-3.582],[-80.20706,-3.54705],[-80.21745,-3.5],[-80.22878,-3.50181],[-80.2335,-3.4899],[-80.2456,-3.48759],[-80.24545,-3.48481],[-80.24416,-3.48461],[-80.24386,-3.48247],[-80.24313,-3.48142],[-80.24393,-3.47881],[-80.24079,-3.47723],[-80.2438,-3.46463],[-80.22217,-3.44047],[-80.25238,-3.41],[-82,-3]]]}},paraguay:{type:"Feature",id:"paraguay",properties:{},geometry:{type:"Polygon",coordinates:[[[-54.25873,-24.35961],[-54.58403,-25.58921],[-54.65681,-25.67588],[-54.67916,-25.99493],[-54.61857,-26.20862],[-54.78678,-26.6308],[-55.42267,-26.99497],[-55.60553,-27.1621],[-55.73675,-27.44486],[-55.78857,-27.44309],[-55.89775,-27.34371],[-55.97809,-27.35591],[-56.06259,-27.30569],[-56.29415,-27.41973],[-56.37473,-27.58873],[-56.601,-27.42072],[-56.84909,-27.606],[-56.96547,-27.50172],[-57.48737,-27.44388],[-57.87465,-27.27496],[-58.59888,-27.29953],[-58.64896,-27.12631],[-58.31974,-26.8579],[-58.18979,-26.64487],[-58.22086,-26.41372],[-58.08456,-26.11154],[-57.89095,-25.96589],[-57.74047,-25.65014],[-57.55483,-25.44809],[-57.76072,-25.17162],[-58.2415,-24.9277],[-58.67226,-24.83161],[-59.3538,-24.4779],[-59.47537,-24.3323],[-60.03924,-24.01125],[-60.37336,-24.02369],[-60.98973,-23.81777],[-61.08807,-23.61362],[-61.73595,-23.234],[-62.20654,-22.70386],[-62.30073,-22.48627],[-62.64387,-22.24906],[-62.26072,-21.05983],[-62.26622,-20.56305],[-61.92152,-20.08915],[-61.73647,-19.63289],[-59.97488,-19.29332],[-59.06988,-19.28619],[-58.20814,-19.80515],[-57.83186,-20.9842],[-57.92507,-21.63334],[-57.88113,-21.68734],[-57.90602,-21.71294],[-57.97194,-22.07832],[-56.81013,-22.27099],[-56.56363,-22.20044],[-56.49462,-22.08659],[-56.39677,-22.07641],[-56.26631,-22.24811],[-56.01774,-22.29259],[-55.8526,-22.28227],[-55.78935,-22.38413],[-55.74034,-22.38913],[-55.75132,-22.47989],[-55.7472,-22.50653],[-55.72347,-22.5514],[-55.69845,-22.56298],[-55.69365,-22.57788],[-55.62361,-22.62986],[-55.38191,-24.00601],[-54.65973,-23.82806],[-54.31366,-24.01762],[-54.25873,-24.35961]]]}},peru:{type:"Feature",id:"peru",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,-3],[-80.25238,-3.41],[-80.22217,-3.44047],[-80.2438,-3.46463],[-80.24079,-3.47723],[-80.24393,-3.47881],[-80.24313,-3.48142],[-80.24386,-3.48247],[-80.24416,-3.48461],[-80.24545,-3.48481],[-80.2456,-3.48759],[-80.2335,-3.4899],[-80.22878,-3.50181],[-80.21745,-3.5001],[-80.20706,-3.54705],[-80.21633,-3.582],[-80.19264,-3.60256],[-80.16106,-3.86704],[-80.12878,-3.89718],[-80.29701,-4.01843],[-80.39915,-3.98281],[-80.44739,-3.99719],[-80.47297,-4.05079],[-80.48035,-4.09445],[-80.44928,-4.13024],[-80.45013,-4.20968],[-80.33409,-4.21841],[-80.44739,-4.37692],[-80.44584,-4.45086],[-80.36018,-4.49775],[-80.12535,-4.29784],[-79.79233,-4.48954],[-79.62753,-4.42656],[-79.24301,-4.96581],[-79.01917,-5.01844],[-78.2872,-3.42158],[-77.84637,-3],[-76.63376,-2.59052],[-75.64087,-1.62576],[-75.36072,-0.95027],[-75.56534,-0.13806],[-75.15884,-0.06665],[-74.40628,-0.55553],[-72.92862,-2.39505],[-70.9552,-2.25162],[-70.02686,-2.70987],[-70.70595,-3.78478],[-70.49789,-3.88142],[-70.32349,-3.8088],[-69.95819,-4.23211],[-69.94446,-4.29784],[-69.99802,-4.37316],[-70.10376,-4.29164],[-70.19028,-4.35946],[-71.82999,-4.5662],[-72.86133,-5.25507],[-73.94348,-7.4932],[-72.19116,-9.95803],[-70.61188,-9.57638],[-70.62149,-10.96681],[-69.57161,-10.94557],[-68.65494,-12.49629],[-69.01886,-13.62196],[-68.83896,-14.22445],[-69.38141,-14.86251],[-69.14795,-15.24444],[-69.39926,-15.6151],[-69.19189,-16.17449],[-69.10177,-16.22555],[-68.96152,-16.19456],[-68.78952,-16.34254],[-68.98865,-16.42357],[-69.04015,-16.57368],[-69.01886,-16.65198],[-69.61075,-17.26542],[-69.46896,-17.37423],[-69.46827,-17.49919],[-69.66654,-17.66071],[-69.81262,-17.67281],[-69.75,-18],[-70,-18.27],[-75,-19],[-83,-3]]]}},latam:{type:"Feature",id:"latam",properties:{},geometry:{type:"Polygon",coordinates:[[[-123,14],[-117.45574,32.58935],[-117.23326,32.52453],[-116.43813,32.58992],[-115.96571,32.62752],[-115.48953,32.66395],[-114.71211,32.7179],[-114.7455,32.65614],[-114.79837,32.6067],[-114.81091,32.49615],[-111.06611,31.33282],[-109.5397,31.33311],[-108.86816,31.33165],[-108.2131,31.33135],[-108.21447,31.78655],[-106.52962,31.78363],[-106.51966,31.77225],[-106.50867,31.76116],[-106.4867,31.74715],[-106.4716,31.75123],[-106.46851,31.75912],[-106.45409,31.76554],[-106.43898,31.75678],[-106.41426,31.75007],[-106.37959,31.7305],[-106.37409,31.71269],[-106.35075,31.69575],[-106.33289,31.65835],[-106.30543,31.6224],[-106.28002,31.56186],[-106.24741,31.54314],[-106.21101,31.47347],[-106.17805,31.45766],[-106.14956,31.43335],[-106.00502,31.38881],[-105.76607,31.16816],[-105.38292,30.84683],[-104.9121,30.63644],[-104.67293,29.91804],[-104.39415,29.56151],[-103.20921,28.98742],[-102.4182,29.81056],[-101.4514,29.77242],[-100.96779,29.34866],[-100.9005,29.31454],[-100.69725,29.14257],[-100.62309,28.91322],[-100.51598,28.749],[-100.51186,28.70474],[-100.50293,28.66227],[-100.40337,28.58271],[-100.01472,28.06956],[-99.53957,27.59837],[-99.53339,27.57859],[-99.51279,27.5655],[-99.52103,27.55607],[-99.52824,27.49731],[-99.5018,27.50066],[-99.48601,27.49426],[-99.47777,27.48299],[-99.48498,27.4635],[-99.49596,27.44857],[-99.48669,27.39067],[-99.53476,27.31321],[-99.44344,27.25951],[-99.45717,27.03222],[-99.07127,26.42692],[-98.9978,26.39248],[-98.46771,26.21028],[-98.25966,26.09194],[-98.08388,26.05061],[-97.95067,26.06172],[-97.79205,26.05185],[-97.57919,25.95002],[-97.51328,25.89073],[-97.46315,25.87899],[-97.41783,25.83821],[-97.34367,25.92594],[-97,26],[-81,24],[-73.5,20.5],[-64,20],[-29,0],[-29,-20],[-63,-51],[-62,-57],[-72,-57],[-113,-30],[-123,14]]]}}};
23653
23654   var resources = {"bw-facebook":{id:"bw-facebook",type:"facebook",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana",url:"https://www.facebook.com/MappingBotswana/",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"bw-twitter":{id:"bw-twitter",type:"twitter",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana",url:"https://twitter.com/mappingbotswana",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"cape-coast-youthmappers":{id:"cape-coast-youthmappers",featureId:"cape_coast_gh",type:"twitter",name:"University of Cape Coast YouthMappers",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable.",url:"https://twitter.com/YouthmappersUCC",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-facebook":{id:"osm-gh-facebook",featureId:"ghana",type:"facebook",name:"OpenStreetMap Ghana on Facebook",countryCodes:["gh"],languageCodes:["en"],description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us.",url:"https://www.facebook.com/OSMGhana/",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-twitter":{id:"osm-gh-twitter",featureId:"ghana",type:"twitter",name:"OpenStreetMap Ghana on Twitter",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmghana",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"talk-gh":{id:"talk-gh",featureId:"ghana",type:"mailinglist",name:"Talk-gh Mailing List",countryCodes:["gh"],languageCodes:["en"],description:"Talk-gh is the official mailing list for Ghana OSM community.",url:"https://lists.openstreetmap.org/listinfo/talk-gh",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-mg-facebook":{id:"osm-mg-facebook",featureId:"madagascar",type:"facebook",name:"OpenStreetMap Madagascar Facebook Group",countryCodes:["mg"],languageCodes:["mg","fr"],description:"Malagasy Facebook group for people interested in OpenStreetMap.",url:"https://www.facebook.com/groups/1601381123461284/",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"talk-mg":{id:"talk-mg",featureId:"madagascar",type:"mailinglist",countryCodes:["mg"],languageCodes:["mg","fr"],name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss.",url:"https://lists.openstreetmap.org/listinfo/talk-mg",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"OSM-BGD-facebook":{id:"OSM-BGD-facebook",featureId:"BGD",type:"facebook",name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/osmbd/",contacts:[{name:"Ahasanul Hoque",email:"hoque.ahasan@gmail.com"}]},"OSM-India-facebook":{id:"OSM-India-facebook",featureId:"india_full",type:"facebook",name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/mappingindia/",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"},{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}],events:[{id:"sotmasia2018",i18n:true,name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India",when:"2018-11-17",url:"http://stateofthemap.asia/"}]},"OSM-india-mailinglist":{id:"OSM-india-mailinglist",featureId:"india_full",type:"mailinglist",name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community",url:"https://lists.openstreetmap.org/listinfo/talk-in",contacts:[{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}]},"OSM-india-twitter":{id:"OSM-india-twitter",featureId:"india_full",type:"twitter",name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}",url:"https://twitter.com/osm_in",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"}]},"OSM-India-Puducherry-Facebook":{id:"OSM-India-Puducherry-Facebook",featureId:"india_puducherry",type:"facebook",name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events.",url:"https://www.facebook.com/FSHMP",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-India-Puducherry-Matrix":{id:"OSM-India-Puducherry-Matrix",featureId:"india_puducherry",type:"matrix",name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism.",url:"https://riot.im/app/#/room/#fshm:matrix.org",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-IDN-facebook":{id:"OSM-IDN-facebook",featureId:"IDN",type:"facebook",name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osm.id/",contacts:[{name:"Yantisa Akhadi",email:"yantisa.akhadi@hotosm.org"}]},"OSM-japan-facebook":{id:"OSM-japan-facebook",featureId:"japan",type:"facebook",name:"OpenStreetMap Japan Community",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://www.facebook.com/groups/osmjapan/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-mailinglist":{id:"OSM-japan-mailinglist",featureId:"japan",type:"mailinglist",name:"OpenStreetMap Japan Mailinglist",countryCodes:["jp"],languageCodes:["jp"],description:"Talk-ja is an Official Mailinglist for Japanese Community",url:"https://lists.openstreetmap.org/listinfo/talk-ja",contacts:[{name:"OSMF Japan",email:"info@osmf.jp"}]},"OSM-japan-twitter":{id:"OSM-japan-twitter",featureId:"japan",type:"twitter",name:"OpenStreetMap Japan Twitter",countryCodes:["jp"],languageCodes:["jp"],description:"Hashtag on Twitter: {url}",url:"https://twitter.com/hashtag/osmjp",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-website":{id:"OSM-japan-website",featureId:"japan",type:"group",name:"OpenStreetMap Japan",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://openstreetmap.jp/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-korea-telegram":{id:"OSM-korea-telegram",featureId:"korea",type:"telegram",countryCodes:["ko"],languageCodes:["ko","en"],name:"OSM Korea Telegram Channel",description:"Unofficial Channnel for OpenStreetMap contributors, communities and users in Korea to share and discuss.",url:"https://t.me/osmKorea",contacts:[{name:"Yongmin Hong",email:"revi@pobox.com"},{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-MY-facebook":{id:"OSM-MY-facebook",featureId:"malaysia",type:"facebook",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!",url:"https://www.facebook.com/groups/openstreetmapMY/",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-forum":{id:"OSM-MY-forum",featureId:"malaysia",type:"forum",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=60",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-matrix":{id:"OSM-MY-matrix",featureId:"malaysia",type:"matrix",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}",signupUrl:"https://riot.im/app/#/register",url:"https://riot.im/app/#/room/#OpenstreetmapMalaysia:matrix.org",contacts:[{name:"Ahmad Amsyar",email:"OfficiallyAhmad@protonmail.ch"}]},"OSM-MNG-facebook":{id:"OSM-MNG-facebook",featureId:"MNG",type:"facebook",name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/OSM.Mongolia/",contacts:[{name:" ",email:"talk-mn@openstreetmap.org"}]},"OSM-MMR-facebook":{id:"OSM-MMR-facebook",featureId:"MMR",type:"facebook",name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osmmm/",contacts:[{name:"Yan Naung Oak",email:"yan@phandeeyar.org"},{name:"Patrick Oswald",email:"patrickoswald.omm@gmail.com"},{name:"Set Khaing Oo",email:"setkhaing@phandeeyar.org"}]},"OSM-Nepal-facebook":{id:"OSM-Nepal-facebook",featureId:"NPL",type:"facebook",name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/mapkathmandu/",contacts:[{name:"Kshitiz Khanal",email:"khanal1990@gmail.com"}]},"OSM-PH-facebook":{id:"OSM-PH-facebook",featureId:"philippines",type:"facebook",countryCodes:["ph"],name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project.",url:"https://www.facebook.com/OSMPH/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-mailinglist":{id:"OSM-PH-mailinglist",featureId:"philippines",type:"mailinglist",countryCodes:["ph"],name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines",url:"https://lists.openstreetmap.org/pipermail/talk-ph/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-slack":{id:"OSM-PH-slack",featureId:"philippines",type:"slack",countryCodes:["ph"],name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://osmph-chat.herokuapp.com/",url:"https://osmph.slack.com",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-telegram":{id:"OSM-PH-telegram",featureId:"philippines",type:"telegram",countryCodes:["ph"],languageCodes:["tl","en"],name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines",url:"https://t.me/osmph",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-RU-forum":{id:"OSM-RU-forum",type:"forum",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=21",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-RU-telegram":{id:"OSM-RU-telegram",type:"telegram",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat",url:"https://t.me/ruosm",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-LKA-facebook":{id:"OSM-LKA-facebook",featureId:"LKA",type:"facebook",name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/142058222659672/",contacts:[{name:"Karan Suthakaran",email:"karansuthakaran@yahoo.com"}]},"OSM-TW-facebook":{id:"OSM-TW-facebook",featureId:"taiwan",type:"facebook",name:"OpenStreetMap Taiwan Community",countryCodes:["tw"],languageCodes:["zh-tw"],description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan.",url:"https://www.facebook.com/groups/OpenStreetMap.TW/",contacts:[{name:"Nobody 沒有人 (Public mail)",email:"hiboard@openstreetmap.tw"}]},"OSM-TW-mailinglist":{id:"OSM-TW-mailinglist",featureId:"taiwan",type:"mailinglist",name:"OpenStreetMap Taiwan Mailinglist",countryCodes:["tw"],languageCodes:["zh-tw","en"],description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan",url:"https://lists.openstreetmap.org/listinfo/talk-tw",contacts:[{name:"Nobody 沒有人 (Public email)",email:"hiboard@openstreetmap.tw"}]},"OSM-TH-CNX-meetup":{id:"OSM-TH-CNX-meetup",featureId:"thailand_cnx",type:"meetup",countryCodes:["th"],languageCodes:["en"],name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Team Chiang Mai",email:"meetup-cnx@openstreetmap.in.th"}]},"OSM-TH-facebook":{id:"OSM-TH-facebook",featureId:"thailand_full",type:"facebook",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand",url:"https://www.facebook.com/groups/thaiosm/",contacts:[{name:"Theppitak Karoonboonyanan",email:"theppitak@gmail.com"}]},"OSM-TH-forum":{id:"OSM-TH-forum",featureId:"thailand_full",type:"forum",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Stephan Knauss",email:"osm@stephans-server.de"}]},"al-forum":{id:"al-forum",featureId:"albania",type:"forum",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=91",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-maptime-tirana":{id:"al-maptime-tirana",featureId:"al-tirana",type:"group",countryCodes:["al"],languageCodes:["sq","en"],name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time.",url:"http://maptime.io/tirana/",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-telegram":{id:"al-telegram",featureId:"albania",type:"telegram",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel",url:"https://telegram.me/OpenStreetMapAL",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"at-forum":{id:"at-forum",featureId:"austria",type:"forum",name:"OpenStreetMap Austria Forum",countryCodes:["at"],languageCodes:["en","de"],description:"The official forum for OpenStreetMap questions in and around Austria",url:"https://forum.openstreetmap.org/viewforum.php?id=89",contacts:[{name:"emga",email:"emgaosm@gmail.com"}]},"at-mailinglist":{id:"at-mailinglist",featureId:"austria",type:"mailinglist",name:"Talk-at Mailing List",countryCodes:["at"],languageCodes:["de"],description:"Talk-at is the official mailing list for the Austrian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-at",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},"at-twitter":{id:"at-twitter",featureId:"austria",type:"twitter",name:"OpenStreetMap Austria Twitter",countryCodes:["at"],languageCodes:["de"],description:"OpenStreetMap Austria On Twitter: {url}",url:"https://twitter.com/osm_at",contacts:[{name:"AT Community",email:"info@openstreetmap.at"}]},"osmgraz-meetup":{id:"osmgraz-meetup",featureId:"graz",type:"meetup",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz",url:"https://wiki.openstreetmap.org/wiki/Graz/Stammtisch",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osmgraz-twitter":{id:"osmgraz-twitter",featureId:"graz",type:"twitter",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter",url:"https://twitter.com/osmgraz",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osm-at":{id:"osm-at",featureId:"austria",type:"group",countryCodes:["at"],languageCodes:["de"],name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria",url:"https://www.openstreetmap.at/",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},byosm:{id:"byosm",type:"telegram",featureId:"belarus",languageCodes:["ru","be","en"],name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat",url:"https://t.me/byosm",contacts:[{name:"Darafei Praliaskouski",email:"me@komzpa.net"}]},"be-facebook":{id:"be-facebook",featureId:"belgium",type:"facebook",name:"OpenStreetMap BE Community",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Mappers and OpenStreetMap on Facebook in Belgium",url:"https://www.facebook.com/groups/1419016881706058/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-forum":{id:"be-forum",type:"forum",featureId:"belgium",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=29",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-irc":{id:"be-irc",featureId:"belgium",type:"irc",name:"OpenStreetMap Belgium IRC",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel",url:"https://webchat.oftc.net/?channels=osmbe",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-mailinglist":{id:"be-mailinglist",featureId:"belgium",type:"mailinglist",name:"Talk-be Mailing List",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Talk-be is the official mailing list for the Belgian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-be",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-maptime":{id:"be-maptime",featureId:"belgium",type:"group",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"Maptime Belgium",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time.",url:"http://maptime.io/belgium/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-matrix":{id:"be-matrix",featureId:"belgium",type:"matrix",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects.",url:"https://riot.im/app/#/group/+osmbe:matrix.org",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-meetup":{id:"be-meetup",featureId:"belgium",type:"meetup",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!",url:"https://meetup.com/OpenStreetMap-Belgium/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-twitter":{id:"be-twitter",featureId:"belgium",type:"twitter",name:"OpenStreetMap Belgium Twitter",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"OSM Belgium on Twitter: @osm_be",url:"https://twitter.com/osm_be",contacts:[{name:"BE community",email:"community@osm.be"}]},"hr-facebook":{id:"hr-facebook",featureId:"croatia",type:"facebook",name:"OpenStreetMap Croatia Facebook group",countryCodes:["hr"],languageCodes:["hr"],description:"OpenStreetMap Croatia Facebook group",url:"https://www.facebook.com/groups/541098862671461",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-irc":{id:"hr-irc",featureId:"croatia",type:"irc",name:"OpenStreetMap Croatia on IRC",countryCodes:["hr"],languageCodes:["hr"],description:"Join #osm-hr on irc.freenode.org (port 6667)",url:"https://webchat.freenode.net/?url=irc://irc.freenode.net/osm-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-mailinglist":{id:"hr-mailinglist",featureId:"croatia",type:"mailinglist",name:"Talk-hr Mailing List",countryCodes:["hr"],languageCodes:["hr"],description:"Talk-hr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"czech-community":{id:"czech-community",featureId:"czechia",type:"group",name:"Czech OSM community",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Map portal, website and contacts on OSM members in Czechia",url:"https://openstreetmap.cz/komunita",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-facebook":{id:"osmcz-facebook",featureId:"czechia",type:"facebook",name:"OpenStreetMap CZ on Facebook",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Facebook - including translated WeeklyOSM!",url:"https://www.facebook.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-twitter":{id:"osmcz-twitter",featureId:"czechia",type:"twitter",name:"Czech twitter @osmcz",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Twitter - including translated WeeklyOSM!",url:"https://twitter.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"talk-cz-mailinglist":{id:"talk-cz-mailinglist",featureId:"czechia",type:"mailinglist",name:"Czech mailing list (talk-cz)",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Talk-cz is the official mailing list for Czech community",url:"https://openstreetmap.cz/talkcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"dk-forum":{id:"dk-forum",type:"forum",featureId:"denmark",countryCodes:["dk"],languageCodes:["da"],name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=48",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-irc":{id:"dk-irc",featureId:"denmark",type:"irc",name:"OpenStreetMap Denmark IRC",countryCodes:["dk"],languageCodes:["da"],description:"Join #osm-dk on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-mailinglist":{id:"dk-mailinglist",featureId:"denmark",type:"mailinglist",name:"Talk-dk Mailing List",countryCodes:["dk"],languageCodes:["da"],description:"A mailing list to discuss OpenStreetMap in Denmark",url:"https://lists.openstreetmap.org/listinfo/talk-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"fi-forum":{id:"fi-forum",featureId:"finland",type:"forum",countryCodes:["fi"],languageCodes:["fi"],name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=15",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-irc":{id:"fi-irc",featureId:"finland",type:"irc",name:"OpenStreetMap Finland IRC",countryCodes:["fi"],languageCodes:["fi"],description:"Join #osm-fi on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-mailinglist":{id:"fi-mailinglist",featureId:"finland",type:"mailinglist",name:"Talk-fi Mailing List",countryCodes:["fi"],languageCodes:["fi"],description:"Talk-fi is the official mailing list for the Finnish OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fr-facebook":{id:"fr-facebook",featureId:"france",type:"facebook",name:"OpenStreetMap France Facebook page",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France Facebook page",url:"https://www.facebook.com/osmfr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-forum":{id:"fr-forum",type:"forum",featureId:"france",countryCodes:["fr"],languageCodes:["fr"],name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum",url:"https://forum.openstreetmap.fr/",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-irc":{id:"fr-irc",featureId:"france",type:"irc",name:"OpenStreetMap France on IRC",countryCodes:["fr"],languageCodes:["fr"],description:"Join #osm-fr on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-mailinglist":{id:"fr-mailinglist",featureId:"france",type:"mailinglist",name:"Talk-fr Mailing List",countryCodes:["fr"],languageCodes:["fr"],description:"Talk-fr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-twitter":{id:"fr-twitter",featureId:"france",type:"twitter",name:"OpenStreetMap France on Twitter",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France on Twitter: {url}",url:"https://twitter.com/osm_fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"de-berlin-mailinglist":{id:"de-berlin-mailinglist",featureId:"de-berlin-brandenburg",type:"mailinglist",name:"Berlin Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Berlin OSM community",url:"https://lists.openstreetmap.de/listinfo/berlin",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-berlin-meetup":{id:"de-berlin-meetup",featureId:"de-berlin-brandenburg",type:"meetup",name:"OpenStreetMap Berlin-Brandenburg Meetup",countryCodes:["de"],languageCodes:["de"],description:"Mappers and OpenStreetMap users in the Berlin area",url:"https://www.meetup.com/OSM-Berlin-Brandenburg/",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-telegram":{id:"de-berlin-telegram",featureId:"de-berlin-brandenburg",type:"telegram",name:"@osmberlin on Telegram",countryCodes:["de"],languageCodes:["de"],description:"OpenStreetMap Berlin Telegram chat",url:"https://t.me/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-twitter":{id:"de-berlin-twitter",featureId:"de-berlin-brandenburg",type:"twitter",name:"OpenStreetMap Berlin Twitter",countryCodes:["de"],languageCodes:["de"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-forum":{id:"de-forum",featureId:"germany",type:"forum",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=14",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-irc":{id:"de-irc",featureId:"germany",type:"irc",name:"OpenStreetMap Germany IRC",countryCodes:["de"],languageCodes:["de"],description:"Join #osm-de on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-mailinglist":{id:"de-mailinglist",featureId:"germany",type:"mailinglist",name:"Talk-de Mailing List",countryCodes:["de"],languageCodes:["de"],description:"Talk-de is the official mailing list for the German OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-ostwestfalen-lippe-mailinglist":{id:"de-ostwestfalen-lippe-mailinglist",featureId:"de-ostwestfalen-lippe",type:"mailinglist",name:"OWL Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Ostwestfalen-Lippe OSM community",url:"https://gt.owl.de/mailman/listinfo/osm",contacts:[{name:"Florian Lohoff",email:"osm-owner@gt.owl.de"}]},"de-telegram":{id:"de-telegram",featureId:"germany",type:"telegram",name:"OpenStreetMap Germany Telegram",countryCodes:["de"],languageCodes:["de"],description:"Join the OpenStreetMap Germany Telegram supergroup at {url}",url:"https://t.me/OSM_de",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"osm-de":{id:"osm-de",featureId:"germany",type:"group",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany",url:"https://www.openstreetmap.de/",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"hu-facebook":{id:"hu-facebook",featureId:"hungary",type:"facebook",name:"OpenStreetMap HU on Facebook",countryCodes:["hu"],languageCodes:["hu"],description:"Mappers and OpenStreetMap Facebook in Hungary",url:"https://www.facebook.com/groups/osm.hu/",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-forum":{id:"hu-forum",featureId:"hungary",type:"forum",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum",url:"https://groups.google.com/forum/#!forum/openstreetmap-hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-meetup":{id:"hu-meetup",featureId:"hungary",type:"meetup",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary",url:"https://www.meetup.com/OpenStreetMap-Hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"is-facebook":{id:"is-facebook",type:"facebook",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland",url:"https://www.facebook.com/osmiceland/",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-mailinglist":{id:"is-mailinglist",type:"mailinglist",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-is",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-twitter":{id:"is-twitter",type:"twitter",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Twittter",description:"Twitter of OpenStreetMap in Iceland",url:"https://twitter.com/openstreetmapis",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"it-facebook":{id:"it-facebook",featureId:"italy",type:"facebook",name:"OpenStreetMap Italy Facebook",countryCodes:["it"],languageCodes:["it"],description:"Join the OpenStreetMap Italy community on Facebook",url:"https://www.facebook.com/OpenStreetMap.Italia/",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-irc":{id:"it-irc",featureId:"italy",type:"irc",name:"OpenStreetMap Italy IRC",countryCodes:["it"],languageCodes:["it"],description:"Join #osm-it on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-mailinglist":{id:"it-mailinglist",featureId:"italy",type:"mailinglist",name:"Talk-it Mailing List",countryCodes:["it"],languageCodes:["it"],description:"Talk-it is the official mailing list for the Italian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-telegram":{id:"it-telegram",type:"telegram",featureId:"italy",countryCodes:["it"],languageCodes:["it"],name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat",url:"https://t.me/OpenStreetMapItalia",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-twitter":{id:"it-twitter",featureId:"italy",type:"twitter",name:"OpenStreetMap Italy Twitter",countryCodes:["it"],languageCodes:["it"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapIt",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"OSM-Rome-meetup":{id:"OSM-Rome-meetup",featureId:"IT_Roma_Capitale",type:"group",name:"Incontro Mappatori Romani",countryCodes:["it"],languageCodes:["it"],description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio.",url:"https://wiki.openstreetmap.org/wiki/Rome/Incontro",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"South-Tyrol-Mailing-List":{id:"South-Tyrol-Mailing-List",featureId:"south_tyrol",type:"mailinglist",countryCodes:["it"],languageCodes:["de","it","lld","en"],name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol",url:"https://lists.openstreetmap.org/listinfo/talk-it-southtyrol",contacts:[{name:"Martin Raifer",email:"tyr.asd@gmail.com"}]},"talk-it-lazio":{id:"talk-it-lazio",featureId:"IT_Lazio",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area.",signupUrl:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",url:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"Trentino-Mailing-List":{id:"Trentino-Mailing-List",featureId:"trentino",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino",url:"https://lists.openstreetmap.org/listinfo/talk-it-trentino",contacts:[{name:"Luca Delucchi",email:"lucadeluge@gmail.com"}]},"no-forum":{id:"no-forum",type:"forum",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=68",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}]},"no-irc":{id:"no-irc",featureId:"norway",type:"irc",name:"OpenStreetMap Norway on IRC",countryCodes:["no"],languageCodes:["no"],description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://webchat.oftc.net/?channels=osm-no"},"no-mailinglist":{id:"no-mailinglist",featureId:"norway",type:"mailinglist",name:"OpenStreetMap Norway mailing list",countryCodes:["no"],languageCodes:["no"],description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://lists.nuug.no/mailman/listinfo/kart"},"OSM-PL-facebook-group":{id:"OSM-PL-facebook-group",type:"facebook",featureId:"poland",countryCodes:["pl"],languageCodes:["pl"],name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland",url:"https://www.facebook.com/groups/500589303317858/",contacts:[{name:"Michał Brzozowski",email:"www.haxor@gmail.com"}]},"OSM-PL-forum":{id:"OSM-PL-forum",type:"forum",featureId:"poland",countryCodes:["pl"],languageCodes:["pl","en"],name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community",url:"https://forum.openstreetmap.org/viewforum.php?id=23",contacts:[{name:"Daniel Koć",email:"daniel@xn--ko-wla.pl"},{name:"Ryszard Mikke",email:"ryszard.mikke@gmail.com"}]},"si-forum":{id:"si-forum",type:"forum",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia",url:"https://forum.openstreetmap.org/viewforum.php?id=58",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"si-mailinglist":{id:"si-mailinglist",type:"mailinglist",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia",url:"https://lists.openstreetmap.org/listinfo/talk-si",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"OSM-ES-mailinglist":{id:"OSM-ES-mailinglist",type:"mailinglist",featureId:"spain",languageCodes:["es"],name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain",url:"https://lists.openstreetmap.org/listinfo/talk-es",contacts:[{name:"Iván Sánchez",email:"ivansanchez@escomposlinux.org"}]},"OSM-ES-telegram":{id:"OSM-ES-telegram",type:"telegram",featureId:"spain",languageCodes:["es"],name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat",url:"https://t.me/OSMes",contacts:[{name:"Jorge Sanz",email:"sanchi2@gmail.com"}]},"osm-se":{id:"osm-se",featureId:"sweden",type:"group",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden",url:"http://openstreetmap.se/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-facebook":{id:"se-facebook",featureId:"sweden",type:"facebook",name:"OpenStreetMap Sweden Facebook",countryCodes:["se"],languageCodes:["sv"],description:"OpenStreetMap Sweden on Facebook",url:"https://www.facebook.com/groups/osmsweden/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-forum":{id:"se-forum",type:"forum",featureId:"sweden",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=4",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-irc":{id:"se-irc",featureId:"sweden",type:"irc",name:"OpenStreetMap Sweden IRC",countryCodes:["se"],languageCodes:["sv"],description:"Join #osm.se on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm.se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-mailinglist":{id:"se-mailinglist",featureId:"sweden",type:"mailinglist",name:"Talk-se Mailing List",countryCodes:["se"],languageCodes:["sv"],description:"A mailing list to discuss OpenStreetMap in Sweden",url:"https://lists.openstreetmap.org/listinfo/talk-se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-twitter":{id:"se-twitter",featureId:"sweden",type:"twitter",name:"OpenStreetMap Sweden on Twitter",countryCodes:["se"],languageCodes:["sv"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/openstreetmapse",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"Nottingham-OSM-pub-meetup":{id:"Nottingham-OSM-pub-meetup",featureId:"east_midlands_uk",type:"group",name:"East Midlands (Nottingham) Monthly pub meet-up",countryCodes:["gb"],languageCodes:["en"],description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose.",url:"https://wiki.openstreetmap.org/wiki/Nottingham/Pub-meetup",contacts:[{name:"Jerry Clough",email:"SK53.osm@gmail.com"}]},"gb-mailinglist":{id:"gb-mailinglist",featureId:"united_kingdom",type:"mailinglist",name:"Talk-gb Mailing List",countryCodes:["gb"],languageCodes:["en","cy"],description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"mappa-mercia-group":{id:"mappa-mercia-group",featureId:"england-west-midlands",type:"group",countryCodes:["gb"],languageCodes:["en"],name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data.",url:"http://www.mappa-mercia.org/",contacts:[{name:"Brian Prangle",email:"community@mappa-mercia.org"}]},"gb-irc":{id:"gb-irc",featureId:"united_kingdom",type:"irc",name:"OpenStreetMap United Kingdom IRC",countryCodes:["gb"],languageCodes:["en","cy"],description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question",url:"https://irc.openstreetmap.org/?chan=osm-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"OSM-CA-Slack":{id:"OSM-CA-Slack",featureId:"canada_full",type:"slack",countryCodes:["ca"],languageCodes:["en","fr"],name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}.",signupUrl:"https://slackinviteosmcanada.herokuapp.com/",url:"https://osm-ca.slack.com/",contacts:[{name:"Denis Carriere",email:"carriere.denis@gmail.com"}]},"OSM-Vancouver-meetup":{id:"OSM-Vancouver-meetup",featureId:"vancouver_metro",type:"meetup",name:"OpenStreetMap Vancouver",countryCodes:["ca"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Vancouver, BC area",url:"https://www.meetup.com/OpenStreetMap-Vancouver/",contacts:[{name:"Paul Norman",email:"penorman@mac.com"},{name:"Peter Chin",email:"bpchin@gmail.com"}],events:[{name:"April Metrotown Mappy Hour",description:"Mappy Hour is the time and place for discussion of OpenStreetMap, from surveying data to consuming data. Beginners welcome. Bring your questions.",when:"2018-04-27 18:30",where:"Firefighters' Public House, 6515 Bonsor Avenue, Burnaby, BC",url:"https://www.meetup.com/OpenStreetMap-Vancouver/events/qzsbsmyxgbkc/"}]},"OSM-CU-telegram":{id:"OSM-CU-telegram",type:"telegram",featureId:"cuba",countryCodes:["cu"],languageCodes:["es"],name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat",url:"https://telegram.me/OSM_Cuba",contacts:[{name:"Talk-cu Owner",email:"talk-cu-owner@openstreetmap.org"}]},"OSM-NI-telegram":{id:"OSM-NI-telegram",type:"telegram",featureId:"nicaragua",countryCodes:["ni"],languageCodes:["es"],name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat",url:"https://telegram.me/MapaNica",contacts:[{name:"Talk-ni Owner",email:"talk-ni-owner@openstreetmap.org"}]},"Bay-Area-OpenStreetMappers":{id:"Bay-Area-OpenStreetMappers",featureId:"sf_bay_area",type:"meetup",name:"Bay Area OpenStreetMappers",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events.",url:"https://www.meetup.com/Bay-Area-OpenStreetMappers/",contacts:[{name:"Ben Discoe",email:"bdiscoe@gmail.com"}]},"Central-Pennsylvania-OSM":{id:"Central-Pennsylvania-OSM",featureId:"central_pa",type:"facebook",name:"Central Pennsylvania OSM",countryCodes:["us"],languageCodes:["en"],description:"Online mapping community based out of State College, PA",url:"https://www.facebook.com/CentralPennsylvaniaOSM",contacts:[{name:"Sterling Quinn",email:"sdq107@psu.edu"}]},"Code-for-San-Jose-Slack":{id:"Code-for-San-Jose-Slack",featureId:"south_sf_bay_area",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel.",signupUrl:"https://slackin-c4sj.herokuapp.com/",url:"https://codeforsanjose.slack.com/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"Dallas-Fort-Worth-OSM":{id:"Dallas-Fort-Worth-OSM",featureId:"dfw_metro",type:"group",name:"Dallas-Fort Worth OSM",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM.",url:"http://dfwosm.org/",contacts:[{name:"Andrew Matheny",email:"andrewdmatheny@gmail.com"}]},GeoPhilly:{id:"GeoPhilly",featureId:"philly_metro",type:"meetup",name:"GeoPhilly",countryCodes:["us"],languageCodes:["en"],description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you!  Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!",url:"https://www.meetup.com/GeoPhilly/",contacts:[{name:"Dan Ford",email:"dford@azavea.com"}]},MapMinnesota:{id:"MapMinnesota",featureId:"minneapolis_st_paul_metro",type:"meetup",name:"MapMinnesota",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!",url:"https://www.meetup.com/Map-Minnesota/",contacts:[{name:"Ian Dees",email:"ian.dees@gmail.com"}]},"Mapping-DC-meetup":{id:"Mapping-DC-meetup",featureId:"dc_metro",type:"meetup",name:"Mapping DC",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city.",url:"https://mappingdc.org/",contacts:[{name:"Brian DeRocher",email:"brian@derocher.org"}],events:[{name:"April Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-04-10 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxgbnb/"},{name:"June Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-06-12 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxjbqb/"},{name:"August Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-08-14 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxlbsb/"},{name:"October Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-10-09 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxnbmb/"}]},"Maptime-ME-meetup":{id:"Maptime-ME-meetup",featureId:"portland_me",type:"meetup",name:"MaptimeME",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking.  Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies.",url:"https://www.meetup.com/MaptimeME/",contacts:[{name:"Malcolm Toon",email:"malcolm@foreflight.com"}]},"us-ma-mailinglist":{id:"us-ma-mailinglist",featureId:"massachusetts",type:"mailinglist",name:"Talk-us-massachusetts Mailing List",countryCodes:["us"],languageCodes:["en"],description:"Email mailing list for the Massachusetts OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-us-massachusetts",contacts:[{name:"Alan Bragg",email:"alan.ruth.bragg@gmail.com"}]},"OpenCleveland-meetup":{id:"OpenCleveland-meetup",featureId:"cleveland",type:"meetup",name:"Open Cleveland",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)",url:"https://www.meetup.com/open-cleveland/",contacts:[{name:"Will Skora",email:"skorasaurus@gmail.com"},{name:"Anastasia Diamond-Ortiz",email:"anastasia.diamond@gmail.com"}],events:[{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-18 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbxb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-25 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbhc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-02 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbdb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-09 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbmb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-16 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbvb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-23 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbfc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-30 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbnc/"}]},"OSM-Boston":{id:"OSM-Boston",featureId:"boston_metro",type:"meetup",name:"OpenStreetMap Boston",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!",url:"https://www.meetup.com/OpenStreetMap-Boston/",contacts:[{name:"Lars Ahlzen",email:"lars@ahlzen.com"}]},"OSM-Central-Salish-Sea":{id:"OSM-Central-Salish-Sea",featureId:"mt_vernon_wa",type:"meetup",name:"OpenStreetMap Central Salish Sea",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!",url:"https://www.meetup.com/OpenStreetMap-Central-Salish-Sea/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-Chattanooga":{id:"OSM-Chattanooga",featureId:"chattanooga",type:"facebook",name:"OSM Chattanooga",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Chattanooga",url:"https://www.facebook.com/groups/123483951073256",contacts:[{name:"Jenny Park",email:"tennessee@tpl.org"},{name:"Randal Hale",email:"rjhale@northrivergeographic.com"}]},"OSM-Colorado":{id:"OSM-Colorado",featureId:"colorado",type:"meetup",name:"OpenStreetMap Colorado",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Colorado/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"OSM-NYC":{id:"OSM-NYC",featureId:"nyc_metro",type:"meetup",name:"OpenStreetMap NYC",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area",url:"https://www.meetup.com/osm-nyc/",contacts:[{name:"Jeff Ferzoco",email:"jferzoco@carto.com"}]},"OSM-Portland-forum":{id:"OSM-Portland-forum",featureId:"portland_or",type:"forum",name:"OpenStreetMap PDX Google Group",countryCodes:["us"],languageCodes:["en"],description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner.",url:"https://groups.google.com/group/osm-pdx",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.com"}]},"OSM-Portland":{id:"OSM-Portland",featureId:"portland_or",type:"meetup",name:"OpenStreetMap Portland",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!",url:"https://www.meetup.com/OpenStreetMap-Portland/",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.com"}]},"OSM-Seattle":{id:"OSM-Seattle",featureId:"seattle",type:"meetup",name:"OpenStreetMap Seattle",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Seattle area",url:"https://www.meetup.com/OpenStreetMap-Seattle/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"},{name:"Chase Stephens",email:"seattlefyi@gmail.com"},{name:"Paul McCombs",email:"pablo@imperium.org"}]},"OSM-SoCal":{id:"OSM-SoCal",featureId:"la_metro",type:"meetup",name:"OpenStreetMap Southern California",countryCodes:["us"],languageCodes:["en"],description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap.  OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe.  Everyone is welcome.  If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!",url:"https://www.meetup.com/OSM-Southern-California/",contacts:[{name:"Charlotte Wolter",email:"techlady@techlady.com"}]},"OSM-South-Bay":{id:"OSM-South-Bay",featureId:"south_sf_bay_area",type:"meetup",name:"OSM South Bay",countryCodes:["us"],languageCodes:["en"],description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required.",url:"https://www.meetup.com/Code-for-San-Jose/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"OSM-Tampa-Bay":{id:"OSM-Tampa-Bay",featureId:"tampa_bay",type:"meetup",name:"OpenStreetMap Tampa Bay",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world.  If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so.",url:"https://www.meetup.com/osmtampabay/",contacts:[{name:"Coleman McCormick",email:"cmccormick@gmail.com"}]},"OSM-US-Slack":{id:"OSM-US-Slack",featureId:"usa_full",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://slack.openstreetmap.us/",url:"https://osmus.slack.com",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-US":{id:"OSM-US",featureId:"usa_full",type:"group",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",signupUrl:"https://www.openstreetmap.us/join",url:"https://www.openstreetmap.us/",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Bryan Housel",email:"bryan@openstreetmap.us"}],events:[{id:"sotmus2018",i18n:true,name:"State of the Map US 2018",description:"Join the OpenStreetMap community at State of the Map US in Detroit, Michigan. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Detroit, Michigan",when:"2018-oct-05",url:"https://2018.stateofthemap.us/"}]},"OSM-Utah":{id:"OSM-Utah",featureId:"salt_lake_city",type:"meetup",name:"OpenStreetMap Utah",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially.  We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!",url:"https://www.meetup.com/OpenStreetMap-Utah/",contacts:[{name:"Martijn van Exel",email:"m@rtijn.org"}]},"OSM-Wyoming":{id:"OSM-Wyoming",featureId:"wyoming",type:"meetup",name:"OpenStreetMap Wyoming",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Wyoming/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"PHXGeo-meetup":{id:"PHXGeo-meetup",featureId:"phoenix",type:"meetup",name:"PHXGeo Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between.",url:"https://www.meetup.com/PHXGeo/",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"PHXGeo-twitter":{id:"PHXGeo-twitter",featureId:"phoenix",type:"twitter",name:"PHXGeo Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/phxgeo",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"Western-Slope-facebook":{id:"Western-Slope-facebook",featureId:"grand_junction_co",type:"facebook",name:"Western Slope OSM Facebook",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",url:"https://www.facebook.com/wsosm/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"Western-Slope-meetup":{id:"Western-Slope-meetup",featureId:"grand_junction_co",type:"meetup",name:"Western Slope OSM Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!",url:"https://www.meetup.com/Western-Slope-OpenStreetMap/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"Maptime-Australia-Slack":{id:"Maptime-Australia-Slack",featureId:"australia_full",type:"slack",countryCodes:["au"],languageCodes:["en"],name:"Maptime Australia Slack",description:"Sign up at {signupUrl}",signupUrl:"https://bit.ly/maptimeau",url:"https://maptimeaustralia.slack.com",contacts:[{name:"David Dean",email:"ddean@ieee.org"},{name:"Philip Mallis",email:"philip.mallis@unimelb.edu.au"},{name:"Edoardo Neerhut",email:"ed@mapillary.com"}]},"talk-au":{id:"talk-au",featureId:"australia_full",type:"mailinglist",countryCodes:["au"],languageCodes:["en"],name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat",url:"https://lists.openstreetmap.org/listinfo/talk-au",contacts:[{name:"Ben Kelley",email:"ben.kelley@gmail.com"},{name:"Steve Bennett",email:"stevagewp@gmail.com"},{name:"Ian Sergeant",email:"inas66+osm@gmail.com"}]},"OSM-AR-facebook":{id:"OSM-AR-facebook",featureId:"argentina",type:"facebook",name:"OpenStreetMap Argentina Facebook",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community",url:"https://www.facebook.com/OpenStreetMapArgentina/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-forum":{id:"OSM-AR-forum",featureId:"argentina",type:"forum",name:"OpenStreetMap Argentina web forum",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time.",url:"https://forum.openstreetmap.org/viewforum.php?id=49",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-irc":{id:"OSM-AR-irc",featureId:"argentina",type:"irc",name:"OpenStreetMap Argentina IRC",countryCodes:["ar"],languageCodes:["es"],description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community.",url:"https://irc.openstreetmap.org/?chan=osm-ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-mailinglist":{id:"OSM-AR-mailinglist",featureId:"argentina",type:"mailinglist",name:"Talk-ar Mailing List",countryCodes:["ar"],languageCodes:["es"],description:"Historic mailing list. Almost unused today.",url:"https://lists.openstreetmap.org/pipermail/talk-ar/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-telegram":{id:"OSM-AR-telegram",featureId:"argentina",type:"telegram",name:"OpenStreetMap Argentina Telegram",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!",url:"https://telegram.me/osm_ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-twitter":{id:"OSM-AR-twitter",featureId:"argentina",type:"twitter",name:"OpenStreetMap Argentina Twitter",countryCodes:["ar"],languageCodes:["es"],description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general.",url:"https://twitter.com/OpenStreetMapAr",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-BO-mailinglist":{id:"OSM-BO-mailinglist",featureId:"bolivia",type:"mailinglist",name:"Talk-bo Mailing List",countryCodes:["bo"],languageCodes:["es"],description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://lists.openstreetmap.org/pipermail/talk-bo/",contacts:[{name:"Marco Antonio",email:"marcoantoniofrias@gmail.com"}]},"Bahia-telegram":{id:"Bahia-telegram",featureId:"bahia",type:"telegram",name:"OpenStreetMap Bahia Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBA",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"DF-telegram":{id:"DF-telegram",featureId:"df_br",type:"telegram",name:"OpenStreetMap Brasília Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/osmbsb",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"OSM-br-mailinglist":{id:"OSM-br-mailinglist",featureId:"brazil",type:"mailinglist",name:"Talk-br Mailing List",countryCodes:["br"],languageCodes:["pt"],description:"A mailing list to discuss OpenStreetMap in Brazil",url:"https://lists.openstreetmap.org/pipermail/talk-br/",contacts:[{name:"Arlindo Pereira",email:"nighto@gmail.com"}]},"OSM-br-telegram":{id:"OSM-br-telegram",featureId:"brazil",type:"telegram",name:"OpenStreetMap Brasil Telegram",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBrasil_Comunidade",contacts:[{name:"Vitor George",email:"vitor.george@gmail.com"}],events:[{id:"webinar_mundogeo",name:"Webinar: OpenStreetMap em Prefeituras e Empresas",description:"Participe do webinar sobre como utilizar o OpenStreeMap em prefeituras e empresas.",where:"Online",when:"2018-05-02 14:30",url:"http://mundogeo.com/webinar/webinar.html"},{id:"mundogeo",name:"Painel OpenStreetMap no MundoGeo #connect",description:"Participe do painel sobre o OpenStreetMap no MundoGeo #connect.",where:"São Paulo, SP, Brasil",when:"2018-05-16 11:00",url:"http://mundogeoconnect.com/2018/atividades-especiais/"}]},"OSM-br-twitter":{id:"OSM-br-twitter",featureId:"brazil",type:"twitter",name:"OpenStreetMap Brasil Twitter",countryCodes:["br"],languageCodes:["pt"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapBR",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"RS-telegram":{id:"RS-telegram",featureId:"rs_br",type:"telegram",name:"OpenStreetMap Rio Grande do Sul Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/osmrs",contacts:[{name:"No one",email:"nobody@nowhere.org"}]},"OSM-CL-facebook":{id:"OSM-CL-facebook",featureId:"chile",type:"facebook",name:"OpenStreetMap Chile Facebook",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://www.facebook.com/OpenStreetMap-Chile-145127198882915/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-mailinglist":{id:"OSM-CL-mailinglist",featureId:"chile",type:"mailinglist",name:"Talk-cl Mailing List",countryCodes:["cl"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Chile",url:"https://lists.openstreetmap.org/pipermail/talk-cl/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-telegram":{id:"OSM-CL-telegram",featureId:"chile",type:"telegram",name:"OpenStreetMap Chile Telegram",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMcl",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-twitter":{id:"OSM-CL-twitter",featureId:"chile",type:"twitter",name:"OpenStreetMap Chile Twitter",countryCodes:["cl"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmCL",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"Maptime-Bogota":{id:"Maptime-Bogota",featureId:"bogota",type:"meetup",name:"Maptime Bogotá",countryCodes:["co"],languageCodes:["es"],description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap.  It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun.",url:"https://www.meetup.com/Maptime-Colombia-OSM/",contacts:[{name:"Andrés Gómez Casanova",email:"angoca@gmail.com"}]},"OSM-CO-facebook":{id:"OSM-CO-facebook",featureId:"colombia",type:"facebook",name:"OpenStreetMap Colombia Facebook",countryCodes:["co"],languageCodes:["es"],description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!",url:"https://www.facebook.com/groups/OsmCol/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-mailinglist":{id:"OSM-CO-mailinglist",featureId:"colombia",type:"mailinglist",name:"Talk-co Mailing List",countryCodes:["co"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Colombia",url:"https://lists.openstreetmap.org/pipermail/talk-co/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-telegram":{id:"OSM-CO-telegram",type:"telegram",featureId:"colombia",countryCodes:["co"],languageCodes:["es"],name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat",url:"https://telegram.me/osmco",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-twitter":{id:"OSM-CO-twitter",featureId:"colombia",type:"twitter",name:"OpenStreetMap Colombia Twitter",countryCodes:["co"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapCo",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO":{id:"OSM-CO",featureId:"colombia",type:"group",countryCodes:["co"],languageCodes:["es"],name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation",url:"https://blog.openstreetmap.co/s657",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-EC-telegram":{id:"OSM-EC-telegram",type:"telegram",featureId:"ecuador",languageCodes:["es"],countryCodes:["ec"],name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat",url:"https://telegram.me/MappingEcuador",contacts:[{name:"Talk-ec Owner",email:"talk-ec-owner@openstreetmap.org"}]},"OSM-PY-telegram":{id:"OSM-PY-telegram",type:"telegram",featureId:"paraguay",languageCodes:["es"],countryCodes:["py"],name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat",url:"https://telegram.me/osm_py",contacts:[{name:"Talk-py Owner",email:"talk-py-owner@openstreetmap.org"}]},"OSM-PE-facebook":{id:"OSM-PE-facebook",featureId:"peru",type:"facebook",name:"OpenStreetMap Peru Facebook",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Facebook",url:"https://www.facebook.com/Osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-mailinglist":{id:"OSM-PE-mailinglist",featureId:"peru",type:"mailinglist",name:"Talk-pe Mailing List",countryCodes:["pe"],languageCodes:["es"],description:"The official mailing list for the OpenStreetMap Peru community",url:"https://lists.openstreetmap.org/pipermail/talk-pe/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-matrix":{id:"OSM-PE-matrix",featureId:"peru",type:"matrix",name:"OpenStreetMap Peru Matrix Chat",countryCodes:["pe"],languageCodes:["es"],description:"Chat with other members of the OpenStreetMap Peru community in Matrix.",url:"https://matrix.to/#/#osmpe:matrix.org",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-telegram":{id:"OSM-PE-telegram",featureId:"peru",type:"telegram",name:"OpenStreetMap Peru Telegram",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Telegram",url:"https://telegram.me/osmPe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-twitter":{id:"OSM-PE-twitter",featureId:"peru",type:"twitter",name:"OpenStreetMap Peru Twitter",countryCodes:["pe"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE":{id:"OSM-PE",featureId:"peru",type:"group",name:"OpenStreetMap Peru",countryCodes:["ar"],languageCodes:["es"],description:"News and resources for the OpenStreetMap Peru community",url:"http://osmpe.ourproject.org/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"LATAM-Facebook":{id:"LATAM-Facebook",featureId:"latam",type:"facebook",languageCodes:["es","pt"],name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook",url:"https://www.facebook.com/osmlatam/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Telegram":{id:"LATAM-Telegram",featureId:"latam",type:"telegram",languageCodes:["es","pt"],name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America",url:"https://t.me/OSMLatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Twitter":{id:"LATAM-Twitter",featureId:"latam",type:"twitter",languageCodes:["es","pt"],name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmlatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"osm-latam":{id:"osm-latam",type:"group",languageCodes:["es","pt"],name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",url:"https://osmlatam.org/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}],events:[{id:"sotm-latam-2018",i18n:true,name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina",when:"2018-sep-24",url:"https://state.osmlatam.org/"}]},"OSM-Facebook":{id:"OSM-Facebook",type:"facebook",languageCodes:["en"],name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap.",url:"https://www.facebook.com/OpenStreetMap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"OSM-help":{id:"OSM-help",type:"forum",languageCodes:["en"],name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap.  Whether you are a beginner mapper or have a technical question, we're here to help!",url:"https://help.openstreetmap.org/",contacts:[{name:"OSMF Operations",email:"operations@osmfoundation.org"}]},"OSM-Reddit":{id:"OSM-Reddit",type:"reddit",languageCodes:["en"],name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap.  Ask us anything!",url:"https://www.reddit.com/r/openstreetmap/",contacts:[{name:"Serge Wroclawski",email:"emacsen@gmail.com"}]},"OSM-Telegram":{id:"OSM-Telegram",type:"telegram",languageCodes:["en"],name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}",url:"https://t.me/OpenStreetMapOrg",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-Twitter":{id:"OSM-Twitter",type:"twitter",languageCodes:["en"],name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/openstreetmap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},OSMF:{id:"OSMF",type:"group",languageCodes:["en","nl","fr","it","jp","ru"],name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",url:"https://wiki.osmfoundation.org/wiki/Main_Page",signupUrl:"https://join.osmfoundation.org/",contacts:[{name:"OSMF Board",email:"board@osmfoundation.org"}],events:[{id:"sotm2018",i18n:true,name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy",when:"2018-jul-28",url:"https://2018.stateofthemap.org/"}]}};
23655
23656   var dataImagery = [{id:"sjcgis.org-Aerials_2013_WM",name:"2013 aerial imagery for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2013_WM/MapServer/tile/{zoom}/{y}/{x}",endDate:"2013-06-01T00:00:00.000Z",startDate:"2013-05-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],terms_url:"https://www.arcgis.com/home/item.html?id=7bf69831861d438d8365cf9f46662523",terms_text:"Pictometry Inc, San Juan County GIS",description:"Public domain aerial imagery taken in May/June 2013 from San Juan County, WA. Resolution is 9 inch."},{id:"sjcgis.org-Aerials_2016_WM",name:"2016 aerial imagery for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2016_WM/MapServer/tile/{zoom}/{y}/{x}",endDate:"2016-07-01T00:00:00.000Z",startDate:"2016-05-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],best:true,description:"Public domain aerial imagery taken in May, June, and July from San Juan County, WA. Resolution is 6 inch countywide."},{id:"OS7",name:"7th Series (OS7)",type:"tms",template:"https://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg",zoomExtent:[6,14],polygon:[[[-3.04697,54.83947],[-3.05864,55.24157],[-4.04466,55.23296],[-4.07076,55.63654],[-4.61904,55.6253],[-4.64926,56.02834],[-4.48961,56.03217],[-4.52394,56.4367],[-3.86751,56.44581],[-3.84176,56.04944],[-3.44591,56.04982],[-3.43492,55.64429],[-2.79497,55.65049],[-2.80802,56.05749],[-3.20661,56.05327],[-3.21417,56.45682],[-3.73808,56.45075],[-3.74185,56.86175],[-5.07669,56.83171],[-5.03652,56.42949],[-5.16012,56.42493],[-5.12991,56.01798],[-5.92607,55.99456],[-5.85518,55.23335],[-5.2281,55.25136],[-5.21024,55.02765],[-4.65956,55.04181],[-4.64548,54.81633],[-3.04697,54.83947]],[[-1.74835,57.76428],[-1.74065,57.36],[-2.58022,57.35537],[-2.57437,57.04526],[-2.08408,57.04799],[-2.07651,56.64276],[-2.7345,56.63906],[-2.73781,56.81718],[-3.23885,56.81437],[-3.24896,57.35168],[-3.75629,57.34889],[-3.76219,57.65868],[-4.76587,57.64473],[-4.81008,58.26984],[-5.2511,58.26547],[-5.27376,58.66767],[-3.55818,58.69887],[-3.56607,58.9316],[-3.37656,58.93444],[-3.38584,59.20171],[-3.18713,59.20215],[-3.18747,59.24176],[-3.06757,59.24203],[-3.07855,59.42135],[-2.37131,59.42763],[-2.36856,59.0222],[-2.67893,59.02078],[-2.67343,58.83935],[-2.86569,58.83651],[-2.8602,58.53531],[-3.03461,58.53316],[-3.0195,58.13159],[-3.6156,58.11982],[-3.61276,57.97754],[-3.71092,57.97562],[-3.69932,57.75364],[-1.74835,57.76428]],[[-7.07492,56.76319],[-7.73471,56.73566],[-7.7911,57.13994],[-7.70662,57.14343],[-7.76299,57.54311],[-7.60218,57.54968],[-7.62134,57.68452],[-7.72499,57.6803],[-7.73017,57.71673],[-7.60264,57.72191],[-7.59964,57.70083],[-7.48634,57.70544],[-7.49528,57.76813],[-7.37493,57.77301],[-7.39337,57.90201],[-7.23591,57.90838],[-7.24323,57.95948],[-7.13916,57.96369],[-7.14508,58.00495],[-7.23742,58.00122],[-7.23297,57.97018],[-7.31133,57.96702],[-7.31538,57.99525],[-7.24904,57.99792],[-7.28082,58.21856],[-7.07355,58.22687],[-7.0827,58.29018],[-6.80743,58.30119],[-6.82768,58.44074],[-6.50305,58.45366],[-6.51532,58.53792],[-6.16474,58.55184],[-6.10631,58.14894],[-6.33469,58.13976],[-6.27759,57.74145],[-6.96138,57.71366],[-6.93332,57.51615],[-7.10017,57.50933],[-7.05218,57.169],[-7.13111,57.16575],[-7.07492,56.76319]],[[0.41076,50.82087],[0.98102,50.80612],[0.99437,51.01173],[1.45062,50.99998],[1.47712,51.40552],[0.89619,51.42035],[0.88243,51.21039],[0.505,51.22007],[0.52273,51.49042],[-0.63397,51.51063],[-0.63671,51.44563],[-1.09951,51.45248],[-1.11485,51.04814],[-0.52987,51.0394],[-0.52751,51.10203],[0.42806,51.08778],[0.41076,50.82087]],[[-5.39457,51.9619],[-4.79581,51.98051],[-4.78873,51.89403],[-4.20265,51.91228],[-4.22941,52.23828],[-3.6552,52.25602],[-3.62228,51.85483],[-4.21342,51.8364],[-4.18551,51.49342],[-4.77661,51.47485],[-4.78476,51.57525],[-5.08799,51.56574],[-5.09422,51.64242],[-5.3678,51.63385],[-5.39457,51.9619]],[[-1.2389,54.03537],[-0.62779,54.02811],[-0.62004,54.25257],[-0.57268,54.25201],[-0.55865,54.65542],[-1.17998,54.66269],[-1.18782,54.43788],[-1.23221,54.4384],[-1.2389,54.03537]],[[-2.67227,50.97677],[-2.09961,50.98023],[-2.10572,51.37949],[-1.58877,51.38259],[-1.59499,51.78589],[-2.17563,51.78891],[-2.17154,51.38392],[-2.67846,51.38088],[-2.67227,50.97677]],[[-2.60155,53.27155],[-3.22973,53.2685],[-3.23522,53.67231],[-2.60704,53.67533],[-2.60155,53.27155]],[[-0.03942,51.7728],[-0.61563,51.77577],[-0.60465,52.58414],[-0.02843,52.58122],[-0.03942,51.7728]],[[-2.91529,54.03523],[-3.53229,54.02866],[-3.54484,54.43397],[-2.92785,54.44047],[-2.91529,54.03523]],[[-6.30583,57.19689],[-6.3539,57.60015],[-5.69111,57.62295],[-5.64305,57.21995],[-6.30583,57.19689]],[[1.17115,52.57236],[1.19865,52.97594],[1.79788,52.96106],[1.77037,52.55734],[1.17115,52.57236]],[[-2.40225,55.56317],[-2.40088,55.9657],[-1.76084,55.96501],[-1.76222,55.56248],[-2.40225,55.56317]],[[-6.32574,56.38537],[-7.0196,56.35747],[-7.07316,56.76384],[-6.3793,56.79145],[-6.32574,56.38537]],[[-2.42258,54.4431],[-2.42574,54.84188],[-1.79931,54.84354],[-1.79614,54.44477],[-2.42258,54.4431]],[[-3.02701,51.37935],[-3.60589,51.37017],[-3.62237,51.77304],[-3.04349,51.78215],[-3.02701,51.37935]],[[-3.05379,52.18979],[-3.06615,52.59374],[-2.48364,52.60034],[-2.47128,52.19646],[-3.05379,52.18979]],[[-5.67673,51.70425],[-5.67886,51.73101],[-5.4636,51.7376],[-5.46146,51.71084],[-5.67673,51.70425]],[[-5.84427,59.10882],[-5.8469,59.13578],[-5.79558,59.1371],[-5.79294,59.11014],[-5.84427,59.10882]],[[-8.64844,57.77861],[-8.66597,57.87717],[-8.46649,57.88721],[-8.44897,57.78867],[-8.64844,57.77861]],[[-4.52711,59.01532],[-4.52859,59.03319],[-4.47623,59.03434],[-4.47475,59.01646],[-4.52711,59.01532]],[[-7.68062,58.25838],[-7.68655,58.2938],[-7.53445,58.30084],[-7.52852,58.26542],[-7.68062,58.25838]],[[-6.19102,59.08009],[-6.19546,59.11586],[-6.12542,59.11815],[-6.12099,59.08238],[-6.19102,59.08009]],[[-4.42669,59.07112],[-4.42805,59.0887],[-4.37621,59.08976],[-4.37485,59.07218],[-4.42669,59.07112]]]},{id:"ACT2017",name:"ACTmapi Imagery 2017",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/services/actmapi/imagery2017mga/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-05-01T00:00:00.000Z",startDate:"2017-05-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.085,-35.1171],[149.1509,-35.1157],[149.1509,-35.1335],[149.1736,-35.1335],[149.1739,-35.1512],[149.1957,-35.1512],[149.1962,-35.1689],[149.2177,-35.1683],[149.2192,-35.2048],[149.241,-35.2043],[149.2419,-35.2223],[149.2632,-35.2222],[149.2644,-35.2575],[149.3085,-35.2571],[149.309,-35.2751],[149.3531,-35.2742],[149.3536,-35.2921],[149.3974,-35.2917],[149.3988,-35.3452],[149.3777,-35.3457],[149.3772,-35.3641],[149.3341,-35.3648],[149.3385,-35.5451],[149.1624,-35.5487],[149.1727,-35.9271],[149.0175,-35.9294],[149.0172,-35.9113],[148.9506,-35.9125],[148.9499,-35.8946],[148.9277,-35.8949],[148.9272,-35.8768],[148.9053,-35.8768],[148.9042,-35.8586],[148.8826,-35.859],[148.8805,-35.7695],[148.8361,-35.7698],[148.8359,-35.7521],[148.8138,-35.7524],[148.8131,-35.7343],[148.7909,-35.7347],[148.7911,-35.7167],[148.7688,-35.7167],[148.7617,-35.3924],[148.7839,-35.3921],[148.7822,-35.3022],[148.8041,-35.302],[148.8033,-35.2836],[148.8474,-35.2832],[148.8469,-35.2652],[148.8689,-35.2643],[148.8687,-35.2466],[148.9128,-35.246],[148.9123,-35.2282],[148.9341,-35.228],[148.9329,-35.1919],[148.999,-35.1904],[148.9986,-35.1724],[149.0206,-35.172],[149.0204,-35.154],[149.0637,-35.1532],[149.0635,-35.1355],[149.0857,-35.1348],[149.085,-35.1171]]],terms_url:"https://actmapi-actgov.opendata.arcgis.com/datasets/884456bde6fd46d68e0c05479f55d548",terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory"},{id:"ACT2018",name:"ACTmapi Imagery 2018",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/services/actmapi/imagery2018mga/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-03-19T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.2695,-35.4381],[149.2669,-35.348],[149.3329,-35.3468],[149.3334,-35.3648],[149.3774,-35.364],[149.3769,-35.3459],[149.3989,-35.3455],[149.3984,-35.3275],[149.4094,-35.3273],[149.4088,-35.3092],[149.3978,-35.3095],[149.3973,-35.2914],[149.3533,-35.2923],[149.3528,-35.2743],[149.3089,-35.2751],[149.3084,-35.2571],[149.2644,-35.2579],[149.2634,-35.2219],[149.2415,-35.2223],[149.241,-35.2043],[149.219,-35.2047],[149.218,-35.1687],[149.1961,-35.1691],[149.1956,-35.151],[149.1737,-35.1514],[149.1732,-35.1334],[149.1512,-35.1338],[149.1508,-35.1158],[149.085,-35.1169],[149.0854,-35.135],[149.0635,-35.1353],[149.0639,-35.1534],[149.0201,-35.1541],[149.0205,-35.1721],[148.9985,-35.1725],[148.999,-35.1905],[148.9331,-35.1916],[148.934,-35.2276],[148.912,-35.228],[148.9124,-35.246],[148.8685,-35.2467],[148.8689,-35.2647],[148.8469,-35.265],[148.8473,-35.2831],[148.8034,-35.2837],[148.8038,-35.3018],[148.7818,-35.3021],[148.7838,-35.3922],[148.8058,-35.3919],[148.8086,-35.5181],[148.7976,-35.5182],[148.7994,-35.5993],[148.8766,-35.5982],[148.8747,-35.517],[148.8527,-35.5174],[148.8508,-35.4363],[148.8398,-35.4364],[148.8388,-35.3914],[149.0039,-35.3888],[149.0048,-35.4248],[149.0268,-35.4244],[149.0277,-35.4605],[149.0497,-35.4601],[149.0511,-35.5142],[149.1613,-35.5122],[149.1594,-35.4402],[149.2695,-35.4381]]],terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory",best:true},{id:"AGIV10cm",name:"AGIV Flanders 2013-2015 aerial imagery 10cm",type:"wms",template:"https://geoservices.informatievlaanderen.be/raadpleegdiensten/OGW/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OGWRGB13_15VL&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.98494,50.70723],[5.98494,50.7672],[5.91079,50.82275],[5.75561,50.83533],[5.75423,50.86264],[5.8332,50.93323],[5.85517,51.02661],[5.90941,51.07754],[5.91216,51.18225],[5.87851,51.20807],[5.77414,51.23689],[5.68419,51.24075],[5.62308,51.26998],[5.62308,51.29789],[5.54,51.34724],[5.4473,51.34853],[5.39855,51.32107],[5.31203,51.32322],[5.26671,51.36182],[5.19942,51.37254],[5.18294,51.39611],[5.15891,51.4924],[5.08338,51.53086],[5.03257,51.53983],[4.95566,51.50522],[4.90142,51.50565],[4.83825,51.54367],[4.77096,51.55862],[4.7119,51.54709],[4.64049,51.49667],[4.6144,51.4971],[4.56565,51.53171],[4.48256,51.53043],[4.42626,51.52189],[4.3006,51.46974],[4.29511,51.42566],[4.18113,51.42437],[4.13718,51.39525],[4.13856,51.35067],[4.05204,51.30047],[3.93325,51.27298],[3.86527,51.27084],[3.86321,51.29016],[3.76296,51.32407],[3.59336,51.35925],[3.47732,51.33137],[3.42582,51.39739],[3.23562,51.35153],[3.226,51.36568],[3.17794,51.36182],[3.16009,51.33223],[3.06258,51.30219],[2.75084,51.1702],[2.47001,51.07452],[2.49267,50.99378],[2.53112,50.95573],[2.50915,50.91159],[2.53043,50.82145],[2.5991,50.76416],[2.66501,50.76459],[2.77007,50.66677],[2.8971,50.65894],[2.99186,50.72549],[3.11339,50.72636],[3.23699,50.70592],[3.36265,50.6585],[3.47114,50.70201],[3.63936,50.66721],[3.69842,50.68156],[3.72794,50.71245],[3.81858,50.68418],[3.87488,50.64152],[4.09255,50.64283],[4.15023,50.66329],[4.20653,50.64413],[4.31365,50.64283],[4.45235,50.68766],[4.53475,50.67808],[4.61303,50.69549],[4.67689,50.69592],[4.72701,50.73201],[4.78057,50.73201],[4.79979,50.71288],[4.86228,50.71288],[4.88563,50.69549],[4.96116,50.69549],[5.03119,50.65763],[5.10741,50.65023],[5.2008,50.64892],[5.23581,50.66546],[5.32508,50.6659],[5.36696,50.682],[5.42121,50.66416],[5.52215,50.6746],[5.6224,50.72418],[5.67527,50.69853],[5.73981,50.69723],[5.77277,50.67199],[5.8126,50.66024],[5.90804,50.65981],[5.98494,50.70723]]],terms_text:"Orthophoto Flanders © AGIV",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIVFlandersGRB",name:"AGIV Flanders GRB",type:"tms",template:"https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,21],polygon:[[[4.40434,50.78177],[4.45538,50.79328],[4.40268,50.8961],[4.331,50.90094],[4.27142,50.82002],[4.30648,50.81244],[4.36348,50.77251],[4.40434,50.78177],[4.43104,50.73831],[4.31859,50.72022],[4.29031,50.69402],[4.14853,50.72834],[3.95877,50.68947],[3.9097,50.69245],[3.89113,50.74333],[3.77568,50.74789],[3.75857,50.78045],[3.67752,50.77062],[3.64047,50.72242],[3.54139,50.73377],[3.54062,50.76307],[3.46005,50.76556],[3.3522,50.70614],[3.30562,50.75466],[3.17839,50.75609],[3.15329,50.78564],[3.02008,50.77312],[2.99943,50.81035],[2.91648,50.75356],[2.85476,50.75745],[2.86521,50.70565],[2.78473,50.7369],[2.713,50.81534],[2.63518,50.8129],[2.59909,50.85306],[2.59031,50.91893],[2.63262,50.94575],[2.57372,51.00842],[2.54165,51.09345],[3.15582,51.32714],[3.18307,51.37128],[3.23443,51.34669],[3.36356,51.37228],[3.38101,51.27446],[3.44201,51.24313],[3.52759,51.24604],[3.51511,51.28753],[3.58984,51.30577],[3.7783,51.26235],[3.79088,51.21429],[3.92412,51.21938],[4.16613,51.2929],[4.26163,51.37647],[4.42065,51.36473],[4.39108,51.45149],[4.54747,51.48571],[4.53541,51.42303],[4.64953,51.42758],[4.76359,51.5088],[4.84188,51.48074],[4.8383,51.42174],[4.89366,51.41698],[4.92785,51.39544],[5.02894,51.48789],[5.08018,51.46948],[5.10202,51.42892],[5.07117,51.3935],[5.13109,51.35137],[5.13448,51.31547],[5.20031,51.32172],[5.24189,51.30534],[5.23036,51.26436],[5.34828,51.27492],[5.41741,51.26229],[5.4863,51.30197],[5.5556,51.26986],[5.56045,51.22233],[5.76027,51.18505],[5.85578,51.14463],[5.75909,51.03588],[5.72665,50.91307],[5.64522,50.8372],[5.68732,50.804],[5.47863,50.72352],[5.41196,50.72368],[5.38908,50.74775],[5.30912,50.71802],[5.16984,50.72257],[5.16508,50.6957],[5.05642,50.71567],[5.00339,50.76594],[4.92545,50.74275],[4.90869,50.76968],[4.83106,50.77028],[4.76014,50.80544],[4.64309,50.79755],[4.65486,50.7552],[4.62021,50.74348],[4.59727,50.76359],[4.52399,50.72724],[4.49455,50.75679],[4.43104,50.73831],[4.40434,50.78177]],[[5.67393,50.75373],[5.88438,50.70114],[5.94172,50.76524],[5.76662,50.78761],[5.67393,50.75373]],[[4.91171,51.43492],[4.93711,51.42614],[4.95891,51.45471],[4.92801,51.46049],[4.91171,51.43492]]],terms_text:"GRB Flanders © AGIV",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIV",name:"AGIV Flanders most recent aerial imagery",type:"tms",template:"https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,21],polygon:[[[4.7737,50.79368],[4.8379,50.75916],[4.92511,50.73483],[4.98862,50.76264],[5.036,50.73527],[5.0645,50.69875],[5.1644,50.69005],[5.19393,50.71179],[5.3086,50.71245],[5.36422,50.74396],[5.43391,50.70766],[5.54378,50.74396],[5.61141,50.73527],[5.71166,50.73505],[5.77105,50.74092],[5.81946,50.70484],[5.89568,50.70614],[5.9204,50.72831],[5.91971,50.74504],[5.89843,50.77675],[5.81569,50.76351],[5.77517,50.79216],[5.69552,50.79737],[5.69072,50.82319],[5.66325,50.82904],[5.65467,50.86481],[5.72368,50.9012],[5.77174,50.95443],[5.75114,50.97368],[5.78273,51.00048],[5.78032,51.0523],[5.80848,51.05338],[5.80951,51.07668],[5.84315,51.09372],[5.84418,51.1101],[5.82599,51.11851],[5.86959,51.14953],[5.8277,51.17365],[5.792,51.16891],[5.7738,51.19344],[5.666,51.1928],[5.64059,51.21065],[5.5709,51.22829],[5.56231,51.27535],[5.49811,51.30605],[5.47099,51.30219],[5.45794,51.2893],[5.43048,51.28823],[5.41434,51.27363],[5.36593,51.282],[5.33641,51.28265],[5.32577,51.26718],[5.24337,51.27406],[5.24989,51.31335],[5.20972,51.32794],[5.14174,51.31914],[5.14209,51.35367],[5.08647,51.39482],[5.11565,51.43615],[5.08853,51.47508],[5.05214,51.47636],[5.04561,51.4939],[5.02364,51.4939],[5.01609,51.48663],[4.82966,51.48663],[4.83001,51.50009],[4.76855,51.51099],[4.74727,51.50394],[4.658,51.4492],[4.65663,51.43144],[4.53956,51.43379],[4.55466,51.48171],[4.5296,51.48748],[4.46368,51.48235],[4.37167,51.45562],[4.37751,51.40553],[4.4139,51.37511],[4.39776,51.36118],[4.34798,51.36675],[4.34627,51.38497],[4.20344,51.38111],[4.2213,51.3511],[4.15641,51.29832],[4.05101,51.25193],[4.00638,51.25279],[3.95144,51.22205],[3.88484,51.22936],[3.81926,51.21797],[3.80038,51.22872],[3.80107,51.26074],[3.74442,51.28007],[3.63593,51.29746],[3.58615,51.31378],[3.5065,51.28308],[3.51371,51.25021],[3.43921,51.25064],[3.39766,51.27513],[3.37329,51.31678],[3.39114,51.34274],[3.3623,51.37961],[3.24283,51.35474],[3.20266,51.37039],[3.15631,51.35196],[3.14223,51.33051],[2.53318,51.09092],[2.56476,50.9968],[2.61832,50.9527],[2.57781,50.91852],[2.5936,50.88431],[2.58948,50.85051],[2.6245,50.80757],[2.71033,50.8054],[2.78449,50.71853],[2.87375,50.69983],[2.86483,50.74765],[2.92525,50.75156],[2.97263,50.77024],[2.97332,50.79889],[3.00078,50.79759],[3.01383,50.76676],[3.09863,50.76611],[3.13537,50.78196],[3.16832,50.75004],[3.30428,50.74613],[3.31561,50.71484],[3.3678,50.70179],[3.44848,50.75091],[3.53293,50.75156],[3.53328,50.72549],[3.63902,50.7131],[3.69086,50.7672],[3.75163,50.76177],[3.7712,50.73874],[3.87729,50.73983],[3.87969,50.70418],[3.9202,50.68352],[3.99951,50.682],[4.06749,50.68961],[4.16018,50.72049],[4.17632,50.70331],[4.24739,50.68222],[4.31708,50.69418],[4.31846,50.70962],[4.38403,50.71027],[4.38437,50.72353],[4.47226,50.74743],[4.52617,50.71853],[4.55226,50.73766],[4.64908,50.73722],[4.6532,50.78717],[4.72426,50.78218],[4.73731,50.79585],[4.7737,50.79368]]],terms_text:"Orthophoto Flanders most recent © AGIV",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGRI-black_and_white-2.5m",name:"AGRI black-and-white 2.5m",type:"tms",template:"https://{switch:a,b,c}.agri.openstreetmap.org/layer/au_ga_agri/{zoom}/{x}/{y}.png",endDate:"2011-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[112.28778,-28.78459],[112.71488,-31.13894],[114.11263,-34.17829],[113.60788,-37.39012],[117.17992,-37.45179],[119.31538,-37.42096],[121.72262,-36.70839],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.7274],[130.07031,-33.24166],[130.10913,-33.8887],[131.00214,-34.04971],[131.0798,-34.72257],[132.28342,-35.39],[134.18591,-35.61126],[133.8753,-37.1119],[134.8459,-37.6365],[139.7769,-37.82075],[139.93223,-39.4283],[141.6017,-39.8767],[142.3783,-39.36829],[142.3783,-40.64702],[142.49478,-42.07487],[144.009,-44.06013],[147.23161,-44.03222],[149.05645,-42.53431],[149.52237,-40.99959],[149.9494,-40.85292],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.66771],[156.20052,-20.10109],[156.62761,-17.41763],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.25677],[152.27905,-13.4135],[151.3472,-12.39177],[149.48354,-12.05024],[146.9598,-9.99241],[135.9719,-9.99241],[130.3032,-10.33636],[128.09016,-12.16414],[125.91588,-12.31591],[124.3239,-11.86033],[122.03323,-11.97429],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.59603],[112.28778,-28.78459]]],terms_url:"https://data.gov.au/dataset/agri-the-australian-geographic-reference-image",terms_text:"AGRI, Geoscience Australia"},{id:"alagoas_litoral",name:"Alagoas Litoral 2006",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Ortofotos%202006&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.52384,-9.48089],[-35.5236,-9.44515],[-35.51572,-9.44518],[-35.51584,-9.44229],[-35.50542,-9.44238],[-35.50518,-9.43064],[-35.49334,-9.43073],[-35.49304,-9.3982],[-35.4893,-9.39817],[-35.48921,-9.38628],[-35.4854,-9.38634],[-35.48525,-9.37809],[-35.48127,-9.37812],[-35.48114,-9.36987],[-35.47698,-9.36996],[-35.47686,-9.36385],[-35.47459,-9.36388],[-35.47447,-9.36153],[-35.47212,-9.36141],[-35.47206,-9.35917],[-35.46976,-9.3592],[-35.46967,-9.35682],[-35.46653,-9.35676],[-35.46641,-9.35289],[-35.46387,-9.35277],[-35.46387,-9.35119],[-35.44135,-9.35131],[-35.44125,-9.34541],[-35.43177,-9.34538],[-35.43171,-9.33602],[-35.39463,-9.33632],[-35.39442,-9.30125],[-35.38165,-9.30143],[-35.38147,-9.28638],[-35.37799,-9.28626],[-35.37796,-9.2811],[-35.36942,-9.28122],[-35.36921,-9.27261],[-35.35966,-9.27276],[-35.35969,-9.26465],[-35.35051,-9.26474],[-35.35036,-9.25562],[-35.34115,-9.25565],[-35.34118,-9.24501],[-35.31775,-9.24519],[-35.3176,-9.22567],[-35.30292,-9.22579],[-35.30283,-9.2113],[-35.30794,-9.21136],[-35.30785,-9.19979],[-35.29103,-9.19988],[-35.29091,-9.1966],[-35.29018,-9.19669],[-35.28997,-9.16516],[-35.27759,-9.16522],[-35.2775,-9.16417],[-35.27541,-9.1642],[-35.27535,-9.16152],[-35.27375,-9.16149],[-35.27366,-9.15839],[-35.27182,-9.15842],[-35.27185,-9.15729],[-35.27149,-9.15729],[-35.27143,-9.15469],[-35.26965,-9.15463],[-35.26959,-9.15362],[-35.26919,-9.15362],[-35.26907,-9.13159],[-35.26403,-9.13165],[-35.264,-9.12318],[-35.26056,-9.12321],[-35.26053,-9.11781],[-35.256,-9.11784],[-35.25573,-9.08946],[-35.25114,-9.08955],[-35.25108,-9.08651],[-35.25026,-9.08648],[-35.25029,-9.08475],[-35.24449,-9.08478],[-35.24449,-9.07989],[-35.24093,-9.07997],[-35.24081,-9.07312],[-35.23734,-9.07312],[-35.23719,-9.06322],[-35.23655,-9.06322],[-35.23652,-9.04655],[-35.23323,-9.04652],[-35.23332,-9.04345],[-35.2306,-9.04348],[-35.2306,-9.04014],[-35.22897,-9.04008],[-35.229,-9.03835],[-35.22505,-9.03826],[-35.22502,-9.03167],[-35.2223,-9.03161],[-35.22233,-9.02012],[-35.21834,-9.02009],[-35.21831,-9.01341],[-35.21671,-9.01341],[-35.21668,-9.00998],[-35.21176,-9.00998],[-35.21173,-9.00647],[-35.20971,-9.00653],[-35.20974,-9.00438],[-35.20765,-9.00432],[-35.20768,-9.00226],[-35.20566,-9.00226],[-35.20563,-8.99987],[-35.20391,-8.99987],[-35.20394,-8.99785],[-35.20213,-8.99791],[-35.20213,-8.99579],[-35.19844,-8.99582],[-35.19844,-8.99361],[-35.19434,-8.99361],[-35.19428,-8.99122],[-35.19065,-8.99131],[-35.19062,-8.98833],[-35.18766,-8.98842],[-35.18763,-8.98544],[-35.18473,-8.98541],[-35.18467,-8.98255],[-35.18238,-8.98252],[-35.18235,-8.98052],[-35.17951,-8.98061],[-35.17948,-8.97742],[-35.17809,-8.97745],[-35.17803,-8.97306],[-35.17558,-8.97303],[-35.17549,-8.96912],[-35.17293,-8.96909],[-35.17284,-8.96292],[-35.17063,-8.96289],[-35.17048,-8.95579],[-35.16852,-8.95564],[-35.16852,-8.94806],[-35.16794,-8.948],[-35.16791,-8.93995],[-35.16245,-8.93995],[-35.16242,-8.92978],[-35.1587,-8.92981],[-35.15873,-8.92662],[-35.15547,-8.92668],[-35.1555,-8.92378],[-35.15348,-8.92381],[-35.15339,-8.92065],[-35.15131,-8.92062],[-35.15122,-8.91194],[-35.15263,-8.91194],[-35.15263,-8.90821],[-35.15439,-8.90824],[-35.1543,-8.90215],[-35.15593,-8.90212],[-35.15593,-8.90051],[-35.15768,-8.90048],[-35.15774,-8.89905],[-35.15958,-8.89908],[-35.15955,-8.89747],[-35.16139,-8.8975],[-35.16133,-8.89625],[-35.16363,-8.89625],[-35.1636,-8.89526],[-35.16553,-8.89526],[-35.1655,-8.89315],[-35.16794,-8.89315],[-35.16791,-8.89147],[-35.17024,-8.89153],[-35.17027,-8.8904],[-35.17302,-8.89043],[-35.17302,-8.88876],[-35.17791,-8.88876],[-35.17794,-8.88795],[-35.17894,-8.88792],[-35.17894,-8.88891],[-35.17966,-8.88894],[-35.17978,-8.88858],[-35.18099,-8.88861],[-35.18099,-8.88816],[-35.18519,-8.88816],[-35.18519,-8.88897],[-35.18591,-8.889],[-35.18591,-8.88971],[-35.18932,-8.88971],[-35.18947,-8.8893],[-35.19014,-8.88927],[-35.19017,-8.88831],[-35.19071,-8.88831],[-35.19077,-8.88789],[-35.19153,-8.88792],[-35.19156,-8.88619],[-35.19754,-8.88607],[-35.19757,-8.8873],[-35.19968,-8.8873],[-35.19974,-8.88777],[-35.2008,-8.88777],[-35.2008,-8.88822],[-35.2033,-8.88822],[-35.20337,-8.8887],[-35.20563,-8.88861],[-35.20557,-8.88983],[-35.20741,-8.8898],[-35.20744,-8.89022],[-35.21125,-8.89025],[-35.21128,-8.88769],[-35.21245,-8.88777],[-35.21248,-8.88861],[-35.21623,-8.88858],[-35.21623,-8.88748],[-35.21871,-8.88745],[-35.21871,-8.88897],[-35.22136,-8.88897],[-35.22263,-8.88792],[-35.22402,-8.88748],[-35.22453,-8.88763],[-35.22644,-8.88718],[-35.22707,-8.88598],[-35.23311,-8.88446],[-35.23933,-8.88339],[-35.24129,-8.88416],[-35.25011,-8.88515],[-35.25624,-8.88506],[-35.26168,-8.88294],[-35.26161,-8.88094],[-35.26406,-8.88109],[-35.26877,-8.8793],[-35.27421,-8.87748],[-35.2781,-8.87518],[-35.28499,-8.87507],[-35.28502,-8.87581],[-35.2881,-8.87578],[-35.29405,-8.87545],[-35.30782,-8.87208],[-35.31757,-8.86961],[-35.32784,-8.86716],[-35.33206,-8.86614],[-35.34103,-8.86376],[-35.3471,-8.86244],[-35.3522,-8.86113],[-35.35257,-8.86391],[-35.34903,-8.86611],[-35.34496,-8.87205],[-35.34327,-8.87489],[-35.34318,-8.87569],[-35.34381,-8.87668],[-35.34481,-8.8768],[-35.34888,-8.87721],[-35.35042,-8.87781],[-35.35254,-8.87891],[-35.35399,-8.88011],[-35.35577,-8.88252],[-35.35755,-8.88396],[-35.36036,-8.88512],[-35.36114,-8.88509],[-35.3612,-8.88587],[-35.36175,-8.8859],[-35.36178,-8.88777],[-35.36253,-8.88783],[-35.36247,-8.891],[-35.36311,-8.89112],[-35.36311,-8.89482],[-35.3644,-8.89488],[-35.36507,-8.8967],[-35.36637,-8.90022],[-35.36754,-8.90427],[-35.36794,-8.90782],[-35.36863,-8.90917],[-35.37207,-8.91155],[-35.3741,-8.91349],[-35.37277,-8.916],[-35.37262,-8.91817],[-35.37084,-8.92229],[-35.37062,-8.92486],[-35.37235,-8.93038],[-35.37153,-8.93193],[-35.37153,-8.93363],[-35.37171,-8.93387],[-35.37171,-8.94362],[-35.36818,-8.94377],[-35.36815,-8.94505],[-35.36927,-8.94511],[-35.36921,-8.94863],[-35.37078,-8.94872],[-35.37081,-8.95182],[-35.37219,-8.95176],[-35.37222,-8.95528],[-35.37319,-8.95531],[-35.37313,-8.95737],[-35.3744,-8.95737],[-35.37446,-8.96012],[-35.37567,-8.96018],[-35.3757,-8.96205],[-35.37688,-8.96208],[-35.37694,-8.96444],[-35.37781,-8.96444],[-35.37775,-8.96617],[-35.38074,-8.96617],[-35.38074,-8.96331],[-35.38288,-8.96328],[-35.38291,-8.95982],[-35.38542,-8.95985],[-35.38542,-8.95722],[-35.38723,-8.95722],[-35.3872,-8.95406],[-35.38947,-8.95409],[-35.38947,-8.95084],[-35.39158,-8.95087],[-35.39158,-8.94792],[-35.39587,-8.94792],[-35.39581,-8.94651],[-35.3972,-8.94654],[-35.39711,-8.94472],[-35.39838,-8.94469],[-35.39838,-8.93915],[-35.40107,-8.93915],[-35.40106,-8.93895],[-35.40167,-8.93894],[-35.40173,-8.93688],[-35.40236,-8.93688],[-35.40236,-8.93628],[-35.40324,-8.9364],[-35.4033,-8.93583],[-35.40426,-8.9358],[-35.4042,-8.93363],[-35.40574,-8.9336],[-35.40577,-8.93124],[-35.4081,-8.93133],[-35.40804,-8.92927],[-35.40937,-8.9293],[-35.40928,-8.92739],[-35.41085,-8.92742],[-35.41085,-8.92542],[-35.41239,-8.92545],[-35.41236,-8.9239],[-35.41335,-8.92387],[-35.41329,-8.92193],[-35.41523,-8.92196],[-35.41523,-8.91999],[-35.41655,-8.92002],[-35.41655,-8.91755],[-35.4196,-8.91755],[-35.41966,-8.91964],[-35.42184,-8.91964],[-35.42187,-8.92265],[-35.42389,-8.92268],[-35.42392,-8.92513],[-35.42537,-8.92513],[-35.42537,-8.92766],[-35.42724,-8.92766],[-35.42727,-8.92987],[-35.42815,-8.92984],[-35.42818,-8.9316],[-35.42987,-8.93154],[-35.4299,-8.93407],[-35.43141,-8.93407],[-35.43141,-8.9356],[-35.43226,-8.93557],[-35.43229,-8.93586],[-35.4334,-8.93583],[-35.4334,-8.94001],[-35.43434,-8.94004],[-35.43434,-8.94097],[-35.43531,-8.94097],[-35.43534,-8.94261],[-35.43567,-8.94264],[-35.4357,-8.94329],[-35.43627,-8.94332],[-35.43624,-8.94422],[-35.4373,-8.94422],[-35.43727,-8.9452],[-35.43823,-8.9452],[-35.43827,-8.94684],[-35.43902,-8.94687],[-35.43902,-8.94798],[-35.44026,-8.94798],[-35.44032,-8.94953],[-35.44159,-8.94956],[-35.44165,-8.95152],[-35.44273,-8.95152],[-35.44273,-8.95334],[-35.44436,-8.95334],[-35.44436,-8.95498],[-35.44569,-8.95501],[-35.44563,-8.95674],[-35.4472,-8.9568],[-35.44717,-8.95865],[-35.44895,-8.95871],[-35.44892,-8.96],[-35.45101,-8.95994],[-35.45098,-8.96101],[-35.45469,-8.96095],[-35.45466,-8.96235],[-35.46049,-8.96235],[-35.46055,-8.96557],[-35.46653,-8.96548],[-35.46659,-8.96885],[-35.46771,-8.96883],[-35.46774,-8.97053],[-35.4739,-8.97053],[-35.47399,-8.9753],[-35.47791,-8.97521],[-35.47797,-8.97816],[-35.4841,-8.97813],[-35.48416,-8.98201],[-35.49084,-8.98195],[-35.49084,-8.98562],[-35.49721,-8.98562],[-35.49721,-8.99069],[-35.50225,-8.99057],[-35.50234,-8.99567],[-35.50648,-8.99567],[-35.50651,-8.99856],[-35.51204,-8.9985],[-35.51207,-9.00163],[-35.51663,-9.00166],[-35.51666,-9.00617],[-35.52119,-9.00614],[-35.52122,-9.00739],[-35.53127,-9.00733],[-35.53127,-9.01064],[-35.54818,-9.01049],[-35.54818,-9.01359],[-35.56968,-9.01344],[-35.56974,-9.01738],[-35.58575,-9.01732],[-35.58578,-9.01995],[-35.60957,-9.01983],[-35.60954,-9.02302],[-35.62911,-9.02287],[-35.62905,-9.02508],[-35.65221,-9.0249],[-35.65224,-9.02758],[-35.67552,-9.0274],[-35.67555,-9.03056],[-35.68295,-9.03056],[-35.68298,-9.03435],[-35.69128,-9.03432],[-35.69128,-9.03766],[-35.6995,-9.0376],[-35.6995,-9.04034],[-35.70668,-9.04031],[-35.70671,-9.04518],[-35.71115,-9.04518],[-35.71133,-9.06691],[-35.70871,-9.06691],[-35.70877,-9.07869],[-35.70656,-9.07872],[-35.70656,-9.08653],[-35.7043,-9.08653],[-35.70433,-9.09104],[-35.69992,-9.09107],[-35.69989,-9.0956],[-35.69536,-9.09557],[-35.69542,-9.10001],[-35.69092,-9.10013],[-35.69101,-9.10207],[-35.63367,-9.10246],[-35.6337,-9.10541],[-35.62585,-9.10553],[-35.62591,-9.10964],[-35.62231,-9.10964],[-35.62234,-9.11203],[-35.6199,-9.112],[-35.6199,-9.11501],[-35.61473,-9.11507],[-35.61473,-9.11707],[-35.61177,-9.11701],[-35.61181,-9.1182],[-35.6096,-9.11826],[-35.60963,-9.12571],[-35.59976,-9.12583],[-35.59979,-9.12923],[-35.59634,-9.12926],[-35.5964,-9.13502],[-35.59197,-9.13507],[-35.59209,-9.149],[-35.59018,-9.14897],[-35.59015,-9.15108],[-35.6016,-9.15105],[-35.60154,-9.14912],[-35.60552,-9.14912],[-35.60549,-9.14557],[-35.61184,-9.14554],[-35.61184,-9.14235],[-35.6176,-9.14238],[-35.61757,-9.13853],[-35.624,-9.13853],[-35.62397,-9.13466],[-35.63177,-9.13466],[-35.63164,-9.13063],[-35.63922,-9.1306],[-35.63919,-9.12878],[-35.66386,-9.12869],[-35.6638,-9.1261],[-35.71278,-9.12577],[-35.71275,-9.12407],[-35.72426,-9.12401],[-35.71964,-9.15323],[-35.72112,-9.1532],[-35.72124,-9.17258],[-35.72066,-9.17255],[-35.72082,-9.18558],[-35.71212,-9.18566],[-35.7133,-9.34416],[-35.69041,-9.34433],[-35.69065,-9.37189],[-35.68899,-9.37189],[-35.68902,-9.37598],[-35.68757,-9.37598],[-35.68766,-9.38232],[-35.68497,-9.38235],[-35.68503,-9.39093],[-35.68168,-9.39099],[-35.68177,-9.39936],[-35.67715,-9.39933],[-35.67724,-9.4089],[-35.67292,-9.40893],[-35.67301,-9.41754],[-35.66972,-9.4176],[-35.66978,-9.42498],[-35.66722,-9.42498],[-35.66728,-9.4327],[-35.66075,-9.43288],[-35.66075,-9.43705],[-35.6513,-9.43708],[-35.65142,-9.44211],[-35.64514,-9.44217],[-35.64523,-9.44652],[-35.63645,-9.44661],[-35.63645,-9.44992],[-35.62711,-9.45],[-35.62727,-9.46505],[-35.62086,-9.46511],[-35.62092,-9.4722],[-35.60939,-9.47222],[-35.60939,-9.47529],[-35.59674,-9.47535],[-35.59674,-9.47351],[-35.57844,-9.47371],[-35.57847,-9.47595],[-35.57267,-9.47604],[-35.5727,-9.48042],[-35.56823,-9.48048],[-35.56826,-9.48881],[-35.54169,-9.48893],[-35.54163,-9.48071],[-35.52384,-9.48089]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"arapiraca_al",name:"Arapiraca AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Arapiraca&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.60875,-9.83072],[-36.60784,-9.74047],[-36.61718,-9.74051],[-36.61631,-9.65075],[-36.70737,-9.64977],[-36.70832,-9.74043],[-36.69898,-9.74047],[-36.69997,-9.82968],[-36.60875,-9.83072]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"CRAIG-Auvergne-2013",name:"Auvergne 2013 25cm CRAIG",type:"tms",template:"https://tiles.craig.fr/osm/wmts/1.0.0/ortho_2013/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.94012,44.63388],[2.99719,44.63393],[2.99717,44.64734],[3.01597,44.64735],[3.01593,44.67412],[3.03495,44.67413],[3.0349,44.70152],[3.05363,44.70154],[3.05357,44.7419],[3.07233,44.74191],[3.07222,44.80917],[3.09216,44.80919],[3.09214,44.82213],[3.13014,44.82216],[3.13005,44.87707],[3.14856,44.87709],[3.14858,44.8637],[3.16823,44.86371],[3.16825,44.85003],[3.2064,44.85006],[3.20638,44.86284],[3.24395,44.86287],[3.24393,44.87679],[3.26315,44.87681],[3.26308,44.91752],[3.32004,44.91757],[3.32002,44.93033],[3.33908,44.93035],[3.33906,44.9442],[3.377,44.94423],[3.37702,44.93029],[3.39603,44.9303],[3.39612,44.87627],[3.41483,44.87629],[3.41489,44.83553],[3.43334,44.83554],[3.43338,44.80828],[3.45255,44.80829],[3.45258,44.79463],[3.50893,44.79468],[3.5089,44.80815],[3.60426,44.80823],[3.60422,44.83482],[3.62361,44.83484],[3.62357,44.86166],[3.64248,44.86167],[3.64255,44.8211],[3.66101,44.82112],[3.66103,44.80777],[3.6993,44.8078],[3.69928,44.82099],[3.73611,44.82102],[3.73618,44.77971],[3.77511,44.77974],[3.77515,44.75223],[3.81184,44.75226],[3.81186,44.7392],[3.83118,44.73922],[3.83121,44.72468],[3.88782,44.72472],[3.8878,44.73818],[3.92563,44.73821],[3.9256,44.75167],[3.94541,44.75168],[3.94537,44.77847],[3.96437,44.77848],[3.96435,44.79193],[4.00332,44.79196],[4.0033,44.80526],[4.02169,44.80527],[4.02167,44.81857],[4.05965,44.8186],[4.05961,44.84492],[4.07981,44.84494],[4.07979,44.85735],[4.17388,44.85743],[4.17386,44.87055],[4.19326,44.87056],[4.19323,44.88427],[4.21404,44.88429],[4.214,44.91002],[4.23241,44.91004],[4.23237,44.93731],[4.27155,44.93734],[4.27153,44.9503],[4.32887,44.95034],[4.32878,45.00367],[4.34893,45.00368],[4.3489,45.01707],[4.40608,45.01711],[4.40599,45.071],[4.38847,45.07099],[4.38845,45.0846],[4.40794,45.08461],[4.40792,45.09663],[4.48436,45.09669],[4.48429,45.13705],[4.46636,45.13703],[4.46634,45.1502],[4.48645,45.15022],[4.4864,45.17724],[4.50655,45.17726],[4.50644,45.24501],[4.48813,45.24499],[4.48811,45.25921],[4.46986,45.25919],[4.46984,45.27298],[4.45088,45.27297],[4.45086,45.28642],[4.39368,45.28637],[4.39363,45.31352],[4.37509,45.3135],[4.37507,45.32741],[4.39507,45.32742],[4.39503,45.35458],[4.37679,45.35457],[4.37676,45.36855],[4.35766,45.36853],[4.35763,45.38234],[4.28146,45.38227],[4.28143,45.39688],[4.24446,45.39685],[4.24443,45.41079],[4.14812,45.41071],[4.14814,45.39807],[4.12919,45.39805],[4.12921,45.38409],[4.09021,45.38406],[4.09024,45.37121],[4.01355,45.37115],[4.01353,45.3861],[3.91709,45.38602],[3.91707,45.39974],[3.93757,45.39975],[3.93755,45.41311],[3.97528,45.41315],[3.97526,45.42621],[3.99537,45.42622],[3.9957,45.52096],[3.97778,45.52094],[3.97769,45.57439],[3.95818,45.57437],[3.95815,45.58837],[3.9396,45.58835],[3.93958,45.60262],[3.92023,45.60261],[3.9202,45.61646],[3.88189,45.61643],[3.88185,45.64328],[3.84413,45.64325],[3.84411,45.65709],[3.82617,45.65707],[3.82612,45.68389],[3.80722,45.68387],[3.80713,45.73758],[3.78821,45.73756],[3.78819,45.7518],[3.76885,45.75178],[3.7688,45.77897],[3.75072,45.77895],[3.75058,45.86066],[3.76967,45.86067],[3.76958,45.91433],[3.75166,45.91432],[3.75164,45.92809],[3.7329,45.92807],[3.73285,45.95472],[3.81018,45.95478],[3.81016,45.96823],[3.8496,45.96826],[3.84951,46.02162],[3.83188,46.0216],[3.83179,46.07591],[3.8505,46.07592],[3.85046,46.10295],[3.83247,46.10294],[3.83234,46.18456],[3.81422,46.18455],[3.81415,46.22442],[3.83369,46.22444],[3.83366,46.2381],[3.85289,46.23812],[3.85287,46.25147],[3.89314,46.25151],[3.89312,46.26447],[3.91306,46.26448],[3.91303,46.27793],[3.95189,46.27796],[3.95187,46.29082],[3.97152,46.29084],[3.9715,46.30369],[4.0105,46.30373],[4.01048,46.31776],[4.02983,46.31778],[4.02978,46.34428],[4.0116,46.34427],[4.01146,46.42534],[4.03153,46.42536],[4.03146,46.4658],[4.01324,46.46578],[4.01322,46.47938],[3.99437,46.47936],[3.99435,46.49361],[3.9746,46.4936],[3.97457,46.50753],[3.87754,46.50745],[3.8775,46.53478],[3.85836,46.53476],[3.85833,46.54832],[3.81869,46.54828],[3.81871,46.53553],[3.79924,46.53552],[3.79922,46.54907],[3.76104,46.54904],[3.76092,46.61681],[3.74233,46.61679],[3.74228,46.64396],[3.72286,46.64395],[3.72281,46.67104],[3.70387,46.67102],[3.70385,46.68467],[3.68411,46.68466],[3.68406,46.712],[3.66484,46.71198],[3.66479,46.73904],[3.64576,46.73902],[3.64572,46.76634],[3.62575,46.76632],[3.62573,46.77971],[3.56723,46.77966],[3.56725,46.76631],[3.54715,46.76629],[3.54719,46.73928],[3.52716,46.73927],[3.52723,46.6989],[3.48774,46.69887],[3.48776,46.68594],[3.46796,46.68593],[3.46794,46.69941],[3.46792,46.71279],[3.44865,46.71278],[3.44863,46.72679],[3.35043,46.72671],[3.35048,46.6999],[3.33039,46.69988],[3.33034,46.7272],[3.23272,46.72712],[3.23274,46.71351],[3.2129,46.7135],[3.21293,46.70013],[3.17354,46.7001],[3.1735,46.72751],[3.15412,46.72749],[3.1541,46.74073],[3.11478,46.7407],[3.11475,46.75428],[3.07534,46.75424],[3.0753,46.78135],[3.05597,46.78134],[3.05592,46.80831],[2.99704,46.80826],[2.99702,46.82196],[2.93794,46.82191],[2.93797,46.80826],[2.89866,46.80823],[2.89869,46.79424],[2.87899,46.79422],[2.87901,46.78104],[2.85942,46.78103],[2.85944,46.76771],[2.84004,46.76769],[2.84007,46.75447],[2.7414,46.75439],[2.74138,46.76682],[2.70234,46.76679],[2.70236,46.75389],[2.68266,46.75387],[2.68268,46.74048],[2.66349,46.74046],[2.66351,46.7259],[2.64342,46.72588],[2.64344,46.71309],[2.62414,46.71308],[2.62417,46.69981],[2.60397,46.69979],[2.60399,46.68584],[2.56512,46.68581],[2.56515,46.67261],[2.54593,46.6726],[2.546,46.63215],[2.56592,46.63217],[2.56595,46.61811],[2.54564,46.61809],[2.54569,46.59072],[2.56642,46.59074],[2.56644,46.57754],[2.5855,46.57756],[2.58552,46.56472],[2.56613,46.5647],[2.56616,46.55062],[2.46828,46.55055],[2.4683,46.53582],[2.33212,46.53571],[2.33217,46.50886],[2.31265,46.50884],[2.31267,46.49534],[2.29288,46.49533],[2.2929,46.48182],[2.27487,46.4818],[2.27492,46.45442],[2.25539,46.4544],[2.25553,46.37349],[2.27595,46.37351],[2.27604,46.32087],[2.31456,46.32091],[2.31458,46.30704],[2.35371,46.30707],[2.35373,46.29297],[2.39384,46.293],[2.39389,46.26729],[2.45157,46.26733],[2.4516,46.25349],[2.47094,46.25351],[2.47098,46.22656],[2.49151,46.22657],[2.49155,46.19933],[2.51088,46.19934],[2.51093,46.17278],[2.53117,46.1728],[2.53138,46.05135],[2.55163,46.05137],[2.55166,46.03777],[2.57056,46.03778],[2.57068,45.96994],[2.55144,45.96993],[2.55146,45.95662],[2.53226,45.9566],[2.53228,45.94301],[2.51307,45.94299],[2.51313,45.90203],[2.47494,45.902],[2.47496,45.88882],[2.43619,45.88879],[2.43622,45.87533],[2.41721,45.87531],[2.41725,45.84794],[2.37847,45.84791],[2.3785,45.83397],[2.35952,45.83396],[2.35956,45.80708],[2.37873,45.8071],[2.37875,45.79358],[2.3987,45.79359],[2.39872,45.78035],[2.41825,45.78036],[2.41832,45.74],[2.45722,45.74003],[2.45724,45.7267],[2.47589,45.72671],[2.47591,45.71324],[2.49533,45.71325],[2.49542,45.65913],[2.45769,45.6591],[2.45776,45.61834],[2.43912,45.61833],[2.43919,45.57766],[2.4585,45.57768],[2.45855,45.55053],[2.47809,45.55055],[2.47811,45.53725],[2.49755,45.53726],[2.49759,45.51068],[2.47855,45.51066],[2.47864,45.45613],[2.45978,45.45612],[2.45987,45.40176],[2.42249,45.40173],[2.42247,45.41528],[2.40232,45.41527],[2.40229,45.42882],[2.3256,45.42876],[2.32567,45.38796],[2.34562,45.38798],[2.34566,45.36111],[2.32626,45.36109],[2.32628,45.34721],[2.30738,45.3472],[2.3074,45.3336],[2.28811,45.33358],[2.28813,45.32082],[2.26963,45.3208],[2.26966,45.30621],[2.25066,45.3062],[2.25068,45.29251],[2.23169,45.2925],[2.23171,45.27924],[2.213,45.27922],[2.21305,45.25204],[2.19374,45.25202],[2.19376,45.23811],[2.17561,45.2381],[2.17574,45.15768],[2.15735,45.15767],[2.15744,45.10295],[2.12024,45.10292],[2.12026,45.08955],[2.10067,45.08953],[2.10069,45.07544],[2.08246,45.07543],[2.08255,45.0216],[2.10255,45.02161],[2.1026,44.99445],[2.04574,44.99441],[2.04585,44.92753],[2.06578,44.92755],[2.06589,44.85969],[2.0857,44.8597],[2.08572,44.84581],[2.10556,44.84583],[2.1056,44.81933],[2.12474,44.81934],[2.12477,44.80551],[2.14351,44.80553],[2.14355,44.7786],[2.12561,44.77858],[2.1257,44.72427],[2.10665,44.72426],[2.10671,44.68423],[2.12634,44.68424],[2.12636,44.67074],[2.14598,44.67075],[2.14607,44.61644],[2.18396,44.61648],[2.18398,44.60378],[2.24042,44.60383],[2.24037,44.63095],[2.25948,44.63097],[2.25946,44.64493],[2.31668,44.64498],[2.3167,44.63088],[2.33615,44.6309],[2.33617,44.61758],[2.37242,44.61761],[2.3724,44.63158],[2.41105,44.63161],[2.41107,44.61907],[2.44922,44.61911],[2.4492,44.63232],[2.50486,44.63237],[2.50481,44.65976],[2.52461,44.65977],[2.52457,44.68717],[2.54225,44.68719],[2.54223,44.70122],[2.58071,44.70125],[2.5806,44.76834],[2.61769,44.76837],[2.61762,44.80884],[2.63676,44.80885],[2.63669,44.84929],[2.67331,44.84933],[2.67329,44.86252],[2.69338,44.86253],[2.69333,44.88943],[2.73052,44.88946],[2.73048,44.91645],[2.74992,44.91646],[2.75005,44.83647],[2.80733,44.83652],[2.80731,44.8491],[2.82638,44.84912],[2.8264,44.83628],[2.8457,44.8363],[2.84577,44.79571],[2.86422,44.79573],[2.86426,44.76865],[2.88399,44.76866],[2.88403,44.74197],[2.90203,44.74198],[2.90214,44.67432],[2.92198,44.67434],[2.92202,44.6473],[2.9401,44.64731],[2.94012,44.63388]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/8cabc987-829c-4c9f-943b-6a0e255cd73",terms_text:"Orthophotographie CRAIG/Sintegra/IGN 2013"},{id:"CRAIG-Auvergne-2016",name:"Auvergne 2016 25cm CRAIG",type:"tms",template:"https://tiles.craig.fr/ortho/wmts/1.0.0/ortho_2016/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.49389,46.66829],[2.71362,46.84141],[3.64746,46.80758],[4.04846,46.48327],[4.03747,46.24825],[4.46044,46.25965],[4.4934,46.14559],[4.38354,46.09229],[4.45495,45.69084],[4.76257,45.57176],[4.81201,45.34443],[4.22424,44.84419],[3.86169,44.696],[3.37829,44.80523],[3.33435,44.89091],[3.18054,44.82471],[3.03222,44.60612],[2.92785,44.60221],[2.71911,44.85198],[2.51037,44.60221],[2.12585,44.58265],[2.005,44.97257],[2.30712,45.46784],[2.43347,45.44087],[2.41149,45.72919],[2.34558,45.82402],[2.54882,45.97979],[2.46093,46.22166],[2.21374,46.33935],[2.27828,46.53903],[2.54882,46.56642],[2.49389,46.66829]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/e37c057b-5884-429b-8bec-5db0baef0ee",terms_text:"CRAIG - IGN -TopoGEODIS - Feder Auvergne-Rhône-Alpes 2016"},{id:"BANO",name:"BANO",type:"tms",template:"https://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/FR:WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)#Licence_du_r.C3.A9sultat",terms_text:"Tiles © cquest@Openstreetmap France, data © OpenStreetMap contributors, ODBL",description:"French address registry or Base Adresses Nationale Ouverte",overlay:true},{id:"lu.geoportail.opendata.basemap",name:"Basemap geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/basemap/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",endDate:"2010-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/carte-de-base-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"basemap.at",name:"basemap.at",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",description:"Basemap of Austria, based on government data.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"basemap.at-overlay",name:"basemap.at Beschriftungen (annotations)",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapoverlay/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at/",terms_text:"basemap.at",description:"Annotation overlay provided by basemap.at.",icon:"https://www.basemap.at/images/logo_basemap.jpg",overlay:true},{id:"basemap.at-orthofoto",name:"basemap.at Orthofoto",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmaporthofoto30cm/normal/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",best:true,description:"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"bavaria-80cm",name:"Bavaria (80 cm)",type:"wms",template:"https://geoservices.bayern.de/wms/v1/ogc_dop80_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=by_dop80c&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true},{id:"bavaria-DOP80",name:"Bavaria DOP 80cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true},{id:"route500hydro",name:"BD Carthage",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.fr/route500hydro/{zoom}/{x}/{y}.png",zoomExtent:[6,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"http://www.sandre.eaufrance.fr/actualite/la-bd-carthage-en-licence-ouverte-open-licence",terms_text:"Tiles © cquest@Openstreetmap France, data © Onema - IGN, LO/OL",description:"Réseau hydrographique: cours et plans d'eau et POI",overlay:true},{id:"fr.ign.bdortho",name:"BDOrtho IGN",type:"tms",template:"https://proxy-ign.openstreetmap.fr/94GjiyqD/bdortho/{zoom}/{x}/{y}.jpg",zoomExtent:[2,21],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]],[[-61.27501,14.90218],[-60.72368,14.90101],[-60.72489,14.36686],[-61.27622,14.36803],[-61.27501,14.90218]],[[-61.92802,16.58618],[-61.92686,15.7394],[-60.88128,15.74072],[-60.88243,16.5875],[-61.92802,16.58618]],[[-53.89344,6.004],[-52.46522,5.4465],[-51.52039,4.51072],[-51.53687,4.11633],[-52.2345,3.10213],[-52.641,2.25162],[-52.92664,2.07597],[-53.72864,2.21869],[-54.20106,2.03205],[-54.8053,2.27358],[-54.31092,2.80589],[-54.31641,3.20085],[-54.12415,3.46408],[-54.12964,3.59567],[-54.42078,4.00127],[-54.58008,4.95962],[-53.89344,6.004]],[[55.08816,-20.77935],[55.95959,-20.77281],[55.96576,-21.49],[55.09434,-21.49651],[55.08816,-20.77935]],[[44.92054,-12.57363],[45.34826,-12.57029],[45.35274,-13.1163],[44.92502,-13.11963],[44.92054,-12.57363]],[[-178.57728,-14.70582],[-178.42568,-14.00334],[-176.34156,-12.83858],[-175.71534,-12.9189],[-175.91858,-13.58726],[-177.84638,-14.64983],[-178.57728,-14.70582]]],terms_url:"https://openstreetmap.fr/bdortho",terms_text:"BDOrtho IGN",best:true,icon:"http://www.ign.fr/institut/sites/all/themes/ign_institut/logo.png"},{id:"Benin_cotonou_pleiade_2016",name:"Benin: Cotonou Pleiade 2016",type:"tms",template:"https://geoxxx.agrocampus-ouest.fr/owsifl/gwc/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Benin:cotonou_pleiade_2016&STYLE=&FORMAT=image/jpeg&tileMatrixSet=EPSG:3857&tileMatrix=EPSG:3857:{zoom}&tileRow={y}&tileCol={x}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.31954,6.55745],[2.33645,6.56024],[2.36377,6.56211],[2.36738,6.56068],[2.37777,6.5494],[2.37779,6.53485],[2.36994,6.49332],[2.37038,6.45527],[2.36958,6.45269],[2.36188,6.44177],[2.35392,6.40545],[2.36749,6.4015],[2.39526,6.40072],[2.40128,6.40374],[2.40588,6.40341],[2.42046,6.39383],[2.42485,6.39794],[2.42949,6.39887],[2.43625,6.39628],[2.43958,6.40042],[2.44439,6.40189],[2.45376,6.39899],[2.47145,6.39632],[2.48162,6.39106],[2.49453,6.3874],[2.50893,6.38888],[2.50719,6.39229],[2.5012,6.39162],[2.4963,6.39521],[2.4951,6.40123],[2.49543,6.40401],[2.4983,6.41022],[2.50191,6.41282],[2.51087,6.41321],[2.52219,6.40849],[2.53352,6.40517],[2.5381,6.40961],[2.54111,6.4109],[2.54651,6.41099],[2.54654,6.40651],[2.57639,6.40724],[2.57642,6.41177],[2.58576,6.41196],[2.58868,6.41095],[2.60877,6.39414],[2.6257,6.39488],[2.64555,6.39729],[2.65039,6.39339],[2.65367,6.36823],[2.64312,6.36659],[2.61251,6.36289],[2.56868,6.3607],[2.54683,6.36055],[2.54687,6.35546],[2.50207,6.35461],[2.47064,6.35596],[2.46777,6.35203],[2.46423,6.3502],[2.45254,6.35006],[2.45113,6.34813],[2.44737,6.34629],[2.43757,6.34654],[2.43298,6.33841],[2.43016,6.33707],[2.42245,6.33707],[2.39236,6.34115],[2.39315,6.34115],[2.36528,6.34445],[2.35386,6.3453],[2.34377,6.34458],[2.34094,6.34534],[2.31086,6.36567],[2.28435,6.37465],[2.28147,6.37762],[2.27599,6.39517],[2.27612,6.3982],[2.31529,6.49261],[2.3158,6.55307],[2.31954,6.55745]],[[1.69563,6.25076],[1.7001,6.24712],[1.70418,6.24697],[1.75875,6.25836],[1.77079,6.25995],[1.81712,6.27161],[1.84457,6.27657],[1.85768,6.27945],[1.88843,6.28326],[1.90482,6.28595],[1.90618,6.29435],[1.90083,6.29721],[1.89881,6.29954],[1.89404,6.30085],[1.89048,6.2997],[1.88748,6.29636],[1.88344,6.29622],[1.8697,6.29227],[1.8564,6.29198],[1.85207,6.28675],[1.84991,6.28906],[1.84691,6.29203],[1.84353,6.29333],[1.84041,6.29315],[1.83627,6.29129],[1.8341,6.28733],[1.83417,6.2852],[1.8323,6.28456],[1.82786,6.28644],[1.82182,6.29084],[1.81563,6.28998],[1.81211,6.29143],[1.80758,6.29571],[1.80472,6.29693],[1.80074,6.2971],[1.79776,6.29612],[1.79625,6.29492],[1.7949,6.28965],[1.79641,6.28608],[1.80098,6.28338],[1.79567,6.28013],[1.79156,6.28174],[1.78499,6.28122],[1.78092,6.27753],[1.77588,6.2755],[1.76745,6.27696],[1.75653,6.27496],[1.74833,6.27239],[1.74762,6.27726],[1.74572,6.27938],[1.73948,6.27985],[1.7368,6.27761],[1.73572,6.27892],[1.72902,6.27911],[1.72435,6.27422],[1.72449,6.26786],[1.72556,6.26683],[1.69934,6.26159],[1.69573,6.25726],[1.69563,6.25076]]],best:true},{id:"Berlin-2011",name:"Berlin aerial photography 2011",type:"wms",template:"https://fbinter.stadt-berlin.de/fb/wms/senstadt/k_luftbild2011_20?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[13.48699,52.68076],[13.52584,52.65196],[13.5299,52.64437],[13.54209,52.60921],[13.58109,52.58134],[13.59674,52.55936],[13.63477,52.55121],[13.66547,52.52854],[13.67199,52.50379],[13.65806,52.50372],[13.65796,52.49324],[13.7547,52.4565],[13.76644,52.43884],[13.76627,52.42973],[13.74494,52.39909],[13.65235,52.33133],[13.6417,52.33103],[13.62609,52.35491],[13.59432,52.37455],[13.53198,52.38376],[13.51948,52.39236],[13.48536,52.39227],[13.43552,52.38016],[13.42885,52.37401],[13.38689,52.37388],[13.38642,52.38667],[13.36857,52.38728],[13.37045,52.39349],[13.33968,52.40887],[13.31243,52.39775],[13.30557,52.40452],[13.23622,52.40342],[13.18886,52.40417],[13.17719,52.39067],[13.14859,52.38971],[13.14868,52.38421],[13.11889,52.38385],[13.11935,52.40025],[13.10487,52.40723],[13.07371,52.40668],[13.07367,52.41403],[13.10516,52.47897],[13.11685,52.47881],[13.112,52.55915],[13.11865,52.59156],[13.15251,52.60489],[13.16282,52.60462],[13.21264,52.6321],[13.22139,52.63215],[13.27292,52.66444],[13.31376,52.66442],[13.32714,52.64692],[13.36783,52.6468],[13.39158,52.65382],[13.42728,52.6549],[13.47594,52.68122],[13.48699,52.68076]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2011"},{id:"Berlin-2014",name:"Berlin aerial photography 2014",type:"tms",template:"https://tiles.codefor.de/berlin-2014/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[13.19746,52.64206],[13.25639,52.64285],[13.2558,52.66101],[13.31391,52.66185],[13.31476,52.64353],[13.37431,52.64462],[13.37386,52.66269],[13.4026,52.663],[13.40332,52.64501],[13.4334,52.64555],[13.43227,52.68001],[13.49082,52.68111],[13.49147,52.66428],[13.52092,52.66457],[13.5216,52.6465],[13.55096,52.6469],[13.55147,52.62938],[13.52219,52.62898],[13.52335,52.59248],[13.58263,52.59329],[13.58307,52.57535],[13.61246,52.57582],[13.61324,52.55784],[13.64268,52.55813],[13.64296,52.5401],[13.67253,52.54048],[13.67375,52.50475],[13.64413,52.5045],[13.64476,52.48608],[13.7037,52.48683],[13.70415,52.46901],[13.73362,52.4692],[13.73399,52.45121],[13.76358,52.45156],[13.76447,52.40209],[13.73546,52.39753],[13.73611,52.37963],[13.70678,52.37935],[13.70731,52.36136],[13.67785,52.36104],[13.67898,52.33017],[13.62102,52.32946],[13.61999,52.36033],[13.59046,52.36007],[13.5901,52.37806],[13.53116,52.37735],[13.53064,52.39525],[13.47168,52.39459],[13.47149,52.4125],[13.44101,52.41219],[13.44257,52.37604],[13.35487,52.37498],[13.35427,52.39306],[13.23667,52.39114],[13.23609,52.40922],[13.17635,52.40836],[13.17752,52.39029],[13.14791,52.38987],[13.14876,52.37459],[13.11971,52.37422],[13.11941,52.38955],[13.08981,52.38899],[13.08938,52.40707],[13.0618,52.40662],[13.06075,52.42408],[13.08842,52.42449],[13.086,52.47853],[13.11546,52.47896],[13.11462,52.49695],[13.1441,52.49729],[13.14332,52.5157],[13.1137,52.51528],[13.11077,52.6047],[13.19862,52.6062],[13.19746,52.64206]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2014"},{id:"Berlin-2015",name:"Berlin aerial photography 2015",type:"tms",template:"https://tiles.codefor.de/berlin-2015/{zoom}/{x}/{y}.png",endDate:"2015-08-03T00:00:00.000Z",startDate:"2015-08-02T00:00:00.000Z",polygon:[[[13.11068,52.59538],[13.13975,52.60527],[13.18355,52.61488],[13.21262,52.63315],[13.24167,52.64282],[13.256,52.65201],[13.27004,52.67021],[13.31368,52.67072],[13.32914,52.66204],[13.32948,52.6529],[13.43284,52.65414],[13.44733,52.6816],[13.50561,52.68244],[13.50654,52.65531],[13.53605,52.65572],[13.5376,52.61991],[13.52229,52.61977],[13.52304,52.60165],[13.59776,52.58469],[13.59865,52.55769],[13.62817,52.55805],[13.64303,52.5492],[13.65813,52.54042],[13.67312,52.53144],[13.67356,52.51358],[13.65913,52.51344],[13.65998,52.48643],[13.68931,52.48687],[13.73386,52.46933],[13.73405,52.46034],[13.76362,52.46068],[13.76431,52.42464],[13.74941,52.42474],[13.75045,52.39778],[13.73585,52.39762],[13.70661,52.37944],[13.707,52.3614],[13.67782,52.36125],[13.66405,52.33395],[13.62073,52.33337],[13.62031,52.36042],[13.58986,52.3781],[13.53149,52.37748],[13.53133,52.38641],[13.44223,52.38484],[13.42813,52.3667],[13.38464,52.3662],[13.35432,52.39301],[13.29537,52.39209],[13.29531,52.40103],[13.19171,52.39957],[13.19222,52.39056],[13.14774,52.38996],[13.14839,52.38095],[13.11964,52.38041],[13.0744,52.40683],[13.07392,52.42426],[13.10275,52.43374],[13.10123,52.47874],[13.11558,52.47897],[13.11068,52.59538]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2015"},{id:"Berlin-2016",name:"Berlin aerial photography 2016",type:"tms",template:"https://tiles.codefor.de/berlin-2016/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2016"},{id:"Berlin-2016-infrared",name:"Berlin aerial photography 2016 (infrared)",type:"tms",template:"https://tiles.codefor.de/berlin-2016i/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale Color-Infrarot-Orthophotos 2016"},{id:"Berlin-2017",name:"Berlin aerial photography 2017",type:"tms",template:"https://tiles.codefor.de/berlin-2017/{zoom}/{x}/{y}.png",endDate:"2017-03-28T00:00:00.000Z",startDate:"2017-03-27T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2017"},{id:"Berlin-2018",name:"Berlin aerial photography 2018",type:"tms",template:"https://tiles.codefor.de/berlin-2018/{zoom}/{x}/{y}.png",endDate:"2018-04-07T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2018",best:true},{id:"Bing",name:"Bing aerial imagery",type:"bing",template:"https://www.bing.com/maps",zoomExtent:[0,22],"default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/Bing.png"},{id:"Bologna-Orthophoto-2017",name:"Bologna ortofoto 2017",type:"tms",template:"https://sitmappe.comune.bologna.it/tms/tileserver/Ortofoto2017/{zoom}/{x}/{y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[11.22962,44.53077],[11.23184,44.52461],[11.24123,44.52167],[11.23251,44.50893],[11.23572,44.50323],[11.25009,44.50116],[11.24765,44.49644],[11.25708,44.49765],[11.25653,44.49294],[11.29461,44.48981],[11.29676,44.4857],[11.28807,44.47586],[11.29226,44.4609],[11.28447,44.45459],[11.28228,44.42572],[11.29347,44.4276],[11.29254,44.43377],[11.31339,44.42103],[11.32504,44.42274],[11.33695,44.42772],[11.33765,44.43167],[11.3315,44.43273],[11.33453,44.43867],[11.34466,44.43594],[11.34498,44.44093],[11.36235,44.45099],[11.37312,44.44935],[11.37498,44.45897],[11.39499,44.46368],[11.4011,44.46122],[11.39464,44.46803],[11.41577,44.48376],[11.42559,44.4845],[11.42717,44.48921],[11.41727,44.4906],[11.43363,44.51312],[11.42692,44.51532],[11.43034,44.5196],[11.42466,44.51959],[11.41987,44.52934],[11.4143,44.52564],[11.40739,44.52851],[11.41487,44.53999],[11.38871,44.54145],[11.39082,44.54553],[11.36474,44.55253],[11.36414,44.55609],[11.3573,44.5519],[11.34375,44.55333],[11.33589,44.54299],[11.33145,44.54734],[11.31349,44.54722],[11.30929,44.5295],[11.29104,44.53581],[11.28179,44.54851],[11.26911,44.53248],[11.25118,44.55578],[11.24499,44.55569],[11.22962,44.53077]]],terms_url:"http://dati.comune.bologna.it/node/3449",terms_text:"© Comune di Bologna cc-by 4.0 ODbL compliant",best:true},{id:"Bonvillars-2013",name:"Bonvillars Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.66713,46.83358],[6.66313,46.83833],[6.67213,46.84191],[6.6749,46.84226],[6.67843,46.83807],[6.66713,46.83358]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Bonvillars - Orthophoto technique 2013"},{id:"Bordeaux_2012",name:"Bordeaux - 2012",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/bordeaux_2012/{zoom}/{x}/{y}",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],terms_text:"Communauté urbaine de Bordeaux - 2012"},{id:"Bordeaux_2016",name:"Bordeaux 2016",type:"tms",template:"http://tms.bordeaux.inria.fr/bdx2016/{zoom}/{x}/{y}.jpg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],terms_text:"Bordeaux Métropole - 2016"},{id:"branquinha_al",name:"Branquinha AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?service=WMS&version=1.1.0&request=GetMap&layers=Branquinha&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.96968,-9.2928],[-35.97063,-9.20261],[-35.97727,-9.20264],[-35.98365,-9.2027],[-35.98765,-9.20266],[-35.99159,-9.20274],[-36.00498,-9.20284],[-36.01473,-9.20293],[-36.01651,-9.20296],[-36.01871,-9.20293],[-36.02487,-9.20286],[-36.02892,-9.20297],[-36.03308,-9.20289],[-36.03769,-9.20294],[-36.04581,-9.203],[-36.05161,-9.20305],[-36.05457,-9.20301],[-36.06022,-9.20304],[-36.06191,-9.20304],[-36.0618,-9.21319],[-36.06167,-9.21806],[-36.06156,-9.21915],[-36.06163,-9.22156],[-36.06144,-9.22277],[-36.06139,-9.22716],[-36.06134,-9.23227],[-36.0614,-9.23391],[-36.06145,-9.23494],[-36.06131,-9.23646],[-36.06133,-9.23773],[-36.06142,-9.23905],[-36.06145,-9.24133],[-36.06136,-9.2423],[-36.06141,-9.24358],[-36.06139,-9.2453],[-36.06126,-9.24726],[-36.06123,-9.24949],[-36.06127,-9.25107],[-36.06121,-9.25517],[-36.06119,-9.25795],[-36.06107,-9.25945],[-36.06109,-9.26183],[-36.06106,-9.26493],[-36.06086,-9.27146],[-36.06083,-9.2751],[-36.06074,-9.28274],[-36.0608,-9.29234],[-36.06074,-9.29363],[-36.05477,-9.29357],[-36.04621,-9.29349],[-36.03941,-9.29348],[-36.03501,-9.29339],[-36.02979,-9.29341],[-36.02167,-9.29332],[-36.01278,-9.29328],[-36.00468,-9.29321],[-35.99678,-9.29314],[-35.98969,-9.29312],[-35.98483,-9.29305],[-35.98305,-9.29289],[-35.98173,-9.29294],[-35.97884,-9.29282],[-35.96968,-9.2928]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"British_Columbia_Mosaic",name:"British Columbia Mosaic",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png",endDate:"2013-06-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",zoomExtent:[9,20],polygon:[[[-123.3176,49.32726],[-123.44053,49.32682],[-123.44072,49.33844],[-123.43984,49.34304],[-123.44013,49.34354],[-123.44011,49.34399],[-123.44063,49.34445],[-123.44047,49.34558],[-123.43978,49.34606],[-123.43897,49.34613],[-123.43729,49.35672],[-123.43748,49.37108],[-123.43353,49.37094],[-123.43304,49.37373],[-123.43327,49.37512],[-123.43228,49.3761],[-123.43175,49.37917],[-123.43143,49.37959],[-123.43078,49.38239],[-123.43134,49.38274],[-123.43121,49.38385],[-123.43004,49.38459],[-123.41899,49.38471],[-123.41922,49.41352],[-123.39725,49.41357],[-123.39728,49.42435],[-123.40069,49.42433],[-123.40077,49.57035],[-123.40008,49.57035],[-123.40108,49.59338],[-123.37604,49.59328],[-123.37698,49.67561],[-123.35073,49.67564],[-123.3508,49.70868],[-123.33289,49.70872],[-123.33279,49.72563],[-123.30071,49.72556],[-123.30092,49.73754],[-123.2886,49.73764],[-123.28878,49.82492],[-123.2998,49.82492],[-123.30117,49.84978],[-123.32182,49.85067],[-123.32733,49.85777],[-123.32767,49.97589],[-123.30083,49.97522],[-123.30072,50.0997],[-123.25017,50.10074],[-123.25091,50.27549],[-123.02243,50.27556],[-123.02249,50.32549],[-123.00093,50.32547],[-123.00078,50.34239],[-122.9775,50.34234],[-122.97748,50.35043],[-122.95081,50.3505],[-122.95079,50.3712],[-122.93252,50.37115],[-122.9321,50.39979],[-122.88742,50.39997],[-122.88734,50.42561],[-122.66202,50.4257],[-122.66231,50.39945],[-122.59903,50.39924],[-122.59883,50.37552],[-122.57248,50.37537],[-122.57356,50.24939],[-122.59904,50.24946],[-122.59915,50.22657],[-122.6185,50.22664],[-122.61857,50.22441],[-122.64906,50.22451],[-122.64922,50.19935],[-122.73086,50.19938],[-122.73116,50.12443],[-122.74904,50.12451],[-122.74905,50.0903],[-122.76878,50.09034],[-122.76898,49.94945],[-122.99905,49.94947],[-122.99912,49.87546],[-122.97759,49.87546],[-122.97781,49.69951],[-122.99924,49.69948],[-122.99925,49.65165],[-123.02215,49.65165],[-123.02212,49.59951],[-123.04919,49.59946],[-123.04919,49.59405],[-123.06646,49.59404],[-123.06636,49.54519],[-123.06999,49.54512],[-123.0699,49.54132],[-123.07068,49.53928],[-123.07089,49.53799],[-123.07115,49.53688],[-123.07111,49.53581],[-123.07138,49.53282],[-123.07165,49.53211],[-123.07171,49.53139],[-123.07203,49.53042],[-123.07396,49.53035],[-123.0748,49.5295],[-123.07482,49.52881],[-123.07434,49.52806],[-123.07353,49.52746],[-123.07337,49.52704],[-123.07329,49.52559],[-123.07371,49.52496],[-123.07362,49.52449],[-123.09926,49.52449],[-123.09916,49.47545],[-123.07105,49.47553],[-123.07109,49.4663],[-123.07392,49.46631],[-123.07422,49.4505],[-123.07463,49.45009],[-123.07465,49.44933],[-123.0746,49.44902],[-123.07446,49.44869],[-123.07433,49.44799],[-123.07424,49.44777],[-123.07431,49.44475],[-123.07471,49.44476],[-123.07464,49.43773],[-122.99965,49.43774],[-122.99965,49.43692],[-122.86062,49.44153],[-122.81026,49.4424],[-122.8099,49.37667],[-122.40361,49.37666],[-122.40363,49.37719],[-122.26474,49.3773],[-122.26354,49.23601],[-122.21557,49.23614],[-122.0581,49.23588],[-121.95383,49.29665],[-121.94009,49.30454],[-121.92358,49.31423],[-121.89909,49.32254],[-121.88834,49.32598],[-121.8553,49.33636],[-121.8327,49.34415],[-121.76713,49.36544],[-121.67367,49.36546],[-121.64042,49.37438],[-121.5962,49.38605],[-121.58612,49.38792],[-121.52137,49.39946],[-121.51174,49.40384],[-121.46793,49.4229],[-121.44168,49.43456],[-121.42243,49.43458],[-121.34629,49.39323],[-121.34801,49.34124],[-121.5135,49.32058],[-121.60317,49.27717],[-121.65841,49.18561],[-121.67995,49.16541],[-121.78158,49.07026],[-121.80762,49.06225],[-121.9394,49.06362],[-121.97255,49.04242],[-121.99214,49.03329],[-122.00353,49.02734],[-122.01786,49.02411],[-122.11086,48.99928],[-122.14931,48.99953],[-122.14927,48.99915],[-122.19914,48.9996],[-122.19918,48.9992],[-122.23436,48.99948],[-122.23436,49.00017],[-122.39947,49.00124],[-122.45213,49.00163],[-122.45213,49.00088],[-122.45841,49.00093],[-122.45848,48.99931],[-122.49925,48.9995],[-122.49925,48.99929],[-122.54926,48.99951],[-122.54926,48.99932],[-122.65808,48.99942],[-122.65811,48.9954],[-122.70676,48.99553],[-122.75198,48.99564],[-122.79221,48.99572],[-122.79219,48.99943],[-123.03504,48.99957],[-123.03504,49.0001],[-123.03971,49.00005],[-123.03974,49.00018],[-123.04855,49.00013],[-123.04853,49.00047],[-123.05571,49.00045],[-123.05563,49.00023],[-123.06414,49.00013],[-123.06416,48.99994],[-123.0749,48.99969],[-123.07507,49.00062],[-123.08996,49.00037],[-123.10923,48.99994],[-123.12712,49.0003],[-123.136,48.99987],[-123.13627,49.00058],[-123.15385,48.99981],[-123.15405,49.00068],[-123.171,49.00013],[-123.20009,48.99968],[-123.20034,49.04978],[-123.21088,49.04972],[-123.21122,49.05199],[-123.20705,49.05209],[-123.20789,49.06079],[-123.21917,49.0601],[-123.21896,49.06127],[-123.22518,49.06127],[-123.22539,49.06224],[-123.22971,49.06203],[-123.22981,49.06859],[-123.23319,49.06873],[-123.2335,49.07059],[-123.24931,49.07025],[-123.24973,49.08026],[-123.27514,49.0804],[-123.27514,49.08709],[-123.29948,49.0873],[-123.29944,49.08025],[-123.32545,49.08039],[-123.32544,49.11547],[-123.2751,49.15033],[-123.27518,49.18733],[-123.27881,49.18711],[-123.27889,49.19107],[-123.30048,49.19107],[-123.30042,49.26229],[-123.31262,49.26224],[-123.3126,49.27149],[-123.31543,49.27147],[-123.31566,49.28189],[-123.31747,49.28188],[-123.3175,49.29185],[-123.31904,49.29185],[-123.31907,49.2986],[-123.32023,49.29857],[-123.32028,49.30197],[-123.32227,49.30196],[-123.32239,49.31183],[-123.3254,49.31181],[-123.32539,49.32017],[-123.31927,49.3202],[-123.31922,49.32467],[-123.31794,49.32466],[-123.31799,49.32541],[-123.3176,49.32726]]],terms_url:"http://imagery.paulnorman.ca/tiles/about.html",terms_text:"Copyright Province of British Columbia, City of Surrey"},{id:"Budapest_XI_2015",name:"Budapest district XI orthophoto 2015",type:"wms",template:"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto2015_20160304&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],terms_url:"http://terinfo.ujbuda.hu",terms_text:"Budapest XI. kerület önkormányzata",description:"5 cm resolution bald image"},{id:"Budapest_XI_2017",name:"Budapest district XI orthophoto 2017",type:"wms",template:"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],terms_url:"http://terinfo.ujbuda.hu",terms_text:"Budapest XI. kerület önkormányzata",best:true,description:"5 cm resolution bald image"},{id:"Cadastre",name:"Cadastre",type:"tms",template:"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png",zoomExtent:[12,22],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_Cadastre_Fran%C3%A7ais/Conditions_d%27utilisation",terms_text:"cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2018",description:"French land registry",icon:"https://svn.openstreetmap.org/applications/editors/josm/plugins/cadastre-fr/images/cadastre_small.png"},{id:"lu.geoportail.opendata.cadastre",name:"Cadastre geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/cadastre/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/plan-cadastral-numerise-pcn-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"cajueiro_al",name:"Cajueiro AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Cajueiro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.10753,-9.43884],[-36.10752,-9.43421],[-36.10767,-9.42959],[-36.10779,-9.42361],[-36.10769,-9.41927],[-36.10781,-9.41391],[-36.10803,-9.41094],[-36.1081,-9.40965],[-36.10811,-9.40747],[-36.10816,-9.40693],[-36.10819,-9.40418],[-36.10811,-9.40176],[-36.10817,-9.40002],[-36.10827,-9.39952],[-36.10827,-9.39646],[-36.10833,-9.39475],[-36.10832,-9.39273],[-36.10836,-9.3904],[-36.10841,-9.38447],[-36.10847,-9.38165],[-36.10846,-9.37767],[-36.10835,-9.37573],[-36.10845,-9.37432],[-36.10849,-9.37234],[-36.10845,-9.3697],[-36.10867,-9.36278],[-36.10863,-9.36102],[-36.10873,-9.35928],[-36.10874,-9.35736],[-36.10855,-9.35479],[-36.1087,-9.3523],[-36.10871,-9.34996],[-36.10873,-9.34893],[-36.11269,-9.34908],[-36.11726,-9.34912],[-36.12138,-9.34905],[-36.12806,-9.3491],[-36.13217,-9.34906],[-36.13694,-9.34915],[-36.14025,-9.34914],[-36.14134,-9.34932],[-36.14458,-9.34916],[-36.14684,-9.34914],[-36.14842,-9.34905],[-36.15276,-9.34907],[-36.154,-9.34922],[-36.15627,-9.34923],[-36.16026,-9.34921],[-36.16086,-9.34929],[-36.166,-9.34933],[-36.16938,-9.34942],[-36.17176,-9.34936],[-36.17628,-9.34945],[-36.18028,-9.34937],[-36.18227,-9.34946],[-36.18826,-9.34938],[-36.19039,-9.34945],[-36.19354,-9.34946],[-36.19552,-9.34941],[-36.19918,-9.34951],[-36.19926,-9.35146],[-36.19913,-9.35234],[-36.19912,-9.35353],[-36.19919,-9.35646],[-36.19922,-9.35771],[-36.1993,-9.35832],[-36.19933,-9.36112],[-36.19922,-9.36177],[-36.19918,-9.36258],[-36.19931,-9.364],[-36.19926,-9.36499],[-36.19922,-9.36563],[-36.19928,-9.3666],[-36.19917,-9.36796],[-36.19917,-9.36868],[-36.19922,-9.36911],[-36.19912,-9.37017],[-36.19887,-9.37149],[-36.19886,-9.37264],[-36.19902,-9.37322],[-36.19915,-9.37504],[-36.19911,-9.37688],[-36.19896,-9.37747],[-36.19899,-9.37915],[-36.19917,-9.38053],[-36.19919,-9.38124],[-36.19926,-9.38175],[-36.19928,-9.38302],[-36.19913,-9.38374],[-36.19908,-9.38592],[-36.19879,-9.38787],[-36.19881,-9.38935],[-36.19902,-9.39092],[-36.19904,-9.392],[-36.19899,-9.39348],[-36.1988,-9.39451],[-36.19867,-9.39705],[-36.19845,-9.39949],[-36.19864,-9.40313],[-36.19866,-9.40476],[-36.19865,-9.40836],[-36.19875,-9.40902],[-36.19857,-9.41058],[-36.19859,-9.41273],[-36.19874,-9.41446],[-36.19868,-9.41711],[-36.1986,-9.41902],[-36.19846,-9.41965],[-36.1985,-9.42235],[-36.19871,-9.42429],[-36.19858,-9.42697],[-36.1984,-9.42895],[-36.19857,-9.43412],[-36.19871,-9.4347],[-36.19865,-9.43595],[-36.19857,-9.43626],[-36.19859,-9.43667],[-36.19876,-9.43749],[-36.19889,-9.43905],[-36.19882,-9.43995],[-36.1785,-9.43977],[-36.17718,-9.43968],[-36.17265,-9.43967],[-36.17099,-9.43971],[-36.16396,-9.43963],[-36.15386,-9.4395],[-36.13983,-9.4393],[-36.12875,-9.43913],[-36.11497,-9.43892],[-36.10753,-9.43884]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"osm-cambodia_laos_thailand_vietnam-bilingual",name:"Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual",type:"tms",template:"https://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png",zoomExtent:[0,20],polygon:[[[92.10238,20.81356],[93.56905,24.09755],[94.1733,23.92695],[95.19503,26.70727],[96.75509,27.52867],[97.58456,28.5806],[98.73812,27.51405],[98.74362,25.87992],[97.67794,24.75774],[97.96359,24.04238],[98.82052,24.16272],[99.52364,22.95934],[100.36959,21.50514],[101.79232,22.48305],[105.36288,23.33311],[106.81857,22.84801],[108.19735,21.36197],[107.43895,18.85398],[117.14537,7.46562],[119.6173,5.28754],[118.12315,4.05023],[117.25523,4.36249],[115.86546,4.34606],[115.50841,3.02498],[114.5526,1.5101],[113.54186,1.25748],[112.96507,1.5705],[112.24547,1.5101],[111.67418,1.01583],[110.4547,0.90049],[109.49889,1.9219],[103.22569,1.12568],[100.46263,3.23889],[97.6721,8.05888],[93.89281,15.93987],[92.10238,20.81356]]],terms_url:"http://www.osm-tools.org",terms_text:"© osm-tools.org & OpenStreetMap contributors, CC-BY-SA"},{id:"campo_alegre_al",name:"Campo Alegre AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Campo%20Alegre&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.30643,-9.82332],[-36.30603,-9.78597],[-36.30602,-9.78263],[-36.30609,-9.78168],[-36.30604,-9.78081],[-36.3059,-9.77531],[-36.30586,-9.76496],[-36.30545,-9.73336],[-36.39634,-9.73248],[-36.39627,-9.73744],[-36.39636,-9.74336],[-36.39644,-9.75535],[-36.3966,-9.75856],[-36.39665,-9.75979],[-36.39655,-9.76244],[-36.39661,-9.76489],[-36.39658,-9.76648],[-36.39661,-9.76684],[-36.39659,-9.7696],[-36.3967,-9.77896],[-36.39675,-9.78464],[-36.39684,-9.79067],[-36.39693,-9.79681],[-36.39703,-9.80298],[-36.39719,-9.82033],[-36.39722,-9.82234],[-36.39392,-9.82233],[-36.35375,-9.82279],[-36.34822,-9.82286],[-36.31697,-9.82317],[-36.31191,-9.82324],[-36.30879,-9.82327],[-36.30643,-9.82332]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"canaan_drone_red_cross_201712",name:"Canaan - American Red Cross, Dec-2017",type:"tms",template:"https://tiles.openaerialmap.org/5ac65a9f91b5310010e0d489/0/5ac65a9f91b5310010e0d48a/{zoom}/{x}/{y}.png",endDate:"2017-12-20T00:00:00.000Z",startDate:"2017-12-11T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[-72.26734,18.63561],[-72.2636,18.6373],[-72.26116,18.64141],[-72.25983,18.64588],[-72.25811,18.64742],[-72.24502,18.64795],[-72.23433,18.64807],[-72.22734,18.6482],[-72.21953,18.65438],[-72.2161,18.65446],[-72.21584,18.66222],[-72.21725,18.66739],[-72.21889,18.67019],[-72.22309,18.66958],[-72.22343,18.67312],[-72.22502,18.6732],[-72.22545,18.67609],[-72.23288,18.67597],[-72.23339,18.67877],[-72.23674,18.67857],[-72.23854,18.67975],[-72.24,18.68129],[-72.24463,18.68207],[-72.24682,18.6817],[-72.24605,18.67698],[-72.25094,18.67698],[-72.25511,18.67902],[-72.25961,18.67898],[-72.26081,18.67743],[-72.27038,18.67711],[-72.27901,18.67682],[-72.28373,18.67893],[-72.28613,18.68154],[-72.29665,18.68178],[-72.30184,18.68568],[-72.3012,18.68824],[-72.30802,18.69324],[-72.30948,18.69308],[-72.31699,18.69682],[-72.32806,18.70528],[-72.3384,18.69902],[-72.34012,18.69666],[-72.33961,18.69426],[-72.33377,18.68357],[-72.33135,18.68192],[-72.32551,18.68093],[-72.32027,18.67741],[-72.31626,18.67477],[-72.31167,18.672],[-72.308,18.66995],[-72.30534,18.66926],[-72.30068,18.66499],[-72.29796,18.66479],[-72.29609,18.66129],[-72.29315,18.65999],[-72.29519,18.65497],[-72.28414,18.64962],[-72.27804,18.64523],[-72.27487,18.64212],[-72.27352,18.64057],[-72.2706,18.63901],[-72.26734,18.63561]]],terms_url:"http://americanredcross.github.io/",terms_text:"American Red Cross",description:"Drone imagery collected December 2017 for Canaan, Haiti by American Red Cross in coordination with the Haitian Red Cross."},{id:"Geneve-SITG-2011",name:"Canton de Génève 5cm (SITG 2011)",type:"wms",template:"https://ge.ch/ags2/services/Orthophotos_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[6.18221,46.22618],[6.18348,46.22772],[6.18929,46.23329],[6.19196,46.23858],[6.19253,46.24239],[6.19061,46.24397],[6.19046,46.24654],[6.19256,46.25045],[6.19186,46.25262],[6.19325,46.256],[6.19287,46.25776],[6.19543,46.26181],[6.1979,46.26454],[6.20045,46.26569],[6.20917,46.26634],[6.21716,46.27388],[6.22046,46.27895],[6.2275,46.28649],[6.23433,46.28955],[6.23643,46.2932],[6.24074,46.29774],[6.23958,46.30396],[6.2413,46.30529],[6.2432,46.30453],[6.24513,46.30492],[6.24627,46.30372],[6.24983,46.3027],[6.25032,46.3014],[6.24938,46.30018],[6.25146,46.29647],[6.25063,46.29451],[6.25223,46.29382],[6.25429,46.2907],[6.25231,46.28735],[6.25032,46.2868],[6.24974,46.28574],[6.24636,46.28433],[6.24323,46.28428],[6.23985,46.28098],[6.23934,46.27627],[6.24372,46.27356],[6.25113,46.26258],[6.26244,46.2553],[6.26301,46.25457],[6.262,46.25215],[6.26736,46.24887],[6.27732,46.25211],[6.27725,46.25298],[6.2832,46.25503],[6.28231,46.25568],[6.28278,46.25677],[6.28868,46.26046],[6.29154,46.2644],[6.29457,46.26556],[6.29729,46.26489],[6.29783,46.2631],[6.29541,46.25827],[6.29663,46.2566],[6.3024,46.2558],[6.30678,46.25753],[6.311,46.25666],[6.30768,46.25184],[6.31046,46.25057],[6.31011,46.24749],[6.31156,46.24386],[6.29606,46.22501],[6.29012,46.22241],[6.27773,46.21493],[6.26707,46.21276],[6.25668,46.20926],[6.25089,46.20574],[6.25076,46.20456],[6.2495,46.20404],[6.24643,46.20454],[6.24251,46.20364],[6.23594,46.20541],[6.23347,46.20509],[6.22889,46.20172],[6.22323,46.20005],[6.22355,46.19881],[6.22257,46.19791],[6.21935,46.19765],[6.21688,46.19448],[6.21259,46.19189],[6.20727,46.19137],[6.20588,46.18908],[6.2034,46.18806],[6.20282,46.18642],[6.20035,46.18504],[6.19905,46.18296],[6.19615,46.18288],[6.1885,46.17967],[6.18751,46.17539],[6.18982,46.16584],[6.1748,46.15694],[6.1688,46.15624],[6.15829,46.15195],[6.15434,46.15141],[6.14952,46.14933],[6.14805,46.14748],[6.14832,46.14619],[6.14561,46.14417],[6.14244,46.14493],[6.13768,46.14217],[6.13692,46.14071],[6.13074,46.13946],[6.12598,46.13966],[6.12014,46.14181],[6.1077,46.14203],[6.10537,46.14313],[6.09746,46.14325],[6.09151,46.15095],[6.07476,46.14795],[6.07188,46.14908],[6.05295,46.15046],[6.04973,46.1468],[6.04862,46.14153],[6.04571,46.13916],[6.04287,46.14006],[6.04013,46.13894],[6.03783,46.13716],[6.03647,46.13381],[6.03531,46.13344],[6.03,46.13816],[6.02079,46.14024],[6.01693,46.14191],[6.01282,46.14119],[6.00814,46.14171],[6.00364,46.14088],[5.99338,46.1432],[5.98728,46.14171],[5.98464,46.14232],[5.98309,46.13712],[5.97603,46.1319],[5.97314,46.13081],[5.97037,46.13108],[5.96536,46.12882],[5.96163,46.12976],[5.9573,46.12767],[5.95575,46.12836],[5.95484,46.13214],[5.9589,46.13553],[5.96446,46.13738],[5.96517,46.13845],[5.9631,46.14241],[5.96383,46.14656],[5.97157,46.1558],[5.97884,46.16721],[5.98022,46.17354],[5.98322,46.17507],[5.98537,46.17478],[5.98754,46.17306],[5.99029,46.17955],[5.9936,46.18203],[5.98976,46.18692],[5.98287,46.18822],[5.98068,46.1904],[5.96282,46.1963],[5.96225,46.19719],[5.96465,46.20022],[5.97164,46.20302],[5.96985,46.20383],[5.96794,46.20675],[5.97227,46.21418],[5.97364,46.21563],[5.97897,46.21821],[6.00857,46.24444],[6.01422,46.24855],[6.06593,46.28345],[6.11511,46.31511],[6.12573,46.31843],[6.12972,46.31568],[6.12978,46.31407],[6.13604,46.30896],[6.14179,46.30555],[6.15393,46.30014],[6.17157,46.29507],[6.17125,46.29223],[6.17277,46.28629],[6.17018,46.28533],[6.16834,46.28109],[6.17201,46.27554],[6.1722,46.27301],[6.1691,46.26785],[6.16746,46.26217],[6.16531,46.26195],[6.16455,46.26274],[6.15943,46.25898],[6.15532,46.25216],[6.15387,46.25212],[6.15273,46.25037],[6.15311,46.2477],[6.15494,46.24591],[6.1521,46.23878],[6.15217,46.23273],[6.15034,46.22659],[6.15454,46.22191],[6.15483,46.22044],[6.15296,46.21738],[6.154,46.21355],[6.1571,46.21097],[6.16263,46.21043],[6.16387,46.2097],[6.16911,46.21191],[6.16867,46.21318],[6.17073,46.21478],[6.17471,46.21603],[6.18221,46.22618]],[[6.18834,46.34901],[6.18696,46.34862],[6.18195,46.35015],[6.17961,46.352],[6.17142,46.35444],[6.17022,46.35911],[6.17415,46.36036],[6.17272,46.36189],[6.17348,46.36288],[6.17999,46.36547],[6.1877,46.36132],[6.19447,46.36175],[6.19905,46.36086],[6.20113,46.35634],[6.20258,46.35567],[6.20791,46.35583],[6.21374,46.35379],[6.21247,46.35085],[6.20846,46.34665],[6.2086,46.33991],[6.20659,46.33792],[6.20493,46.33861],[6.20348,46.33793],[6.19181,46.34333],[6.19318,46.34787],[6.19076,46.3477],[6.18834,46.34901]],[[6.18182,46.34281],[6.18016,46.34318],[6.1752,46.34532],[6.17341,46.34398],[6.17324,46.34054],[6.1714,46.33952],[6.16588,46.34254],[6.16564,46.34339],[6.17091,46.35054],[6.17341,46.35029],[6.17458,46.35192],[6.17587,46.35205],[6.18579,46.34593],[6.18182,46.34281]]],terms_url:"http://ge.ch/sitg/donnees/conditions-d-utilisation/open-data",terms_text:"Orthophotos du SITG 2011"},{id:"CTFRIBOURG2016",name:"Canton Fribourg 2016",type:"tms",template:"https://mapproxy.osm.ch/tiles/fribourg_2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[6.79478,46.57542],[6.79949,46.57407],[6.80256,46.57491],[6.80336,46.57687],[6.80427,46.57664],[6.80489,46.57792],[6.80794,46.57761],[6.8094,46.57885],[6.81084,46.57896],[6.81322,46.57823],[6.81153,46.58099],[6.8142,46.58396],[6.81411,46.58567],[6.8206,46.58368],[6.82371,46.57747],[6.82693,46.57796],[6.82927,46.57637],[6.83485,46.57533],[6.83744,46.57677],[6.83691,46.57748],[6.83982,46.57896],[6.84239,46.58244],[6.84532,46.58276],[6.84644,46.58394],[6.84857,46.58331],[6.85087,46.58113],[6.85262,46.58197],[6.85996,46.57987],[6.86554,46.57725],[6.86507,46.57623],[6.8679,46.57515],[6.87446,46.56497],[6.8845,46.56195],[6.88686,46.56341],[6.89214,46.5679],[6.89918,46.56671],[6.89885,46.56499],[6.89393,46.55991],[6.88822,46.55815],[6.86839,46.54164],[6.86498,46.53896],[6.86015,46.53597],[6.85563,46.54086],[6.85501,46.54144],[6.85087,46.54111],[6.8407,46.53819],[6.83032,46.53744],[6.82783,46.54298],[6.82553,46.54357],[6.81278,46.52707],[6.81088,46.52513],[6.81534,46.52139],[6.8181,46.5165],[6.82263,46.51411],[6.82429,46.51207],[6.83034,46.51246],[6.83239,46.50544],[6.83503,46.50231],[6.84126,46.49706],[6.84294,46.49632],[6.84554,46.49667],[6.84775,46.49369],[6.84891,46.49337],[6.85729,46.49305],[6.86276,46.49384],[6.86634,46.50079],[6.87244,46.50431],[6.88168,46.51257],[6.8967,46.52044],[6.89773,46.52005],[6.89711,46.51766],[6.89767,46.51483],[6.89522,46.51079],[6.89572,46.50773],[6.89974,46.51039],[6.90142,46.51233],[6.92517,46.50769],[6.92759,46.50467],[6.93363,46.50167],[6.93674,46.50096],[6.95614,46.49949],[6.97239,46.48879],[6.97581,46.4784],[6.97783,46.47289],[6.97815,46.46833],[6.97906,46.46107],[6.98016,46.45896],[6.99212,46.44891],[6.98361,46.43873],[6.98394,46.43799],[6.98746,46.43794],[7.01786,46.44707],[7.02103,46.45729],[7.06583,46.48904],[7.0724,46.4864],[7.10037,46.48699],[7.12279,46.49869],[7.1264,46.50317],[7.13096,46.50466],[7.13624,46.50861],[7.13704,46.51308],[7.14005,46.51688],[7.14044,46.51988],[7.14318,46.52183],[7.1437,46.52475],[7.1453,46.52701],[7.14835,46.52846],[7.15834,46.52681],[7.16346,46.52855],[7.16709,46.53101],[7.18234,46.53837],[7.19218,46.54656],[7.20081,46.54169],[7.20108,46.543],[7.20765,46.53291],[7.21417,46.53762],[7.21811,46.54211],[7.22171,46.54481],[7.22311,46.5476],[7.22543,46.54923],[7.2322,46.55123],[7.23614,46.554],[7.24047,46.55424],[7.24705,46.55623],[7.25574,46.56029],[7.26385,46.56752],[7.2681,46.57369],[7.28136,46.58411],[7.2992,46.5791],[7.30805,46.58132],[7.31254,46.58917],[7.3207,46.59183],[7.31479,46.60042],[7.3162,46.60937],[7.31826,46.61615],[7.3178,46.61856],[7.31213,46.6217],[7.31327,46.63662],[7.32284,46.63731],[7.32684,46.63873],[7.32975,46.64171],[7.32787,46.64616],[7.321,46.65465],[7.32345,46.65526],[7.32914,46.65459],[7.33116,46.65522],[7.33403,46.65471],[7.34549,46.6553],[7.34756,46.65307],[7.35063,46.65164],[7.35079,46.64799],[7.35456,46.64669],[7.3558,46.64533],[7.35528,46.64193],[7.35714,46.63927],[7.35877,46.64418],[7.36209,46.64683],[7.36229,46.64791],[7.36608,46.64898],[7.37747,46.65636],[7.36933,46.65564],[7.36953,46.65748],[7.37103,46.65907],[7.37083,46.66085],[7.37187,46.66283],[7.37122,46.66375],[7.37252,46.66757],[7.37108,46.66942],[7.37649,46.67503],[7.37293,46.68012],[7.37777,46.68357],[7.37587,46.68645],[7.376,46.6878],[7.38027,46.69018],[7.37693,46.69272],[7.3686,46.69265],[7.3649,46.69505],[7.36261,46.69928],[7.3598,46.69802],[7.34598,46.69895],[7.34604,46.7019],[7.34939,46.70555],[7.35037,46.70874],[7.35021,46.71119],[7.34903,46.71249],[7.34065,46.71464],[7.33277,46.71491],[7.32868,46.71641],[7.31011,46.71815],[7.30785,46.71717],[7.30002,46.72247],[7.29683,46.72737],[7.29685,46.73565],[7.29834,46.74013],[7.30304,46.74517],[7.30454,46.74816],[7.30486,46.75026],[7.30335,46.7514],[7.30309,46.75261],[7.30359,46.75919],[7.29987,46.76375],[7.29881,46.76513],[7.29307,46.77136],[7.29532,46.77537],[7.29639,46.77729],[7.30081,46.77905],[7.30053,46.78064],[7.30113,46.78134],[7.30447,46.78321],[7.30447,46.78415],[7.30207,46.78638],[7.30351,46.78887],[7.30201,46.79079],[7.30159,46.79283],[7.30732,46.79872],[7.31044,46.80823],[7.31537,46.81246],[7.32028,46.8149],[7.32047,46.81564],[7.32072,46.82011],[7.31981,46.82515],[7.32891,46.829],[7.3302,46.82968],[7.33123,46.83177],[7.33103,46.8328],[7.32926,46.83563],[7.32333,46.84041],[7.30755,46.84704],[7.30775,46.84808],[7.30613,46.84999],[7.31207,46.85557],[7.31351,46.85936],[7.31739,46.8606],[7.32087,46.86154],[7.32576,46.85681],[7.323,46.85476],[7.32603,46.85163],[7.33181,46.8512],[7.33536,46.85043],[7.33678,46.84979],[7.33821,46.84946],[7.34726,46.85375],[7.34934,46.85331],[7.35167,46.85502],[7.35444,46.85875],[7.35772,46.86065],[7.35925,46.86311],[7.35794,46.86513],[7.35838,46.8688],[7.35738,46.8701],[7.35386,46.87129],[7.35253,46.87555],[7.35339,46.88676],[7.34843,46.88934],[7.32573,46.89373],[7.30935,46.89152],[7.29618,46.89377],[7.28938,46.89377],[7.28639,46.89269],[7.28245,46.8898],[7.2802,46.8896],[7.27259,46.89249],[7.26634,46.89361],[7.25931,46.89797],[7.24433,46.90037],[7.24314,46.89792],[7.23633,46.89809],[7.23203,46.90029],[7.2309,46.9024],[7.23032,46.90394],[7.22351,46.90276],[7.21755,46.89735],[7.21244,46.90173],[7.2088,46.9026],[7.20781,46.90913],[7.20578,46.91477],[7.20692,46.92481],[7.2111,46.92527],[7.21854,46.92434],[7.2342,46.92939],[7.23411,46.93669],[7.23477,46.93827],[7.2302,46.93995],[7.2282,46.93881],[7.22555,46.93633],[7.2174,46.93307],[7.2093,46.93334],[7.20823,46.93323],[7.2058,46.94023],[7.2055,46.94112],[7.20951,46.94188],[7.21027,46.94302],[7.21044,46.94569],[7.21011,46.94781],[7.20885,46.95435],[7.21102,46.95652],[7.20838,46.95768],[7.20742,46.95967],[7.19764,46.96065],[7.19459,46.96135],[7.19463,46.9629],[7.19552,46.96416],[7.19633,46.96365],[7.19794,46.96445],[7.1993,46.9638],[7.20646,46.96413],[7.20745,46.96751],[7.21422,46.96692],[7.21467,46.97133],[7.21739,46.97147],[7.21686,46.97271],[7.22247,46.97454],[7.22163,46.97556],[7.22821,46.97836],[7.23569,46.98456],[7.23486,46.98675],[7.22594,46.9924],[7.22625,46.99868],[7.22575,46.99915],[7.21779,47.00641],[7.21299,47.0068],[7.09058,46.978],[7.03295,46.98265],[6.73785,46.81195],[6.73908,46.71021],[6.81908,46.65533],[6.82741,46.65982],[6.82089,46.65179],[6.81729,46.64923],[6.81851,46.6478],[6.81458,46.64747],[6.81344,46.64953],[6.81194,46.6492],[6.81081,46.65038],[6.80674,46.65059],[6.80203,46.64889],[6.79891,46.64914],[6.79879,46.64781],[6.80367,46.64567],[6.80325,46.6448],[6.8038,46.64451],[6.80321,46.64376],[6.80171,46.64421],[6.79895,46.63959],[6.79692,46.63314],[6.79838,46.63016],[6.80043,46.62991],[6.80065,46.62843],[6.80172,46.62854],[6.80228,46.62775],[6.80197,46.62507],[6.80355,46.62124],[6.80244,46.61877],[6.80296,46.61615],[6.80185,46.61555],[6.80389,46.60903],[6.80239,46.60142],[6.79833,46.59986],[6.8002,46.59362],[6.80124,46.5925],[6.79848,46.58616],[6.79948,46.58559],[6.79894,46.58205],[6.79611,46.57932],[6.79626,46.57728],[6.79478,46.57542]]],terms_text:"Canton Fribourg 2016 'orthophoto technique'"},{id:"Canvec",name:"Canvec - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"Canvec_French",name:"Canvec - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"capela_al",name:"Capela AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Capela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.03321,-9.45741],[-36.03322,-9.45581],[-36.03336,-9.45483],[-36.0334,-9.45291],[-36.03327,-9.45141],[-36.03336,-9.44287],[-36.0335,-9.43821],[-36.03353,-9.42881],[-36.03363,-9.42027],[-36.03389,-9.41091],[-36.03389,-9.40032],[-36.03401,-9.3888],[-36.03413,-9.38528],[-36.03428,-9.38265],[-36.03417,-9.37849],[-36.03444,-9.36688],[-36.05246,-9.3671],[-36.05791,-9.36711],[-36.0716,-9.36727],[-36.08622,-9.36731],[-36.103,-9.3675],[-36.11652,-9.36755],[-36.12515,-9.36768],[-36.12522,-9.37473],[-36.12521,-9.37721],[-36.12511,-9.38038],[-36.12514,-9.38529],[-36.12505,-9.39026],[-36.12504,-9.39477],[-36.12506,-9.40172],[-36.12499,-9.40382],[-36.1248,-9.40679],[-36.12463,-9.41123],[-36.12474,-9.4136],[-36.12456,-9.4163],[-36.12459,-9.42461],[-36.12466,-9.42691],[-36.12465,-9.42925],[-36.12457,-9.4297],[-36.12464,-9.43538],[-36.12438,-9.44109],[-36.12446,-9.44387],[-36.12452,-9.44579],[-36.12438,-9.44736],[-36.12448,-9.44856],[-36.12448,-9.45095],[-36.12436,-9.45392],[-36.12434,-9.45791],[-36.11758,-9.45783],[-36.1089,-9.45778],[-36.10419,-9.4578],[-36.10116,-9.45773],[-36.0953,-9.45773],[-36.08461,-9.45767],[-36.07361,-9.45757],[-36.05726,-9.45741],[-36.04816,-9.45747],[-36.04177,-9.45739],[-36.03767,-9.45739],[-36.03321,-9.45741]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"COS2010_v1.0",name:"Carta de Uso do Solo 2010 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt/wms-inspire/cos2010v1?language=por&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=COS2010_v1.0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[14,18],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/cos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"Cartoriviera-2012",name:"Cartoriviera - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[7.02235,46.42856],[7.0224,46.42045],[7.02176,46.41955],[7.02225,46.41954],[7.02161,46.41749],[7.02242,46.4174],[7.02242,46.41681],[7.02113,46.41443],[7.02164,46.41259],[7.0216,46.41188],[7.01918,46.41055],[7.01896,46.41004],[7.01757,46.40826],[7.01426,46.40696],[7.00948,46.40695],[7.00952,46.40451],[7.00368,46.40153],[6.97052,46.40139],[6.97056,46.39354],[6.96507,46.38333],[6.89379,46.383],[6.89327,46.39209],[6.8968,46.4],[6.89678,46.40097],[6.89395,46.401],[6.89768,46.40888],[6.89246,46.41386],[6.89237,46.41807],[6.8949,46.4193],[6.89285,46.41948],[6.89395,46.42312],[6.89225,46.42339],[6.89219,46.42802],[6.88743,46.428],[6.87652,46.43163],[6.86624,46.43633],[6.84003,46.44591],[6.83504,46.44934],[6.827,46.45204],[6.82695,46.45379],[6.81953,46.45655],[6.80361,46.45993],[6.78775,46.46253],[6.78697,46.5246],[6.82604,46.5248],[6.82609,46.52662],[6.83907,46.5267],[6.83888,46.55006],[6.90658,46.55042],[6.912,46.54301],[6.91083,46.53983],[6.90979,46.53512],[6.90931,46.53517],[6.90867,46.53373],[6.91195,46.53297],[6.91335,46.53604],[6.9268,46.53364],[6.92723,46.5349],[6.93714,46.53311],[6.93691,46.5327],[6.94028,46.53196],[6.94164,46.53477],[6.94309,46.53455],[6.94345,46.53528],[6.95641,46.53003],[6.95632,46.52733],[6.95111,46.52725],[6.95301,46.52611],[6.94341,46.52605],[6.94343,46.52546],[7.01629,46.52568],[7.02158,46.52211],[7.02196,46.47355],[7.07099,46.47368],[7.07402,46.4719],[7.07383,46.4326],[7.05947,46.43233],[7.05278,46.42879],[7.02235,46.42856]]],terms_url:"https://map.cartoriviera.ch/?baselayer_ref=orthos_2012_mobile&baselayer_opacity=100",terms_text:"Cartoriviera"},{id:"Catastro-Spain",name:"Catastro Spain",type:"wms",template:"http://ovc.catastro.meh.es/Cartografia/WMS/ServidorWMS.aspx?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Catastro&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]},{id:"Chorzow-buildings",name:"Chorzów: Buildings",type:"wms",template:"http://e-odgik.chorzow.eu/services/wms/wms_funkcje_bud/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,2,1,8,7,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.94562,50.31836],[18.94349,50.32385],[18.95466,50.32599],[18.96426,50.33307],[18.96521,50.33777],[18.98692,50.33621],[18.98468,50.32501],[18.99777,50.32204],[18.99686,50.31716],[18.98774,50.31736],[18.98695,50.30989],[18.99736,50.30031],[18.99744,50.29722],[19.00546,50.29548],[19.0073,50.28342],[19.00574,50.27871],[18.99236,50.27091],[18.96792,50.28661],[18.96215,50.27972],[18.96169,50.27337],[18.95824,50.27291],[18.95492,50.26193],[18.96014,50.24927],[18.95672,50.2452],[18.95555,50.23891],[18.94132,50.243],[18.93475,50.25314],[18.93324,50.26032],[18.93262,50.26588],[18.9296,50.26774],[18.92976,50.27131],[18.92669,50.27289],[18.92632,50.27623],[18.93071,50.27619],[18.93437,50.28729],[18.92383,50.29533],[18.92635,50.29986],[18.91905,50.30212],[18.91955,50.30576],[18.92463,50.31192],[18.9262,50.31883],[18.94562,50.31836]]],terms_text:"Urząd Miasta Chorzowa"},{id:"South_Africa-CapeTown-Aerial-2013",name:"City of Cape Town 2013 Aerial",type:"tms",template:"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2013/{zoom}/{x}/{y}.jpg",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],terms_url:"https://www.capetown.gov.za",terms_text:"City of Cape Town Aerial - OPENSTREETMAP USE ONLY",description:"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 12cm ground sample distance"},{id:"South_Africa-CapeTown-Aerial",name:"City of Cape Town 2015 Aerial",type:"tms",template:"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2015/{zoom}/{x}/{y}.jpg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],terms_url:"https://www.capetown.gov.za",terms_text:"City of Cape Town Aerial - OPENSTREETMAP USE ONLY",best:true,description:"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 8cm ground sample distance"},{id:"Zuerich-aerial_2011",name:"City of Zürich Orthophoto 2011",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Zuerich-overview",name:"City of Zürich Overview map (Steets, buildings, house numbers)",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Uebersichtsplan&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.6023,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33678],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Czech_CUZK-KM",name:"Czech CUZK:KM",type:"wms",template:"https://wms.cuzk.cz/wms.asp?service=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&LAYERS=parcelni_cisla_i,obrazy_parcel_i,RST_KMD_I,hranice_parcel_i,DEF_BUDOVY,RST_KN_I,dalsi_p_mapy_i,prehledka_kat_prac,prehledka_kat_uz,prehledka_kraju-linie&FORMAT=image/png&transparent=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_CUZK-KM-tms",name:"Czech CUZK:KM tiles proxy",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png",zoomExtent:[13,18],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_pLPIS",name:"Czech pLPIS",type:"wms",template:"https://eagri.cz/public/app/wms/plpis.fcgi?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LPIS_FB4,LPIS_FB4_KOD&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:4326",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]]},{id:"Czech_RUIAN-budovy",name:"Czech RUIAN budovy",type:"tms",template:"https://tile.poloha.net/budovy/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czech_RUIAN-parcely",name:"Czech RUIAN parcely",type:"tms",template:"https://tile.poloha.net/parcely/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czestochowa-buildings",name:"Częstochowa: Buildings",type:"wms",template:"http://geoportal.czestochowa.um.gov.pl/isdp/scripts/isdp.dll/wms?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ieg_budynek&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.08183,50.8554],[19.0888,50.86563],[19.11082,50.86616],[19.10961,50.86092],[19.11709,50.85933],[19.11531,50.86283],[19.11997,50.86327],[19.1227,50.85452],[19.12938,50.85519],[19.12566,50.86165],[19.13364,50.86147],[19.14318,50.86815],[19.1498,50.87916],[19.16507,50.8794],[19.16816,50.88501],[19.17265,50.88477],[19.18346,50.87706],[19.18084,50.86562],[19.18711,50.84712],[19.19973,50.84395],[19.19637,50.83678],[19.19358,50.83357],[19.19454,50.83145],[19.20696,50.82985],[19.20838,50.82484],[19.21831,50.82571],[19.22564,50.82475],[19.23075,50.82509],[19.2308,50.82666],[19.23351,50.82683],[19.23303,50.82335],[19.21868,50.80115],[19.21753,50.79272],[19.22592,50.78822],[19.20889,50.77561],[19.19891,50.76355],[19.19521,50.75182],[19.19074,50.75211],[19.18245,50.7545],[19.16504,50.7535],[19.16417,50.75586],[19.14559,50.75805],[19.14282,50.75543],[19.13021,50.75786],[19.127,50.75314],[19.1216,50.75363],[19.12066,50.74981],[19.10348,50.75228],[19.09598,50.75201],[19.0956,50.74912],[19.09351,50.7488],[19.09285,50.75027],[19.08442,50.74986],[19.08473,50.74349],[19.08382,50.73741],[19.07878,50.73668],[19.07503,50.73465],[19.07284,50.73708],[19.07153,50.74042],[19.0685,50.74339],[19.06632,50.74233],[19.06392,50.74554],[19.06595,50.7466],[19.06548,50.7496],[19.06202,50.75041],[19.06018,50.74455],[19.04257,50.74466],[19.0333,50.74827],[19.01869,50.76252],[19.01554,50.77044],[19.01101,50.7718],[19.01353,50.77766],[19.01159,50.78077],[19.01081,50.78759],[19.01362,50.79262],[19.01972,50.79555],[19.01896,50.80703],[19.03439,50.80116],[19.03453,50.804],[19.02593,50.80731],[19.02308,50.81499],[19.03154,50.81614],[19.02909,50.82435],[19.03787,50.82584],[19.03921,50.84083],[19.04676,50.84934],[19.05993,50.8532],[19.06209,50.8596],[19.06492,50.86134],[19.08183,50.8554]]],terms_text:"Urząd Miasta Częstochowy"},{id:"Duna_2013",name:"Danube flood orthophoto 2013",type:"tms",template:"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[10,20],polygon:[[[19.07732,47.69597],[19.07799,47.69598],[19.09462,47.69446],[19.08056,47.59587],[19.07434,47.58909],[19.07952,47.58883],[19.07717,47.57241],[19.05779,47.57209],[19.07732,47.69597]]],terms_url:"http://fototerkep.hu",terms_text:"Fotótérkép.hu",description:"Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"},{id:"Delaware2012Orthophotography",name:"Delaware 2012 Orthophotography",type:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],terms_url:"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2012/ImageServer",terms_text:"Digital Aerial Solutions, LLC",description:"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{id:"Delaware2017Orthophotography",name:"Delaware 2017 Orthophotography",type:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2017/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],terms_url:"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2017/ImageServer",terms_text:"Digital Aerial Solutions, LLC",description:"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{id:"delmiro_gouveia",name:"Delmiro Gouveia AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Delmiro%20Gouveia&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.94962,-9.42957],[-37.94834,-9.33972],[-38.03903,-9.33834],[-38.04034,-9.42846],[-37.94962,-9.42957]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"der-es",name:"DER-ES",type:"wms",template:"http://portal.der.es.gov.br/geoserver/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=deres-ext:TRECHOINFO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-40.94577,-21.31404],[-40.6231,-20.86278],[-40.38882,-20.65177],[-40.22209,-20.29831],[-39.80383,-19.66412],[-39.69603,-19.42573],[-39.67304,-19.30437],[-39.70538,-18.61384],[-39.65292,-18.33096],[-40.22281,-17.97587],[-40.34282,-17.9198],[-40.45278,-17.91502],[-40.46499,-17.92049],[-40.48368,-17.90408],[-40.50164,-17.90681],[-40.51602,-17.88903],[-40.53326,-17.88903],[-40.54548,-17.90134],[-40.58932,-17.91502],[-40.58932,-17.93211],[-40.61519,-17.93416],[-40.62956,-17.9868],[-40.64609,-17.9868],[-40.65903,-18.00731],[-40.68777,-18.00594],[-40.70574,-18.01756],[-40.71365,-18.00184],[-40.72155,-17.99774],[-40.75102,-18.00252],[-40.76754,-17.99842],[-40.76754,-17.98133],[-40.80923,-17.94852],[-40.82432,-17.96014],[-40.83151,-17.94989],[-40.86528,-17.9827],[-40.88397,-17.96766],[-40.90912,-17.98475],[-40.77761,-18.10775],[-40.77832,-18.15146],[-40.79054,-18.15351],[-40.8351,-18.14531],[-40.89547,-18.10365],[-40.93283,-18.12755],[-40.95583,-18.1255],[-40.95296,-18.14463],[-40.96014,-18.15009],[-40.96374,-18.14326],[-40.97955,-18.13643],[-40.99248,-18.15009],[-40.99105,-18.16307],[-41.00901,-18.16307],[-41.05788,-18.1658],[-41.05788,-18.17536],[-41.09597,-18.19243],[-41.09597,-18.2054],[-41.1089,-18.21291],[-41.09812,-18.22997],[-41.10531,-18.2327],[-41.09884,-18.25591],[-41.12903,-18.27502],[-41.16137,-18.30572],[-41.15059,-18.37394],[-41.16424,-18.37939],[-41.16424,-18.4019],[-41.15059,-18.40735],[-41.15849,-18.41144],[-41.17358,-18.41144],[-41.18868,-18.44485],[-41.02123,-18.46667],[-41.04638,-18.60362],[-41.03776,-18.61452],[-41.05788,-18.62678],[-41.0471,-18.64857],[-41.03488,-18.65402],[-40.99895,-18.67716],[-40.94505,-18.69418],[-40.94433,-18.76973],[-40.92134,-18.81055],[-40.93715,-18.82347],[-40.94721,-18.82143],[-40.97092,-18.83572],[-41.08375,-18.83232],[-41.10675,-18.83572],[-41.11753,-18.80783],[-41.13118,-18.79286],[-41.23611,-18.7949],[-41.2512,-18.81667],[-41.2476,-18.85544],[-41.2203,-18.87992],[-41.20808,-18.87992],[-41.20664,-18.86632],[-41.16424,-18.867],[-41.15634,-18.88876],[-41.12903,-18.9044],[-41.12112,-18.92412],[-41.0392,-18.98665],[-41.07585,-19.00567],[-41.06507,-19.06342],[-40.96877,-19.12726],[-40.96158,-19.15102],[-40.92996,-19.206],[-40.94649,-19.22296],[-40.94793,-19.24264],[-40.92565,-19.26299],[-40.94936,-19.2786],[-40.92277,-19.31048],[-40.94361,-19.35252],[-40.93427,-19.381],[-40.95727,-19.39184],[-40.9738,-19.42641],[-40.95439,-19.46165],[-40.97883,-19.50298],[-41.01332,-19.50298],[-41.04638,-19.48333],[-41.05429,-19.48401],[-41.04135,-19.56664],[-41.09238,-19.58966],[-41.14627,-19.656],[-41.16496,-19.65871],[-41.17933,-19.6939],[-41.19658,-19.74599],[-41.16999,-19.80618],[-41.18939,-19.82375],[-41.18868,-19.88526],[-41.21239,-19.89743],[-41.22964,-19.90216],[-41.24689,-19.93324],[-41.25479,-19.92919],[-41.26988,-19.93797],[-41.30653,-19.93392],[-41.31516,-19.96972],[-41.3245,-19.97647],[-41.313,-20.01226],[-41.33672,-20.05548],[-41.34822,-20.08653],[-41.3554,-20.12094],[-41.37768,-20.15805],[-41.38702,-20.18638],[-41.41074,-20.19448],[-41.4208,-20.20257],[-41.7636,-20.2046],[-41.78516,-20.28483],[-41.85055,-20.3246],[-41.86349,-20.37513],[-41.85127,-20.38187],[-41.84337,-20.40949],[-41.80887,-20.42498],[-41.80672,-20.47211],[-41.83115,-20.47885],[-41.81103,-20.54212],[-41.83115,-20.55086],[-41.86205,-20.61814],[-41.82109,-20.64437],[-41.85343,-20.68068],[-41.87139,-20.72102],[-41.8678,-20.73849],[-41.88002,-20.73984],[-41.88289,-20.76739],[-41.85415,-20.77478],[-41.83331,-20.7983],[-41.80887,-20.80905],[-41.78444,-20.80569],[-41.75138,-20.82382],[-41.74707,-20.87487],[-41.72335,-20.87554],[-41.74132,-20.92723],[-41.72335,-20.97757],[-41.74347,-21.09763],[-41.7291,-21.12579],[-41.594,-21.16332],[-41.57244,-21.18678],[-41.49051,-21.18879],[-41.48332,-21.20085],[-41.43948,-21.22095],[-41.41289,-21.20956],[-41.34965,-21.21291],[-41.27994,-21.2464],[-41.24473,-21.23234],[-41.17718,-21.25511],[-41.09238,-21.2243],[-41.04854,-21.25913],[-41.01548,-21.25578],[-41.00254,-21.28726],[-40.94577,-21.31404]]],terms_url:"https://der.es.gov.br",terms_text:"Departamento de Estradas de Rodagem do Estado do Espírito Santo",overlay:true},{id:"db-inspire-2013-11",name:"Deutsche Bahn VzG lines January 2017",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2017?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-11-01T00:00:00.000Z",startDate:"2013-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"db-inspire-2015-11",name:"Deutsche Bahn VzG lines Nov 2015",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2015?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"DigitalGlobe-Premium",name:"DigitalGlobe Premium Imagery",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.316c9a2e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ2c2dzFlMWgyd2x0ZHdmMDB6NzYifQ.9Pl3XOO82ArX94fHV289Pg",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{id:"DigitalGlobe-Premium-vintage",name:"DigitalGlobe Premium Imagery Vintage",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.2850d66c/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBkcmZjNzJ5ZnozNHF6NnVkOGd6ODYifQ.grAnqgpCjOaeq-ozqt4QNw",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback",description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",overlay:true},{id:"DigitalGlobe-Standard",name:"DigitalGlobe Standard Imagery",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.0a8e44ba/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ3pjczNpaHYycXFyMGo0djY3N2IifQ.90uebT4-ow1uqZKTUrf6RQ",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{id:"DigitalGlobe-Standard-vintage",name:"DigitalGlobe Standard Imagery Vintage",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.1412531a/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBlYWJ1ZDAza2YyeG14NWVodTA4OWUifQ.wVc8ZOuPuYVw39lhS2j3_g",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback",description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",overlay:true},{id:"drone-imagery-2014",name:"Drone Imagery 2014 (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_2014/{zoom}/{x}/{y}",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[-72.3286,18.69461],[-72.33034,18.69412],[-72.33117,18.69284],[-72.33413,18.68542],[-72.33452,18.68414],[-72.33443,18.68355],[-72.33375,18.68235],[-72.32147,18.67721],[-72.32027,18.67698],[-72.31909,18.67713],[-72.3183,18.67804],[-72.31508,18.68457],[-72.31394,18.689],[-72.31553,18.68993],[-72.3286,18.69461]],[[-72.34695,18.61833],[-72.34553,18.62166],[-72.34355,18.62447],[-72.34245,18.62553],[-72.34076,18.62658],[-72.33786,18.62639],[-72.33649,18.62597],[-72.33589,18.62504],[-72.33482,18.62559],[-72.33472,18.6255],[-72.33459,18.62513],[-72.33343,18.62438],[-72.33174,18.62469],[-72.3313,18.62457],[-72.33126,18.62321],[-72.33088,18.62276],[-72.33066,18.62277],[-72.32985,18.62345],[-72.32862,18.62186],[-72.32829,18.6218],[-72.32817,18.62193],[-72.32809,18.6218],[-72.32734,18.62261],[-72.32541,18.62101],[-72.32422,18.62122],[-72.32396,18.61869],[-72.32354,18.61815],[-72.32325,18.61818],[-72.32351,18.61877],[-72.32058,18.62031],[-72.32043,18.61993],[-72.31978,18.62066],[-72.31807,18.61907],[-72.31742,18.61958],[-72.31523,18.61782],[-72.31463,18.61844],[-72.31324,18.6165],[-72.31275,18.61677],[-72.31232,18.6172],[-72.31198,18.61704],[-72.31042,18.61764],[-72.31062,18.61564],[-72.30996,18.61526],[-72.30936,18.61623],[-72.30786,18.61542],[-72.30669,18.61623],[-72.30604,18.61704],[-72.30419,18.61545],[-72.30288,18.61688],[-72.30191,18.61637],[-72.30131,18.61552],[-72.30118,18.6158],[-72.30087,18.61546],[-72.30076,18.61567],[-72.30062,18.6156],[-72.30012,18.61609],[-72.29198,18.61365],[-72.29194,18.61347],[-72.29143,18.61342],[-72.29094,18.61323],[-72.29105,18.61199],[-72.29057,18.61152],[-72.28772,18.61145],[-72.28801,18.6096],[-72.2865,18.60968],[-72.28635,18.60799],[-72.28448,18.60844],[-72.28436,18.60789],[-72.283,18.60808],[-72.283,18.60658],[-72.2828,18.60676],[-72.2816,18.60537],[-72.28106,18.60533],[-72.27973,18.60682],[-72.27805,18.60525],[-72.27793,18.6053],[-72.2778,18.60524],[-72.2772,18.60638],[-72.27589,18.60564],[-72.27544,18.60629],[-72.27385,18.60508],[-72.27341,18.60508],[-72.27241,18.60593],[-72.27099,18.60442],[-72.27047,18.60429],[-72.27038,18.60446],[-72.27024,18.60427],[-72.27011,18.60433],[-72.26862,18.60368],[-72.26778,18.6037],[-72.26751,18.60429],[-72.2655,18.60318],[-72.26539,18.60336],[-72.26515,18.60309],[-72.26471,18.603],[-72.26436,18.60331],[-72.26312,18.60193],[-72.26258,18.60188],[-72.262,18.60251],[-72.26139,18.60184],[-72.26106,18.60182],[-72.26106,18.60148],[-72.26014,18.6005],[-72.25994,18.60049],[-72.25803,18.60079],[-72.2576,18.60054],[-72.25691,18.60094],[-72.25413,18.59992],[-72.25093,18.59739],[-72.25062,18.59676],[-72.25033,18.59701],[-72.24451,18.59231],[-72.24215,18.58872],[-72.24167,18.58756],[-72.24077,18.58654],[-72.24147,18.58592],[-72.2413,18.58543],[-72.2395,18.58424],[-72.24007,18.58358],[-72.2382,18.58197],[-72.23868,18.58157],[-72.2385,18.58119],[-72.23703,18.58054],[-72.23612,18.57894],[-72.23646,18.57825],[-72.23636,18.5777],[-72.23467,18.57684],[-72.2353,18.57562],[-72.235,18.57499],[-72.23335,18.57423],[-72.23399,18.57293],[-72.23182,18.57169],[-72.23188,18.57137],[-72.23175,18.57127],[-72.23198,18.5708],[-72.23072,18.5694],[-72.23097,18.56874],[-72.23082,18.56844],[-72.23046,18.56855],[-72.23009,18.56754],[-72.22942,18.56715],[-72.22972,18.56651],[-72.22961,18.566],[-72.22908,18.56612],[-72.22848,18.56396],[-72.22818,18.56395],[-72.22733,18.56421],[-72.2265,18.56179],[-72.22623,18.56191],[-72.22436,18.55908],[-72.22471,18.55882],[-72.22357,18.55689],[-72.22379,18.55675],[-72.22325,18.55579],[-72.22387,18.55544],[-72.22382,18.55528],[-72.22458,18.55483],[-72.22453,18.55439],[-72.22625,18.55408],[-72.22705,18.55349],[-72.22692,18.55333],[-72.2271,18.55324],[-72.22687,18.55273],[-72.22592,18.55308],[-72.22465,18.55027],[-72.22483,18.5501],[-72.22457,18.54956],[-72.22327,18.55014],[-72.22261,18.54869],[-72.2208,18.54918],[-72.22051,18.54852],[-72.22034,18.54865],[-72.2201,18.54845],[-72.21952,18.54876],[-72.21862,18.54755],[-72.2174,18.5478],[-72.21714,18.54733],[-72.21694,18.54734],[-72.21583,18.54517],[-72.21505,18.54533],[-72.21477,18.54494],[-72.21442,18.54218],[-72.21421,18.54233],[-72.21293,18.5401],[-72.21199,18.5404],[-72.21188,18.54025],[-72.21145,18.53781],[-72.21085,18.53797],[-72.21028,18.53545],[-72.20993,18.53465],[-72.20942,18.53478],[-72.20942,18.53456],[-72.20851,18.53472],[-72.2057,18.53039],[-72.20444,18.52693],[-72.20438,18.52643],[-72.20418,18.52637],[-72.20399,18.52572],[-72.20263,18.5222],[-72.20182,18.5197],[-72.20148,18.51742],[-72.20301,18.51606],[-72.20503,18.51506],[-72.20767,18.51432],[-72.20936,18.5142],[-72.2095,18.51448],[-72.21082,18.51416],[-72.21095,18.51444],[-72.21189,18.51412],[-72.21266,18.51403],[-72.21277,18.51417],[-72.21462,18.51393],[-72.21697,18.51569],[-72.21731,18.51648],[-72.21787,18.51642],[-72.21818,18.51975],[-72.21798,18.51984],[-72.21909,18.52189],[-72.22031,18.52152],[-72.22096,18.52382],[-72.22209,18.52355],[-72.22251,18.52685],[-72.22229,18.52693],[-72.22271,18.52726],[-72.22289,18.52707],[-72.2231,18.52722],[-72.22404,18.52681],[-72.22551,18.52936],[-72.22596,18.5297],[-72.22642,18.52964],[-72.2265,18.53018],[-72.2275,18.53118],[-72.22673,18.53171],[-72.22885,18.53383],[-72.22811,18.53435],[-72.22981,18.53623],[-72.22912,18.5367],[-72.22935,18.53731],[-72.23059,18.53875],[-72.23222,18.54189],[-72.23215,18.5421],[-72.23258,18.54324],[-72.23311,18.54304],[-72.2342,18.54558],[-72.23436,18.5455],[-72.23554,18.54776],[-72.23571,18.54779],[-72.23601,18.54899],[-72.23839,18.55165],[-72.23747,18.55231],[-72.23951,18.55397],[-72.23918,18.55413],[-72.2407,18.55661],[-72.24014,18.5568],[-72.24079,18.55824],[-72.24063,18.55835],[-72.24067,18.55845],[-72.24117,18.55815],[-72.24161,18.55898],[-72.24216,18.55882],[-72.24242,18.56062],[-72.24262,18.56101],[-72.24294,18.56089],[-72.24399,18.56371],[-72.24466,18.56356],[-72.24475,18.56413],[-72.24536,18.56445],[-72.2449,18.56525],[-72.24518,18.56549],[-72.245,18.56581],[-72.24499,18.56607],[-72.24543,18.56633],[-72.24559,18.56618],[-72.24588,18.56662],[-72.24687,18.56727],[-72.24662,18.56749],[-72.24781,18.56897],[-72.24728,18.56938],[-72.24859,18.57137],[-72.24894,18.57159],[-72.24865,18.57222],[-72.2488,18.57219],[-72.24885,18.5723],[-72.24945,18.57197],[-72.25068,18.57411],[-72.25147,18.5737],[-72.25251,18.57598],[-72.25339,18.57551],[-72.25491,18.57848],[-72.25462,18.57863],[-72.25467,18.57878],[-72.25505,18.57894],[-72.25495,18.57913],[-72.256,18.58074],[-72.2563,18.58054],[-72.25752,18.58237],[-72.25769,18.58227],[-72.2578,18.5824],[-72.25808,18.5823],[-72.25857,18.5821],[-72.25862,18.58222],[-72.25889,18.58219],[-72.25894,18.58302],[-72.25958,18.58445],[-72.25984,18.58472],[-72.26072,18.58443],[-72.26094,18.58565],[-72.2622,18.58722],[-72.26351,18.58643],[-72.2643,18.58738],[-72.26474,18.58708],[-72.26594,18.58862],[-72.26756,18.58877],[-72.26742,18.58917],[-72.27039,18.58893],[-72.27021,18.5903],[-72.2722,18.59048],[-72.27211,18.59145],[-72.27381,18.59188],[-72.27384,18.59168],[-72.27729,18.59169],[-72.28014,18.59129],[-72.28059,18.59048],[-72.28106,18.59071],[-72.28226,18.58989],[-72.28286,18.59047],[-72.28367,18.58966],[-72.28401,18.59014],[-72.28468,18.59029],[-72.2851,18.58997],[-72.2857,18.59062],[-72.28661,18.59068],[-72.28681,18.59014],[-72.28728,18.59032],[-72.28741,18.59013],[-72.28801,18.59052],[-72.28991,18.59071],[-72.29077,18.58997],[-72.29196,18.59186],[-72.2945,18.59148],[-72.29454,18.59361],[-72.29654,18.59322],[-72.29689,18.59586],[-72.2976,18.59675],[-72.29824,18.59722],[-72.29871,18.5962],[-72.30053,18.59733],[-72.30081,18.59675],[-72.30113,18.59691],[-72.30131,18.59676],[-72.30175,18.59721],[-72.30303,18.59774],[-72.3033,18.59729],[-72.30394,18.59761],[-72.30394,18.59736],[-72.30555,18.59794],[-72.30598,18.59756],[-72.30703,18.59838],[-72.30723,18.59799],[-72.30862,18.59833],[-72.30938,18.59752],[-72.31013,18.5981],[-72.31037,18.59739],[-72.3121,18.5983],[-72.3122,18.59807],[-72.31424,18.59902],[-72.31456,18.59873],[-72.31524,18.59922],[-72.31681,18.59952],[-72.31662,18.60004],[-72.31958,18.60072],[-72.31907,18.60202],[-72.32042,18.60247],[-72.32061,18.60242],[-72.32082,18.60267],[-72.3211,18.6027],[-72.32105,18.60298],[-72.32144,18.60347],[-72.32368,18.60322],[-72.32375,18.60432],[-72.32584,18.60436],[-72.32588,18.60522],[-72.32617,18.60585],[-72.32864,18.60525],[-72.32897,18.60527],[-72.32916,18.60727],[-72.33006,18.60812],[-72.3294,18.60867],[-72.33004,18.60959],[-72.33282,18.60949],[-72.33258,18.61058],[-72.33302,18.61005],[-72.3335,18.61054],[-72.33477,18.61035],[-72.33485,18.61167],[-72.33735,18.61174],[-72.33725,18.61237],[-72.33767,18.61298],[-72.34038,18.61306],[-72.34016,18.6138],[-72.34153,18.61384],[-72.34258,18.61457],[-72.3426,18.61512],[-72.34306,18.61499],[-72.34682,18.61792],[-72.34695,18.61833]],[[-72.72363,19.09461],[-72.72302,19.09518],[-72.72206,19.0965],[-72.72169,19.09612],[-72.72164,19.0962],[-72.72132,19.09609],[-72.72073,19.0967],[-72.7198,19.09587],[-72.71965,19.09591],[-72.7197,19.09601],[-72.71955,19.09602],[-72.71911,19.09623],[-72.71906,19.09627],[-72.71904,19.09625],[-72.71888,19.09631],[-72.71886,19.09626],[-72.71817,19.09643],[-72.71776,19.09679],[-72.71756,19.09657],[-72.71693,19.09705],[-72.71713,19.09735],[-72.71495,19.0988],[-72.71479,19.09852],[-72.71483,19.09849],[-72.7148,19.0984],[-72.71455,19.09859],[-72.71449,19.09851],[-72.71413,19.09877],[-72.71413,19.09893],[-72.71419,19.09891],[-72.71417,19.09978],[-72.71324,19.09971],[-72.71287,19.09974],[-72.71295,19.09967],[-72.71278,19.09968],[-72.71278,19.09977],[-72.71282,19.09976],[-72.71285,19.09988],[-72.71266,19.09989],[-72.71266,19.09987],[-72.71245,19.09987],[-72.71182,19.09991],[-72.71178,19.10012],[-72.71157,19.10009],[-72.71147,19.10102],[-72.71042,19.10086],[-72.71039,19.10119],[-72.7103,19.1012],[-72.71031,19.10151],[-72.7097,19.10156],[-72.7097,19.10162],[-72.70917,19.10169],[-72.70917,19.1021],[-72.70828,19.10211],[-72.70809,19.10289],[-72.70788,19.10284],[-72.70798,19.10367],[-72.70724,19.1038],[-72.70731,19.10501],[-72.70723,19.10501],[-72.70736,19.10565],[-72.70637,19.10584],[-72.7062,19.10714],[-72.70588,19.10706],[-72.70591,19.10747],[-72.7053,19.10757],[-72.7054,19.10813],[-72.70568,19.10809],[-72.70568,19.10928],[-72.70591,19.11013],[-72.70589,19.11022],[-72.70574,19.11025],[-72.70574,19.11116],[-72.70538,19.11114],[-72.70557,19.11247],[-72.70499,19.11256],[-72.70537,19.11361],[-72.7047,19.11388],[-72.70496,19.11563],[-72.70418,19.11564],[-72.70442,19.11762],[-72.70371,19.11764],[-72.70371,19.1178],[-72.70352,19.11779],[-72.70339,19.12227],[-72.70264,19.12205],[-72.70253,19.12301],[-72.70289,19.12592],[-72.70308,19.12595],[-72.70316,19.12864],[-72.70234,19.12997],[-72.70206,19.1301],[-72.69987,19.1305],[-72.69325,19.13064],[-72.687,19.13075],[-72.68456,19.13073],[-72.68338,19.13056],[-72.6828,19.1297],[-72.68203,19.1283],[-72.68201,19.12715],[-72.68158,19.12714],[-72.68187,19.12508],[-72.68185,19.12507],[-72.68215,19.12414],[-72.68253,19.12295],[-72.68265,19.12243],[-72.68263,19.12185],[-72.68302,19.12185],[-72.68301,19.12132],[-72.68286,19.12133],[-72.68293,19.11947],[-72.68251,19.11946],[-72.68256,19.11803],[-72.68265,19.11751],[-72.68265,19.11703],[-72.68318,19.11704],[-72.68319,19.11685],[-72.68371,19.11687],[-72.68384,19.11684],[-72.684,19.11685],[-72.68398,19.11689],[-72.68426,19.11688],[-72.68426,19.11679],[-72.68481,19.11674],[-72.68546,19.11667],[-72.68557,19.11664],[-72.68551,19.11664],[-72.6856,19.11662],[-72.68595,19.11658],[-72.68596,19.11654],[-72.68608,19.11654],[-72.68661,19.11663],[-72.68662,19.11656],[-72.68713,19.11665],[-72.68721,19.11666],[-72.68721,19.11663],[-72.6878,19.11666],[-72.68779,19.11659],[-72.68833,19.11663],[-72.68832,19.11658],[-72.68928,19.11657],[-72.6897,19.11656],[-72.68998,19.11644],[-72.6902,19.11644],[-72.69019,19.11615],[-72.69027,19.11563],[-72.69029,19.11541],[-72.69017,19.11543],[-72.69018,19.11493],[-72.69018,19.11458],[-72.69019,19.11445],[-72.69022,19.11433],[-72.6902,19.11406],[-72.68972,19.11398],[-72.68968,19.11397],[-72.68973,19.11415],[-72.68974,19.1142],[-72.68937,19.11417],[-72.68872,19.11412],[-72.688,19.11412],[-72.68758,19.11409],[-72.68759,19.11401],[-72.68736,19.11403],[-72.68711,19.11406],[-72.68682,19.11406],[-72.68677,19.11405],[-72.68591,19.11422],[-72.68554,19.11421],[-72.68557,19.11369],[-72.68554,19.11308],[-72.68533,19.11314],[-72.6852,19.11316],[-72.68519,19.1132],[-72.68504,19.11325],[-72.68495,19.1127],[-72.68474,19.11278],[-72.68468,19.11277],[-72.68446,19.11281],[-72.68416,19.1128],[-72.6836,19.11254],[-72.68353,19.11102],[-72.68363,19.11007],[-72.68338,19.11003],[-72.68344,19.10974],[-72.68295,19.1096],[-72.68305,19.10892],[-72.68111,19.10826],[-72.68112,19.1081],[-72.67965,19.10781],[-72.67968,19.10765],[-72.67923,19.10749],[-72.67916,19.10802],[-72.67838,19.10755],[-72.67779,19.10753],[-72.67775,19.10769],[-72.67623,19.10765],[-72.67606,19.10762],[-72.67621,19.10797],[-72.67549,19.10804],[-72.67548,19.1079],[-72.67431,19.10804],[-72.67432,19.10795],[-72.67398,19.10794],[-72.67382,19.10798],[-72.6739,19.10864],[-72.67319,19.10856],[-72.67307,19.10852],[-72.67284,19.10855],[-72.67276,19.10855],[-72.67286,19.10907],[-72.67284,19.10915],[-72.67251,19.10903],[-72.67236,19.10906],[-72.6723,19.10905],[-72.67224,19.10913],[-72.67179,19.10912],[-72.67051,19.10679],[-72.6704,19.10401],[-72.67048,19.10396],[-72.67032,19.10223],[-72.67034,19.1016],[-72.67062,19.09856],[-72.67121,19.09697],[-72.67278,19.09595],[-72.67277,19.09629],[-72.67364,19.09636],[-72.6736,19.09662],[-72.67484,19.09623],[-72.67489,19.09666],[-72.67566,19.09655],[-72.67566,19.09648],[-72.67655,19.09642],[-72.67772,19.09626],[-72.67786,19.09675],[-72.67784,19.09689],[-72.67826,19.09677],[-72.67837,19.09698],[-72.67858,19.09698],[-72.67853,19.09665],[-72.67878,19.09666],[-72.67861,19.09635],[-72.67927,19.09633],[-72.67973,19.0962],[-72.68015,19.09604],[-72.68058,19.09598],[-72.68029,19.09501],[-72.68072,19.095],[-72.68066,19.09474],[-72.68048,19.09418],[-72.68037,19.09335],[-72.68064,19.09335],[-72.68064,19.09266],[-72.67973,19.09263],[-72.67972,19.09269],[-72.67943,19.09266],[-72.67966,19.09132],[-72.67977,19.09107],[-72.68249,19.0892],[-72.68272,19.08907],[-72.68506,19.0888],[-72.68508,19.08888],[-72.68616,19.08873],[-72.6862,19.08887],[-72.68718,19.08866],[-72.68717,19.0886],[-72.68849,19.08844],[-72.68852,19.08847],[-72.69006,19.0884],[-72.69018,19.08871],[-72.69227,19.08828],[-72.69229,19.08887],[-72.69218,19.08924],[-72.69222,19.08928],[-72.69277,19.08923],[-72.69279,19.08933],[-72.69335,19.08934],[-72.69289,19.0888],[-72.69274,19.0883],[-72.69496,19.08857],[-72.69571,19.08831],[-72.69579,19.08892],[-72.69625,19.08904],[-72.69649,19.08889],[-72.69849,19.08845],[-72.69849,19.08866],[-72.6988,19.08858],[-72.69885,19.08895],[-72.69884,19.08903],[-72.69926,19.08895],[-72.70023,19.08884],[-72.70023,19.08893],[-72.70088,19.08892],[-72.7014,19.08887],[-72.70128,19.08828],[-72.70257,19.08859],[-72.70282,19.08874],[-72.70309,19.08883],[-72.70293,19.08855],[-72.70341,19.08862],[-72.70557,19.08863],[-72.70552,19.08906],[-72.70665,19.08889],[-72.70666,19.08938],[-72.70902,19.08917],[-72.70898,19.0891],[-72.71116,19.08894],[-72.71121,19.0892],[-72.71281,19.08912],[-72.71286,19.0898],[-72.71502,19.08882],[-72.71569,19.08838],[-72.71573,19.08847],[-72.7161,19.08824],[-72.71598,19.08795],[-72.71653,19.0877],[-72.71653,19.08761],[-72.71579,19.08781],[-72.71676,19.08727],[-72.71671,19.08717],[-72.71815,19.08638],[-72.71795,19.08602],[-72.71954,19.08518],[-72.71954,19.08511],[-72.72217,19.08467],[-72.72327,19.08506],[-72.72622,19.08712],[-72.72763,19.0891],[-72.72752,19.08973],[-72.72548,19.09295],[-72.72482,19.09403],[-72.72399,19.09495],[-72.72363,19.09461]],[[-72.06537,19.65239],[-72.06565,19.6518],[-72.06603,19.65128],[-72.06697,19.65109],[-72.0676,19.6511],[-72.07102,19.65223],[-72.0719,19.65254],[-72.07189,19.65255],[-72.07264,19.6528],[-72.07262,19.65284],[-72.07268,19.65286],[-72.07269,19.65283],[-72.0733,19.65305],[-72.07393,19.65327],[-72.07416,19.65347],[-72.07418,19.65351],[-72.07435,19.65395],[-72.07432,19.65425],[-72.07419,19.65495],[-72.07399,19.65583],[-72.07384,19.65648],[-72.07307,19.65805],[-72.07274,19.65866],[-72.0727,19.65869],[-72.07228,19.65915],[-72.07221,19.65917],[-72.07196,19.65916],[-72.0714,19.65909],[-72.07012,19.65866],[-72.07017,19.65856],[-72.06983,19.65852],[-72.06984,19.65848],[-72.06939,19.65841],[-72.06944,19.65823],[-72.06941,19.65823],[-72.06937,19.65836],[-72.06842,19.65807],[-72.06707,19.65759],[-72.06451,19.65663],[-72.06434,19.65632],[-72.06421,19.65547],[-72.06422,19.65541],[-72.06472,19.65379],[-72.06487,19.65351],[-72.06537,19.65239]],[[-72.23222,18.69173],[-72.23182,18.69172],[-72.23115,18.69168],[-72.23128,18.69161],[-72.23072,18.69152],[-72.23068,18.69147],[-72.23135,18.69159],[-72.23157,18.69149],[-72.23162,18.69137],[-72.23165,18.69134],[-72.23165,18.69164],[-72.23222,18.69173]],[[-72.2406,18.69192],[-72.23953,18.6921],[-72.23891,18.69207],[-72.23878,18.69207],[-72.23856,18.692],[-72.23818,18.69192],[-72.23186,18.69054],[-72.22977,18.69113],[-72.21709,18.68967],[-72.21618,18.68724],[-72.21599,18.68673],[-72.21602,18.68659],[-72.2159,18.68601],[-72.21581,18.68593],[-72.21561,18.68483],[-72.21569,18.6847],[-72.21578,18.68435],[-72.21595,18.68347],[-72.21629,18.68289],[-72.2164,18.68221],[-72.21633,18.68211],[-72.21641,18.68208],[-72.21642,18.68189],[-72.21694,18.6813],[-72.21685,18.68096],[-72.21693,18.68099],[-72.21722,18.68091],[-72.21734,18.6808],[-72.21731,18.67964],[-72.21749,18.67958],[-72.21749,18.67946],[-72.21747,18.67908],[-72.21743,18.67853],[-72.21739,18.6785],[-72.21718,18.6786],[-72.2171,18.67856],[-72.21708,18.67838],[-72.21724,18.67767],[-72.21724,18.67745],[-72.21721,18.67744],[-72.21681,18.67754],[-72.21671,18.67688],[-72.21662,18.67612],[-72.21642,18.67621],[-72.21601,18.67548],[-72.21596,18.67551],[-72.21589,18.67549],[-72.21552,18.6756],[-72.2154,18.67561],[-72.21529,18.6757],[-72.21521,18.67571],[-72.21491,18.67472],[-72.21464,18.67387],[-72.21456,18.6737],[-72.21447,18.67348],[-72.21413,18.67301],[-72.21427,18.67293],[-72.21413,18.67271],[-72.21383,18.67278],[-72.21339,18.67181],[-72.21178,18.67209],[-72.21169,18.67172],[-72.21135,18.67183],[-72.21116,18.67196],[-72.21077,18.67121],[-72.21058,18.67129],[-72.20984,18.66963],[-72.20972,18.6697],[-72.20966,18.66968],[-72.20918,18.66838],[-72.20895,18.66773],[-72.2093,18.66606],[-72.20937,18.66571],[-72.20974,18.66536],[-72.21031,18.66477],[-72.21021,18.66416],[-72.21042,18.66401],[-72.2111,18.66329],[-72.21167,18.66268],[-72.21179,18.66236],[-72.21206,18.66242],[-72.21193,18.66185],[-72.21188,18.66155],[-72.21199,18.66147],[-72.21239,18.66137],[-72.21331,18.66103],[-72.21393,18.66039],[-72.21376,18.65992],[-72.21355,18.65956],[-72.21376,18.65943],[-72.21349,18.65869],[-72.21296,18.65736],[-72.21357,18.6572],[-72.21312,18.65639],[-72.21281,18.65534],[-72.21317,18.6551],[-72.21308,18.65459],[-72.21347,18.65438],[-72.21374,18.65436],[-72.21382,18.65416],[-72.2135,18.65353],[-72.21304,18.65171],[-72.21345,18.65143],[-72.21341,18.65133],[-72.21364,18.65105],[-72.21418,18.65077],[-72.21378,18.65016],[-72.21364,18.64989],[-72.21372,18.64975],[-72.21429,18.64943],[-72.21379,18.64934],[-72.21362,18.64922],[-72.21382,18.64869],[-72.21354,18.64765],[-72.21331,18.64717],[-72.21366,18.64552],[-72.21389,18.64539],[-72.21377,18.6451],[-72.214,18.64399],[-72.21412,18.64378],[-72.21437,18.64347],[-72.2158,18.64222],[-72.21601,18.64217],[-72.21761,18.64218],[-72.21778,18.64272],[-72.21798,18.64256],[-72.21816,18.64236],[-72.21821,18.6422],[-72.22119,18.64222],[-72.22125,18.6423],[-72.22135,18.64224],[-72.2215,18.64223],[-72.22293,18.64229],[-72.22299,18.64235],[-72.22311,18.64227],[-72.22717,18.64249],[-72.22828,18.64281],[-72.22811,18.6432],[-72.22848,18.64325],[-72.22919,18.64258],[-72.2304,18.64263],[-72.23711,18.64295],[-72.23719,18.64317],[-72.23807,18.64322],[-72.23828,18.64298],[-72.23988,18.64306],[-72.24332,18.6434],[-72.24367,18.64387],[-72.24518,18.64437],[-72.2456,18.64364],[-72.24562,18.64372],[-72.24574,18.64363],[-72.24723,18.64378],[-72.24853,18.64441],[-72.24918,18.64397],[-72.25155,18.64418],[-72.25382,18.64516],[-72.2546,18.64564],[-72.25517,18.64642],[-72.2554,18.64807],[-72.25531,18.64812],[-72.2552,18.64828],[-72.2555,18.64881],[-72.25586,18.64847],[-72.25603,18.64856],[-72.25625,18.64848],[-72.25685,18.64755],[-72.25965,18.64494],[-72.26253,18.64336],[-72.26304,18.64362],[-72.26388,18.64308],[-72.26486,18.64445],[-72.26525,18.64373],[-72.26533,18.64378],[-72.26576,18.64259],[-72.26652,18.64289],[-72.26641,18.64135],[-72.26714,18.64137],[-72.26737,18.6407],[-72.26824,18.64023],[-72.26853,18.6403],[-72.26901,18.63988],[-72.26908,18.63978],[-72.26948,18.63958],[-72.27214,18.63895],[-72.27383,18.63988],[-72.27375,18.64004],[-72.27476,18.64088],[-72.27501,18.64054],[-72.27622,18.64161],[-72.27639,18.64131],[-72.27652,18.64138],[-72.27845,18.643],[-72.27896,18.64273],[-72.2823,18.64457],[-72.28387,18.64607],[-72.28384,18.64611],[-72.28412,18.64641],[-72.28401,18.64647],[-72.28455,18.6471],[-72.28538,18.64803],[-72.28569,18.64785],[-72.28642,18.64857],[-72.28724,18.64936],[-72.28775,18.65003],[-72.28724,18.65028],[-72.28768,18.65089],[-72.28708,18.65122],[-72.28656,18.65188],[-72.28736,18.6532],[-72.2872,18.65332],[-72.2873,18.65355],[-72.28905,18.65383],[-72.28882,18.65459],[-72.28889,18.6546],[-72.28878,18.65512],[-72.29013,18.65481],[-72.29084,18.65766],[-72.2902,18.65767],[-72.29076,18.66015],[-72.28998,18.66022],[-72.29045,18.66151],[-72.29022,18.66161],[-72.29033,18.66256],[-72.29138,18.66227],[-72.29155,18.66276],[-72.29368,18.66243],[-72.29377,18.663],[-72.29441,18.66289],[-72.29444,18.66273],[-72.29656,18.66246],[-72.29662,18.66262],[-72.29708,18.66261],[-72.29692,18.66184],[-72.30025,18.66195],[-72.30141,18.66311],[-72.30141,18.66397],[-72.30192,18.66392],[-72.30197,18.66454],[-72.30311,18.66471],[-72.30471,18.66632],[-72.30471,18.66668],[-72.30505,18.66666],[-72.30529,18.66692],[-72.30519,18.66768],[-72.30607,18.66759],[-72.30749,18.66901],[-72.30782,18.67109],[-72.30784,18.67216],[-72.30757,18.67405],[-72.30716,18.67526],[-72.30674,18.67537],[-72.30687,18.67599],[-72.30657,18.67612],[-72.30611,18.67602],[-72.30585,18.67705],[-72.30607,18.67726],[-72.3061,18.67744],[-72.30635,18.678],[-72.30609,18.67871],[-72.30587,18.67881],[-72.3059,18.67951],[-72.30556,18.68062],[-72.30395,18.68368],[-72.30377,18.68373],[-72.30139,18.68415],[-72.29912,18.68452],[-72.29899,18.68432],[-72.29826,18.6844],[-72.29828,18.6845],[-72.29502,18.68412],[-72.29419,18.68422],[-72.29408,18.68376],[-72.29202,18.68398],[-72.29191,18.68364],[-72.29101,18.68377],[-72.29095,18.68347],[-72.29037,18.68378],[-72.29035,18.68363],[-72.28936,18.68384],[-72.28913,18.68345],[-72.28766,18.6835],[-72.2877,18.68329],[-72.28538,18.68344],[-72.2849,18.68243],[-72.28449,18.68243],[-72.28376,18.68198],[-72.28268,18.68186],[-72.2822,18.68284],[-72.28268,18.68296],[-72.28164,18.68413],[-72.28111,18.68523],[-72.28129,18.68628],[-72.28089,18.68726],[-72.28036,18.68726],[-72.28036,18.68762],[-72.2715,18.688],[-72.2715,18.68774],[-72.27171,18.6875],[-72.27193,18.68611],[-72.2713,18.68611],[-72.27115,18.68635],[-72.27115,18.68735],[-72.26903,18.68805],[-72.26661,18.68821],[-72.26315,18.68817],[-72.25798,18.6868],[-72.25503,18.68501],[-72.25415,18.68242],[-72.25408,18.68278],[-72.25266,18.68732],[-72.25106,18.68819],[-72.24828,18.68927],[-72.24695,18.68917],[-72.24718,18.68966],[-72.24628,18.68966],[-72.24632,18.68997],[-72.24527,18.69032],[-72.24487,18.69045],[-72.24361,18.69036],[-72.24351,18.69029],[-72.24321,18.6903],[-72.24318,18.69051],[-72.24324,18.69061],[-72.24325,18.691],[-72.24303,18.69122],[-72.24166,18.69171],[-72.24149,18.69178],[-72.2406,18.69192]],[[-72.27545,18.56614],[-72.27419,18.56701],[-72.27356,18.56701],[-72.27297,18.56706],[-72.27227,18.56707],[-72.27191,18.56707],[-72.27178,18.56718],[-72.2709,18.56724],[-72.27064,18.56724],[-72.26998,18.56708],[-72.26875,18.56671],[-72.2684,18.56661],[-72.26809,18.56639],[-72.26781,18.56611],[-72.26744,18.5652],[-72.26739,18.56308],[-72.26738,18.5626],[-72.26742,18.56195],[-72.26799,18.56064],[-72.26822,18.56014],[-72.26856,18.55975],[-72.26871,18.55962],[-72.2702,18.55963],[-72.27181,18.55967],[-72.27491,18.55982],[-72.27579,18.55986],[-72.27588,18.55999],[-72.2758,18.56491],[-72.27578,18.56541],[-72.27575,18.56556],[-72.27552,18.56608],[-72.27545,18.56614]],[[-72.33318,18.56014],[-72.33166,18.55959],[-72.33021,18.55904],[-72.32919,18.55866],[-72.3292,18.55861],[-72.32887,18.55838],[-72.32868,18.55826],[-72.3282,18.55827],[-72.32815,18.55828],[-72.3261,18.55752],[-72.32604,18.5575],[-72.32604,18.55745],[-72.32589,18.55732],[-72.32551,18.5573],[-72.32437,18.55688],[-72.32411,18.55678],[-72.32379,18.55662],[-72.32348,18.55633],[-72.32315,18.55628],[-72.32174,18.55556],[-72.32143,18.55541],[-72.3205,18.55488],[-72.32019,18.5547],[-72.32007,18.55453],[-72.31984,18.55412],[-72.31984,18.55385],[-72.31998,18.55322],[-72.32046,18.55124],[-72.32056,18.55083],[-72.32066,18.55047],[-72.32068,18.55039],[-72.32111,18.54857],[-72.32127,18.54791],[-72.32147,18.54719],[-72.32153,18.54699],[-72.322,18.5458],[-72.32203,18.54575],[-72.32354,18.54486],[-72.3236,18.54483],[-72.3236,18.54481],[-72.32486,18.54407],[-72.32534,18.54378],[-72.32533,18.5439],[-72.32534,18.54392],[-72.32555,18.54416],[-72.32588,18.54452],[-72.3259,18.54453],[-72.32621,18.54452],[-72.3266,18.54452],[-72.32666,18.54398],[-72.32669,18.54367],[-72.32666,18.54361],[-72.32666,18.54356],[-72.32669,18.54356],[-72.32677,18.5436],[-72.32704,18.54363],[-72.32714,18.5432],[-72.32713,18.54314],[-72.32704,18.54317],[-72.32697,18.54316],[-72.32698,18.54296],[-72.32697,18.54293],[-72.32697,18.54281],[-72.32728,18.54263],[-72.32814,18.5424],[-72.32864,18.54226],[-72.3297,18.54228],[-72.32979,18.54228],[-72.33174,18.54279],[-72.33242,18.54298],[-72.33329,18.54319],[-72.33328,18.54321],[-72.33529,18.54372],[-72.33589,18.54387],[-72.33689,18.54504],[-72.33734,18.54555],[-72.33761,18.546],[-72.33783,18.54639],[-72.33788,18.54658],[-72.33791,18.54693],[-72.33792,18.54705],[-72.33763,18.54705],[-72.33749,18.54705],[-72.33751,18.54753],[-72.33751,18.54764],[-72.33747,18.54764],[-72.33748,18.54773],[-72.33742,18.54773],[-72.33739,18.54776],[-72.33735,18.54773],[-72.33734,18.54774],[-72.33726,18.54774],[-72.33725,18.54782],[-72.33725,18.54804],[-72.33728,18.548],[-72.3373,18.54798],[-72.3373,18.54796],[-72.33737,18.54788],[-72.33739,18.54789],[-72.33741,18.5478],[-72.33744,18.5478],[-72.33755,18.5477],[-72.33752,18.54764],[-72.33773,18.54741],[-72.33775,18.54741],[-72.33775,18.54737],[-72.33789,18.54721],[-72.3389,18.54828],[-72.33902,18.54842],[-72.34008,18.55026],[-72.34014,18.55034],[-72.34028,18.55068],[-72.34041,18.55099],[-72.34029,18.55156],[-72.34021,18.55185],[-72.33985,18.55283],[-72.33973,18.55315],[-72.33927,18.55425],[-72.33914,18.55457],[-72.33915,18.55458],[-72.3391,18.5547],[-72.33896,18.55506],[-72.33847,18.55626],[-72.33842,18.55625],[-72.33844,18.55631],[-72.33832,18.55661],[-72.33822,18.55686],[-72.33821,18.55687],[-72.33816,18.55699],[-72.33815,18.55698],[-72.33807,18.557],[-72.33803,18.557],[-72.33806,18.55726],[-72.338,18.55742],[-72.33716,18.5593],[-72.33709,18.55945],[-72.33843,18.55931],[-72.33929,18.55922],[-72.33982,18.55941],[-72.33983,18.55943],[-72.34028,18.55975],[-72.34092,18.5598],[-72.34096,18.5598],[-72.34413,18.5609],[-72.3446,18.56107],[-72.34472,18.56111],[-72.34472,18.56109],[-72.34829,18.5623],[-72.34912,18.5626],[-72.35035,18.56335],[-72.35302,18.56496],[-72.35333,18.56616],[-72.35351,18.56901],[-72.35337,18.56949],[-72.35156,18.57185],[-72.35042,18.57341],[-72.35036,18.57338],[-72.34849,18.57592],[-72.34815,18.57636],[-72.34756,18.57636],[-72.34753,18.57634],[-72.34746,18.57647],[-72.34745,18.57639],[-72.34705,18.57703],[-72.34659,18.57672],[-72.34649,18.57683],[-72.34544,18.57618],[-72.34365,18.57629],[-72.34361,18.57636],[-72.34354,18.57631],[-72.34258,18.5764],[-72.34252,18.57699],[-72.3428,18.57707],[-72.343,18.57715],[-72.3429,18.57737],[-72.34338,18.5774],[-72.34321,18.57803],[-72.34324,18.57803],[-72.3432,18.57816],[-72.3444,18.57852],[-72.34395,18.57972],[-72.34414,18.57976],[-72.34377,18.58067],[-72.34424,18.58074],[-72.34398,18.58155],[-72.34388,18.58181],[-72.34392,18.5818],[-72.34371,18.5823],[-72.34375,18.58229],[-72.34371,18.58237],[-72.34283,18.58355],[-72.3424,18.58413],[-72.34238,18.58411],[-72.34234,18.58411],[-72.34209,18.58403],[-72.34207,18.58434],[-72.342,18.58433],[-72.34192,18.58474],[-72.34192,18.58477],[-72.34118,18.58575],[-72.3408,18.58627],[-72.34024,18.58655],[-72.33983,18.58675],[-72.33542,18.58843],[-72.33539,18.58845],[-72.33539,18.58843],[-72.33517,18.58851],[-72.3346,18.58806],[-72.33372,18.58896],[-72.33361,18.58917],[-72.33295,18.58941],[-72.33253,18.58912],[-72.33252,18.58916],[-72.33168,18.58889],[-72.33157,18.5891],[-72.33152,18.58918],[-72.33153,18.58917],[-72.33152,18.5892],[-72.33158,18.58929],[-72.33161,18.58934],[-72.33136,18.58951],[-72.33134,18.58953],[-72.33135,18.58954],[-72.3313,18.58963],[-72.33132,18.58976],[-72.33112,18.58977],[-72.33118,18.58983],[-72.33097,18.59017],[-72.33011,18.5905],[-72.32965,18.59068],[-72.32418,18.59182],[-72.3238,18.59189],[-72.32228,18.59068],[-72.32079,18.58947],[-72.32076,18.58801],[-72.32078,18.588],[-72.32078,18.58706],[-72.32073,18.58691],[-72.32073,18.58626],[-72.32092,18.58625],[-72.32081,18.58589],[-72.32074,18.58593],[-72.3207,18.58531],[-72.32114,18.58437],[-72.32185,18.58274],[-72.32202,18.58277],[-72.3222,18.58276],[-72.32211,18.58251],[-72.32196,18.58249],[-72.32242,18.5815],[-72.32245,18.5815],[-72.32295,18.58034],[-72.32368,18.579],[-72.32465,18.57947],[-72.32575,18.57852],[-72.32661,18.5778],[-72.32721,18.57838],[-72.32824,18.57817],[-72.32848,18.57756],[-72.32855,18.5776],[-72.32938,18.57666],[-72.32907,18.57629],[-72.32936,18.57607],[-72.32877,18.57563],[-72.32975,18.57451],[-72.32968,18.57443],[-72.32989,18.57408],[-72.32994,18.57359],[-72.3296,18.57363],[-72.32997,18.57247],[-72.33009,18.57153],[-72.33017,18.57152],[-72.33047,18.57045],[-72.3314,18.57052],[-72.33167,18.56999],[-72.33027,18.56999],[-72.33025,18.57003],[-72.33006,18.57004],[-72.3297,18.57],[-72.32981,18.56877],[-72.32877,18.56765],[-72.32858,18.56749],[-72.32877,18.56711],[-72.32912,18.5668],[-72.32897,18.56664],[-72.32938,18.56572],[-72.32946,18.56554],[-72.33052,18.56424],[-72.33056,18.56424],[-72.33056,18.5642],[-72.33105,18.56367],[-72.33112,18.56374],[-72.33111,18.56376],[-72.33117,18.56377],[-72.33131,18.56391],[-72.33153,18.5641],[-72.33154,18.56385],[-72.33161,18.56365],[-72.33168,18.56329],[-72.33169,18.56322],[-72.33171,18.56319],[-72.33181,18.5628],[-72.33187,18.5626],[-72.33299,18.56123],[-72.33318,18.561],[-72.33365,18.56064],[-72.33393,18.56042],[-72.33367,18.56033],[-72.33367,18.56027],[-72.33332,18.56011],[-72.33318,18.56014]],[[-72.31173,18.56168],[-72.31195,18.56259],[-72.31221,18.56365],[-72.31259,18.56628],[-72.31254,18.5663],[-72.31264,18.56654],[-72.31266,18.56682],[-72.3127,18.56687],[-72.31276,18.56734],[-72.31256,18.56746],[-72.31232,18.56754],[-72.31229,18.56757],[-72.31199,18.5677],[-72.31216,18.56801],[-72.31227,18.56815],[-72.31231,18.56828],[-72.31239,18.56841],[-72.31291,18.56909],[-72.31281,18.56916],[-72.31306,18.56945],[-72.31309,18.56956],[-72.31323,18.57061],[-72.31325,18.57137],[-72.31325,18.57213],[-72.31234,18.57268],[-72.31117,18.57341],[-72.30971,18.5739],[-72.30911,18.5739],[-72.30894,18.57369],[-72.3086,18.57389],[-72.30712,18.57389],[-72.307,18.57357],[-72.30666,18.57388],[-72.30605,18.57389],[-72.30581,18.57367],[-72.30555,18.57388],[-72.3007,18.57387],[-72.30059,18.57369],[-72.30044,18.57386],[-72.29691,18.57388],[-72.29518,18.57386],[-72.295,18.57371],[-72.29473,18.57341],[-72.29387,18.5722],[-72.29341,18.57156],[-72.29338,18.57142],[-72.2933,18.57075],[-72.29338,18.57008],[-72.29349,18.56992],[-72.29361,18.56978],[-72.29361,18.56985],[-72.29378,18.56959],[-72.29364,18.56957],[-72.29345,18.56951],[-72.29358,18.56919],[-72.29389,18.56859],[-72.29373,18.56847],[-72.29359,18.56827],[-72.29359,18.5681],[-72.29379,18.5679],[-72.29403,18.56774],[-72.29387,18.56762],[-72.29368,18.56743],[-72.29396,18.56457],[-72.29411,18.56426],[-72.29401,18.56418],[-72.29402,18.5638],[-72.29412,18.56283],[-72.29451,18.56209],[-72.29462,18.56196],[-72.29767,18.5617],[-72.29849,18.56192],[-72.29864,18.56184],[-72.29857,18.56174],[-72.2988,18.56157],[-72.30144,18.56133],[-72.30181,18.56176],[-72.30228,18.56125],[-72.30275,18.56122],[-72.30427,18.56126],[-72.30505,18.56147],[-72.30522,18.5613],[-72.30609,18.56132],[-72.30821,18.56138],[-72.31173,18.56168]]]},{id:"DroneImageryCanaanHaitiNovember2015",name:"Drone Imagery Canaan(Haiti) November 2015",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_canaan_nov2015/{zoom}/{x}/{y}",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[-72.23109,18.67676],[-72.23101,18.67675],[-72.23108,18.67675],[-72.23104,18.67669],[-72.23105,18.67665],[-72.23151,18.67663],[-72.23153,18.67665],[-72.23146,18.67676],[-72.23285,18.67669],[-72.23506,18.67641],[-72.23507,18.67638],[-72.23507,18.67635],[-72.23505,18.67635],[-72.23511,18.6762],[-72.23509,18.67614],[-72.23523,18.67613],[-72.23522,18.67611],[-72.23523,18.67606],[-72.2352,18.67598],[-72.23515,18.6758],[-72.23629,18.67565],[-72.23625,18.67553],[-72.23624,18.67551],[-72.23648,18.67548],[-72.23648,18.67565],[-72.23648,18.67581],[-72.23689,18.67575],[-72.2372,18.67571],[-72.23747,18.67567],[-72.23772,18.67563],[-72.23805,18.6756],[-72.23854,18.67555],[-72.23888,18.67552],[-72.239,18.67551],[-72.23897,18.67565],[-72.23897,18.67571],[-72.23901,18.67576],[-72.239,18.67576],[-72.23902,18.67584],[-72.23905,18.67589],[-72.23929,18.67587],[-72.23981,18.67581],[-72.24059,18.67571],[-72.24142,18.67561],[-72.24177,18.67556],[-72.24179,18.67553],[-72.2421,18.67551],[-72.24272,18.67545],[-72.24276,18.67536],[-72.24278,18.67537],[-72.24279,18.67537],[-72.24299,18.67536],[-72.24334,18.67535],[-72.24339,18.67535],[-72.2434,18.67534],[-72.24372,18.67532],[-72.24424,18.67525],[-72.24443,18.67509],[-72.2474,18.67253],[-72.24731,18.67233],[-72.24681,18.67157],[-72.2469,18.67061],[-72.24652,18.67055],[-72.24661,18.66991],[-72.24669,18.66991],[-72.24688,18.66884],[-72.24707,18.66789],[-72.24709,18.66749],[-72.24728,18.66743],[-72.24716,18.66691],[-72.24717,18.66642],[-72.24703,18.66644],[-72.24701,18.66616],[-72.24971,18.66598],[-72.24947,18.66475],[-72.24989,18.66489],[-72.24989,18.66507],[-72.25113,18.66515],[-72.25102,18.66548],[-72.25111,18.66548],[-72.25111,18.66559],[-72.25219,18.66551],[-72.25387,18.66554],[-72.25387,18.66563],[-72.25551,18.66559],[-72.25638,18.66484],[-72.25719,18.66359],[-72.25763,18.66208],[-72.25768,18.65694],[-72.25779,18.64996],[-72.25713,18.64563],[-72.25696,18.64517],[-72.25564,18.64352],[-72.2493,18.64358],[-72.2482,18.64361],[-72.24637,18.64397],[-72.24629,18.64462],[-72.24454,18.64436],[-72.24442,18.64527],[-72.24311,18.6455],[-72.24326,18.64639],[-72.24286,18.64794],[-72.24272,18.64801],[-72.24282,18.6482],[-72.24257,18.64894],[-72.24109,18.64902],[-72.24109,18.64918],[-72.2405,18.64906],[-72.24036,18.6495],[-72.2403,18.64863],[-72.23753,18.64915],[-72.23664,18.64899],[-72.23666,18.64883],[-72.23582,18.64888],[-72.23488,18.64878],[-72.23487,18.64893],[-72.2338,18.649],[-72.23384,18.64932],[-72.23262,18.64927],[-72.2325,18.64824],[-72.23028,18.64837],[-72.23028,18.64821],[-72.22743,18.64815],[-72.2263,18.64775],[-72.22608,18.64845],[-72.22583,18.64841],[-72.22576,18.64828],[-72.22417,18.64849],[-72.22417,18.64805],[-72.22166,18.64804],[-72.21921,18.6485],[-72.21767,18.64995],[-72.21719,18.6509],[-72.21637,18.65422],[-72.21633,18.65888],[-72.21633,18.66198],[-72.2171,18.66448],[-72.21737,18.66441],[-72.21814,18.66454],[-72.21864,18.66568],[-72.21837,18.66588],[-72.21881,18.66817],[-72.21881,18.66893],[-72.21846,18.66888],[-72.21884,18.67018],[-72.22015,18.67173],[-72.22175,18.67311],[-72.22175,18.67288],[-72.2225,18.67317],[-72.22257,18.67357],[-72.22241,18.67368],[-72.22489,18.67588],[-72.2287,18.67693],[-72.23073,18.6768],[-72.23111,18.67678],[-72.23109,18.67676]]]},{id:"drone-imagery-2016",name:"Drone Imagery Matthew(Haiti) October 2016",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/haiti_uav_201610/{zoom}/{x}/{y}",endDate:"2016-10-01T00:00:00.000Z",startDate:"2016-10-01T00:00:00.000Z",polygon:[[[-74.11291,18.64948],[-74.10903,18.64598],[-74.10873,18.64446],[-74.1095,18.64452],[-74.1095,18.64181],[-74.10968,18.64187],[-74.11053,18.64103],[-74.10988,18.64034],[-74.11005,18.64014],[-74.11005,18.64009],[-74.11011,18.64002],[-74.10949,18.63959],[-74.1095,18.63924],[-74.10904,18.63926],[-74.10894,18.63917],[-74.10905,18.63912],[-74.10898,18.63899],[-74.10782,18.63839],[-74.10823,18.63775],[-74.10812,18.63764],[-74.10786,18.63774],[-74.10768,18.63733],[-74.10748,18.63719],[-74.10722,18.63559],[-74.10901,18.63394],[-74.11678,18.62847],[-74.11952,18.62815],[-74.12251,18.63132],[-74.12731,18.63703],[-74.12684,18.6374],[-74.12731,18.63771],[-74.12768,18.63756],[-74.13403,18.64671],[-74.13401,18.64897],[-74.13087,18.65167],[-74.13076,18.65153],[-74.13053,18.65179],[-74.13054,18.65195],[-74.12878,18.65342],[-74.1274,18.65412],[-74.12514,18.65497],[-74.11997,18.65432],[-74.11938,18.65429],[-74.11291,18.64948]],[[-74.11305,18.4922],[-74.10884,18.49216],[-74.10118,18.49095],[-74.10105,18.49057],[-74.10131,18.4902],[-74.10101,18.48996],[-74.10142,18.48933],[-74.10099,18.48931],[-74.1009,18.48886],[-74.10166,18.48725],[-74.10108,18.48713],[-74.10133,18.48664],[-74.10058,18.48654],[-74.10048,18.48552],[-74.10062,18.4849],[-74.10037,18.48478],[-74.10012,18.4827],[-74.09994,18.48123],[-74.10033,18.48114],[-74.10242,18.48116],[-74.10492,18.48149],[-74.10771,18.48189],[-74.1099,18.48226],[-74.10987,18.48243],[-74.10992,18.48246],[-74.11018,18.48232],[-74.11196,18.48261],[-74.11247,18.48278],[-74.11316,18.48382],[-74.1134,18.48521],[-74.11349,18.48709],[-74.11338,18.48704],[-74.11336,18.48717],[-74.11349,18.48727],[-74.11355,18.48931],[-74.11349,18.48949],[-74.1135,18.48951],[-74.11349,18.48952],[-74.11347,18.48951],[-74.11334,18.48957],[-74.11336,18.48962],[-74.11341,18.48958],[-74.11344,18.48959],[-74.11349,18.48956],[-74.11352,18.48957],[-74.11355,18.48956],[-74.11357,18.48998],[-74.11359,18.49067],[-74.11354,18.49108],[-74.11322,18.492],[-74.11305,18.4922]],[[-74.10198,18.24954],[-74.09767,18.24744],[-74.09419,18.2474],[-74.09338,18.24885],[-74.09638,18.25292],[-74.09934,18.25335],[-74.10198,18.24954]],[[-74.02901,18.59744],[-74.02881,18.60255],[-74.00847,18.60182],[-74.00867,18.59671],[-74.02901,18.59744]],[[-73.91991,18.07466],[-73.91468,18.07482],[-73.91535,18.07742],[-73.91478,18.08009],[-73.91997,18.08014],[-73.91924,18.07802],[-73.91999,18.07637],[-73.91991,18.07466]],[[-74.22365,18.3081],[-74.22061,18.30272],[-74.21902,18.30278],[-74.21592,18.30364],[-74.21615,18.30804],[-74.22365,18.3081]],[[-74.00508,18.17646],[-74.00072,18.17657],[-74.00186,18.18175],[-74.00269,18.18344],[-74.00653,18.18336],[-74.00715,18.18218],[-74.00649,18.18056],[-74.0052,18.17922],[-74.00508,18.17646]],[[-74.0653,18.22881],[-74.06361,18.2268],[-74.06114,18.22672],[-74.05968,18.22853],[-74.06281,18.23083],[-74.06446,18.23034],[-74.0653,18.22881]],[[-74.11371,18.47184],[-74.11002,18.47177],[-74.10959,18.47536],[-74.11341,18.47497],[-74.11371,18.47184]],[[-73.95852,18.47452],[-73.95446,18.47465],[-73.95548,18.4794],[-73.95965,18.47878],[-73.95852,18.47452]],[[-74.16719,18.27229],[-74.16196,18.27232],[-74.16175,18.27303],[-74.16255,18.27452],[-74.16372,18.27542],[-74.16341,18.27749],[-74.16404,18.27854],[-74.16756,18.27868],[-74.16742,18.27592],[-74.16775,18.27416],[-74.16719,18.27229]],[[-74.11091,18.45286],[-74.10701,18.45258],[-74.10684,18.4586],[-74.11102,18.45781],[-74.11091,18.45286]],[[-73.76854,18.18022],[-73.75773,18.18006],[-73.73559,18.19311],[-73.73567,18.20143],[-73.74563,18.20191],[-73.74468,18.22311],[-73.77121,18.22417],[-73.77129,18.20844],[-73.76915,18.2064],[-73.76854,18.18022]],[[-74.13455,18.60914],[-74.1388,18.60929],[-74.13871,18.61165],[-74.13447,18.6115],[-74.13455,18.60914]],[[-74.04228,18.20945],[-74.042,18.20484],[-74.04155,18.20239],[-74.03959,18.20051],[-74.03836,18.20028],[-74.03764,18.20242],[-74.03792,18.20562],[-74.03918,18.20932],[-74.04228,18.20945]],[[-74.08668,18.61121],[-74.08669,18.61217],[-74.09146,18.61689],[-74.09211,18.61603],[-74.09313,18.61699],[-74.09603,18.62025],[-74.09627,18.6206],[-74.0967,18.62202],[-74.09337,18.62651],[-74.09237,18.62754],[-74.08862,18.62596],[-74.08863,18.62561],[-74.08778,18.62561],[-74.08661,18.6251],[-74.08662,18.62368],[-74.08514,18.62367],[-74.08462,18.62289],[-74.08463,18.62175],[-74.08339,18.62174],[-74.08261,18.62057],[-74.08262,18.61982],[-74.07659,18.6198],[-74.07658,18.61596],[-74.07255,18.61591],[-74.07259,18.61403],[-74.07062,18.61402],[-74.06858,18.6129],[-74.06855,18.61208],[-74.06614,18.61207],[-74.06414,18.61206],[-74.0625,18.61105],[-74.06254,18.61011],[-74.05927,18.61013],[-74.0545,18.60876],[-74.05451,18.60817],[-74.05168,18.60816],[-74.04932,18.60776],[-74.04647,18.60664],[-74.04646,18.6062],[-74.04243,18.6062],[-74.04133,18.60592],[-74.03625,18.60378],[-74.03597,18.60345],[-74.03642,18.60252],[-74.03719,18.6019],[-74.04003,18.60217],[-74.05608,18.60473],[-74.05851,18.6054],[-74.05861,18.60623],[-74.0611,18.60627],[-74.06481,18.60745],[-74.06518,18.60686],[-74.06679,18.60802],[-74.0696,18.60885],[-74.07142,18.60711],[-74.07239,18.60736],[-74.07515,18.61024],[-74.07701,18.61019],[-74.07798,18.61096],[-74.07901,18.61013],[-74.08109,18.61234],[-74.08234,18.60896],[-74.08383,18.60922],[-74.08513,18.60977],[-74.08668,18.61121]],[[-74.45922,18.4663],[-74.45589,18.46471],[-74.44779,18.47],[-74.44693,18.4713],[-74.44726,18.47934],[-74.44554,18.47915],[-74.44515,18.48326],[-74.43968,18.4839],[-74.439,18.48762],[-74.44299,18.49004],[-74.44906,18.49104],[-74.45382,18.49311],[-74.45571,18.49635],[-74.45786,18.49725],[-74.46052,18.49523],[-74.46241,18.49143],[-74.46198,18.48799],[-74.45537,18.48597],[-74.45526,18.47111],[-74.45944,18.46871],[-74.45922,18.4663]],[[-74.41888,18.57551],[-74.41499,18.57331],[-74.41045,18.57648],[-74.40824,18.58233],[-74.40954,18.58894],[-74.4112,18.59195],[-74.41081,18.59689],[-74.41663,18.60063],[-74.42178,18.59671],[-74.42146,18.59416],[-74.41745,18.59419],[-74.41753,18.59067],[-74.41538,18.59002],[-74.41533,18.58382],[-74.41652,18.58382],[-74.41756,18.5814],[-74.41756,18.57967],[-74.41924,18.57754],[-74.41888,18.57551]]]},{id:"Erlangen-2011",name:"Erlangen Luftbild (2011 5,0 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbilder2011/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio10_5cm_gk4.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[10.92791,49.53196],[10.97194,49.52969],[10.97821,49.53568],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03663,49.57167],[11.04029,49.58572],[11.07287,49.58587],[11.07243,49.63486],[11.0054,49.6344],[11.00397,49.62599],[10.9748,49.62541],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],terms_text:"© Stadt Erlangen | © Aerowest GmbH"},{id:"Erlangen-2013",name:"Erlangen Luftbild (2013 6,25 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbilder2013/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio5_6.25cm.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[10.92791,49.53196],[10.9726,49.52939],[10.97909,49.53475],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03743,49.57873],[11.0568,49.592],[11.05748,49.61358],[11.04681,49.61447],[11.04788,49.6187],[11.00308,49.62367],[10.98107,49.62339],[10.98069,49.62617],[10.96737,49.62781],[10.96539,49.63415],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],terms_text:"© Stadt Erlangen | © Aerowest GmbH"},{id:"Erlangen-2016",name:"Erlangen Luftbild (2016 5,0 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbild2016/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-03-18T00:00:00.000Z",startDate:"2016-03-18T00:00:00.000Z",polygon:[[[10.97664,49.53765],[10.99101,49.53392],[10.99389,49.53835],[11.02784,49.53254],[11.0346,49.53462],[11.03407,49.53759],[11.04318,49.54321],[11.03557,49.55303],[11.0384,49.55842],[11.03508,49.56929],[11.03791,49.58659],[11.04797,49.5902],[11.04922,49.5937],[11.05749,49.59521],[11.05623,49.59905],[11.05127,49.6003],[11.05351,49.60904],[11.04309,49.61381],[11.04076,49.61823],[11.0285,49.61735],[11.01929,49.61896],[11.0152,49.61372],[11.00581,49.61448],[11.00639,49.61931],[11.00083,49.6221],[10.9856,49.61651],[10.97837,49.61753],[10.9737,49.62495],[10.96539,49.62557],[10.96063,49.62856],[10.96382,49.63176],[10.95474,49.6379],[10.94837,49.637],[10.94185,49.64377],[10.9273,49.64837],[10.92063,49.63963],[10.91136,49.63773],[10.92429,49.60505],[10.92205,49.58004],[10.91221,49.57008],[10.91441,49.5618],[10.92353,49.55842],[10.92712,49.55976],[10.93345,49.55892],[10.93071,49.54467],[10.93067,49.53225],[10.9406,49.53325],[10.95488,49.53021],[10.97199,49.53126],[10.97664,49.53765]]],terms_text:"© Stadt Erlangen | © Geocart GmbH",best:true},{id:"EsriWorldImagery",name:"Esri World Imagery",type:"tms",template:"https://{switch:services,server}.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/Esri",terms_text:"Terms & Feedback","default":true,description:"Esri world imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{id:"EsriWorldImageryClarity",name:"Esri World Imagery (Clarity) Beta",type:"tms",template:"https://clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/Esri",terms_text:"Terms & Feedback","default":true,description:"Esri archive imagery that may be clearer and more accurate than the default layer.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{id:"maaamet.ee-pohi_vr2",name:"Estonia Basemap (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=pohi_vr2&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti põhikaart"},{id:"Maaamet-Estonia_Cadastre",name:"Estonia Cadastre (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=of10000,TOPOYKSUS_6569,TOPOYKSUS_6573&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti katastrikaart ortofoto alusel"},{id:"maaamet.ee-cir_ngr",name:"Estonia Forestry (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=cir_ngr&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti metsanduslik ortofoto"},{id:"maaamet.ee-reljeef",name:"Estonia Hillshading (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=reljeef&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti reljeefikaart"},{id:"maaamet.ee-orto",name:"Estonia Ortho (Maaamet)",type:"tms",template:"https://tiles.maaamet.ee/tm/tms/1.0.0/foto@GMC/{zoom}/{x}/{-y}.png",zoomExtent:[14,18],polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti ortofoto"},{id:"estrela_de_alagoas",name:"Estrela de Alagoas",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Estrela%20de%20Alagoas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.71382,-9.43476],[-36.71477,-9.34443],[-36.80586,-9.34498],[-36.80525,-9.43542],[-36.71382,-9.43476]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Fiez-2013",name:"Fiez Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.62313,46.82339],[6.62899,46.82484],[6.62882,46.82674],[6.62531,46.83274],[6.62382,46.83317],[6.61839,46.83194],[6.62313,46.82339]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Fiez - Orthophoto technique 2013"},{id:"fiskeridir-akvakultur",name:"Fiskeridirektoratet Aquaculture overlay",type:"wms",template:"https://ogc.fiskeridir.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_262&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.fiskeridir.no/Kart",terms_text:"© Fiskeridirektoratet",description:"Aquaculture/marine farms (licensed sites, may not yet have any installations)",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg/175px-Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg.png",overlay:true},{id:"FOMI_2000",name:"FÖMI orthophoto 2000",type:"tms",template:"http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg",endDate:"2000-01-01T00:00:00.000Z",startDate:"2000-01-01T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://www.fomi.hu",terms_text:"Földmérési és Távérzékelési Intézet"},{id:"FOMI_2005",name:"FÖMI orthophoto 2005",type:"tms",template:"http://e.tile.openstreetmap.hu/ortofoto2005/{zoom}/{x}/{y}.jpg",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://www.fomi.hu",terms_text:"Földmérési és Távérzékelési Intézet"},{id:"Freemap.sk-Car",name:"Freemap.sk Car",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/A/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Cyclo",name:"Freemap.sk Cyclo",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/C/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Hiking",name:"Freemap.sk Hiking",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/T/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Ski",name:"Freemap.sk Ski",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/K/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"fta-digiroad-functional",name:"FTA Road Network",type:"wms",template:"https://extranet.liikennevirasto.fi/inspirepalvelu/beta/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dr_tielinkki_toim_lk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.liikennevirasto.fi/web/en/open-data/digiroad/",terms_text:"© Liikennevirasto",description:"Digiroad national road network from the Finnish Transport Agency, functional road classes.",icon:"https://www.liikennevirasto.fi/livi-theme/images/general/liikennevirasto_logo_2x.png",overlay:true},{id:"gaza_pleiades_20140706",name:"Gaza Strip - Pléiades - 2014/07/06",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"gaza_pleiades_20140706_nir",name:"Gaza Strip - Pléiades - 2014/07/06 (NIR)",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706_nir/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"Geobase_Hydrography",name:"Geobase Hydrography - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]],overlay:true},{id:"Geobase_Hydrography_French",name:"Geobase Hydrography - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]],overlay:true},{id:"Geobase_Roads",name:"Geobase Roads - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/roads_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=roads&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,20],polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"Geobase_Roads_French",name:"Geobase Roads - French",type:"wms",template:"https://cartes.geogratis.gc.ca/wms/roads_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=routes&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,20],polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"geoimage.at",name:"Geoimage.at MaxRes",type:"wms",template:"https://gis.bmlfuw.gv.at/wmsgw/?key=4d80de696cd562a63ce463a58a61488d&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Luftbild_MR,Luftbild_1m,Luftbild_8m,Satellitenbild_30m&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"http://geoimage.at",terms_text:"geoimage.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/GeoimageatMaxRes.png"},{id:"Geolittoral-Orthophotos2000",name:"Géolittoral - Orthophotos 2000",type:"wms",template:"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2000-01-01T00:00:00.000Z",startDate:"2000-01-01T00:00:00.000Z",polygon:[[[-1.07962,46.10959],[-0.94115,46.01474],[-0.56306,45.15178],[-0.7266,45.08425],[-0.87904,45.34094],[-0.99794,45.33779],[-0.95558,44.69982],[-1.15862,44.19865],[-1.21512,44.20558],[-1.24654,44.1162],[-1.27903,44.03937],[-1.28825,44.02304],[-1.32117,43.94094],[-1.32151,43.92296],[-1.3092,43.92337],[-1.3085,43.91439],[-1.28366,43.91514],[-1.28302,43.90624],[-1.2761,43.90655],[-1.28211,43.89254],[-1.30102,43.85159],[-1.30384,43.8424],[-1.30923,43.83498],[-1.33474,43.76946],[-1.34407,43.74875],[-1.3456,43.74214],[-1.34673,43.73688],[-1.43284,43.53152],[-1.42806,43.46812],[-1.60627,43.40591],[-1.6061,43.36012],[-1.77441,43.30357],[-1.82995,43.38484],[-1.58551,43.46856],[-1.35706,44.03374],[-1.40217,44.06461],[-1.33584,44.22832],[-1.21836,44.23033],[-1.16795,44.41097],[-1.30744,44.41847],[-1.16979,45.59107],[-1.48685,46.06042],[-1.36364,46.09146],[-1.60176,46.17019],[-1.64442,46.22375],[-1.58595,46.30426],[-1.51008,46.33888],[-1.75643,46.42214],[-2.1872,46.81857],[-2.16423,46.85534],[-2.23654,46.9337],[-2.39769,46.96718],[-2.282,47.07631],[-2.12563,47.01875],[-2.09013,47.06562],[-2.18487,47.10698],[-2.2647,47.10763],[-2.24489,47.18562],[-2.56779,47.24467],[-2.66727,47.46686],[-2.74787,47.47122],[-2.75771,47.43461],[-2.89321,47.4629],[-2.90369,47.50905],[-3.03383,47.53833],[-3.07113,47.51185],[-3.01653,47.49873],[-3.12502,47.42693],[-3.18803,47.48441],[-3.22791,47.61132],[-3.2967,47.63161],[-3.2876,47.67154],[-3.34074,47.66893],[-3.38912,47.59473],[-3.55087,47.63827],[-3.53384,47.72488],[-3.76577,47.76476],[-3.77595,47.7371],[-3.91168,47.75915],[-3.8959,47.79911],[-3.97236,47.81526],[-3.99722,47.7975],[-3.97956,47.76268],[-3.8945,47.72193],[-3.9162,47.67831],[-4.10163,47.70921],[-4.08989,47.78944],[-4.03798,47.79909],[-4.04125,47.83109],[-4.08765,47.84221],[-4.14781,47.82525],[-4.14314,47.78847],[-4.35162,47.7415],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.63576,48.07798],[-4.60147,48.11469],[-4.385,48.10962],[-4.38955,48.14543],[-4.30925,48.15009],[-4.31268,48.17694],[-4.46369,48.18468],[-4.49748,48.1453],[-4.5921,48.14758],[-4.57537,48.22488],[-4.67101,48.2331],[-4.65434,48.31049],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.81465,48.39413],[-4.83515,48.54319],[-4.63387,48.66373],[-3.96692,48.77978],[-3.94939,48.74715],[-3.6502,48.75356],[-3.65853,48.82527],[-3.53931,48.85834],[-3.54444,48.90297],[-3.40954,48.91866],[-3.40755,48.87366],[-3.02769,48.9275],[-2.67861,48.58841],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.80392,48.66126],[-1.61161,48.68582],[-1.71645,49.24781],[-1.8026,49.32721],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.17134,49.55412],[-1.27353,49.55245],[-1.1328,49.3934],[-0.93059,49.40804],[-0.74827,49.35976],[-0.38935,49.34167],[-0.24704,49.29995],[-0.12454,49.29353],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.4521,51.12144],[2.59286,51.12124],[2.60683,51.05779],[1.7976,50.89906],[1.66458,50.82379],[1.70786,50.1282],[1.05936,49.85],[0.61607,49.79062],[0.24731,49.65027],[0.1709,49.53174],[0.57065,49.49622],[0.41115,49.3396],[0.19504,49.35736],[0.01718,49.25479],[-0.24453,49.26312],[-0.38408,49.30495],[-0.74091,49.32438],[-0.9954,49.37133],[-1.05453,49.25175],[-1.27704,49.29022],[-1.25966,49.43463],[-1.39141,49.53985],[-1.27535,49.62056],[-1.29775,49.65946],[-1.4905,49.57139],[-1.77517,49.63398],[-1.74601,49.48155],[-1.51294,49.24691],[-1.48261,48.72607],[-1.30574,48.72531],[-1.28323,48.59731],[-2.76114,48.43471],[-3.00174,48.67646],[-3.21062,48.72097],[-3.95404,48.56051],[-4.15643,48.60792],[-4.44475,48.55852],[-4.63683,48.48299],[-4.6319,48.44727],[-4.25022,48.43088],[-4.06141,48.21805],[-4.1757,48.05165],[-4.31904,48.0141],[-4.26781,47.89977],[-3.88484,47.98172],[-3.76375,47.86403],[-2.32727,47.52634],[-2.36911,47.3339],[-1.74067,47.33507],[-1.77062,47.20451],[-2.03678,47.21942],[-2.0968,47.15548],[-1.88786,47.01239],[-2.08797,46.83007],[-2.01214,46.83436],[-1.84079,46.69651],[-1.87318,46.65484],[-1.68859,46.50392],[-1.62117,46.51513],[-1.42428,46.41675],[-1.01761,46.35917],[-1.07962,46.10959]],[[-2.41232,46.69242],[-2.37197,46.67611],[-2.26749,46.68033],[-2.27007,46.70705],[-2.29827,46.73286],[-2.41655,46.73711],[-2.41232,46.69242]],[[-3.06018,47.40542],[-2.82587,47.29635],[-2.78787,47.33417],[-3.02436,47.44563],[-3.06018,47.40542]],[[-3.26482,47.4295],[-3.3343,47.35928],[-3.29614,47.34133],[-3.31489,47.30057],[-3.19941,47.24492],[-3.16567,47.27751],[-3.08686,47.23612],[-3.00637,47.30855],[-3.26482,47.4295]],[[-1.93966,48.86346],[-1.93993,48.91179],[-1.701,48.91105],[-1.69726,48.86173],[-1.93966,48.86346]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho littorale 2000"},{id:"Geolittoral-Sentiers",name:"Géolittoral - Sentiers",type:"wms",template:"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n_sentier_littoral_l&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-0.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho littorale 2000"},{id:"GeolittoralV2-Orthophotos",name:"Géolittoral V2 - Orthophotos 2011-2014",type:"wms",template:"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale_v2_rvb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[-0.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho Littorale V2 - MEDDE"},{id:"lu.geoportail.opendata.ortho_10cm_proto_lidar",name:"geoportail.lu LIDAR prototype Nordstad 2017",type:"tms",template:"https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_10cm_proto_lidar/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-04-09T00:00:00.000Z",startDate:"2017-04-09T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[6.05001,49.82175],[6.04979,49.91166],[6.18901,49.91172],[6.18897,49.82181],[6.05001,49.82175]]],terms_url:"https://act.public.lu/fr/cartographie/lidar",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"Geoportal2-PL-aerial_image",name:"Geoportal 2: Orthophotomap (aerial image)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/img/guest/ORTO/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Raster&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://geoportal.gov.pl/web/guest/regulamin",terms_text:"Główny Urząd Geodezji i Kartografii",best:true,icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png"},{id:"Geoportal2-PL-prng",name:"Geoportal 2: PRNG (geo names)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/pub/guest/G2_PRNG_WMS/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=PozostaleObiektyFizjograficzne,Hydrografia,PozostaleMiejscowosci,Wies,UksztaltowanieTerenu&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"http://www.codgik.gov.pl/index.php/darmowe-dane/prng.html",terms_text:"Centralny Ośrodek Dokumentacji Geodezyjnej i Kartograficznej",icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png",overlay:true},{id:"Geoportal-PL-aerial_image",name:"Geoportal.gov.pl (Orthophotomap)",type:"tms",template:"https://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}",zoomExtent:[6,24],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_text:"Copyright © Główny Urząd Geodezji i Kartografii.",best:true,icon:"https://i.imgur.com/aFlvMpM.png"},{id:"girau_do_pnciano",name:"Girau do Ponciano",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Girau%20do%20Ponciano&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.78013,-9.92939],[-36.78087,-9.83892],[-36.87233,-9.83917],[-36.87173,-9.90542],[-36.87037,-9.92989],[-36.86156,-9.92994],[-36.85566,-9.92981],[-36.85146,-9.92973],[-36.84575,-9.92977],[-36.83213,-9.92967],[-36.81456,-9.9296],[-36.78013,-9.92939]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Gliwice-buildings",name:"Gliwice: Buildings",type:"wms",template:"http://185.60.246.14:9090/isdp/gs/ows?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=default:EGIB_budynek,default:pkt_adr&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.57376,50.34828],[18.58723,50.35464],[18.58421,50.3601],[18.59264,50.37522],[18.65228,50.38297],[18.67384,50.37675],[18.67672,50.36174],[18.69218,50.34467],[18.70805,50.33799],[18.74154,50.3391],[18.75145,50.33046],[18.74679,50.31236],[18.75512,50.30193],[18.76358,50.29989],[18.76539,50.26873],[18.744,50.26541],[18.73482,50.25377],[18.72775,50.22843],[18.71439,50.22835],[18.71426,50.21978],[18.67522,50.21969],[18.67607,50.22562],[18.65098,50.23169],[18.6288,50.22539],[18.61744,50.24044],[18.62699,50.24369],[18.6315,50.25487],[18.61406,50.2576],[18.60319,50.25206],[18.56536,50.24763],[18.54841,50.2492],[18.55857,50.2826],[18.5459,50.29947],[18.52896,50.33687],[18.55118,50.35332],[18.57376,50.34828]]],terms_text:"Urząd Miasta Gliwice"},{id:"GRAFCAN-Canary_Islands",name:"GRAFCAN - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoUrb?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OU&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress Urbana 2009"},{id:"GRAFCAN_Express-Canary_Islands",name:"GRAFCAN Express - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoExpress?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=ortoexpress&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress"},{id:"GrandNancy_Orthophotographie_2012",name:"GrandNancy - Orthophoto - 2012",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/nancy_2012/{zoom}/{x}/{y}",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[6.06066,48.60554],[6.29717,48.59923],[6.30611,48.74077],[6.06896,48.7471],[6.06066,48.60554]]],terms_url:"https://wiki.openstreetmap.org/wiki/Nancy/Orthophotographie",terms_text:"GrandNancy Orthophotographie 2012"},{id:"GURS-buildings",name:"GURS: Building outlines",type:"tms",template:"http://wms.openstreetmap.de/tms/GURS-building-outlines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2018 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"GURS-roads",name:"GURS: Road lines",type:"tms",template:"http://wms.openstreetmap.de/tms/GURS-road-lines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2018 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"hamburg-20cm",name:"Hamburg (20 cm)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DOP20?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hamburg-DK5",name:"Hamburg (DK5)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DK5?FORMAT=image/png&TRANSPARENT=false&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hampshire-Aerial-FCIR",name:"Hampshire Aerial FCIR",type:"tms",template:"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_fcir/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"Hampshire-Aerial-RGB",name:"Hampshire Aerial RGB",type:"tms",template:"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_rgb/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"hu-hillshade",name:"Hillshade Hungary",type:"tms",template:"https://{switch:a,b,c}.map.turistautak.hu/tiles/shading/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[15,45],[24,45],[24,49],[15,49],[15,45]]],terms_text:"SRTM",overlay:true},{id:"hri-orto",name:"HRI Orthophoto",type:"wms",template:"https://kartta.hsy.fi/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=taustakartat_ja_aluejaot:Ortoilmakuva_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[24.26948,59.8593],[24.26674,60.22549],[24.55307,60.36703],[24.50363,60.49038],[24.76387,60.60079],[25.00625,60.54175],[24.90051,60.38197],[24.9884,60.35073],[25.06943,60.44096],[25.17517,60.45248],[25.18066,60.34122],[25.27954,60.2943],[25.19577,60.08813],[24.26948,59.8593]]],terms_url:"https://www.hsy.fi/",terms_text:"© Helsingin kaupunkiympäristön toimiala",best:true,description:"Ortophotos from Helsinki Region Infoshare",icon:"https://github.com/osmlab/editor-layer-index/blob/gh-pages/sources/europe/fi/hri_logo.png"},{id:"IBGE_DF_Addresses",name:"IBGE Distrito Federal",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/wille/cirnnxni1000jg8nfppc8g7pm/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g",zoomExtent:[0,20],polygon:[[[-48.2444,-16.0508],[-48.2444,-15.5005],[-47.5695,-15.5005],[-47.5695,-16.0508],[-48.2444,-16.0508]]],terms_text:"IBGE",description:"Addresses data from IBGE",overlay:true},{id:"IBGE_Setores_Rurais",name:"IBGE Mapa de Setores Rurais",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw",zoomExtent:[0,14],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{id:"IBGE_Setores_Urbanos",name:"IBGE Mapa de Setores Urbanos",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw",zoomExtent:[0,19],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{id:"IBGE_BC250_Aglomerado_Rural",name:"IBGE-BC250-Aglomerado Rural Isolado",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Aglomerado_Rural_Isolado_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Pista_Pouso",name:"IBGE-BC250-Pista de Pouso",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Pista_Ponto_Pouso_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Rios_Drenagem",name:"IBGE-BC250-Rios Drenagem",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Drenagem_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Terra_Indegina",name:"IBGE-BC250-Terra Indigena",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Terra_Indigena_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Rodoviario",name:"IBGE-BC250-Trecho Rodoviario",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Rodoviario_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image/png&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Uso_Sustentavel",name:"IBGE-BC250-Unidade de Uso Sistentável - APA",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Unidade_Uso_Sustentavel_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Villa",name:"IBGE-BC250-Villa",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Vila_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BCIM_Gerador_Eletrica",name:"IBGE-BCIM-Estações Geradora de Energia Elétrica",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Est_Gerad_Energia_Eletrica_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BCIM_Municipio",name:"IBGE-BCIM-Município",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Municipio_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"ign-topografico-tms",name:"IGN topographical map (TMS)",type:"tms",template:"https://ide.ign.gob.ar/geoservicios/rest/services/Mapas_IGN/mapa_topografico/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,20],polygon:[[[-55.5438,-35.77219],[-64.31743,-49.44788],[-61.52546,-55.68296],[-66.04226,-55.24192],[-66.6896,-55.17191],[-66.86233,-55.04496],[-67.23387,-54.9245],[-67.47633,-54.92785],[-67.71808,-54.91261],[-67.96138,-54.88571],[-68.18753,-54.89288],[-68.61804,-54.92151],[-68.66375,-52.66716],[-68.51023,-52.39432],[-70.01629,-52.05707],[-72.05562,-52.01749],[-72.09055,-51.93758],[-72.02273,-51.88832],[-72.49598,-51.597],[-72.3623,-51.25935],[-72.46252,-51.08654],[-72.31217,-50.90093],[-72.39293,-50.69005],[-72.49148,-50.66866],[-72.59646,-50.73916],[-72.76983,-50.68829],[-73.22154,-50.87193],[-73.22709,-50.66897],[-73.39438,-50.58008],[-73.57703,-50.15788],[-73.53993,-50.01443],[-73.61453,-49.91795],[-73.52684,-49.7716],[-73.02779,-49.70085],[-73.02788,-49.23743],[-73.16148,-49.13062],[-72.96385,-48.89084],[-72.80952,-48.90039],[-72.59462,-48.77255],[-72.63621,-48.45823],[-72.46698,-48.45706],[-72.42158,-48.31422],[-72.3428,-48.29046],[-72.37166,-48.15995],[-72.57678,-47.96054],[-72.5731,-47.72062],[-72.3839,-47.57888],[-72.38448,-47.41759],[-72.07162,-47.2755],[-72.04726,-47.14867],[-71.93566,-47.15037],[-72.00956,-47.08473],[-72.00759,-46.78833],[-71.71488,-46.64453],[-71.7985,-46.26925],[-71.97019,-46.14972],[-71.63332,-45.97063],[-71.66595,-45.89232],[-71.77408,-45.85187],[-71.8548,-45.61169],[-71.7885,-45.50505],[-71.58354,-45.45607],[-71.58236,-45.36316],[-71.40574,-45.27206],[-71.61593,-45.03146],[-72.07949,-44.93988],[-72.11766,-44.73884],[-71.47444,-44.68048],[-71.2897,-44.75036],[-71.28469,-44.60892],[-71.20209,-44.5359],[-71.40536,-44.44891],[-71.86374,-44.44274],[-71.9047,-44.10354],[-71.70007,-43.98287],[-71.78725,-43.80985],[-71.63263,-43.65888],[-71.87866,-43.56195],[-71.95542,-43.44292],[-71.91512,-43.319],[-71.80268,-43.29535],[-71.73869,-43.19234],[-71.94149,-43.11061],[-72.18001,-42.8948],[-72.18733,-42.66619],[-72.06314,-42.53751],[-72.0441,-42.41231],[-72.14365,-42.40333],[-72.20024,-42.17229],[-72.17802,-42.13207],[-72.06032,-42.10593],[-71.78041,-42.12128],[-71.83133,-41.78089],[-71.94135,-41.60926],[-71.9023,-41.06778],[-72.02097,-40.73647],[-71.91507,-40.61832],[-71.87117,-40.38959],[-71.76665,-40.35676],[-71.87961,-40.24227],[-71.8856,-40.10093],[-71.67779,-39.92156],[-71.74365,-39.86164],[-71.77001,-39.61946],[-71.68665,-39.50983],[-71.58545,-39.55159],[-71.45202,-39.31025],[-71.47673,-38.89162],[-71.25594,-38.74909],[-70.95844,-38.70272],[-70.89411,-38.57644],[-71.03346,-38.45451],[-71.08724,-38.09054],[-71.23505,-37.86541],[-71.26668,-37.68295],[-71.18031,-37.4828],[-71.27241,-37.28686],[-71.17697,-37.1077],[-71.27586,-36.9637],[-71.20495,-36.91075],[-71.2345,-36.83303],[-71.07654,-36.43571],[-70.96469,-36.43366],[-70.90086,-36.34336],[-70.77062,-36.35412],[-70.59553,-36.12118],[-70.44219,-36.14876],[-70.42788,-35.73781],[-70.50607,-35.38014],[-70.59764,-35.34459],[-70.63128,-35.23712],[-70.42629,-35.12462],[-70.32933,-34.83081],[-70.35687,-34.72532],[-70.07752,-34.38253],[-70.06901,-34.24694],[-69.87771,-34.20233],[-69.95948,-33.77235],[-69.83371,-33.34911],[-70.02502,-33.37388],[-70.14906,-33.04145],[-70.06223,-33.01233],[-70.00981,-32.90747],[-70.19517,-32.75732],[-70.19589,-32.50891],[-70.28486,-32.45564],[-70.44343,-32.05325],[-70.41077,-31.9809],[-70.29402,-31.95849],[-70.5117,-31.85844],[-70.62295,-31.59949],[-70.59941,-31.29869],[-70.5377,-31.08557],[-70.35748,-31.0002],[-70.20264,-30.32249],[-69.97775,-30.32288],[-69.847,-30.16294],[-70.01824,-30.10003],[-69.95038,-29.73744],[-70.03755,-29.35428],[-69.97565,-29.18743],[-69.85112,-29.06923],[-69.70118,-28.37779],[-69.20484,-27.90816],[-68.84844,-27.13115],[-68.76133,-27.08588],[-68.60693,-27.09636],[-68.3489,-26.92771],[-68.64137,-26.50722],[-68.60352,-26.25391],[-68.45177,-26.1377],[-68.63052,-25.43524],[-68.55582,-25.14476],[-68.44595,-25.0658],[-68.62011,-24.81717],[-68.55162,-24.58836],[-68.28078,-24.34935],[-67.32648,-24.02538],[-66.99882,-23.00044],[-67.18775,-22.81375],[-67.08088,-22.62433],[-67.03366,-22.53815],[-66.84345,-22.39746],[-66.73734,-22.22282],[-66.38248,-22.07602],[-66.28978,-21.76554],[-66.21845,-21.72575],[-65.89675,-21.88263],[-65.71368,-22.09054],[-65.61493,-22.09152],[-65.60973,-22.09505],[-65.60607,-22.09358],[-65.60256,-22.09658],[-65.60015,-22.09543],[-65.59229,-22.09511],[-65.59015,-22.09735],[-65.58691,-22.09645],[-65.58512,-22.08432],[-65.57523,-22.07312],[-65.47487,-22.08487],[-64.99026,-22.06739],[-64.59768,-22.19269],[-64.52643,-22.29504],[-64.33114,-22.68517],[-64.10381,-22.34114],[-64.10712,-22.32023],[-64.06522,-22.23093],[-64.04702,-22.23757],[-64.03654,-22.19469],[-64.0029,-22.10735],[-63.99022,-22.07925],[-63.97147,-22.07619],[-63.94118,-21.99823],[-63.70932,-21.99896],[-63.68839,-22.01037],[-63.68079,-22.03116],[-63.68507,-22.04019],[-63.68156,-22.05185],[-63.67659,-22.03287],[-63.67201,-22.02293],[-63.66821,-22.01634],[-63.67191,-22.01399],[-63.66566,-21.99839],[-62.79606,-21.98778],[-62.74618,-22.10033],[-62.18511,-22.50843],[-61.93761,-22.97376],[-61.45605,-23.36182],[-61.05842,-23.56621],[-60.95137,-23.75997],[-60.28746,-24.01906],[-60.03728,-24.00408],[-59.46607,-24.33428],[-59.12256,-24.59772],[-58.46645,-24.84584],[-58.332,-24.98132],[-58.2349,-24.91756],[-57.8565,-25.08005],[-57.76981,-25.15013],[-57.75374,-25.17277],[-57.71597,-25.26456],[-57.71837,-25.27146],[-57.71111,-25.27265],[-57.71008,-25.28146],[-57.70692,-25.2845],[-57.70438,-25.28159],[-57.70273,-25.28239],[-57.70175,-25.28459],[-57.69741,-25.28283],[-57.69281,-25.28588],[-57.69733,-25.29337],[-57.70246,-25.29847],[-57.69612,-25.30832],[-57.69763,-25.3199],[-57.69143,-25.32127],[-57.67993,-25.33318],[-57.64822,-25.3679],[-57.63902,-25.38287],[-57.61504,-25.38841],[-57.59954,-25.39704],[-57.57673,-25.42029],[-57.56698,-25.43147],[-57.55477,-25.43999],[-57.55285,-25.44705],[-57.55811,-25.45717],[-57.55763,-25.46897],[-57.56523,-25.48014],[-57.56806,-25.49501],[-57.57722,-25.50575],[-57.57566,-25.52264],[-57.5661,-25.54112],[-57.56809,-25.55797],[-57.58142,-25.57145],[-57.59952,-25.57438],[-57.60444,-25.59855],[-57.6122,-25.61963],[-57.6367,-25.61807],[-57.66569,-25.60273],[-57.67006,-25.65579],[-57.67513,-25.66052],[-57.68626,-25.66287],[-57.69808,-25.65933],[-57.71855,-25.64914],[-57.72537,-25.71924],[-57.77786,-25.77559],[-57.84986,-26.01142],[-58.08597,-26.14202],[-58.13896,-26.66834],[-58.28224,-26.80127],[-58.32056,-26.82169],[-58.3167,-26.86081],[-58.32384,-26.87074],[-58.56858,-27.20629],[-57.90834,-27.24265],[-56.99114,-27.41858],[-56.60886,-27.36586],[-56.40607,-27.52701],[-56.32355,-27.36897],[-56.09353,-27.25219],[-55.76168,-27.38106],[-55.65541,-27.30153],[-55.67524,-27.17004],[-55.59643,-27.06538],[-55.40826,-26.91763],[-55.20788,-26.89214],[-54.97304,-26.63717],[-54.8532,-26.59894],[-54.72264,-26.31238],[-54.73235,-25.98554],[-54.65309,-25.84138],[-54.71357,-25.66721],[-54.62995,-25.55106],[-54.44288,-25.5795],[-54.11451,-25.4396],[-53.80059,-25.65093],[-53.766,-25.94301],[-53.59024,-26.19274],[-53.67264,-26.61495],[-53.61669,-26.95395],[-53.76351,-27.18917],[-54.15393,-27.36033],[-54.26461,-27.49923],[-54.79439,-27.6397],[-55.0044,-27.90341],[-55.19076,-27.92946],[-55.41589,-28.14304],[-55.66542,-28.26547],[-55.61633,-28.32205],[-55.65957,-28.46539],[-55.83413,-28.42136],[-55.87339,-28.49468],[-56.13558,-28.7265],[-56.37343,-29.10817],[-56.569,-29.13892],[-56.76306,-29.48638],[-57.05958,-29.72263],[-57.24463,-29.86452],[-57.3045,-30.03966],[-57.61942,-30.20517],[-57.60863,-30.32424],[-57.82983,-30.53118],[-57.75241,-30.68756],[-57.75273,-30.91942],[-57.93419,-31.27388],[-57.99,-31.36053],[-57.98302,-31.3734],[-57.97736,-31.38022],[-57.97778,-31.38599],[-57.98203,-31.39213],[-58.00944,-31.41341],[-58.06637,-31.47395],[-57.92613,-31.57745],[-57.98622,-31.77449],[-58.12179,-31.89772],[-58.11905,-32.14059],[-58.04227,-32.29153],[-58.14327,-32.45845],[-58.0758,-33.00587],[-58.18964,-33.09402],[-58.2723,-33.1061],[-58.31012,-33.1048],[-58.35418,-33.1221],[-58.37567,-33.17644],[-58.44465,-33.5853],[-58.43016,-33.71813],[-58.42434,-33.86887],[-58.41858,-33.91742],[-58.33697,-34.00477],[-58.241,-34.16246],[-57.84696,-34.50017],[-55.5438,-35.77219]]],terms_url:"http://www.ign.gob.ar/",terms_text:"Instituto Geográfico Nacional de la República Argentina",icon:"http://www.ign.gob.ar/sites/default/files/favicon.png"},{id:"Haiti-Drone",name:"Imagerie Drone (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}",zoomExtent:[0,21],polygon:[[[-72.15474,19.6879],[-72.15458,19.6878],[-72.15485,19.68776],[-72.15472,19.68685],[-72.15431,19.68707],[-72.15463,19.68544],[-72.15301,19.68499],[-72.15086,19.68435],[-72.15045,19.68479],[-72.15078,19.68315],[-72.15223,19.6833],[-72.15282,19.68066],[-72.15186,19.68051],[-72.15191,19.68034],[-72.15227,19.68035],[-72.15238,19.67972],[-72.15328,19.67965],[-72.15333,19.67698],[-72.15308,19.67694],[-72.15348,19.67638],[-72.14878,19.67107],[-72.13664,19.67081],[-72.13557,19.67408],[-72.13573,19.68351],[-72.13679,19.68407],[-72.13695,19.68559],[-72.13778,19.685],[-72.13782,19.68727],[-72.13888,19.68767],[-72.13881,19.69013],[-72.13853,19.68949],[-72.13806,19.68964],[-72.13869,19.69232],[-72.13825,19.69276],[-72.13948,19.69737],[-72.14101,19.7],[-72.1437,19.70112],[-72.14851,19.70015],[-72.14772,19.70268],[-72.14874,19.7029],[-72.1616,19.70357],[-72.16578,19.698],[-72.165,19.69324],[-72.16223,19.68901],[-72.15474,19.6879]],[[-72.13106,19.67189],[-72.12598,19.67728],[-72.12554,19.67762],[-72.12169,19.67764],[-72.11497,19.6726],[-72.11527,19.66872],[-72.11982,19.66275],[-72.12278,19.66257],[-72.1249,19.6627],[-72.12858,19.66454],[-72.13081,19.66617],[-72.13167,19.66879],[-72.13156,19.671],[-72.13106,19.67189]],[[-71.84579,19.67098],[-71.84294,19.67595],[-71.841,19.67595],[-71.83802,19.67553],[-71.83787,19.6745],[-71.83905,19.67439],[-71.83901,19.67411],[-71.83984,19.67395],[-71.83891,19.67361],[-71.83802,19.67209],[-71.83801,19.67263],[-71.83767,19.67272],[-71.83763,19.67254],[-71.83544,19.67321],[-71.83533,19.673],[-71.83312,19.67346],[-71.83267,19.67168],[-71.83216,19.67209],[-71.83072,19.66949],[-71.8306,19.66976],[-71.83022,19.66989],[-71.82918,19.66721],[-71.82907,19.66721],[-71.82891,19.66679],[-71.82895,19.66662],[-71.82883,19.66635],[-71.82856,19.66648],[-71.82887,19.66725],[-71.82876,19.66741],[-71.8278,19.66782],[-71.82771,19.66786],[-71.82783,19.66796],[-71.82718,19.66812],[-71.82718,19.66809],[-71.82644,19.66839],[-71.82641,19.66832],[-71.8262,19.66843],[-71.82618,19.66836],[-71.82589,19.66842],[-71.82589,19.66866],[-71.82516,19.66875],[-71.82545,19.66916],[-71.82293,19.66957],[-71.82271,19.66967],[-71.82277,19.66976],[-71.82018,19.67099],[-71.81985,19.67045],[-71.8198,19.6706],[-71.81947,19.67076],[-71.81825,19.67134],[-71.81814,19.67114],[-71.81758,19.67143],[-71.81696,19.67077],[-71.81764,19.6719],[-71.81714,19.67204],[-71.81582,19.6718],[-71.81384,19.67119],[-71.81233,19.6707],[-71.81218,19.67043],[-71.81243,19.67015],[-71.81192,19.67001],[-71.81188,19.67058],[-71.81117,19.67035],[-71.80959,19.66985],[-71.8078,19.66928],[-71.8056,19.66861],[-71.80514,19.66689],[-71.80512,19.66523],[-71.80523,19.66198],[-71.80656,19.65239],[-71.80734,19.64829],[-71.80997,19.64683],[-71.81475,19.64545],[-71.81477,19.64556],[-71.815,19.64551],[-71.81495,19.64538],[-71.81599,19.64502],[-71.81589,19.64489],[-71.81659,19.64461],[-71.81901,19.6438],[-71.82115,19.64345],[-71.82216,19.64333],[-71.8269,19.64321],[-71.82805,19.64322],[-71.83045,19.64408],[-71.83064,19.64486],[-71.82953,19.64504],[-71.82961,19.64561],[-71.82994,19.64557],[-71.83037,19.64517],[-71.83047,19.64535],[-71.83081,19.6452],[-71.83102,19.64511],[-71.83125,19.64585],[-71.83111,19.64582],[-71.83137,19.64659],[-71.83289,19.64619],[-71.83446,19.64571],[-71.83447,19.64631],[-71.83422,19.64619],[-71.8342,19.64655],[-71.83467,19.6463],[-71.83491,19.64639],[-71.8348,19.64622],[-71.83544,19.64585],[-71.8355,19.6458],[-71.83647,19.64613],[-71.83764,19.64727],[-71.83791,19.64789],[-71.83905,19.6508],[-71.84569,19.66962],[-71.84579,19.67098]],[[-72.09888,18.54843],[-72.09907,18.54838],[-72.09991,18.54809],[-72.10234,18.54813],[-72.10252,18.54814],[-72.10229,18.54826],[-72.10229,18.54828],[-72.10256,18.54815],[-72.10272,18.54814],[-72.10343,18.54871],[-72.10354,18.5489],[-72.10352,18.54974],[-72.10349,18.54974],[-72.10351,18.55003],[-72.10285,18.55018],[-72.1029,18.55025],[-72.10287,18.55031],[-72.10352,18.55024],[-72.1035,18.55152],[-72.10338,18.55152],[-72.10308,18.55161],[-72.10348,18.55162],[-72.10342,18.55435],[-72.10243,18.5555],[-72.10149,18.55562],[-72.10062,18.55559],[-72.0979,18.55521],[-72.09688,18.55466],[-72.09652,18.55421],[-72.09661,18.55417],[-72.09651,18.55417],[-72.09654,18.55398],[-72.09644,18.55355],[-72.09628,18.55357],[-72.09621,18.5532],[-72.09599,18.55337],[-72.09564,18.55267],[-72.09556,18.55185],[-72.09685,18.55035],[-72.09729,18.55032],[-72.09699,18.5502],[-72.09888,18.54843]],[[-72.25425,18.56826],[-72.25603,18.57178],[-72.25579,18.5748],[-72.2535,18.57555],[-72.25228,18.57555],[-72.24999,18.57409],[-72.24739,18.56983],[-72.24601,18.56673],[-72.24585,18.56295],[-72.24794,18.56254],[-72.25015,18.5628],[-72.25192,18.56508],[-72.25425,18.56826]],[[-72.30315,18.53327],[-72.30313,18.53318],[-72.30483,18.53111],[-72.30974,18.53111],[-72.31643,18.53243],[-72.32341,18.53661],[-72.32614,18.53878],[-72.32619,18.54264],[-72.31705,18.55406],[-72.31309,18.55406],[-72.29875,18.54533],[-72.29886,18.54073],[-72.2963,18.54047],[-72.29546,18.53952],[-72.29619,18.53386],[-72.29719,18.53322],[-72.3007,18.53328],[-72.30227,18.53423],[-72.30285,18.53352],[-72.3031,18.53334],[-72.30318,18.5334],[-72.30358,18.53356],[-72.30308,18.53465],[-72.30371,18.53399],[-72.30453,18.53441],[-72.3044,18.53451],[-72.30627,18.53526],[-72.30631,18.53527],[-72.30612,18.53576],[-72.30612,18.53582],[-72.30637,18.53589],[-72.30627,18.53549],[-72.30667,18.53509],[-72.3062,18.53497],[-72.30589,18.53494],[-72.30554,18.53468],[-72.30549,18.53461],[-72.30556,18.53451],[-72.30467,18.53423],[-72.30476,18.53388],[-72.30433,18.53375],[-72.30426,18.53363],[-72.30315,18.53327]],[[-72.29814,18.4775],[-72.29357,18.49486],[-72.29222,18.49643],[-72.29317,18.49725],[-72.28923,18.50571],[-72.28781,18.5081],[-72.28505,18.51199],[-72.28402,18.51132],[-72.28086,18.51588],[-72.27732,18.5176],[-72.27235,18.51752],[-72.26627,18.51446],[-72.26659,18.50668],[-72.26926,18.50462],[-72.2662,18.50298],[-72.26882,18.49652],[-72.26915,18.49594],[-72.27027,18.49615],[-72.27027,18.4956],[-72.26907,18.49557],[-72.26929,18.49377],[-72.2737,18.486],[-72.27467,18.48504],[-72.27518,18.4834],[-72.27654,18.48134],[-72.27735,18.4815],[-72.2783,18.48097],[-72.27785,18.4807],[-72.2771,18.48012],[-72.279,18.47758],[-72.27972,18.47729],[-72.28064,18.47764],[-72.28137,18.47716],[-72.28084,18.47698],[-72.28128,18.47584],[-72.28232,18.47518],[-72.28516,18.4751],[-72.28499,18.47637],[-72.28544,18.47698],[-72.28628,18.47563],[-72.28693,18.47547],[-72.2866,18.47519],[-72.2866,18.475],[-72.29098,18.47473],[-72.29466,18.47494],[-72.29739,18.47684],[-72.29814,18.4775]],[[-72.34667,18.52224],[-72.34683,18.52443],[-72.34753,18.52776],[-72.34555,18.52911],[-72.34031,18.52922],[-72.33833,18.52803],[-72.3369,18.53012],[-72.33381,18.52967],[-72.32893,18.52708],[-72.32865,18.52533],[-72.32921,18.52327],[-72.33041,18.52205],[-72.33216,18.52218],[-72.33225,18.5192],[-72.33692,18.51836],[-72.3382,18.51847],[-72.33815,18.51818],[-72.3412,18.51779],[-72.34549,18.5172],[-72.34926,18.51728],[-72.35043,18.51889],[-72.35035,18.52061],[-72.34968,18.52204],[-72.34667,18.52224]],[[-72.33031,18.54865],[-72.34297,18.55081],[-72.34332,18.55306],[-72.34131,18.56143],[-72.33906,18.56136],[-72.33847,18.56383],[-72.33753,18.56543],[-72.33484,18.56506],[-72.33118,18.56383],[-72.33121,18.56162],[-72.32321,18.56069],[-72.32124,18.5596],[-72.3208,18.5587],[-72.32088,18.55788],[-72.32595,18.55803],[-72.32662,18.5582],[-72.32592,18.55775],[-72.3251,18.55738],[-72.32338,18.55226],[-72.3246,18.54785],[-72.3289,18.54837],[-72.32998,18.54895],[-72.33031,18.54865]],[[-72.32314,18.52698],[-72.32234,18.52807],[-72.32096,18.52797],[-72.32078,18.52713],[-72.32085,18.52537],[-72.32146,18.52496],[-72.32257,18.52489],[-72.32285,18.52533],[-72.32324,18.52648],[-72.32314,18.52698]],[[-72.21608,18.64578],[-72.21596,18.65538],[-72.20303,18.65583],[-72.19471,18.65534],[-72.19222,18.65456],[-72.19206,18.65213],[-72.19348,18.64776],[-72.20125,18.63852],[-72.20693,18.63882],[-72.2121,18.64241],[-72.21181,18.64306],[-72.21217,18.64269],[-72.2128,18.64276],[-72.21347,18.64313],[-72.21356,18.64375],[-72.21542,18.64439],[-72.21589,18.64503],[-72.21608,18.64578]],[[-72.28677,18.6482],[-72.2901,18.65274],[-72.28981,18.65365],[-72.29007,18.65427],[-72.29072,18.65377],[-72.29103,18.65447],[-72.29125,18.65422],[-72.29168,18.65589],[-72.29122,18.65661],[-72.29227,18.65597],[-72.29269,18.65675],[-72.29307,18.65673],[-72.29413,18.65818],[-72.29602,18.66084],[-72.29597,18.66191],[-72.29329,18.66457],[-72.29067,18.666],[-72.28959,18.66613],[-72.28959,18.66657],[-72.2877,18.66647],[-72.28758,18.66766],[-72.28312,18.66972],[-72.27965,18.66965],[-72.27843,18.66908],[-72.2784,18.66877],[-72.27774,18.66917],[-72.27744,18.66914],[-72.27701,18.66832],[-72.27656,18.66811],[-72.27654,18.66806],[-72.27523,18.66852],[-72.27493,18.66746],[-72.27464,18.66743],[-72.27347,18.66821],[-72.27323,18.66827],[-72.27268,18.66716],[-72.27191,18.66743],[-72.27188,18.66734],[-72.26881,18.66819],[-72.26883,18.66718],[-72.26908,18.66682],[-72.26881,18.66679],[-72.26811,18.66707],[-72.26763,18.66738],[-72.26756,18.66669],[-72.26686,18.66695],[-72.26559,18.66736],[-72.26545,18.66701],[-72.26475,18.66741],[-72.26299,18.66819],[-72.26285,18.66818],[-72.26265,18.66761],[-72.2623,18.66771],[-72.26248,18.66792],[-72.26248,18.66823],[-72.26231,18.66826],[-72.2621,18.66797],[-72.26228,18.66892],[-72.26015,18.6689],[-72.25427,18.66879],[-72.25054,18.66835],[-72.25044,18.66954],[-72.24779,18.66989],[-72.24152,18.66979],[-72.24142,18.67419],[-72.23892,18.67398],[-72.23872,18.67346],[-72.23837,18.67331],[-72.2387,18.67395],[-72.23755,18.6739],[-72.23742,18.67351],[-72.23774,18.67334],[-72.23751,18.67326],[-72.23684,18.67349],[-72.23644,18.67241],[-72.23551,18.6726],[-72.2354,18.67242],[-72.2353,18.6729],[-72.23455,18.67269],[-72.23431,18.67246],[-72.23424,18.67347],[-72.23341,18.67346],[-72.23329,18.6733],[-72.23274,18.67329],[-72.23271,18.6735],[-72.2277,18.67253],[-72.22653,18.67165],[-72.2268,18.67157],[-72.2275,18.67159],[-72.22749,18.67145],[-72.22729,18.67146],[-72.22728,18.6713],[-72.22721,18.67136],[-72.22618,18.67137],[-72.2256,18.67088],[-72.22551,18.66945],[-72.22611,18.66969],[-72.22618,18.66959],[-72.22598,18.66955],[-72.22578,18.66914],[-72.22533,18.66946],[-72.22497,18.66947],[-72.22458,18.66788],[-72.22355,18.6677],[-72.22359,18.66759],[-72.22246,18.66763],[-72.22237,18.66702],[-72.22233,18.66709],[-72.22192,18.66703],[-72.22081,18.6669],[-72.22081,18.66653],[-72.22087,18.66636],[-72.2206,18.66681],[-72.22039,18.66664],[-72.21843,18.66505],[-72.21829,18.6641],[-72.21835,18.66084],[-72.21872,18.66065],[-72.21869,18.6606],[-72.21873,18.66045],[-72.21898,18.66032],[-72.21878,18.6602],[-72.2187,18.66024],[-72.21858,18.66004],[-72.21861,18.66],[-72.21878,18.66013],[-72.219,18.66002],[-72.21891,18.65991],[-72.21897,18.65979],[-72.21838,18.65958],[-72.21847,18.65397],[-72.2201,18.65116],[-72.2258,18.64695],[-72.2283,18.64573],[-72.23793,18.64586],[-72.23776,18.6447],[-72.24004,18.64325],[-72.2456,18.64335],[-72.24827,18.64504],[-72.24875,18.64367],[-72.25111,18.64298],[-72.25124,18.64334],[-72.25126,18.64316],[-72.25148,18.64314],[-72.25133,18.64297],[-72.25336,18.64235],[-72.25352,18.64268],[-72.25395,18.64254],[-72.25415,18.64293],[-72.25439,18.64287],[-72.25438,18.64275],[-72.25642,18.64232],[-72.25669,18.64314],[-72.25688,18.64286],[-72.25682,18.64253],[-72.25884,18.6421],[-72.25889,18.64225],[-72.25926,18.64223],[-72.25965,18.64241],[-72.25922,18.64069],[-72.25995,18.64048],[-72.26012,18.64063],[-72.26012,18.63994],[-72.26153,18.63947],[-72.26261,18.6391],[-72.26545,18.63873],[-72.27194,18.63868],[-72.2722,18.63886],[-72.27303,18.63942],[-72.27317,18.64126],[-72.27387,18.64103],[-72.27422,18.64161],[-72.27522,18.6417],[-72.27545,18.64157],[-72.27555,18.64169],[-72.27554,18.64175],[-72.27647,18.64186],[-72.27675,18.6419],[-72.2763,18.6426],[-72.27742,18.643],[-72.27798,18.64272],[-72.27858,18.64313],[-72.27857,18.64323],[-72.2789,18.64335],[-72.27985,18.64397],[-72.28587,18.64697],[-72.28677,18.6482]],[[-72.55572,18.53059],[-72.55559,18.5367],[-72.555,18.53797],[-72.5488,18.53792],[-72.54866,18.53728],[-72.54884,18.53063],[-72.54937,18.5301],[-72.55513,18.53012],[-72.55572,18.53059]],[[-72.62353,18.50799],[-72.62344,18.50952],[-72.62261,18.51043],[-72.62049,18.51185],[-72.61834,18.51075],[-72.61622,18.50832],[-72.61626,18.50647],[-72.61866,18.50444],[-72.6204,18.5045],[-72.62283,18.507],[-72.62353,18.50799]]]},{id:"osmim-imagicode-S2A_R119_N09_20160327T050917",name:"imagico.de: Adams Bridge",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R119_N09_20160327T050917&z={zoom}&x={x}&y={-y}",endDate:"2016-03-27T00:00:00.000Z",startDate:"2016-03-27T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[79.01779,8.82757],[79.01402,9.64678],[80.17642,9.65042],[80.17728,8.8313],[79.01779,8.82757]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Supplementing incomplete coverage in other sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80700162014211LGN00",name:"imagico.de: Alaska Range",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80700162014211LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-07-31T00:00:00.000Z",startDate:"2014-07-31T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-152.70873,62.30357],[-152.70839,62.58153],[-152.00835,63.54646],[-148.99432,63.5333],[-148.99432,62.30357],[-152.70873,62.30357]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent summer image of the Alaska Range for mapping natural features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-aral2",name:"imagico.de: Aral Sea (high water level)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=aral2&z={zoom}&x={x}&y={-y}",endDate:"2016-03-03T00:00:00.000Z",startDate:"2016-03-03T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[58.049,43.2623],[58.049,46.7189],[58.1014,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4675,45.3416],[60.6317,43.2623],[58.049,43.2623]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Water and wetland extents, dams etc. - some remaining winter ice in the north (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-aral1",name:"imagico.de: Aral Sea (low water level)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=aral1&z={zoom}&x={x}&y={-y}",endDate:"2016-09-09T00:00:00.000Z",startDate:"2016-09-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[58.049,43.2623],[58.049,46.7334],[58.096,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4685,45.3544],[60.6267,43.2623],[58.049,43.2623]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Water and wetland extents, dams etc. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R067_S40_20170417T140051",name:"imagico.de: Bahía Blanca (high tide)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170417T140051&z={zoom}&x={x}&y={-y}",endDate:"2017-04-17T00:00:00.000Z",startDate:"2017-04-17T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and islands at the coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R067_S40_20170127T140051",name:"imagico.de: Bahía Blanca (low tide)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170127T140051&z={zoom}&x={x}&y={-y}",endDate:"2017-01-27T00:00:00.000Z",startDate:"2017-01-27T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and islands at the coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81190582014075LGN00",name:"imagico.de: Bakun Reservoir",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81190582014075LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-03-16T00:00:00.000Z",startDate:"2014-03-16T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[114.36,2.02846],[113.53448,2.03],[113.53619,3.07077],[114.76512,3.06751],[114.76254,2.08816],[114.36,2.02846]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in older pre-2011 images (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81250592016107LGN00",name:"imagico.de: Batam",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81250592016107LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[104.00155,-0.00008],[104.00137,1.45099],[104.91015,1.45116],[104.91015,-0.00008],[104.00155,-0.00008]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing Islands in OSM (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80770232017156LGN00",name:"imagico.de: Bogoslof Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80770232017156LGN00&z={zoom}&x={x}&y={-y}",endDate:"2017-06-05T00:00:00.000Z",startDate:"2017-06-05T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-168.2544,53.8749],[-168.2544,54.0213],[-167.8591,54.0213],[-167.8591,53.8749],[-168.2544,53.8749]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image from after the eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81800982013291LGN00",name:"imagico.de: Bouvet Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81800982013291LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-10-18T00:00:00.000Z",startDate:"2013-10-18T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[3.24653,-54.47047],[3.24653,-54.37539],[3.46385,-54.37539],[3.46385,-54.47047],[3.24653,-54.47047]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",best:true,description:"For more accurate coastline and glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R017_S67_20170223T022551",name:"imagico.de: Bunger Hills",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R017_S67_20170223T022551&z={zoom}&x={x}&y={-y}",endDate:"2017-02-23T00:00:00.000Z",startDate:"2017-02-23T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[96.1197,-67.6542],[96.1201,-67.1899],[98.7331,-65.044],[105.1028,-65.044],[105.1028,-65.7224],[103.3017,-67.6542],[96.1197,-67.6542]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Largest ice free area at the East Antarctic coast - shows considerable amounts of non-permanent ice. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R065_N47_20160929T102022",name:"imagico.de: Central Alps in late September 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R065_N47_20160929T102022&z={zoom}&x={x}&y={-y}",endDate:"2016-09-29T00:00:00.000Z",startDate:"2016-09-29T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[10.55906,45.95485],[7.47396,45.95533],[7.55585,46.2708],[8.0547,47.66469],[11.75245,47.66481],[11.75245,46.81334],[11.38424,45.95509],[10.55906,45.95485]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping - beware of some fresh snow at higher altitudes (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82050982015344LGN00",name:"imagico.de: Clerke Rocks",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82050982015344LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-10T00:00:00.000Z",startDate:"2015-12-10T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-34.17701,-55.29693],[-35.19599,-55.28285],[-35.16664,-54.72097],[-34.12517,-54.73465],[-34.1401,-55.29693],[-34.17701,-55.29693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R086_N60_20160831T213532",name:"imagico.de: Cook Inlet",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R086_N60_20160831T213532&z={zoom}&x={x}&y={-y}",endDate:"2016-08-31T00:00:00.000Z",startDate:"2016-08-31T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-154.5102,59.4577],[-154.5097,60.6888],[-153.5403,62.1718],[-148.0423,62.1718],[-148.0445,61.5342],[-149.7291,59.4584],[-154.5102,59.4577]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and glaciers in surrounding mountains (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A0040712016264110KF",name:"imagico.de: Coropuna",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A0040712016264110KF&z={zoom}&x={x}&y={-y}",endDate:"2016-09-21T00:00:00.000Z",startDate:"2016-09-21T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-72.75945,-15.68684],[-72.75945,-15.4957],[-72.74434,-15.4263],[-72.41286,-15.4263],[-72.41286,-15.65296],[-72.42411,-15.68667],[-72.75945,-15.68684]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R022_N06_20151221T103009",name:"imagico.de: Cotonou",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R022_N06_20151221T103009&z={zoom}&x={x}&y={-y}",endDate:"2015-12-21T00:00:00.000Z",startDate:"2015-12-21T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[1.83975,6.2578],[1.83975,7.11427],[2.5494,7.11427],[2.5494,6.48905],[2.49781,6.25806],[1.83975,6.2578]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Patchy and partly cloudy coverage in usual sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R040_N01_20160311T164128",name:"imagico.de: Darwin and Wolf islands, Galapagos",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R040_N01_20160311T164128&z={zoom}&x={x}&y={-y}",endDate:"2016-03-11T00:00:00.000Z",startDate:"2016-03-11T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-92.05216,1.3213],[-92.05216,1.72181],[-91.74849,1.72181],[-91.74849,1.3213],[-92.05216,1.3213]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image, only old and poor images in other sources currently (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80360072014245LGN00",name:"imagico.de: Eastern Devon Island coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80360072014245LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-09-02T00:00:00.000Z",startDate:"2014-09-02T00:00:00.000Z",zoomExtent:[0,11],polygon:[[[-84.34799,74.38946],[-84.34799,75.8903],[-79.14871,75.8903],[-79.14871,74.38946],[-84.34799,74.38946]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastline mostly mapped meanwhile (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82160152013239LGN00",name:"imagico.de: Eastern Iceland",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82160152013239LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-08-27T00:00:00.000Z",startDate:"2013-08-27T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-13.04701,64.21109],[-15.16496,64.22408],[-15.16805,64.81573],[-13.04357,64.8036],[-13.04701,64.21109]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islets and inaccurate coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-AST_L1T_00302052007154424_20150518041444_91492",name:"imagico.de: El Altar",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00302052007154424_20150518041444_91492&z={zoom}&x={x}&y={-y}",endDate:"2012-02-05T00:00:00.000Z",startDate:"2012-02-05T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-78.532,-1.80509],[-78.532,-1.60811],[-78.33562,-1.60811],[-78.33562,-1.80509],[-78.532,-1.80509]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"2007 ASTER image offering better glacier coverage than common sources (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R009_S61_20160109",name:"imagico.de: Elephant Island/Clarence Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R009_S61_20160109&z={zoom}&x={x}&y={-y}",endDate:"2016-01-09T00:00:00.000Z",startDate:"2016-01-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-56.13476,-61.63472],[-56.13476,-61.19936],[-55.83264,-60.84015],[-53.72343,-60.83982],[-53.72343,-61.63472],[-56.13476,-61.63472]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Fairly clear up-to-date image for updating glacier edges (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-enderby",name:"imagico.de: Enderby Land and Kemp Coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=enderby&z={zoom}&x={x}&y={-y}",endDate:"2017-03-27T00:00:00.000Z",startDate:"2017-01-25T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[45.4547,-68.5091],[45.4547,-67.5724],[49.7155,-65.7176],[59.2693,-65.7176],[67.3735,-67.3449],[67.3735,-68.2581],[67.088,-68.5091],[45.4547,-68.5091]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 images of Enderby Land and Kemp Coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82100502015347LGN00",name:"imagico.de: Fogo, Cape Verde",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82100502015347LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-13T00:00:00.000Z",startDate:"2015-12-13T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-24.75878,14.74814],[-24.75878,15.09249],[-24.26706,15.09249],[-24.26706,14.74814],[-24.75878,14.74814]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Image from after the 2014/2015 eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-greenland",name:"imagico.de: Greenland mosaic",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=greenland&z={zoom}&x={x}&y={-y}",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-43.9774,59.7171],[-44.545,59.7302],[-44.9203,59.7672],[-45.3587,59.8218],[-45.763,59.8848],[-46.0859,59.9827],[-46.3381,60.119],[-46.577,60.2652],[-46.8114,60.4418],[-47.2635,60.5314],[-47.6937,60.5549],[-48.1457,60.6192],[-48.5771,60.7015],[-48.8689,60.8506],[-49.0578,61.0555],[-49.396,61.2957],[-49.7601,61.4934],[-50.2064,61.7324],[-50.4699,61.9539],[-50.8647,62.1596],[-51.0631,62.3869],[-51.2121,62.6001],[-51.3005,62.8389],[-51.4238,62.9979],[-51.6767,63.1944],[-51.9465,63.4079],[-52.0253,63.6377],[-52.2255,63.8378],[-52.3658,64.0705],[-52.4829,64.3792],[-52.4988,64.6788],[-52.789,64.9063],[-53.2046,65.1321],[-53.6649,65.4753],[-53.9977,65.8019],[-54.1348,66.1568],[-54.1441,66.5235],[-54.2285,66.8319],[-54.4519,67.303],[-54.5141,67.7648],[-54.604,68.2021],[-54.568,68.5698],[-54.598,68.8347],[-54.7606,69.1207],[-55.0028,69.4125],[-55.2735,69.6187],[-55.3808,69.8283],[-55.3945,70.0838],[-55.3094,70.2573],[-55.4307,70.479],[-55.5501,70.6707],[-55.7654,70.861],[-56.2489,71.2343],[-56.5018,71.5429],[-56.5867,71.9015],[-56.5189,72.2355],[-56.5085,72.5258],[-56.8923,72.8144],[-57.4027,73.1054],[-57.8066,73.4566],[-58.1461,73.7696],[-58.3554,74.0972],[-58.5125,74.3783],[-58.7336,74.6328],[-59.3551,74.8869],[-60.1412,75.102],[-61.0067,75.2763],[-61.911,75.3886],[-62.4706,75.5595],[-62.9776,75.7454],[-64.1463,75.779],[-65.4481,75.7235],[-66.7068,75.6792],[-67.8379,75.6525],[-69.0456,75.6195],[-70.055,75.5344],[-71.0898,75.4705],[-72.1119,75.4476],[-74.2311,76.4102],[-74.5601,76.5328],[-74.5601,82.6959],[-14.4462,82.6959],[-14.3994,82.5997],[-13.5339,82.4379],[-12.0312,82.3426],[-10.7796,82.3196],[-10.7796,80.1902],[-11.2123,80.069],[-11.136,79.8103],[-10.7796,79.5176],[-10.7796,79.0441],[-11.2626,78.7128],[-12.2579,78.3558],[-13.2398,78.1272],[-13.7649,77.9279],[-14.1169,77.6779],[-14.7129,77.5278],[-15.5507,77.3655],[-16.0936,77.0771],[-16.0586,76.5548],[-15.838,75.9611],[-15.6879,75.4726],[-16.253,75.058],[-17.0427,74.6425],[-18.3155,74.2702],[-19.4463,73.9378],[-19.8329,73.632],[-20.2938,73.3524],[-20.7831,73.0446],[-21.01,72.6766],[-20.8774,72.2926],[-20.7672,71.8726],[-20.7765,71.4304],[-20.9411,70.9802],[-21.219,70.6126],[-21.5326,70.3001],[-21.8039,70.0911],[-22.166,69.8947],[-22.4831,69.7539],[-22.9027,69.6585],[-23.3545,69.544],[-23.9177,69.4036],[-24.1794,69.3088],[-24.6745,69.1084],[-25.1222,68.9555],[-25.6659,68.7995],[-26.0994,68.583],[-26.6316,68.4043],[-27.7638,68.2813],[-28.4575,68.0023],[-29.353,67.8135],[-30.6456,67.4911],[-31.7673,67.0005],[-32.9783,66.2596],[-33.9313,66.0156],[-34.8956,65.7403],[-35.5914,65.5208],[-36.1483,65.372],[-36.7532,65.2559],[-37.1858,65.1349],[-37.6032,64.9727],[-38.0624,64.4901],[-38.5304,64.1244],[-39.0545,63.7213],[-39.3131,63.4405],[-39.5739,62.7506],[-39.9532,62.2739],[-40.2757,61.8547],[-40.714,61.3365],[-41.2091,60.8495],[-41.821,60.5526],[-42.4368,60.3264],[-42.8643,60.0299],[-43.1131,59.9147],[-43.3282,59.83],[-43.5459,59.7695],[-43.797,59.7284],[-43.9774,59.7171]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Landsat mosaic of Greenland (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R047_S54_20160411T044330",name:"imagico.de: Heard Island coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R047_S54_20160411T044330&z={zoom}&x={x}&y={-y}",endDate:"2016-04-12T00:00:00.000Z",startDate:"2016-04-12T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[73.06897,-53.27059],[73.06897,-52.87549],[73.67338,-52.87673],[74.08863,-52.9495],[74.08863,-53.27059],[73.06897,-53.27059]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image of Heard island with interior mostly cloud covered but mostly well visible coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82280982013259LGN00",name:"imagico.de: Isla Londonderry",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82280982013259LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-09-16T00:00:00.000Z",startDate:"2013-09-16T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-69.8568,-55.55949],[-72.26521,-55.14943],[-72.26521,-54.51089],[-72.08531,-54.17909],[-69.49116,-54.17889],[-69.4915,-55.28379],[-69.62231,-55.5591],[-69.8568,-55.55949]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"A lot of very coarse coastlines could be improved here, much snow cover though so no use for glacier mapping (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_kangerlussuaq_20151008",name:"imagico.de: Kangerlussuaq Autumn",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20151008&z={zoom}&x={x}&y={-y}",endDate:"2015-10-08T00:00:00.000Z",startDate:"2015-10-08T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[-50.6992,66.9888],[-50.721,67.0017],[-50.7341,67.0125],[-50.7396,67.0193],[-50.7396,67.0212],[-50.7158,67.0265],[-50.7017,67.0265],[-50.6829,67.0176],[-50.6686,67.0077],[-50.6638,66.998],[-50.6642,66.9946],[-50.6891,66.9888],[-50.6992,66.9888]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the airport and settlement - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_kangerlussuaq_20160518",name:"imagico.de: Kangerlussuaq Spring",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20160518&z={zoom}&x={x}&y={-y}",endDate:"2016-05-18T00:00:00.000Z",startDate:"2016-05-18T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[-50.7519,66.9996],[-50.7555,67.0023],[-50.7555,67.0033],[-50.6395,67.0297],[-50.6162,67.0339],[-50.6097,67.0281],[-50.6331,67.022],[-50.7323,66.9996],[-50.7519,66.9996]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the airport and roads - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20160807T083013",name:"imagico.de: Kerch Strait",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20160807T083013&z={zoom}&x={x}&y={-y}",endDate:"2016-08-07T00:00:00.000Z",startDate:"2016-08-07T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[35.93259,44.96237],[35.93259,45.55926],[37.36991,45.55926],[37.36991,44.96237],[35.93259,44.96237]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"State of bridge construction in August 2016 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20180429T082601",name:"imagico.de: Kerch Strait 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20180429T082601&z={zoom}&x={x}&y={-y}",endDate:"2018-04-29T00:00:00.000Z",startDate:"2018-04-29T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[35.8787,45.0348],[35.8787,45.6095],[36.9208,45.6095],[36.9208,45.0348],[35.8787,45.0348]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Bridge and surrounding after completion in April 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ls_polar2",name:"imagico.de: Landsat off-nadir July 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ls_polar2&z={zoom}&x={x}&y={-y}",endDate:"2016-07-17T00:00:00.000Z",startDate:"2016-07-17T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-79.05175,81.91484],[-79.05175,83.43339],[-73.6039,83.80225],[-26.42449,83.80225],[-21.493,83.50352],[-16.88835,83.15095],[-16.88835,81.91484],[-79.05175,81.91484]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Latest images north of the regular Landsat limit (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-larsen_2018",name:"imagico.de: Larsen C ice shelf after calving",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=larsen_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-01-06T00:00:00.000Z",startDate:"2018-01-06T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-62.7282,-68.9652],[-64.0489,-68.7318],[-64.0486,-68.5373],[-60.8845,-65.9399],[-59.9187,-65.9389],[-59.1088,-66.0775],[-59.1088,-68.8359],[-59.2544,-68.9652],[-62.7282,-68.9652]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"For updating the ice edge after the 2017 iceberg calving (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-AST_L1T_00311162013112731_20150618142416_109190",name:"imagico.de: Leskov Island ASTER",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00311162013112731_20150618142416_109190&z={zoom}&x={x}&y={-y}",endDate:"2013-11-16T00:00:00.000Z",startDate:"2013-11-16T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-28.21075,-56.72108],[-28.21075,-56.62498],[-27.96956,-56.62498],[-27.96956,-56.72108],[-28.21075,-56.72108]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81991002015286LGN00",name:"imagico.de: Leskov Island Landsat",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81991002015286LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-10-13T00:00:00.000Z",startDate:"2015-10-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-27.99293,-56.73479],[-28.22776,-56.73262],[-28.22416,-56.60075],[-27.96975,-56.60283],[-27.97319,-56.73479],[-27.99293,-56.73479]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2B_R005_S69_20180222T061749",name:"imagico.de: Lützow-Holm Bay",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2B_R005_S69_20180222T061749&z={zoom}&x={x}&y={-y}",endDate:"2018-02-22T00:00:00.000Z",startDate:"2018-02-22T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[35.124,-70.3693],[35.1241,-69.2795],[36.3864,-68.4765],[42.2208,-68.4762],[42.2208,-70.3651],[35.124,-70.3693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image or an area poorly mapped in OSM at the moment - lots of sea ice, be careful with distinguishing sea ice from ice shelves and floating glacier tongues. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ls_polar",name:"imagico.de: May 2013 off-nadir Landsat",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ls_polar&z={zoom}&x={x}&y={-y}",endDate:"2013-05-17T00:00:00.000Z",startDate:"2013-05-17T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-85.76109,81.39333],[-89.83016,82.14952],[-89.83153,82.24405],[-84.99342,82.73099],[-79.95207,83.13108],[-74.55641,83.46267],[-69.35851,83.70451],[-28.20784,83.70451],[-23.06624,83.46532],[-17.96584,83.15518],[-17.96721,82.72386],[-22.78197,81.4419],[-85.76109,81.39333]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"First available image north of the regular Landsat limit, mostly with seasonal snow cover so difficult to interpret (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R042_S78_20170214T202521",name:"imagico.de: McMurdo Sound and Dry Valleys",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R042_S78_20170214T202521&z={zoom}&x={x}&y={-y}",endDate:"2017-02-14T00:00:00.000Z",startDate:"2017-02-14T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[162.9125,-78.4514],[162.6595,-78.4257],[159.2712,-77.6013],[159.2712,-77.4108],[164.157,-76.477],[169.7813,-76.4764],[169.7813,-78.4514],[162.9125,-78.4514]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image - not ice minimum, be careful with distinguishing sea ice from ice shelves. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R092_S02_20160613T075613",name:"imagico.de: Mount Kenya 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S02_20160613T075613&z={zoom}&x={x}&y={-y}",endDate:"2016-06-13T00:00:00.000Z",startDate:"2016-06-13T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[37.20666,-0.26685],[37.20666,-0.01193],[37.56552,-0.01193],[37.56552,-0.26685],[37.20666,-0.26685]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R092_S05_20160802T075556",name:"imagico.de: Mount Kilimanjaro 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S05_20160802T075556&z={zoom}&x={x}&y={-y}",endDate:"2016-08-02T00:00:00.000Z",startDate:"2016-08-02T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[37.24769,-3.22921],[37.24769,-2.96816],[37.61581,-2.96816],[37.61581,-3.22921],[37.24769,-3.22921]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80940622015159LGN00",name:"imagico.de: New Ireland",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80940622015159LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-06-08T00:00:00.000Z",startDate:"2015-06-08T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[150.38853,-2.80053],[150.38853,-2.3834],[150.83348,-2.3834],[150.83348,-2.80053],[150.38853,-2.80053]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Many missing islands in OSM (mostly mapped meanwhile) (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2016",name:"imagico.de: North Sea Coast 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2016&z={zoom}&x={x}&y={-y}",endDate:"2016-09-25T00:00:00.000Z",startDate:"2016-09-25T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.1562,52.8755],[5.1615,53.0325],[6.4155,55.7379],[9.8813,55.7459],[9.8813,53.2428],[9.6846,52.8877],[5.1562,52.8755]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2017",name:"imagico.de: North Sea Coast 2017",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2017&z={zoom}&x={x}&y={-y}",endDate:"2017-06-02T00:00:00.000Z",startDate:"2017-06-02T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.1713,53.0918],[6.477,55.8973],[9.8813,55.8973],[9.8813,53.2761],[9.7789,53.0918],[5.1713,53.0918]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2018",name:"imagico.de: North Sea Coast spring 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-08T00:00:00.000Z",startDate:"2018-05-08T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.3179,53.0918],[5.322,53.4418],[6.7023,56.3572],[9.8813,56.3578],[9.8813,53.2819],[9.7758,53.0921],[5.3179,53.0918]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-caspian_2018",name:"imagico.de: Northeast Caspian Sea 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=caspian_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-16T00:00:00.000Z",startDate:"2018-05-16T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[51.0243,45.0729],[51.0243,46.569],[52.4259,46.5687],[53.6471,46.3177],[53.6474,45.0729],[51.0243,45.0729]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastal contruction and Kashagan oil field in Kazakhstan in May 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ural_s2_2016",name:"imagico.de: Northern and Polar Ural mountains August 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ural_s2_2016&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[59.19898,64.89205],[59.19898,66.91656],[60.73329,68.44289],[67.73295,68.44327],[67.73295,67.74883],[64.21647,64.91957],[59.19898,64.89205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late summer imagery with few clouds - caution: not all visible snow is glaciers (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ndvina",name:"imagico.de: Northern Dvina delta at low tide",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ndvina&z={zoom}&x={x}&y={-y}",endDate:"2015-09-13T00:00:00.000Z",startDate:"2015-09-13T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[37.7291,64.1971],[37.7291,65.1161],[37.8592,65.2705],[41.3223,65.2705],[41.3223,64.3142],[41.2114,64.1973],[37.7291,64.1971]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Beaches, tidal flats and other costal forms (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-nellesmere_ast",name:"imagico.de: Northern Ellesmere Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast&z={zoom}&x={x}&y={-y}",endDate:"2012-07-09T00:00:00.000Z",startDate:"2012-07-09T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-81.62923,82.4597],[-83.03136,82.47986],[-83.03136,83.05876],[-72.80309,83.09567],[-65.65786,83.03232],[-65.81167,82.4597],[-81.62923,82.4597]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from July 2012 ASTER imagery (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-nellesmere_ast_2016",name:"imagico.de: Northern Ellesmere Island July 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast_2016&z={zoom}&x={x}&y={-y}",endDate:"2012-07-15T00:00:00.000Z",startDate:"2012-07-08T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-78.89729,82.17577],[-82.64501,82.19426],[-82.64501,83.08067],[-66.58986,83.08497],[-63.78011,82.98908],[-63.78011,82.72198],[-65.0092,82.17577],[-78.89729,82.17577]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from July 2016 ASTER imagery (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81960222015233LGN00vis",name:"imagico.de: Northern German west coast tidalflats",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00vis&z={zoom}&x={x}&y={-y}",endDate:"2015-08-21T00:00:00.000Z",startDate:"2015-08-21T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.6677],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81960222015233LGN00ir",name:"imagico.de: Northern German west coast tidalflats (infrared)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00ir&z={zoom}&x={x}&y={-y}",endDate:"2015-08-21T00:00:00.000Z",startDate:"2015-08-21T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.66811],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ngreenland_ast",name:"imagico.de: Northern Greenland ASTER",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ngreenland_ast&z={zoom}&x={x}&y={-y}",endDate:"2012-08-13T00:00:00.000Z",startDate:"2005-06-21T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-52.49222,82.48972],[-52.49222,82.94295],[-49.28696,83.47312],[-44.5285,83.73214],[-29.5253,83.73214],[-25.26398,83.58271],[-21.18393,83.39776],[-21.18393,82.74312],[-23.40454,82.48972],[-52.49222,82.48972]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from mostly 2012 ASTER imagery, some 2005 images mainly in the northeast (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A1350972013086110KF",name:"imagico.de: Northwest Heard Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A1350972013086110KF&z={zoom}&x={x}&y={-y}",endDate:"2013-03-13T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[73.2279,-53.20333],[73.2279,-53.01073],[73.25949,-52.94944],[73.78992,-52.94944],[73.78992,-53.06048],[73.71783,-53.20333],[73.2279,-53.20333]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Glaciers of Northwest Heard Island (mapped meanwhile) (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R111_N09_20160604T154554",name:"imagico.de: Panama Canal",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R111_N09_20160604T154554&z={zoom}&x={x}&y={-y}",endDate:"2016-06-07T00:00:00.000Z",startDate:"2016-06-07T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-80.01654,8.84898],[-80.01654,9.41481],[-79.46859,9.41481],[-79.46859,8.84898],[-80.01654,8.84898]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Images of the new locks (but partly cloudy) (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A0120532016364110KF",name:"imagico.de: Panama Canal - Pacific side",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A0120532016364110KF&z={zoom}&x={x}&y={-y}",endDate:"2016-12-30T00:00:00.000Z",startDate:"2016-12-30T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-79.62539,8.77083],[-79.68684,8.82197],[-79.68667,8.93705],[-79.65363,9.09294],[-79.26816,9.09294],[-79.32833,8.77083],[-79.62539,8.77083]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"New locks with less clouds than in the Sentinel-2 image - make sure to check image alignment (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R078_N68_20160930T081002",name:"imagico.de: Pechora Sea Coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N68_20160930T081002&z={zoom}&x={x}&y={-y}",endDate:"2016-09-30T00:00:00.000Z",startDate:"2016-09-30T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[53.1802,67.5344],[53.1821,68.414],[54.2107,69.3367],[55.3584,70.2786],[59.004,70.2786],[60.6947,69.977],[61.9837,69.7161],[61.9823,68.9395],[59.9153,67.5344],[53.1802,67.5344]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 image of the Pechora Sea coast in autumn 2016 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81511242016033LGN00",name:"imagico.de: Pensacola Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81511242016033LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-02-02T00:00:00.000Z",startDate:"2016-02-02T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-53.20922,-84.12525],[-60.61538,-83.78609],[-60.61538,-82.29969],[-48.72405,-82.29987],[-44.52178,-82.43683],[-44.51354,-84.12525],[-53.20922,-84.12525]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R136_N41_20150831T093006",name:"imagico.de: Prokletije Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R136_N41_20150831T093006&z={zoom}&x={x}&y={-y}",endDate:"2015-08-31T00:00:00.000Z",startDate:"2015-08-31T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[19.11233,42.15316],[19.08426,43.08074],[20.63299,43.09603],[20.63788,42.16779],[19.11233,42.15316]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Late summer imagery where usual sources are severely limited by clouds and snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-DMS_1142622_03746_20110415_17533956",name:"imagico.de: Qasigiannguit",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142622_03746_20110415_17533956&z={zoom}&x={x}&y={-y}",endDate:"2011-04-15T00:00:00.000Z",startDate:"2011-04-15T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[-51.23857,68.79972],[-51.24334,68.85303],[-51.15167,68.85303],[-51.14038,68.80116],[-51.23857,68.79972]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the settlement - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81510432015030LGN00",name:"imagico.de: Rann of Kutch",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81510432015030LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[67.9684,22.36265],[67.86231,22.38392],[67.86231,24.88693],[71.48986,24.88693],[71.48986,22.36265],[67.9684,22.36265]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Land/water distinction difficult to properly map based on Bing/Mapbox images (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R093_N41_20150828T092005",name:"imagico.de: Rila and Pirin Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R093_N41_20150828T092005&z={zoom}&x={x}&y={-y}",endDate:"2015-08-28T00:00:00.000Z",startDate:"2015-08-28T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[23.80811,41.58488],[22.99238,41.60195],[23.01186,42.29984],[23.99402,42.28339],[23.96561,41.58488],[23.80811,41.58488]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Late summer imagery where usual sources are severely limited by clouds and snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81730602015040LGN00",name:"imagico.de: Rwenzori Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81730602015040LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-02-09T00:00:00.000Z",startDate:"2015-02-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[29.7663,0.20689],[29.7663,0.50918],[30.0346,0.50918],[30.0346,0.20689],[29.7663,0.20689]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image of most of the remaining Rwenzori Mountains glaciers (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R078_N01_20160702T082522",name:"imagico.de: Rwenzori Mountains 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N01_20160702T082522&z={zoom}&x={x}&y={-y}",endDate:"2016-07-02T00:00:00.000Z",startDate:"2016-07-02T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[29.80514,0.23586],[29.80514,0.46709],[30.02503,0.46709],[30.02503,0.23586],[29.80514,0.23586]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80611072014036LGN00",name:"imagico.de: Scott Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80611072014036LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-02-05T00:00:00.000Z",startDate:"2014-02-05T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-180,-67.42635],[-180,-67.32544],[-179.82473,-67.32538],[-179.82473,-67.42635],[-180,-67.42635]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82100972015347LGN00",name:"imagico.de: Shag Rocks",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82100972015347LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-13T00:00:00.000Z",startDate:"2015-12-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-42.12875,-53.7205],[-42.14626,-53.45782],[-41.67573,-53.44586],[-41.65582,-53.70872],[-42.12875,-53.7205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81130622013270LGN00",name:"imagico.de: Southeastern Sulawesi",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81130622013270LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-09-27T00:00:00.000Z",startDate:"2013-09-27T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[120.84382,-3.59545],[120.84382,-3.15985],[120.98184,-2.51468],[122.62618,-2.51468],[122.62618,-3.00215],[122.5007,-3.59545],[120.84382,-3.59545]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islands and coarse coastline due to cloud cover in Bing, lakes could also use additional detail (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80281222016035LGN00",name:"imagico.de: Southern Transantarctic Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80281222016035LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-02-04T00:00:00.000Z",startDate:"2016-02-04T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[156.96951,-84.50098],[154.50858,-84.46255],[154.50858,-82.60681],[175.46774,-82.58505],[177.00583,-83.52807],[177.00583,-84.19262],[171.93839,-84.34633],[166.83798,-84.4437],[161.67029,-84.50045],[156.96951,-84.50098]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81030632015286LGN00",name:"imagico.de: Sudirman Range 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81030632015286LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-10-13T00:00:00.000Z",startDate:"2015-10-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[136.4226,-4.2853],[136.4226,-3.6447],[137.7971,-3.6447],[137.7971,-4.2853],[136.4226,-4.2853]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Older image of the Sudirman Range with no fresh snow showing glacier extent (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R088_S05_20160812T011732",name:"imagico.de: Sudirman Range 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R088_S05_20160812T011732&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[136.8044,-4.2585],[136.8044,-3.7836],[137.7701,-3.7836],[137.7701,-4.2585],[136.8044,-4.2585]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Cloud free image of the Sudirman Range but with fresh snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-s2sval",name:"imagico.de: Svalbard mosaic",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=s2sval&z={zoom}&x={x}&y={-y}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[16.6108,76.4137],[16.4731,76.4268],[16.3788,76.4589],[14.4124,77.1324],[14.0784,77.2536],[10.9875,78.4054],[10.631,78.5605],[10.2314,78.8392],[10.3952,79.6074],[10.516,79.7731],[10.9632,79.8707],[20.2294,80.849],[20.4702,80.8493],[25.1752,80.6817],[33.4391,80.3438],[33.7809,80.3016],[34.0395,80.239],[33.977,80.1527],[25.5722,76.5917],[25.2739,76.481],[25.1416,76.4327],[24.937,76.4176],[16.6108,76.4137]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 mosaic of Svalbard (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-DMS_1142636_160xx_20110507_1822xxxx",name:"imagico.de: Thule Air Base",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142636_160xx_20110507_1822xxxx&z={zoom}&x={x}&y={-y}",endDate:"2011-05-07T00:00:00.000Z",startDate:"2011-05-07T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[-68.93977,76.51133],[-68.93977,76.5499],[-68.76635,76.55176],[-68.50993,76.55176],[-68.50744,76.51612],[-68.67897,76.51194],[-68.93977,76.51133]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule2_2015.09.25",name:"imagico.de: Thule Airbase DMS low altitude overflight September 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule2_2015.09.25&z={zoom}&x={x}&y={-y}",endDate:"2015-09-25T00:00:00.000Z",startDate:"2015-09-25T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[-68.74292,76.52636],[-68.74446,76.5284],[-68.74807,76.54939],[-68.74615,76.56017],[-68.72276,76.56022],[-68.72017,76.55775],[-68.71853,76.52921],[-68.71978,76.52637],[-68.74292,76.52636]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule_2015.10.06",name:"imagico.de: Thule Airbase DMS overflight October 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.10.06&z={zoom}&x={x}&y={-y}",endDate:"2015-10-06T00:00:00.000Z",startDate:"2015-10-06T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[-68.81924,76.5251],[-68.82651,76.54177],[-68.77345,76.5439],[-68.7021,76.54545],[-68.59177,76.5456],[-68.59183,76.52793],[-68.6597,76.5251],[-68.81924,76.5251]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule_2015.09.25",name:"imagico.de: Thule Airbase DMS overflight September 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.09.25&z={zoom}&x={x}&y={-y}",endDate:"2015-09-25T00:00:00.000Z",startDate:"2015-09-25T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[-68.77771,76.50688],[-68.77662,76.57064],[-68.68115,76.57065],[-68.6763,76.55384],[-68.6762,76.53074],[-68.68523,76.50688],[-68.77771,76.50688]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R094_N79_20160812T105622",name:"imagico.de: Ushakov Island August 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R094_N79_20160812T105622&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[78.45886,80.72643],[78.45886,80.9099],[80.48892,80.9099],[80.48892,80.72643],[78.45886,80.72643]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late summer imagery with few clouds (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80910682014358LGN00",name:"imagico.de: Vanatinai",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80910682014358LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-12-24T00:00:00.000Z",startDate:"2014-12-24T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[153.06138,-11.78923],[153.06138,-11.28869],[153.10927,-11.07229],[154.41201,-11.07229],[154.41201,-11.78923],[153.06138,-11.78923]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coarse coastline due to cloud cover in Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82330892016031LGN00",name:"imagico.de: Volcán Calbuco",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82330892016031LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-01-31T00:00:00.000Z",startDate:"2016-01-31T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-72.86696,-41.51741],[-72.86696,-41.04527],[-72.23181,-41.04527],[-71.8751,-41.10829],[-72.00007,-41.51741],[-72.86696,-41.51741]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Image from after the 2015 eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R089_N52_20160623T024048",name:"imagico.de: Vostochny Cosmodrome",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R089_N52_20160623T024048&z={zoom}&x={x}&y={-y}",endDate:"2016-06-23T00:00:00.000Z",startDate:"2016-06-23T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[126.36143,51.37553],[126.34804,52.33932],[128.60762,52.3409],[128.61174,51.37553],[126.36143,51.37553]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image showing newest features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-walps_autumn_2017",name:"imagico.de: Western Alps autumn colors 2017",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=walps_autumn_2017&z={zoom}&x={x}&y={-y}",endDate:"2017-10-17T00:00:00.000Z",startDate:"2017-10-17T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[4.6412,43.2493],[4.3118,43.2653],[4.3118,44.2167],[5.2562,46.965],[5.9151,48.7177],[7.3866,48.7467],[10.088,48.7467],[10.088,48.7032],[7.7819,43.2813],[7.76,43.2653],[7.3646,43.2493],[4.6412,43.2493]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Autumn colors in the Alps, Jura and southwestern Germany  (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81490352013282LGN00",name:"imagico.de: Western Karakoram",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81490352013282LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-10-09T00:00:00.000Z",startDate:"2013-10-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[75.98364,34.97851],[73.96164,35.36957],[74.44281,37.09391],[76.50601,36.70267],[75.98364,34.97851]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Represents approximately minimum snow cover so can be well used for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R039_S15_20160510T145731",name:"imagico.de: Willkanuta Mountains and Quelccaya Ice Cap",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R039_S15_20160510T145731&z={zoom}&x={x}&y={-y}",endDate:"2016-05-10T00:00:00.000Z",startDate:"2016-05-10T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-71.18071,-14.49785],[-71.17976,-13.71029],[-70.55637,-13.71263],[-70.55637,-14.49785],[-71.18071,-14.49785]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Poor and outdated imagery in other sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"IPR-orotofoto-last-tms",name:"IPR ortofoto LAST (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"IPR-orotofoto-vege-tms",name:"IPR ortofoto Low-Vegetation (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"GSGS3906",name:"Ireland British War Office 1:25k GSGS 3906",type:"tms",template:"https://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[-9.31139,51.43828],[-7.36131,51.99302],[-7.33934,52.13149],[-6.9658,52.06231],[-6.23796,52.1534],[-6.21049,52.52928],[-5.98253,52.80079],[-5.96056,53.67037],[-6.20775,53.67851],[-6.22423,53.95255],[-5.86442,54.12513],[-5.85893,54.20392],[-5.53483,54.23122],[-5.39476,54.44739],[-5.50188,54.70052],[-6.21873,55.38194],[-6.86418,55.2162],[-7.25145,55.46455],[-7.53435,55.30853],[-8.25395,55.26787],[-8.61101,54.97259],[-8.49016,54.89369],[-8.83897,54.68306],[-8.42699,54.52397],[-8.75108,54.31302],[-9.29765,54.38985],[-10.05296,54.37866],[-10.30015,54.05747],[-10.02275,53.79386],[-10.30565,53.55142],[-9.99803,53.24354],[-9.09166,53.19256],[-9.81676,53.1102],[-9.48167,52.96984],[-9.70415,52.68107],[-10.00627,52.63608],[-9.78929,52.52426],[-9.99803,52.32663],[-10.64348,52.1753],[-10.39629,51.9761],[-10.16832,51.64668],[-10.28642,51.57334],[-9.88542,51.57163],[-9.79204,51.44684],[-9.31139,51.43828]]],terms_url:"https://wiki.openstreetmap.org/wiki/Ireland/Background_Imagery#Trinity_College_Dublin",terms_text:"Glucksman Map Library, Trinity College Dublin",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ie/IrelandBritishWarOffice-GSGS3906.png"},{id:"Israel_Hiking",name:"Israel Hiking",type:"tms",template:"https://israelhiking.osm.org.il/Tiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel Hiking map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"Israel_MTB",name:"Israel MTB",type:"tms",template:"https://israelhiking.osm.org.il/MTBTiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel MTB map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"ITACyL-Castile-and-Leon",name:"ITACyL - Castile and León",type:"wms",template:"http://orto.wms.itacyl.es/WMS?REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&LAYERS=Ortofoto_CyL&SRS={proj}&FORMAT=image/jpeg&STYLES=Default&TRANSPARENT=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-1.9358,41.43834],[-1.89601,41.43869],[-1.89536,41.39687],[-1.9767,41.39616],[-1.97639,41.37623],[-2.06201,41.37548],[-2.06262,41.41471],[-2.10458,41.41434],[-2.10363,41.35367],[-2.14448,41.35331],[-2.1419,41.18683],[-2.06204,41.18753],[-2.06171,41.16624],[-2.02046,41.16661],[-2.01887,41.06334],[-2.10083,41.06262],[-2.10114,41.08296],[-2.22733,41.08185],[-2.22704,41.0635],[-2.26912,41.06313],[-2.2688,41.04257],[-2.35325,41.04182],[-2.35356,41.06148],[-2.39487,41.06112],[-2.39457,41.04206],[-2.43722,41.04168],[-2.43756,41.06315],[-2.47928,41.06278],[-2.47991,41.10369],[-2.52078,41.10333],[-2.5211,41.12429],[-2.60415,41.12357],[-2.60481,41.16628],[-2.6471,41.16591],[-2.64808,41.22931],[-2.72874,41.2286],[-2.72907,41.24974],[-2.89552,41.24828],[-2.89649,41.31063],[-2.9363,41.31028],[-2.93571,41.27231],[-3.14692,41.27046],[-3.14723,41.29045],[-3.22828,41.28974],[-3.22767,41.25008],[-3.39581,41.2486],[-3.39518,41.20808],[-3.43492,41.20773],[-3.43429,41.16696],[-3.47877,41.16657],[-3.47844,41.14556],[-3.60336,41.14446],[-3.6027,41.10169],[-3.64539,41.10131],[-3.64508,41.08159],[-3.68735,41.08122],[-3.68673,41.04104],[-3.72866,41.04067],[-3.72803,40.9998],[-3.76896,40.99944],[-3.76864,40.97886],[-3.85473,40.97811],[-3.8544,40.95653],[-3.89857,40.95615],[-3.89764,40.89575],[-3.93906,40.89539],[-3.93716,40.77204],[-4.06198,40.77093],[-4.06133,40.72926],[-4.10372,40.72888],[-4.10311,40.68918],[-4.14628,40.6888],[-4.14498,40.60421],[-4.19025,40.60381],[-4.18994,40.58362],[-4.22946,40.58327],[-4.22979,40.60487],[-4.27054,40.60451],[-4.26958,40.54211],[-4.31384,40.54171],[-4.31163,40.39758],[-4.39376,40.39685],[-4.39345,40.37677],[-4.43723,40.37638],[-4.43623,40.31123],[-4.52192,40.31046],[-4.52037,40.20897],[-4.56131,40.2086],[-4.56099,40.18763],[-4.68895,40.18649],[-4.68933,40.21101],[-4.73192,40.21063],[-4.73252,40.24966],[-4.76838,40.24934],[-4.76809,40.23035],[-4.81104,40.22996],[-4.81147,40.20726],[-4.8542,40.18414],[-4.85264,40.12563],[-4.93699,40.12488],[-4.93638,40.08529],[-5.35538,40.08155],[-5.35606,40.12562],[-5.44027,40.12487],[-5.44091,40.16673],[-5.60382,40.16527],[-5.60448,40.20881],[-5.68646,40.20808],[-5.68712,40.25131],[-6.02166,40.24834],[-6.02295,40.33257],[-6.10433,40.33184],[-6.1056,40.41451],[-6.18951,40.41376],[-6.19018,40.45745],[-6.26971,40.45675],[-6.26909,40.41653],[-6.35192,40.41579],[-6.35128,40.37422],[-6.43325,40.37349],[-6.43264,40.33361],[-6.52245,40.33281],[-6.52116,40.24849],[-6.59942,40.24779],[-6.59886,40.21128],[-6.85568,40.20899],[-6.85634,40.25257],[-6.93622,40.25186],[-6.93751,40.33657],[-6.85111,40.33734],[-6.86001,40.91672],[-6.93544,40.91605],[-6.93741,41.0435],[-6.85482,41.04423],[-6.85548,41.08706],[-6.77015,41.08781],[-6.77245,41.23623],[-6.68379,41.23701],[-6.60436,41.2377],[-6.60524,41.29474],[-6.5193,41.29549],[-6.51991,41.33479],[-6.43673,41.33552],[-6.43801,41.41814],[-6.35318,41.41888],[-6.35447,41.50141],[-6.26889,41.50216],[-6.2708,41.6245],[-6.35661,41.62375],[-6.35724,41.66401],[-6.43548,41.66333],[-6.4349,41.62651],[-6.52279,41.62575],[-6.52343,41.66635],[-6.6034,41.66565],[-6.60733,41.9166],[-7.02209,41.913],[-7.02406,42.03872],[-7.1054,42.03801],[-7.10613,42.08421],[-7.0208,42.08495],[-7.02276,42.2094],[-6.93699,42.21014],[-6.93763,42.25087],[-6.8548,42.25159],[-6.85545,42.29329],[-6.77342,42.294],[-6.77403,42.33244],[-6.85325,42.33176],[-6.85523,42.4569],[-7.10341,42.45477],[-7.10811,42.75115],[-7.02199,42.75189],[-7.02241,42.77825],[-6.93976,42.77896],[-6.94199,42.91962],[-6.77302,42.92106],[-6.77363,42.95958],[-6.52329,42.96172],[-6.52391,43.00095],[-6.43893,43.00167],[-6.44024,43.08361],[-5.93782,43.08789],[-5.93708,43.04189],[-5.85421,43.0426],[-5.85357,43.00258],[-5.77236,43.00327],[-5.77363,43.08308],[-5.6027,43.08453],[-5.60202,43.04222],[-5.52161,43.04291],[-5.52226,43.08409],[-5.4376,43.08481],[-5.43827,43.12651],[-5.10444,43.12935],[-5.10573,43.2099],[-5.02386,43.2106],[-5.02451,43.25117],[-4.90017,43.25222],[-4.89941,43.20501],[-4.81126,43.20576],[-4.80966,43.10538],[-4.76975,43.10571],[-4.76937,43.08168],[-4.72945,43.08202],[-4.72881,43.04219],[-4.56322,43.0436],[-4.56353,43.06296],[-4.39599,43.06438],[-4.39566,43.04336],[-4.3537,43.04371],[-4.35266,42.97836],[-4.23013,42.9794],[-4.22913,42.91625],[-4.18774,42.9166],[-4.18706,42.87407],[-4.10552,42.87476],[-4.10486,42.83348],[-3.97801,42.83457],[-3.97733,42.79214],[-3.9375,42.79248],[-3.93781,42.81183],[-3.85397,42.81254],[-3.85427,42.83193],[-3.89573,42.83158],[-3.89607,42.85343],[-3.93821,42.85307],[-3.93889,42.89577],[-3.9806,42.89542],[-3.98093,42.91627],[-4.0222,42.91591],[-4.0229,42.96014],[-3.97851,42.96052],[-3.97946,43.01999],[-3.93883,43.02034],[-3.93918,43.04239],[-3.89704,43.04275],[-3.89738,43.06414],[-3.85424,43.06451],[-3.8549,43.10583],[-3.77086,43.10654],[-3.77116,43.12515],[-3.72819,43.12551],[-3.72853,43.14656],[-3.68713,43.14691],[-3.68778,43.18786],[-3.60365,43.18858],[-3.60331,43.16747],[-3.52278,43.16815],[-3.52243,43.14619],[-3.39669,43.14726],[-3.39699,43.16601],[-3.35444,43.16637],[-3.35479,43.18837],[-3.31268,43.18873],[-3.31299,43.20828],[-3.22993,43.20899],[-3.22959,43.18768],[-3.10343,43.18875],[-3.10274,43.14562],[-3.14546,43.14526],[-3.14516,43.1271],[-3.10617,43.12743],[-3.10445,43.01915],[-3.02075,43.01987],[-3.0201,42.97903],[-2.9811,42.97936],[-2.97977,42.8958],[-3.10476,42.89473],[-3.10276,42.76928],[-3.02199,42.76997],[-3.02168,42.74983],[-2.98024,42.75019],[-2.97988,42.7275],[-2.89613,42.72822],[-2.89679,42.76967],[-2.8534,42.77004],[-2.85405,42.81087],[-2.68577,42.81231],[-2.68544,42.79159],[-2.64523,42.79194],[-2.64489,42.77024],[-2.52005,42.7713],[-2.51936,42.72827],[-2.5607,42.72791],[-2.56038,42.7076],[-2.51944,42.70795],[-2.5181,42.62357],[-2.60404,42.62283],[-2.60439,42.64497],[-2.77154,42.64353],[-2.77188,42.66544],[-2.81176,42.6651],[-2.8121,42.68624],[-2.85469,42.68588],[-2.85337,42.60302],[-2.89413,42.60267],[-2.89379,42.58159],[-3.0619,42.58015],[-3.06031,42.47952],[-3.02191,42.47985],[-3.0199,42.3525],[-3.06255,42.35213],[-3.06029,42.20906],[-3.1012,42.20871],[-3.10086,42.18682],[-3.06175,42.18716],[-3.0611,42.14559],[-3.02029,42.14594],[-3.01963,42.10375],[-2.89602,42.10482],[-2.89501,42.04071],[-2.81222,42.04143],[-2.81353,42.1246],[-2.76871,42.12499],[-2.76905,42.14674],[-2.72695,42.14711],[-2.7266,42.12485],[-2.68706,42.12519],[-2.68605,42.06109],[-2.72804,42.06073],[-2.72739,42.0193],[-2.60343,42.02037],[-2.60376,42.04135],[-2.561,42.04173],[-2.56198,42.10411],[-2.52266,42.10445],[-2.52299,42.12577],[-2.47933,42.12615],[-2.47963,42.145],[-2.35517,42.14608],[-2.3555,42.16747],[-2.31184,42.16785],[-2.3115,42.14605],[-2.2699,42.14641],[-2.26924,42.1048],[-2.2295,42.10515],[-2.22981,42.12514],[-2.14467,42.12587],[-2.14432,42.10386],[-2.10385,42.10421],[-2.10156,41.95811],[-1.97689,41.95919],[-1.97655,41.93765],[-1.93473,41.93801],[-1.93504,41.95776],[-1.89453,41.95811],[-1.89483,41.97715],[-1.854,41.97751],[-1.85304,41.91638],[-1.81381,41.91672],[-1.81151,41.76984],[-1.7706,41.77019],[-1.76866,41.64582],[-1.85335,41.64508],[-1.85305,41.62567],[-1.89471,41.6253],[-1.89403,41.58215],[-1.97716,41.58142],[-1.97683,41.56021],[-1.9377,41.56055],[-1.9358,41.43834]]],terms_text:"ITACyL"},{id:"gsi.go.jp",name:"Japan GSI ortho Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg",zoomExtent:[5,19],polygon:[[[130.35021,31.45741],[130.26851,31.45817],[130.20875,31.44939],[130.1002,31.44996],[130.09237,31.3919],[130.13355,31.37528],[130.35043,31.37528],[130.35021,31.45741]],[[130.4193,31.41715],[130.417,31.41672],[130.41677,31.47525],[130.34179,31.47506],[130.34179,31.48374],[130.33362,31.48374],[130.33329,31.50044],[130.36675,31.49997],[130.36664,31.52458],[130.35019,31.52544],[130.35041,31.54986],[130.32523,31.55024],[130.32501,31.60029],[130.31661,31.63336],[130.31634,31.65084],[130.3752,31.65084],[130.31164,31.67599],[130.29194,31.69179],[130.29105,31.73235],[130.2521,31.73387],[130.24986,31.71693],[130.24427,31.71712],[130.21629,31.75804],[130.17533,31.75919],[130.17422,31.78259],[130.18384,31.79096],[130.23644,31.79096],[130.26911,31.77003],[130.36334,31.75785],[130.42668,31.70893],[130.62409,31.7076],[130.62588,31.68627],[130.61088,31.62245],[130.55582,31.50249],[130.54239,31.41715],[130.42158,31.41715],[130.4193,31.41715]],[[130.52516,31.24184],[130.54441,31.24107],[130.56858,31.21715],[130.59924,31.21657],[130.59924,31.26633],[130.57641,31.26633],[130.57351,31.31625],[130.6308,31.28393],[130.68989,31.27666],[130.66706,31.26059],[130.66594,31.21925],[130.64401,31.18135],[130.59007,31.14688],[130.54239,31.17503],[130.54239,31.1913],[130.50009,31.19207],[130.50009,31.21581],[130.52494,31.21715],[130.52516,31.24184]],[[130.74987,31.16622],[130.74965,31.24107],[130.77449,31.25887],[130.77718,31.33307],[130.75122,31.37455],[130.74898,31.41658],[130.67557,31.46852],[130.67489,31.50077],[131.40006,31.5002],[131.40834,31.45916],[131.36694,31.40932],[131.3656,31.35142],[131.31703,31.34206],[131.29957,31.36595],[131.24317,31.36633],[131.19952,31.43358],[131.14782,31.45019],[131.13394,31.45],[131.1326,31.42899],[131.10059,31.42536],[131.05091,31.41639],[131.04912,31.39155],[131.08403,31.35085],[131.11626,31.35085],[131.11783,31.33422],[130.99943,31.33365],[130.99965,31.25102],[130.87521,31.25064],[130.87454,31.16679],[130.74987,31.16622]],[[130.86625,30.47468],[130.86602,30.49937],[130.93362,30.57493],[130.93227,30.61597],[131.00636,30.61655],[131.04933,30.59112],[131.04933,30.54275],[130.99203,30.50843],[130.99114,30.47526],[130.86625,30.47468]],[[137.87486,36.37519],[138.00005,36.37494],[138.00005,36.30839],[138.04159,36.30827],[138.04191,36.29175],[138.08306,36.29162],[138.08353,36.2499],[138.13307,36.24996],[138.13354,36.16677],[138.16654,36.1667],[138.16694,36.12485],[138.04167,36.12491],[138.04144,36.04158],[137.87479,36.04152],[137.87486,36.37519]],[[138.37446,35.83393],[138.4998,35.83285],[138.4998,35.75042],[138.74936,35.7506],[138.7507,35.58332],[138.62447,35.58386],[138.62536,35.49991],[138.37491,35.49972],[138.37446,35.83393]],[[135.79179,35.64165],[135.8006,35.64923],[135.834,35.65052],[135.8916,35.62003],[135.89271,35.6091],[135.95776,35.60858],[135.9834,35.6172],[135.98435,35.641],[135.95095,35.6419],[135.95048,35.68305],[135.94225,35.69204],[135.94178,35.73239],[136.00809,35.77516],[136.03167,35.77503],[136.05018,35.75012],[136.05003,35.66646],[136.0084,35.65836],[136.00856,35.61694],[136.03404,35.60022],[136.06664,35.59996],[136.06617,35.61656],[136.1002,35.62492],[136.1002,35.69127],[136.07598,35.69166],[136.07503,35.74922],[136.08342,35.76694],[136.12441,35.76605],[136.15021,35.7004],[136.15875,35.64216],[136.17442,35.62492],[136.17553,35.58342],[136.1749,35.55813],[136.15859,35.55832],[136.15875,35.56701],[136.1165,35.56675],[136.11626,35.52555],[136.04045,35.5247],[136.01684,35.50311],[136.01661,35.48334],[135.97543,35.48334],[135.94141,35.50885],[135.94186,35.56641],[135.93358,35.57487],[135.90873,35.57514],[135.90851,35.59953],[135.83185,35.59972],[135.7928,35.62519],[135.79179,35.64165]],[[135.80916,35.47505],[135.77044,35.53345],[135.7579,35.53326],[135.74168,35.51641],[135.70072,35.51705],[135.67464,35.53363],[135.67543,35.56659],[135.6996,35.58333],[135.81654,35.58343],[135.81654,35.56804],[135.85817,35.54956],[135.85851,35.52543],[135.8509,35.5247],[135.85012,35.47514],[135.80916,35.47505]],[[135.58333,35.44132],[135.61656,35.44989],[135.64163,35.47496],[135.71639,35.47478],[135.71728,35.46703],[135.81442,35.46539],[135.86668,35.44187],[135.86679,35.40868],[135.81722,35.40822],[135.81677,35.38496],[135.77548,35.3835],[135.75835,35.40804],[135.59183,35.4084],[135.58322,35.42536],[135.58333,35.44132]],[[135.40011,35.43312],[135.42496,35.44189],[135.45803,35.45008],[135.45899,35.49164],[135.46642,35.49184],[135.46619,35.50807],[135.44181,35.51709],[135.43968,35.53293],[135.45843,35.55804],[135.52324,35.55811],[135.52498,35.5091],[135.54152,35.50008],[135.54152,35.4834],[135.57515,35.48366],[135.57491,35.49164],[135.60878,35.49171],[135.60894,35.46684],[135.59208,35.45826],[135.53305,35.45826],[135.50029,35.45008],[135.50045,35.4415],[135.50789,35.42506],[135.53337,35.42513],[135.53297,35.38346],[135.5416,35.38333],[135.54176,35.36688],[135.5086,35.35836],[135.50892,35.34216],[135.50013,35.34164],[135.50013,35.41662],[135.39987,35.41655],[135.40011,35.43312]],[[133.70822,35.45816],[133.70822,35.33319],[133.12484,35.33328],[133.12495,35.3749],[132.95877,35.37508],[132.95821,35.4578],[132.87506,35.45853],[132.87461,35.52504],[132.95015,35.52522],[132.9497,35.55819],[133.01674,35.55855],[133.01685,35.56675],[133.03352,35.56693],[133.03308,35.59205],[133.06687,35.59187],[133.06654,35.6168],[133.14135,35.61671],[133.14151,35.59181],[133.36667,35.59186],[133.36689,35.57484],[133.34216,35.57447],[133.34194,35.558],[133.33321,35.55026],[133.28363,35.55017],[133.28341,35.49178],[133.33354,35.4916],[133.33354,35.47529],[133.41714,35.47492],[133.41714,35.37516],[133.49995,35.37534],[133.49973,35.45806],[133.45854,35.45806],[133.45854,35.51629],[133.49212,35.5335],[133.54136,35.54161],[133.58343,35.54197],[133.58355,35.45843],[133.70822,35.45816]],[[133.84174,35.46646],[133.84158,35.58367],[133.975,35.58329],[133.97532,35.5086],[134.00823,35.50834],[134.0334,35.49971],[134.0421,35.47497],[134.04432,35.45834],[134.08357,35.4586],[134.08309,35.53359],[134.13326,35.54969],[134.23328,35.55999],[134.27491,35.58342],[134.33299,35.58367],[134.33521,35.49172],[134.36654,35.49224],[134.36654,35.49997],[134.41718,35.49971],[134.41592,35.5417],[134.6253,35.54157],[134.62514,35.37554],[134.70839,35.37463],[134.70823,35.33398],[134.41655,35.33359],[134.41592,35.37528],[134.39218,35.37541],[134.39155,35.35011],[134.37477,35.33346],[134.20005,35.33359],[134.19939,35.35874],[134.24997,35.39971],[134.27515,35.39962],[134.27504,35.39205],[134.35819,35.39314],[134.35852,35.3999],[134.3752,35.39999],[134.37441,35.42489],[134.33256,35.42507],[134.33278,35.41659],[134.04954,35.41659],[134.05077,35.39178],[134.0661,35.39187],[134.06711,35.39999],[134.14187,35.40017],[134.14164,35.36678],[134.18339,35.35847],[134.18372,35.33337],[133.78309,35.33364],[133.78331,35.34159],[133.82472,35.3592],[133.82505,35.38311],[133.84173,35.40838],[133.89981,35.40893],[133.89981,35.41677],[133.85829,35.41659],[133.8574,35.46646],[133.84174,35.46646]],[[133.24987,33.66667],[133.41786,33.66674],[133.52485,33.66674],[133.52493,33.79178],[133.64157,33.79185],[133.64188,33.66681],[133.75006,33.66687],[133.75029,33.62517],[133.79152,33.62498],[133.79168,33.5084],[133.73336,33.5084],[133.73328,33.51658],[133.64196,33.51671],[133.60833,33.48346],[133.52493,33.46682],[133.47492,33.41935],[133.43313,33.38321],[133.37497,33.38334],[133.37497,33.49157],[133.20817,33.49191],[133.20824,33.55827],[133.24947,33.55833],[133.24987,33.66667]],[[134.3501,33.73355],[134.4832,33.73368],[134.48336,33.66732],[134.43366,33.65033],[134.43287,33.63412],[134.35279,33.63347],[134.3501,33.73355]],[[140.31656,36.21656],[140.31671,36.44984],[140.34973,36.44994],[140.35012,36.51668],[140.47467,36.51671],[140.47483,36.59159],[140.62489,36.59204],[140.62467,36.63354],[140.64974,36.6348],[140.65041,36.71684],[140.69912,36.81554],[140.71006,36.91306],[140.70838,36.95687],[140.74956,36.95866],[140.75323,37.06176],[140.75001,37.16671],[141.00832,37.16666],[141.00837,37.0917],[140.98331,37.05828],[140.98333,36.95834],[140.90834,36.90002],[140.81672,36.89999],[140.80828,36.87498],[140.80833,36.85],[140.81655,36.85004],[140.81669,36.8415],[140.81669,36.81816],[140.79988,36.80832],[140.7834,36.79992],[140.775,36.79523],[140.77498,36.78339],[140.75836,36.775],[140.75825,36.75837],[140.75002,36.75831],[140.74689,36.71939],[140.73336,36.65048],[140.69167,36.58337],[140.65003,36.51336],[140.64998,36.38351],[140.59986,36.27483],[140.57499,36.24796],[140.57463,36.21729],[140.31656,36.21656]],[[141.2166,41.24992],[141.41662,41.24971],[141.39858,41.17052],[141.40426,41.0968],[141.39503,41.04046],[141.39858,40.97185],[141.40625,40.91003],[141.41136,40.83011],[141.41307,40.80204],[141.42245,40.74987],[141.34161,40.75084],[141.3149,40.74556],[141.29203,40.74169],[141.23322,40.7419],[141.23307,40.85837],[141.25026,40.85858],[141.24941,40.91647],[141.17412,40.9169],[141.22498,40.9948],[141.23819,41.0696],[141.2497,41.1258],[141.27143,41.15875],[141.23336,41.22995],[141.2166,41.24992]],[[141.25854,41.3166],[141.15015,41.31672],[141.1499,41.39163],[141.18877,41.39205],[141.21625,41.37916],[141.25849,41.36012],[141.25854,41.3166]],[[141.05841,45.2584],[141.03453,45.25833],[141.00874,45.25815],[141.0083,45.27495],[140.99994,45.27495],[141.00002,45.30371],[140.99999,45.30828],[140.99196,45.30846],[140.99171,45.34162],[140.98351,45.34172],[140.98336,45.34998],[140.97477,45.35008],[140.97502,45.3667],[140.96664,45.36675],[140.96685,45.39818],[140.9665,45.42499],[140.9584,45.42484],[140.95816,45.43314],[140.95012,45.4335],[140.94967,45.51651],[140.97443,45.51672],[140.97448,45.50014],[140.98307,45.50042],[140.98332,45.46697],[140.99045,45.46704],[140.99135,45.45876],[141.00019,45.45813],[141.00035,45.45002],[141.01627,45.4502],[141.01637,45.47496],[141.04992,45.47532],[141.04992,45.46676],[141.06614,45.46679],[141.0665,45.4502],[141.07463,45.44999],[141.07498,45.34178],[141.0666,45.34168],[141.06418,45.30611],[141.06644,45.30565],[141.06629,45.28484],[141.05906,45.28357],[141.05841,45.2584]],[[144.27488,42.96671],[144.27502,42.99155],[144.25861,42.99145],[144.25805,42.98314],[144.20818,42.98319],[144.20854,42.97472],[144.16684,42.97503],[144.16684,43.00496],[144.16642,43.04178],[144.07486,43.04188],[144.07493,43.10025],[144.24988,43.1],[144.24988,43.1168],[144.29179,43.11675],[144.292,43.0919],[144.4168,43.09185],[144.4168,43.1168],[144.56654,43.1168],[144.56675,42.99171],[144.50005,42.9915],[144.5002,42.92481],[144.46653,42.92501],[144.31739,42.96675],[144.27488,42.96671]],[[140.69973,42.57513],[140.70015,42.61647],[140.84451,42.61673],[140.99961,42.61669],[141.00006,42.54168],[141.24984,42.54168],[141.24994,42.58336],[141.29163,42.58332],[141.29158,42.6251],[141.37501,42.62498],[141.37501,42.66662],[141.49992,42.66666],[141.49992,42.8165],[141.47496,42.8165],[141.47511,42.83341],[141.81236,42.83357],[141.95752,42.83328],[141.94355,42.77977],[141.95762,42.77896],[141.95832,42.7502],[141.99991,42.75086],[141.9992,42.71493],[142.00031,42.67632],[142.01799,42.65076],[142.09082,42.65002],[142.09122,42.5251],[142.02472,42.5251],[141.96033,42.52495],[141.8665,42.52518],[141.8656,42.57713],[141.83577,42.58519],[141.80482,42.57417],[141.74646,42.57705],[141.73069,42.61477],[141.61707,42.61055],[141.52134,42.60331],[141.45615,42.57587],[141.3562,42.52866],[141.27523,42.48822],[141.19507,42.43791],[141.10476,42.3914],[141.05393,42.33165],[141.0254,42.29161],[140.95187,42.29146],[140.9147,42.32682],[140.89451,42.37174],[140.88426,42.42723],[140.85041,42.46096],[140.76643,42.49978],[140.76663,42.52821],[140.69973,42.57513]],[[140.75005,43.23374],[140.82762,43.2135],[140.88245,43.22531],[140.97338,43.24601],[141.02139,43.24311],[141.04213,43.20211],[141.08346,43.18205],[141.17267,43.16382],[141.25678,43.19366],[141.37528,43.33327],[141.62491,43.33335],[141.62451,43.4168],[141.79146,43.4168],[141.79197,43.83339],[142.12487,43.83332],[142.12487,43.75022],[142.16656,43.74993],[142.16656,43.83317],[142.24954,43.83325],[142.24984,43.8581],[142.27465,43.8581],[142.27465,43.87425],[142.26671,43.8749],[142.26651,43.91688],[142.24994,43.9171],[142.25001,44.5],[142.49997,44.50013],[142.49977,43.88366],[142.51674,43.88344],[142.51644,43.83346],[142.62473,43.83346],[142.62473,43.58331],[142.54176,43.58403],[142.54196,43.50008],[142.50057,43.50022],[142.50037,43.25006],[142.25054,43.25014],[142.25004,43.45838],[142.00031,43.45816],[142.00001,43.41724],[141.91703,43.41688],[141.91703,43.33342],[141.87494,43.33327],[141.87454,43.17487],[141.93351,43.17473],[141.93391,43.15868],[141.99137,43.15802],[141.99207,43.1334],[141.87524,43.13332],[141.87484,43.00012],[141.49984,43.00027],[141.50015,42.91683],[141.25021,42.91631],[141.25001,42.9999],[141.12505,43.00005],[141.12525,43.08323],[140.99988,43.0836],[141.00008,43.16638],[140.75086,43.1666],[140.75005,43.23374]],[[140.59121,41.78353],[140.58382,41.8334],[140.58453,41.87732],[140.59092,41.91613],[140.60797,41.94403],[140.57544,41.95914],[140.58439,41.99979],[140.7104,42.00011],[140.86894,42.00011],[140.91724,42.00053],[140.99041,41.91909],[141.04737,41.90693],[141.12722,41.88398],[141.17552,41.83732],[141.20194,41.81488],[141.18418,41.78321],[141.11301,41.76711],[141.05689,41.71559],[140.99382,41.69968],[140.94267,41.70414],[140.89238,41.73563],[140.84806,41.74326],[140.80018,41.75672],[140.73299,41.74634],[140.69705,41.73234],[140.6881,41.76986],[140.59121,41.78353]],[[140.2418,42.2338],[140.24159,42.25827],[140.21005,42.25797],[140.20804,42.27485],[140.26611,42.27514],[140.2651,42.29179],[140.29001,42.2912],[140.29182,42.26779],[140.33914,42.24139],[140.34145,42.21662],[140.29323,42.21662],[140.2418,42.2338]],[[140.55007,42.08447],[140.54977,42.11387],[140.58066,42.11193],[140.62636,42.12069],[140.63365,42.12136],[140.6336,42.10061],[140.60853,42.09964],[140.60848,42.08327],[140.54972,42.08312],[140.55007,42.08447]],[[140.6583,41.06668],[140.67117,40.91974],[140.84492,40.91652],[140.91726,40.91688],[140.91712,40.87597],[140.9846,40.87533],[140.98503,40.79278],[141.13391,40.79192],[141.13972,40.68034],[141.17424,40.68174],[141.18504,40.60057],[141.43351,40.60078],[141.43308,40.51757],[141.18305,40.51649],[141.18362,40.58223],[141.16714,40.59172],[141.04397,40.59237],[141.04283,40.65825],[140.98402,40.65836],[140.72646,40.65857],[140.72589,40.57521],[140.66849,40.57467],[140.60883,40.57489],[140.60925,40.48311],[140.55058,40.483],[140.54888,40.51757],[140.40028,40.51692],[140.40013,40.5832],[140.25665,40.58233],[140.24898,40.63292],[140.33251,40.63292],[140.33251,40.66687],[140.41676,40.66698],[140.41704,40.73311],[140.33194,40.73375],[140.33351,40.75851],[140.28421,40.75818],[140.28037,40.85679],[140.30254,40.98507],[140.31845,41.00019],[140.42443,41.0004],[140.42443,40.90029],[140.55044,40.89975],[140.54994,41.06668],[140.6583,41.06668]],[[140.01669,40.33381],[140.25252,40.33381],[140.25006,39.33298],[139.98341,39.3332],[140.05622,39.72433],[140.00614,39.77043],[139.94073,39.88023],[139.94158,40.01081],[139.94055,40.08509],[139.94116,40.10876],[140.01669,40.33381]],[[139.85814,39.04176],[139.87552,39.04137],[139.87703,39.00009],[139.91671,39.00001],[139.9167,38.79173],[139.75493,38.79165],[139.7502,38.79386],[139.79376,38.89687],[139.79014,38.9254],[139.83615,38.99102],[139.85814,39.04176]],[[139.37551,38.1174],[139.38053,37.95893],[139.417,37.95845],[139.417,37.87413],[139.37571,37.8746],[139.37611,37.83296],[139.29234,37.83145],[139.30007,37.78074],[139.29173,37.68357],[139.29193,37.66473],[139.22935,37.6594],[139.18113,37.61024],[139.14537,37.60769],[139.12367,37.62671],[139.09816,37.65018],[139.08831,37.6664],[138.99951,37.66656],[138.99942,37.79171],[138.81261,37.79199],[138.86834,37.84689],[138.9915,37.91333],[139.08231,37.9775],[139.27679,38.03417],[139.37551,38.1174]],[[139.96008,38.49993],[140.50033,38.50009],[140.50023,38.16654],[140.37496,38.16654],[140.37536,38.08348],[140.2504,38.08293],[140.21705,38.07407],[140.22136,38.0422],[140.2512,38.04196],[140.2504,38.00017],[140.23372,37.99962],[140.23352,37.94197],[140.20861,37.9411],[140.20841,37.90013],[140.19253,37.89965],[140.19123,37.88372],[140.15838,37.883],[140.15828,37.85811],[140.0753,37.85945],[140.0741,37.87476],[140.05019,37.87571],[140.05019,37.89252],[140.05762,37.89355],[140.05813,37.92541],[140.0741,37.92573],[140.0742,37.94197],[140.09871,37.95369],[140.09821,37.99234],[140.10182,38.00041],[140.12282,38.00081],[140.11549,38.01806],[140.08977,38.02795],[140.0747,38.04133],[140.06727,38.03492],[140.06707,37.99186],[140.01634,37.9917],[140.01584,38.066],[139.99805,38.06656],[139.99966,38.13739],[139.99956,38.17514],[139.99795,38.3337],[139.95787,38.33378],[139.95837,38.50028],[139.96008,38.49993]],[[140.70822,38.7833],[140.70837,39.15023],[141.04194,39.14957],[141.04167,39.50008],[141.00147,39.49986],[140.99893,39.91638],[141.25077,39.91692],[141.25037,39.5007],[141.16709,39.50008],[141.16699,39.45627],[141.16669,39.40273],[141.16689,39.25073],[141.20798,39.24996],[141.20898,38.87471],[141.03399,38.8751],[141.03339,38.78354],[140.86794,38.78315],[140.70822,38.7833]],[[141.3759,38.36972],[141.37476,38.49992],[141.24904,38.50025],[141.25134,38.66886],[141.52524,38.66653],[141.54981,38.63369],[141.55052,38.55563],[141.55549,38.47938],[141.56558,38.39559],[141.54626,38.37398],[141.55919,38.32429],[141.59854,38.31226],[141.59527,38.26063],[141.50762,38.23664],[141.46983,38.24479],[141.39226,38.27725],[141.41158,38.34781],[141.3759,38.36972]],[[131.04175,33.7381],[131.0413,33.70887],[130.99956,33.70858],[131.00035,33.68392],[131.04959,33.68392],[131.05014,33.64171],[131.0751,33.64201],[131.07588,33.61683],[131.10039,33.61666],[131.10084,33.60082],[131.17448,33.60007],[131.19999,33.58422],[131.20066,33.55868],[131.2405,33.55868],[131.28258,33.54207],[131.33137,33.52528],[131.41821,33.55065],[131.51625,33.55084],[131.51692,33.5667],[131.63353,33.56688],[131.63308,33.47545],[131.7423,33.47452],[131.74946,33.45939],[131.75014,33.33289],[131.60756,33.33401],[131.60801,33.37421],[131.52565,33.37458],[131.52467,33.26691],[131.5769,33.25843],[131.64942,33.28332],[131.71634,33.28388],[131.77497,33.26687],[131.78385,33.25028],[131.83291,33.25015],[131.88403,33.2745],[131.90825,33.2749],[131.90809,33.25849],[131.87517,33.20607],[131.84985,33.18276],[131.85032,33.14964],[131.87525,33.15038],[131.90777,33.14129],[131.9171,33.13332],[131.91733,33.10858],[131.9505,33.09967],[131.95019,33.08349],[131.98279,33.08336],[131.98279,33.10007],[132.00036,33.1169],[132.0252,33.1169],[132.02473,33.0998],[132.00843,33.09172],[132.00843,33.06718],[132.01745,33.06705],[132.01715,33.04988],[131.99181,33.04211],[131.92518,33.04092],[131.9255,33.025],[131.95003,33.025],[131.95045,33.01347],[131.95034,32.97482],[131.98326,32.97536],[131.98492,32.95941],[132.0261,32.95922],[132.05828,32.95862],[132.05844,32.99142],[132.07198,32.9917],[132.08297,32.98332],[132.09168,32.92635],[132.02473,32.92542],[132.02473,32.90058],[132.03349,32.88294],[132.00795,32.88357],[131.98326,32.85871],[131.99988,32.8498],[132.01715,32.8429],[132.01603,32.82654],[131.97551,32.78396],[131.93411,32.76746],[131.8992,32.76614],[131.89179,32.71661],[131.83317,32.6507],[131.78369,32.64894],[131.78415,32.58396],[131.74185,32.58283],[131.7082,32.56669],[131.70773,32.54294],[131.74159,32.50852],[131.74141,32.45129],[131.70804,32.44216],[131.70112,32.40878],[131.65787,32.39219],[131.64226,32.33355],[131.59948,32.27572],[131.57492,32.18338],[131.54184,32.08474],[131.542,32.00009],[131.49975,32.00023],[131.50038,31.74971],[131.4586,31.75011],[131.45876,31.79182],[131.24969,31.79169],[131.24969,32.16704],[131.37488,32.16717],[131.37504,32.25046],[131.49991,32.25019],[131.49991,32.33341],[131.54137,32.33341],[131.54167,32.62506],[131.66645,32.62515],[131.66633,32.66662],[131.74993,32.66652],[131.75006,32.91664],[131.5977,32.91688],[131.25044,32.91663],[131.24902,33.00042],[131.49971,33.00002],[131.49987,33.06345],[131.50018,33.13915],[131.4804,33.16631],[131.284,33.16618],[131.26706,33.20035],[131.26627,33.25039],[131.29966,33.26985],[131.29951,33.31999],[131.24427,33.34114],[131.17511,33.34154],[131.17527,33.35806],[131.07525,33.35806],[131.07572,33.33347],[131.00055,33.33321],[131.00007,33.2496],[130.91445,33.2496],[130.7497,33.25013],[130.7497,33.08374],[130.62546,33.08321],[130.62546,33.00002],[130.72796,33.00171],[130.87492,33.00018],[130.8753,32.79131],[130.96677,32.79185],[130.96709,32.85808],[130.92531,32.85781],[130.92531,32.95029],[130.96679,32.95831],[131.00012,32.91683],[131.00017,32.50007],[130.66647,32.50046],[130.66669,32.33306],[130.62506,32.33306],[130.62461,32.24943],[130.49972,32.25037],[130.50039,32.12517],[130.33275,32.12498],[130.3437,32.16133],[130.34954,32.20815],[130.42748,32.29423],[130.46637,32.40054],[130.4939,32.40073],[130.523,32.43304],[130.54941,32.44456],[130.54986,32.4659],[130.48383,32.46647],[130.47421,32.47535],[130.4751,32.50064],[130.5089,32.54197],[130.62439,32.62571],[130.62484,32.6666],[130.52569,32.66679],[130.52524,32.68337],[130.55859,32.71671],[130.55903,32.7745],[130.57493,32.78372],[130.57493,32.82172],[130.50935,32.84185],[130.50778,32.86986],[130.44155,32.89158],[130.41624,32.94258],[130.41579,32.97488],[130.37438,33.00098],[130.37528,33.08315],[130.24927,33.08372],[130.24905,33.16076],[130.15863,33.09741],[130.17775,33.07174],[130.18369,33.06684],[130.18369,33.03401],[130.19958,33.025],[130.19977,33.00001],[130.12479,33.00001],[130.12457,32.96678],[130.0409,32.9407],[130.02501,32.94164],[130.02456,32.91647],[130.12457,32.9172],[130.12457,32.86739],[130.15031,32.86683],[130.19578,32.8661],[130.23334,32.89183],[130.29198,32.89183],[130.29243,32.84991],[130.29153,32.7916],[130.2922,32.71725],[130.18343,32.65791],[130.15034,32.65002],[130.11539,32.64962],[130.11744,32.70014],[130.15903,32.71706],[130.24856,32.75867],[130.24968,32.79085],[130.1333,32.79235],[130.12569,32.76751],[130.00147,32.74963],[129.9294,32.67317],[129.80048,32.57459],[129.80003,32.54704],[129.77425,32.54749],[129.71767,32.54987],[129.71632,32.59043],[129.7499,32.67487],[129.75012,32.72459],[129.80025,32.72553],[129.74161,32.77523],[129.62411,32.8501],[129.62646,32.91787],[129.83159,32.91738],[129.87121,32.91644],[129.89269,32.94105],[129.93343,33.00827],[129.967,33.07469],[130.05809,33.12025],[130.05876,33.21693],[130.24946,33.21674],[130.2499,33.33331],[130.21566,33.3335],[130.0422,33.33331],[129.92559,33.33294],[129.90836,33.35837],[129.90791,33.38304],[129.86695,33.38285],[129.86697,33.36012],[129.83338,33.34079],[129.80093,33.34098],[129.80003,33.31592],[129.75057,33.31686],[129.75034,33.27533],[129.72572,33.27477],[129.6917,33.30807],[129.69237,33.25025],[129.87479,33.25025],[129.8759,33.21299],[129.87521,33.11856],[129.87523,33.03323],[129.80831,33.03305],[129.7499,33.05031],[129.734,33.058],[129.72658,33.08172],[129.69842,33.09982],[129.62413,33.09928],[129.62374,33.12377],[129.62501,33.24201],[129.59255,33.24108],[129.59255,33.29928],[129.54197,33.3004],[129.50012,33.31761],[129.49989,33.41686],[129.59949,33.41593],[129.66753,33.40864],[129.66775,33.43274],[129.8336,33.56656],[129.93208,33.56787],[129.93522,33.40827],[130.04131,33.3836],[130.04108,33.48428],[130.24901,33.48465],[130.25057,33.61681],[130.28504,33.63405],[130.28303,33.69151],[130.30888,33.69151],[130.32365,33.66712],[130.39225,33.69179],[130.41777,33.72484],[130.43388,33.77546],[130.39024,33.87047],[130.39113,33.92509],[130.50774,33.92621],[130.60555,33.89166],[130.66665,33.9496],[130.74991,34.00844],[130.84973,34.00825],[130.8504,34.14155],[130.88308,34.19192],[130.85801,34.27519],[130.83228,34.36706],[130.97127,34.45052],[131.08608,34.43336],[131.19307,34.44166],[131.29356,34.44092],[131.36518,34.44591],[131.37548,34.5328],[131.44934,34.55013],[131.57445,34.69176],[131.62526,34.69158],[131.78596,34.70078],[131.86989,34.77435],[131.99545,34.88146],[132.37594,35.16739],[132.74972,35.16684],[132.75084,35.08318],[132.6255,35.08337],[132.62505,34.91671],[132.3755,34.91689],[132.37527,34.83426],[132.12482,34.83298],[132.12482,34.75008],[132.00038,34.7499],[132.00038,34.5833],[131.74989,34.58326],[131.75139,34.37954],[131.75147,34.1671],[132.12497,34.16683],[132.12481,34.2914],[132.25016,34.29193],[132.24929,34.40917],[132.25016,34.49983],[132.37249,34.49996],[132.37503,34.58339],[132.49167,34.58339],[132.49182,34.70831],[132.59177,34.70824],[132.58365,34.5417],[132.84148,34.54133],[132.84193,34.66623],[133.08343,34.66678],[133.08365,34.76631],[133.20743,34.76687],[133.20787,34.66678],[133.49973,34.66642],[133.50026,34.83314],[133.7012,34.83357],[133.69941,34.87526],[133.74984,34.87535],[133.74984,34.9999],[133.8751,35.00003],[133.87518,35.12504],[133.97425,35.12517],[133.97546,35.00097],[134.0585,34.99997],[134.05816,35.07464],[134.16654,35.0748],[134.1667,35.00016],[134.75338,35.00016],[134.83324,34.99997],[134.8333,35.04176],[135.24494,35.04176],[135.37472,35.04153],[135.37535,35.0836],[135.74948,35.08335],[135.75066,35.25004],[135.87474,35.2503],[135.87529,35.33388],[136.00001,35.33356],[136.00024,35.2587],[135.98331,35.24255],[135.93361,35.20027],[135.93306,35.1667],[135.97539,35.16664],[135.97523,35.15597],[136.04993,35.15829],[136.04993,35.21663],[136.05895,35.22484],[136.12455,35.23344],[136.12536,35.25011],[136.16667,35.24997],[136.16651,35.36441],[136.16664,35.45873],[136.33347,35.45857],[136.37478,35.33382],[136.49981,35.33356],[136.49965,35.49981],[136.74991,35.58365],[137.00003,35.58344],[136.99984,35.41254],[136.99999,35.33351],[137.24995,35.33357],[137.24998,34.91665],[137.6249,34.91658],[137.62516,35.00034],[137.69186,35.00052],[137.69182,35.06711],[137.74199,35.06668],[137.74222,35.10789],[137.77489,35.10844],[137.77474,35.15015],[138.16671,35.15021],[138.16666,35.2918],[138.38224,35.29138],[138.50029,35.29187],[138.50119,35.33333],[138.38256,35.33369],[138.38319,35.44169],[138.49985,35.44208],[138.49988,35.4584],[138.66644,35.45855],[138.66704,35.37476],[138.70818,35.37519],[138.70818,35.33348],[138.8334,35.33357],[138.83329,35.40832],[139.0082,35.40836],[139.00858,35.39192],[139.1243,35.39228],[139.12498,35.41668],[139.25001,35.41667],[139.24995,35.49996],[139.12487,35.50005],[139.12492,35.5833],[138.99999,35.58333],[138.99999,35.6667],[139.1249,35.66678],[139.12504,35.8092],[139.12474,35.91713],[139.00053,35.91713],[139.00006,36.00001],[139.12492,36.00012],[139.12547,36.11894],[139.12495,36.16664],[139,36.16668],[138.99941,36.25031],[138.95831,36.25002],[138.95822,36.29127],[138.91663,36.29166],[138.91678,36.37496],[138.95845,36.37565],[138.95836,36.45832],[139.08379,36.45868],[139.08334,36.5],[139.25009,36.50012],[139.2496,36.54136],[139.37464,36.54189],[139.37505,36.62499],[139.45022,36.62528],[139.44999,36.66667],[139.66374,36.66671],[139.75002,36.66665],[139.75005,36.75003],[140,36.75001],[139.99998,36.62209],[140.00001,36.41668],[140.25001,36.41666],[140.24999,36.04158],[140.50004,36.04158],[140.49989,35.83349],[140.41632,35.83374],[140.4168,35.7919],[140.45874,35.79113],[140.45874,35.72461],[140.51666,35.72486],[140.51691,35.7417],[140.59144,35.74174],[140.5915,35.94177],[140.65002,35.94164],[140.64994,36.00837],[140.67503,36.00834],[140.71403,35.92326],[140.77327,35.83877],[140.81532,35.78508],[140.89133,35.7501],[140.89211,35.71717],[140.86632,35.67853],[140.80694,35.70622],[140.72767,35.6761],[140.68235,35.68891],[140.60194,35.63074],[140.48545,35.54409],[140.4095,35.42897],[140.40816,35.33353],[140.30722,35.33371],[140.30767,35.41748],[140.30946,35.45851],[140.20762,35.45905],[140.20829,35.37478],[140.12503,35.37478],[140.12436,35.33408],[140.29155,35.33316],[140.29245,35.20909],[140.31707,35.20836],[140.31662,35.18422],[140.35042,35.18257],[140.3431,35.13152],[140.23201,35.10096],[140.13697,35.09271],[140.05542,35.03643],[139.98865,34.98849],[139.96379,34.91688],[139.91222,34.88262],[139.82272,34.89218],[139.78337,34.93633],[139.73961,34.95322],[139.7443,34.99303],[139.81476,35.00932],[139.7963,35.05283],[139.80169,35.09108],[139.80766,35.1529],[139.80866,35.19667],[139.85153,35.24127],[139.8325,35.29189],[139.74927,35.2961],[139.76149,35.33517],[139.79232,35.35267],[139.81035,35.49933],[140.0035,35.49988],[140.03349,35.53668],[140.06639,35.58384],[139.79714,35.58311],[139.80005,35.50079],[139.77087,35.47343],[139.70992,35.44207],[139.6987,35.40282],[139.66887,35.36715],[139.68478,35.30781],[139.73549,35.2728],[139.75069,35.25934],[139.73734,35.23092],[139.74388,35.20852],[139.69714,35.18971],[139.67426,35.1702],[139.68932,35.15394],[139.68151,35.13477],[139.62355,35.12199],[139.59783,35.1285],[139.60224,35.17253],[139.58363,35.18959],[139.59033,35.24164],[139.5496,35.28403],[139.49879,35.30084],[139.42314,35.30942],[139.29131,35.30066],[139.23074,35.27778],[139.15546,35.23542],[139.15031,35.17507],[139.16665,35.13316],[139.12502,35.13298],[139.09436,35.13335],[139.05832,35.13316],[139.05671,35.00443],[139.03348,34.98385],[138.99968,34.98367],[139.00057,34.88274],[139.14136,34.88348],[139.11002,34.84602],[139.08129,34.79529],[139.01691,34.74107],[138.9999,34.64151],[138.90044,34.6097],[138.87367,34.59159],[138.80026,34.59988],[138.75773,34.65881],[138.72528,34.67575],[138.72528,34.72506],[138.83316,34.72598],[138.83383,34.74952],[138.7419,34.75106],[138.7338,34.8136],[138.74985,34.90057],[138.76065,34.93773],[138.75028,34.98313],[138.77855,35.04352],[138.87546,35.03316],[138.87703,35.04929],[138.85845,35.04984],[138.76804,35.12107],[138.68294,35.12223],[138.61873,35.09015],[138.55409,35.05201],[138.54926,34.99442],[138.49996,34.95392],[138.39142,34.91129],[138.35562,34.86759],[138.33929,34.80042],[138.27635,34.72246],[138.24467,34.66616],[138.24396,34.58503],[138.12662,34.58573],[138.01467,34.62561],[137.88184,34.65541],[137.79532,34.63718],[137.68991,34.65307],[137.57654,34.66441],[137.38135,34.64618],[137.18402,34.58409],[137.03187,34.5662],[137.00794,34.57573],[137.0254,34.61792],[137.0599,34.66613],[137.17517,34.66686],[137.30767,34.75996],[137.29894,34.77595],[137.29088,34.79231],[137.25037,34.79213],[137.21635,34.76768],[137.15816,34.74911],[137.08318,34.75076],[137.03215,34.76345],[136.94061,34.80848],[136.93456,34.77522],[136.98335,34.72575],[137.06751,34.74212],[137.06773,34.70183],[137.02454,34.70809],[137.01581,34.64937],[136.98179,34.65029],[136.82601,34.74911],[136.84884,34.82319],[136.79266,34.82521],[136.79132,35.00048],[136.75081,35.00012],[136.74991,34.95849],[136.68277,34.96069],[136.6624,34.89701],[136.59078,34.80003],[136.53863,34.72704],[136.58294,34.62506],[136.75682,34.54181],[136.85798,34.54126],[136.93945,34.54347],[136.91675,34.49231],[136.94081,34.46687],[136.94113,34.40866],[136.92404,34.35876],[136.90742,34.30209],[136.90045,34.2666],[136.84981,34.23416],[136.81693,34.1923],[136.79948,34.19254],[136.79996,34.22906],[136.74203,34.25863],[136.73325,34.28285],[136.70896,34.28334],[136.64264,34.25902],[136.5594,34.22605],[136.53564,34.22167],[136.50068,34.20864],[136.44007,34.20053],[136.38325,34.16675],[136.3334,34.14802],[136.31583,34.08487],[136.2674,34.08316],[136.12497,34.08343],[136.12449,34.16688],[136.24968,34.16688],[136.24984,34.25012],[136.37486,34.25025],[136.37468,34.33331],[136.50021,34.33302],[136.49973,34.49192],[136.45843,34.49127],[136.45811,34.5416],[136.4168,34.54186],[136.41664,34.62516],[136.37494,34.62464],[136.37469,34.68106],[136.37485,34.74974],[136.33402,34.75026],[136.33354,34.79109],[136.37485,34.79213],[136.37533,34.95858],[136.33323,34.95858],[136.33323,34.83345],[136.29239,34.83371],[136.29208,34.792],[136.24966,34.79213],[136.24998,34.70838],[136.29192,34.70851],[136.2916,34.62475],[136.12487,34.62512],[136.12498,34.66674],[136.04161,34.66655],[136.04094,34.7499],[136.00023,34.75009],[135.99991,34.65993],[135.99975,34.58387],[136.04153,34.58374],[136.04185,34.50017],[136.04989,34.49997],[136.05005,34.42503],[135.91674,34.425],[135.91667,34.35836],[135.81665,34.35837],[135.81661,34.31668],[135.74991,34.31672],[135.75007,34.29167],[135.64152,34.29176],[135.64186,34.27512],[135.53325,34.27489],[135.53348,34.25834],[135.475,34.25834],[135.47511,34.22498],[135.37507,34.22512],[135.3749,34.20814],[135.50001,34.20837],[135.50001,33.66652],[135.87502,33.66661],[135.87558,33.74983],[136.03371,33.75021],[136.01272,33.71062],[135.99681,33.67327],[135.97948,33.63389],[135.97195,33.61271],[135.95831,33.56798],[135.85332,33.50522],[135.85353,33.48302],[135.87591,33.4814],[135.86057,33.44051],[135.77718,33.42558],[135.7418,33.42534],[135.74163,33.4665],[135.68498,33.47915],[135.59008,33.49633],[135.47373,33.52819],[135.3902,33.5752],[135.37485,33.61633],[135.37533,33.64967],[135.33371,33.6498],[135.32468,33.66653],[135.45794,33.66666],[135.45842,33.74987],[135.41727,33.75],[135.41663,33.78802],[135.41743,33.83273],[135.37517,33.83326],[135.37517,33.79171],[135.3284,33.78999],[135.28777,33.75622],[135.21503,33.7698],[135.14371,33.85113],[135.12013,33.87826],[135.05776,33.87991],[135.05947,33.96479],[135.07709,34.00837],[135.11345,34.05029],[135.06515,34.06759],[135.07041,34.121],[135.15522,34.16286],[135.1163,34.18742],[135.06316,34.25849],[135.04915,34.27082],[134.99554,34.27152],[134.9955,34.29122],[134.99945,34.29894],[135.00904,34.30357],[135.1457,34.34721],[135.20804,34.35108],[135.24174,34.39165],[135.19145,34.42482],[135.25012,34.46056],[135.29487,34.42658],[135.30902,34.44119],[135.36647,34.53277],[135.39147,34.53394],[135.38308,34.63128],[135.36409,34.66669],[135.29161,34.66695],[135.29061,34.6245],[135.08349,34.62463],[135.04725,34.61643],[134.92905,34.64799],[134.826,34.69662],[134.75874,34.74267],[134.71632,34.74982],[134.52561,34.74969],[134.41657,34.70885],[134.31671,34.66669],[134.25055,34.66656],[134.24992,34.68309],[134.15797,34.68348],[134.15781,34.70013],[134.12505,34.7],[134.12474,34.58386],[134.11666,34.55845],[134.02519,34.55024],[134.02535,34.44785],[134.02788,34.41639],[134.19168,34.41678],[134.19152,34.38401],[134.28347,34.38296],[134.28347,34.33371],[134.38082,34.29415],[134.40952,34.26539],[134.43268,34.24648],[134.56265,34.25055],[134.66663,34.24963],[134.64146,34.04963],[134.70809,33.96554],[134.74006,33.92825],[134.71221,33.86773],[134.76918,33.86691],[134.76712,33.82524],[134.66742,33.7754],[134.63102,33.77487],[134.50018,33.77493],[134.49978,33.95855],[134.4582,33.95874],[134.45816,34.00006],[134.34679,33.99889],[134.06047,33.99988],[133.74955,34.00047],[133.74998,34.33337],[133.875,34.33342],[133.87494,34.41668],[133.95888,34.41683],[133.95843,34.44157],[133.85055,34.44157],[133.84966,34.46621],[133.82537,34.46704],[133.81642,34.44222],[133.84205,34.43326],[133.84194,34.41656],[133.75822,34.41715],[133.74122,34.44175],[133.6913,34.44152],[133.69085,34.45739],[133.69097,34.46639],[133.70004,34.48346],[133.61655,34.48355],[133.61689,34.45827],[133.53351,34.45887],[133.53329,34.41752],[133.4897,34.41743],[133.46642,34.43313],[133.46631,34.44992],[133.4503,34.45002],[133.45008,34.4166],[133.41713,34.41696],[133.41668,34.35786],[133.34174,34.3583],[133.30304,34.37515],[133.2748,34.35876],[133.21655,34.35],[133.16694,34.35007],[133.16662,34.36659],[133.09184,34.36659],[133.09176,34.3417],[133.05837,34.34164],[133.05829,34.32491],[132.90003,34.32517],[132.89148,34.29164],[132.7917,34.29164],[132.79133,34.28281],[132.792,34.24212],[132.77492,34.22513],[132.71629,34.22499],[132.71652,34.21655],[132.75854,34.21636],[132.775,34.20877],[132.79218,34.20095],[132.79223,34.14177],[132.74138,34.14173],[132.70838,34.16655],[132.63354,34.16665],[132.61664,34.1917],[132.59185,34.1916],[132.5749,34.1666],[132.54155,34.16674],[132.54178,34.14196],[132.42515,34.14165],[132.42503,34.16657],[132.3749,34.16663],[132.37515,34.18348],[132.40833,34.18343],[132.3752,34.2168],[132.34991,34.23331],[132.35014,34.25834],[132.35814,34.25843],[132.35819,34.27503],[132.33922,34.25834],[132.29166,34.22494],[132.24992,34.22494],[132.25003,34.2043],[132.25809,34.18324],[132.28327,34.18352],[132.28321,34.19995],[132.29183,34.20837],[132.32501,34.20847],[132.31684,34.1753],[132.25843,34.17533],[132.25843,34.14171],[132.2502,34.11675],[132.21669,34.11684],[132.21685,34.0585],[132.22491,34.05827],[132.22502,33.99163],[132.21669,33.99177],[132.21652,33.97516],[132.25037,33.97526],[132.25014,33.91622],[131.95761,33.91733],[131.95783,33.92512],[131.91755,33.92495],[131.91586,33.95863],[131.88699,33.96671],[131.87569,33.95891],[131.84973,33.92502],[131.80049,33.92439],[131.79948,33.95046],[131.7752,33.95057],[131.75058,33.9668],[131.70828,33.97508],[131.70918,33.92551],[131.68366,33.92513],[131.68321,33.95056],[131.6916,33.96717],[131.69988,33.98323],[131.68332,33.99937],[131.68354,34.01681],[131.69999,34.017],[131.70011,34.03314],[131.68209,34.03352],[131.67515,34.02581],[131.62513,34.02488],[131.59122,33.97515],[131.38721,33.97497],[131.29981,33.91685],[131.16675,33.91667],[131.1172,33.97473],[131.06078,34.02462],[131.03349,34.02557],[131.04198,34.00848],[131.04175,33.7381]],[[135.98583,35.86595],[135.93905,35.95517],[135.95723,36.1316],[136.15271,36.29666],[136.6596,36.75695],[136.65846,37.00603],[136.66642,37.33477],[136.85167,37.42328],[137.11307,37.5288],[137.31877,37.54953],[137.39151,37.50356],[137.34765,37.35791],[137.20218,37.24762],[137.09307,37.06828],[137.0223,36.83795],[137.09532,36.80133],[137.22971,36.77368],[137.35387,36.80451],[137.39706,36.90966],[137.50588,36.95883],[137.72267,37.01579],[137.95199,37.10656],[138.053,37.16975],[138.18626,37.18254],[138.28854,37.24861],[138.43501,37.34512],[138.54909,37.41229],[138.61842,37.49225],[138.73903,37.51536],[138.78378,37.5674],[138.82185,37.62796],[138.91491,37.63009],[138.924,37.6032],[139.01321,37.59757],[139.01421,37.53507],[139.03452,37.52325],[139.03793,37.45798],[139.04887,37.42358],[139.13027,37.42312],[139.23881,37.4326],[139.26282,37.33326],[139.12289,37.32784],[139.11408,37.26354],[139.11422,37.16748],[139.05555,37.16658],[138.82825,37.17133],[138.87072,37.2338],[138.89104,37.31316],[138.72965,37.33259],[138.71403,37.29474],[138.71715,37.1642],[138.53517,37.16533],[138.39907,37.16692],[138.37478,37.13261],[138.3725,36.99907],[138.08823,36.99839],[138.08596,36.91586],[137.89233,36.91768],[137.87798,36.83517],[137.66517,36.8321],[137.52111,36.83142],[137.51216,36.74222],[137.39482,36.74427],[137.37138,36.58325],[137.29367,36.58371],[137.18016,36.55028],[137.21383,36.53133],[137.26384,36.33176],[136.63321,36.33496],[136.50436,36.29227],[136.39412,36.29444],[136.38034,36.25493],[136.37778,36.17665],[136.38218,36.09507],[136.38758,36.00065],[136.2593,35.99399],[136.25532,35.90923],[136.24992,35.83337],[136.12207,35.82876],[136.11184,35.88725],[136.05984,35.91165],[136.01793,35.86676],[135.98583,35.86595]],[[140.03281,37.29986],[140.03344,37.34643],[140.03344,37.47427],[140.03407,37.48281],[139.99973,37.48356],[140.00036,37.44198],[139.94212,37.44173],[139.94197,37.35007],[139.89116,37.35007],[139.89116,37.41698],[139.81725,37.41647],[139.81266,37.57468],[139.74192,37.57556],[139.74224,37.79174],[139.81789,37.79162],[139.98296,37.79112],[139.98359,37.58334],[140.0412,37.58334],[140.04151,37.47502],[140.1591,37.47528],[140.15815,37.63311],[140.3745,37.63399],[140.37481,37.83338],[140.5,37.83525],[140.49989,37.91662],[140.53144,37.9168],[140.62489,37.9167],[140.62489,37.84641],[140.62534,37.33359],[140.57502,37.33284],[140.57486,37.25881],[140.4579,37.25855],[140.45774,37.2084],[140.2501,37.20866],[140.24994,37.29998],[140.03281,37.29986]],[[141.00075,38.16707],[140.84264,38.16752],[140.68779,38.16405],[140.70788,38.09499],[140.70868,38.03346],[140.61627,38.03362],[140.53369,38.11364],[140.5359,38.14478],[140.61948,38.14478],[140.62471,38.2048],[140.6231,38.27376],[140.63073,38.33902],[140.81255,38.33698],[141.00362,38.33398],[141.00075,38.16707]],[[129.44454,34.73675],[129.52524,34.65452],[129.35703,34.19046],[129.23088,34.06063],[129.15132,34.11616],[129.27179,34.63488],[129.44454,34.73675]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan"},{id:"gsi.go.jp_std_map",name:"Japan GSI Standard Map",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/std/{zoom}/{x}/{y}.png",zoomExtent:[5,18],polygon:[[[141.85547,44.64912],[140.22949,43.9691],[138.95508,41.80408],[139.48242,40.17887],[138.86719,38.30718],[136.31836,37.19533],[132.14355,35.13788],[128.93555,33.35806],[129.50684,32.4727],[129.77051,31.69078],[130.20996,30.90223],[131.2207,30.78904],[131.66016,32.32428],[132.71484,32.87959],[133.76953,33.17434],[136.75781,33.87042],[139.30664,35.06597],[140.88867,35.17381],[141.15234,36.5626],[142.11914,39.94344],[141.76758,42.68243],[141.85547,44.64912]]],terms_url:"https://maps.gsi.go.jp/help/use.html",terms_text:"GSI Japan"},{id:"Aargau-AGIS-2014",name:"Kanton Aargau 25cm (AGIS 2014)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[8.09602,47.57882],[8.10323,47.57879],[8.10323,47.58583],[8.10591,47.58732],[8.11019,47.58878],[8.11589,47.5893],[8.12168,47.58916],[8.12546,47.58873],[8.12959,47.58888],[8.13023,47.59122],[8.132,47.59358],[8.13506,47.59546],[8.13831,47.59698],[8.14161,47.59939],[8.14534,47.60076],[8.14961,47.60144],[8.15438,47.60127],[8.15751,47.60063],[8.16119,47.59914],[8.16255,47.59976],[8.16438,47.60148],[8.16653,47.60399],[8.17087,47.60673],[8.17608,47.60838],[8.17912,47.60868],[8.18153,47.6118],[8.18304,47.61489],[8.18498,47.6176],[8.18953,47.62151],[8.19212,47.62321],[8.22261,47.623],[8.22561,47.6212],[8.22849,47.61842],[8.22959,47.61621],[8.23008,47.61501],[8.23261,47.61686],[8.23657,47.61803],[8.24,47.61835],[8.24351,47.61783],[8.24749,47.61877],[8.25066,47.61988],[8.25708,47.6208],[8.26104,47.62069],[8.26491,47.61935],[8.26732,47.61769],[8.26902,47.61531],[8.27579,47.61702],[8.28106,47.61707],[8.28772,47.61626],[8.29421,47.61442],[8.29947,47.61221],[8.30311,47.60977],[8.30287,47.59447],[8.30438,47.59227],[8.30591,47.59109],[8.30791,47.59019],[8.31236,47.58917],[8.31655,47.58713],[8.32049,47.58436],[8.32598,47.57888],[8.32864,47.57716],[8.33219,47.57604],[8.33902,47.57577],[8.34702,47.57628],[8.35962,47.57552],[8.36475,47.57436],[8.37207,47.57377],[8.38002,47.57233],[8.38194,47.57496],[8.38387,47.57686],[8.38879,47.58027],[8.39232,47.58174],[8.39611,47.58247],[8.40013,47.58255],[8.40432,47.58158],[8.41158,47.57928],[8.418,47.57602],[8.42381,47.57452],[8.43039,47.57228],[8.43275,47.57035],[8.4336,47.56849],[8.43353,47.56669],[8.4319,47.56444],[8.4286,47.56217],[8.42575,47.56121],[8.4259,47.55854],[8.42498,47.55624],[8.42353,47.55469],[8.42296,47.5537],[8.4246,47.5517],[8.42492,47.54981],[8.42434,47.54836],[8.42539,47.54679],[8.425,47.54418],[8.4233,47.5422],[8.421,47.54106],[8.41832,47.54049],[8.41551,47.54062],[8.4139,47.53924],[8.41283,47.5372],[8.41194,47.53626],[8.41241,47.53415],[8.41185,47.53237],[8.41117,47.53158],[8.40143,47.53169],[8.40124,47.52443],[8.39936,47.5222],[8.39666,47.52082],[8.39385,47.51988],[8.39085,47.51973],[8.38877,47.52014],[8.38809,47.5146],[8.38551,47.51075],[8.38366,47.50944],[8.36776,47.50953],[8.36739,47.48709],[8.3751,47.48689],[8.37889,47.4853],[8.38196,47.48188],[8.38184,47.47521],[8.38328,47.47192],[8.38244,47.46879],[8.37943,47.46643],[8.37751,47.4659],[8.37787,47.46496],[8.38238,47.46423],[8.38671,47.46097],[8.39171,47.45743],[8.39315,47.45349],[8.39514,47.45031],[8.39418,47.44722],[8.39171,47.44535],[8.3896,47.44449],[8.38996,47.44339],[8.39111,47.4416],[8.39213,47.43924],[8.39339,47.4359],[8.39249,47.43411],[8.39369,47.43143],[8.39568,47.42854],[8.39959,47.42463],[8.39953,47.41954],[8.449,47.41897],[8.45369,47.41233],[8.45369,47.40451],[8.44858,47.39649],[8.40362,47.39685],[8.40483,47.39392],[8.4029,47.38903],[8.4035,47.38553],[8.40314,47.38304],[8.40483,47.37905],[8.40844,47.37575],[8.41379,47.37338],[8.4159,47.37016],[8.41584,47.36539],[8.4144,47.36327],[8.41494,47.35912],[8.41722,47.35573],[8.41632,47.35231],[8.41355,47.34913],[8.41367,47.34688],[8.41476,47.3448],[8.41885,47.34244],[8.42264,47.34052],[8.42469,47.33718],[8.42421,47.33163],[8.42914,47.33286],[8.4351,47.33192],[8.43763,47.33281],[8.44328,47.33506],[8.44527,47.33746],[8.45213,47.3402],[8.45761,47.33975],[8.46212,47.33649],[8.46278,47.33322],[8.46043,47.32829],[8.45797,47.32457],[8.45556,47.32005],[8.44918,47.31495],[8.44713,47.31217],[8.44021,47.30948],[8.43624,47.29817],[8.43311,47.29593],[8.42806,47.29397],[8.42318,47.29001],[8.41656,47.28789],[8.41024,47.28728],[8.4035,47.28409],[8.40188,47.2805],[8.40862,47.27593],[8.41066,47.2716],[8.40892,47.26613],[8.41235,47.2618],[8.41235,47.25873],[8.41109,47.25608],[8.41698,47.25142],[8.41885,47.2475],[8.41801,47.24305],[8.4144,47.23904],[8.41373,47.23565],[8.4106,47.23226],[8.40435,47.22797],[8.40296,47.2256],[8.40398,47.22127],[8.40856,47.21718],[8.40928,47.21326],[8.40844,47.20945],[8.41012,47.20258],[8.41319,47.19678],[8.41271,47.1924],[8.4088,47.18799],[8.40814,47.18475],[8.4091,47.1812],[8.41518,47.17915],[8.41915,47.17563],[8.42294,47.16553],[8.42294,47.15747],[8.42011,47.15325],[8.42246,47.14838],[8.42276,47.14392],[8.42053,47.13954],[8.41584,47.13524],[8.40898,47.13274],[8.40386,47.13201],[8.40116,47.13258],[8.39532,47.1327],[8.38437,47.1345],[8.37895,47.13385],[8.37245,47.13442],[8.36908,47.13659],[8.368,47.13876],[8.35656,47.14228],[8.35409,47.14564],[8.35331,47.14916],[8.3506,47.15161],[8.3503,47.15419],[8.34772,47.15669],[8.34561,47.15923],[8.34086,47.16164],[8.33935,47.16512],[8.3373,47.16896],[8.33315,47.17154],[8.33261,47.17351],[8.33062,47.17792],[8.33002,47.18717],[8.32924,47.18786],[8.32936,47.19494],[8.32292,47.19514],[8.32148,47.19854],[8.32196,47.20115],[8.31835,47.21043],[8.31413,47.21178],[8.31089,47.2153],[8.31107,47.21857],[8.31221,47.2198],[8.30884,47.22433],[8.30932,47.22646],[8.30715,47.23042],[8.30727,47.2321],[8.30595,47.23582],[8.30607,47.23949],[8.30378,47.24366],[8.30144,47.24677],[8.29554,47.24836],[8.29187,47.25293],[8.28814,47.25869],[8.28766,47.26143],[8.28627,47.26519],[8.28723,47.26805],[8.28838,47.26964],[8.2823,47.27478],[8.27718,47.27576],[8.27273,47.27531],[8.26749,47.27593],[8.26533,47.27719],[8.2616,47.27695],[8.25793,47.27781],[8.25576,47.27887],[8.25317,47.27678],[8.25034,47.27548],[8.2501,47.27348],[8.24956,47.27017],[8.24559,47.26715],[8.24095,47.26678],[8.23452,47.26727],[8.23145,47.26278],[8.2309,47.25931],[8.22663,47.24942],[8.222,47.24713],[8.21526,47.24431],[8.21363,47.24203],[8.21309,47.23602],[8.21123,47.23246],[8.21285,47.22548],[8.21117,47.22266],[8.20689,47.22053],[8.19762,47.22065],[8.19149,47.21861],[8.16976,47.21865],[8.16543,47.22315],[8.16085,47.22405],[8.15351,47.2294],[8.15171,47.2332],[8.14822,47.23647],[8.14798,47.241],[8.14635,47.24203],[8.13823,47.24166],[8.13558,47.23941],[8.12673,47.23606],[8.1218,47.23631],[8.11614,47.23872],[8.10675,47.23945],[8.10266,47.24113],[8.09983,47.24436],[8.09766,47.2493],[8.09797,47.25069],[8.09339,47.25567],[8.08852,47.2569],[8.08485,47.25583],[8.08323,47.25405],[8.07995,47.25246],[8.0769,47.25054],[8.06854,47.24284],[8.06325,47.24098],[8.05134,47.23865],[8.04857,47.23886],[8.03575,47.23747],[8.0322,47.23555],[8.02714,47.23534],[8.01139,47.23967],[8.00927,47.24116],[8.00791,47.24312],[8.00783,47.24821],[8.00857,47.25042],[8.0084,47.25769],[8.00712,47.25922],[8.00299,47.26162],[8.00052,47.26486],[7.99759,47.26789],[7.99627,47.27271],[7.99474,47.27369],[7.98993,47.27121],[7.97278,47.26907],[7.96857,47.27008],[7.96737,47.27098],[7.95861,47.27112],[7.9601,47.26748],[7.96274,47.26396],[7.96576,47.26171],[7.96699,47.25879],[7.96695,47.25001],[7.95963,47.24582],[7.95112,47.23918],[7.94469,47.236],[7.93733,47.23106],[7.93405,47.23051],[7.9298,47.23077],[7.9178,47.23305],[7.90784,47.23837],[7.89793,47.2377],[7.8695,47.23207],[7.85478,47.22719],[7.85137,47.22713],[7.83958,47.22947],[7.83584,47.22976],[7.83082,47.23259],[7.82707,47.23505],[7.82431,47.23831],[7.82129,47.24042],[7.82014,47.24264],[7.81822,47.24562],[7.81771,47.24917],[7.81822,47.25082],[7.81835,47.25371],[7.81988,47.25587],[7.82116,47.2568],[7.82112,47.25778],[7.8192,47.26058],[7.81912,47.26154],[7.81686,47.26486],[7.8175,47.26731],[7.81958,47.26982],[7.82439,47.27158],[7.82805,47.2721],[7.83592,47.27837],[7.83707,47.28342],[7.84005,47.2872],[7.84201,47.29067],[7.84588,47.29427],[7.84763,47.2982],[7.85137,47.30299],[7.8529,47.30741],[7.85571,47.31032],[7.86065,47.31254],[7.86422,47.31349],[7.87018,47.31672],[7.87631,47.31736],[7.88082,47.31716],[7.88337,47.31667],[7.88588,47.31941],[7.88886,47.32131],[7.88805,47.32443],[7.88907,47.3287],[7.8915,47.33262],[7.8978,47.34014],[7.9001,47.34156],[7.90005,47.3432],[7.90222,47.34557],[7.90635,47.34704],[7.90963,47.34735],[7.91359,47.34626],[7.91618,47.34456],[7.91699,47.34303],[7.92401,47.33899],[7.93839,47.33792],[7.94929,47.33784],[7.95431,47.33596],[7.95593,47.33317],[7.95691,47.32968],[7.95571,47.32535],[7.96993,47.32797],[7.97308,47.33017],[7.98333,47.33432],[7.98563,47.33692],[7.98954,47.33818],[7.99248,47.33827],[7.99784,47.34017],[7.99635,47.34257],[7.99601,47.34588],[7.99733,47.34859],[8.00116,47.35081],[8.00137,47.3569],[8.00261,47.3577],[8.00418,47.36044],[8.00976,47.36419],[8.01125,47.36598],[8.01746,47.36926],[8.01912,47.37157],[8.0198,47.37376],[8.02023,47.37598],[8.02172,47.37837],[8.02193,47.38093],[8.02282,47.38286],[8.02078,47.38857],[8.01606,47.38929],[8.01265,47.38897],[8.00772,47.39012],[8.00367,47.39205],[8.00163,47.39479],[8.00155,47.39998],[8.00023,47.40306],[7.99801,47.40453],[7.99261,47.40551],[7.98776,47.40637],[7.98418,47.40839],[7.98027,47.4081],[7.9732,47.41127],[7.96963,47.41383],[7.95695,47.41893],[7.95529,47.4218],[7.95593,47.42402],[7.95746,47.42621],[7.96274,47.42828],[7.97746,47.43254],[7.97567,47.43732],[7.97614,47.44138],[7.97431,47.44368],[7.95129,47.45111],[7.94861,47.4539],[7.94818,47.4566],[7.94678,47.45755],[7.94039,47.45669],[7.93588,47.45738],[7.93631,47.47625],[7.9318,47.47605],[7.92469,47.47717],[7.91571,47.47743],[7.90903,47.47947],[7.90316,47.47967],[7.90295,47.48965],[7.8969,47.4898],[7.8918,47.49405],[7.89086,47.49765],[7.8878,47.49931],[7.88631,47.5023],[7.87999,47.50397],[7.87403,47.50787],[7.86994,47.50944],[7.87006,47.51239],[7.86435,47.51245],[7.85851,47.51543],[7.8558,47.51854],[7.85625,47.52147],[7.8549,47.52474],[7.85183,47.5285],[7.84647,47.52714],[7.84148,47.52777],[7.8413,47.52406],[7.84015,47.51587],[7.83943,47.51259],[7.83688,47.51256],[7.83679,47.51049],[7.83352,47.50949],[7.83156,47.50765],[7.82981,47.50552],[7.82522,47.50354],[7.82049,47.5004],[7.81475,47.49491],[7.81181,47.49261],[7.80645,47.4914],[7.80403,47.49146],[7.80049,47.49014],[7.77977,47.49028],[7.77871,47.49304],[7.7796,47.496],[7.78386,47.5004],[7.78203,47.50368],[7.78088,47.5073],[7.78109,47.51018],[7.77977,47.51265],[7.77969,47.51529],[7.77045,47.51802],[7.75905,47.52003],[7.75266,47.52009],[7.74781,47.51957],[7.73368,47.52291],[7.72781,47.52719],[7.71985,47.52978],[7.71262,47.53095],[7.70764,47.5344],[7.70551,47.53917],[7.70696,47.54279],[7.71415,47.54627],[7.72245,47.54756],[7.749,47.54977],[7.75428,47.55339],[7.76654,47.55615],[7.77168,47.55761],[7.78007,47.55836],[7.78577,47.55982],[7.7902,47.5616],[7.79398,47.56634],[7.80492,47.57237],[7.80611,47.57989],[7.81173,47.58954],[7.81577,47.59218],[7.82211,47.59352],[7.83645,47.59163],[7.83952,47.59045],[7.84305,47.58778],[7.84875,47.58899],[7.85624,47.59189],[7.86488,47.59393],[7.87126,47.5943],[7.87726,47.59367],[7.88535,47.59424],[7.89343,47.59301],[7.90109,47.58976],[7.90833,47.58514],[7.91386,47.57923],[7.91867,47.57194],[7.91956,47.56772],[7.91875,47.56433],[7.9156,47.56008],[7.91577,47.55715],[7.91841,47.55405],[7.92126,47.55261],[7.92552,47.55227],[7.93471,47.55221],[7.9405,47.55078],[7.94326,47.54968],[7.94356,47.55052],[7.94458,47.55589],[7.94841,47.55979],[7.95394,47.56229],[7.96003,47.56333],[7.96577,47.56272],[7.97203,47.5612],[7.97833,47.56057],[7.98624,47.56094],[7.99718,47.56212],[8.0045,47.56137],[8.01114,47.55974],[8.01641,47.55701],[8.02046,47.55574],[8.0262,47.55741],[8.03799,47.55876],[8.04254,47.56028],[8.0485,47.56333],[8.05454,47.56798],[8.05931,47.56921],[8.0622,47.56895],[8.06693,47.57002],[8.07242,47.56973],[8.07739,47.56795],[8.08182,47.56436],[8.08522,47.56281],[8.08791,47.56298],[8.09259,47.56559],[8.09395,47.56809],[8.09484,47.57587],[8.09602,47.57882]]],terms_text:"AGIS OF2014"},{id:"Aargau-AGIS-2016",name:"Kanton Aargau 25cm (AGIS 2016)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[7.70438,47.55794],[7.77076,47.55772],[7.77103,47.58025],[7.80408,47.58017],[7.80433,47.60248],[7.93713,47.60217],[7.93703,47.57962],[8.00374,47.57917],[8.00338,47.55687],[8.0364,47.55665],[8.03681,47.57928],[8.10313,47.57881],[8.10387,47.60112],[8.17011,47.60086],[8.17036,47.6235],[8.30311,47.62235],[8.30305,47.59988],[8.3362,47.59927],[8.33585,47.5771],[8.36913,47.57694],[8.36943,47.59931],[8.43564,47.59877],[8.43454,47.53133],[8.40144,47.53162],[8.40096,47.50926],[8.3678,47.50959],[8.3675,47.48698],[8.40042,47.48666],[8.39939,47.41929],[8.46558,47.4187],[8.46515,47.39647],[8.43206,47.39654],[8.43125,47.3516],[8.46434,47.35128],[8.46327,47.28387],[8.42997,47.28421],[8.42714,47.12676],[8.3293,47.12753],[8.32937,47.13007],[8.32833,47.13007],[8.3285,47.14529],[8.3294,47.19502],[8.2964,47.19526],[8.29714,47.24022],[8.2641,47.24046],[8.26446,47.26297],[8.23141,47.26316],[8.23075,47.21822],[8.09886,47.21912],[8.09874,47.24135],[8.066,47.24176],[8.06552,47.2192],[7.99993,47.21952],[8.00003,47.26433],[7.96735,47.26462],[7.96675,47.21961],[7.80153,47.22029],[7.80244,47.28791],[7.83518,47.28772],[7.83543,47.31017],[7.86837,47.31017],[7.86885,47.35542],[8.00097,47.3543],[8.00156,47.39928],[7.9353,47.39976],[7.93607,47.46716],[7.90278,47.46729],[7.90303,47.48981],[7.86987,47.48998],[7.86993,47.5125],[7.83689,47.51258],[7.83665,47.4901],[7.77027,47.49026],[7.77045,47.51274],[7.70452,47.51307],[7.70438,47.55794]]],terms_text:"AGIS OF2016",best:true},{id:"Basel-Landschaft-2015",name:"Kanton Basel-Landschaft 10cm (2015)",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[18,21],polygon:[[[7.37028,47.41368],[7.35758,47.41508],[7.35792,47.41827],[7.35354,47.41961],[7.34488,47.42402],[7.33973,47.42971],[7.33269,47.43024],[7.32685,47.43192],[7.32528,47.43489],[7.3305,47.44176],[7.33899,47.44109],[7.34496,47.43608],[7.35266,47.43436],[7.3812,47.43208],[7.37599,47.41431],[7.37815,47.414],[7.38204,47.41331],[7.38839,47.41398],[7.41371,47.41093],[7.42074,47.4111],[7.42748,47.41448],[7.43811,47.41274],[7.4484,47.41507],[7.45558,47.42792],[7.45062,47.43534],[7.43784,47.44632],[7.42542,47.44328],[7.4209,47.44594],[7.42242,47.45072],[7.4288,47.45388],[7.43003,47.45949],[7.44577,47.46197],[7.44717,47.45696],[7.45651,47.44926],[7.49236,47.45897],[7.53068,47.46119],[7.52745,47.47391],[7.53633,47.48383],[7.53623,47.49105],[7.5326,47.49097],[7.53179,47.4974],[7.52004,47.49678],[7.51223,47.49892],[7.50935,47.50888],[7.49908,47.51628],[7.49787,47.52125],[7.50228,47.51491],[7.51746,47.51728],[7.5222,47.51409],[7.53096,47.52905],[7.51935,47.53472],[7.51075,47.52899],[7.5023,47.5284],[7.49804,47.53615],[7.50545,47.54438],[7.51676,47.54541],[7.52732,47.55278],[7.55466,47.56437],[7.56458,47.55704],[7.56124,47.55172],[7.55875,47.55235],[7.55588,47.54434],[7.56479,47.54569],[7.58726,47.5419],[7.58269,47.53247],[7.58948,47.52792],[7.59025,47.51979],[7.59478,47.51929],[7.61378,47.53925],[7.6223,47.53977],[7.62285,47.55004],[7.61774,47.55437],[7.61762,47.55865],[7.63273,47.56149],[7.63997,47.55816],[7.649,47.5483],[7.66131,47.54483],[7.66586,47.53746],[7.67467,47.53375],[7.69494,47.5325],[7.71347,47.53978],[7.71596,47.53582],[7.72362,47.53675],[7.72716,47.53293],[7.73322,47.53275],[7.73797,47.52732],[7.74902,47.52498],[7.75786,47.52605],[7.78763,47.52012],[7.79014,47.51864],[7.78887,47.50683],[7.7928,47.50068],[7.78663,47.49312],[7.79889,47.49565],[7.79816,47.4994],[7.7994,47.49748],[7.80742,47.49714],[7.81471,47.5048],[7.83198,47.51474],[7.83321,47.53382],[7.84653,47.53266],[7.85233,47.53524],[7.86257,47.52692],[7.86396,47.51931],[7.87666,47.52269],[7.87567,47.51319],[7.89399,47.50606],[7.90477,47.49218],[7.90482,47.48491],[7.93329,47.48141],[7.94702,47.48489],[7.94003,47.46202],[7.94885,47.46378],[7.95761,47.45881],[7.95785,47.45128],[7.94678,47.44319],[7.95003,47.43172],[7.96183,47.42183],[7.95657,47.41968],[7.95504,47.41561],[7.94839,47.41627],[7.93493,47.41177],[7.93672,47.40806],[7.93266,47.40527],[7.90974,47.39852],[7.89022,47.40714],[7.88333,47.4061],[7.88344,47.4012],[7.8777,47.40126],[7.86914,47.39551],[7.87943,47.38799],[7.87881,47.38351],[7.86265,47.38198],[7.84012,47.37476],[7.83055,47.36512],[7.80217,47.3611],[7.79637,47.35347],[7.79356,47.33905],[7.78529,47.33788],[7.76896,47.33891],[7.76642,47.34273],[7.75152,47.34433],[7.73415,47.35776],[7.72791,47.36886],[7.70195,47.37245],[7.6442,47.36721],[7.64176,47.38047],[7.63558,47.38059],[7.63332,47.38291],[7.63331,47.38534],[7.63725,47.38607],[7.63272,47.41003],[7.66405,47.41002],[7.6798,47.41751],[7.68658,47.43366],[7.68297,47.43872],[7.68485,47.44784],[7.69227,47.45421],[7.69883,47.45586],[7.69993,47.46191],[7.70988,47.46938],[7.69976,47.48063],[7.66833,47.48635],[7.66612,47.49687],[7.65217,47.49581],[7.64865,47.49183],[7.65539,47.49021],[7.65051,47.48826],[7.65593,47.48739],[7.64442,47.48564],[7.64097,47.48273],[7.6073,47.4894],[7.60885,47.48353],[7.60563,47.47936],[7.60815,47.47521],[7.60449,47.47045],[7.61887,47.46745],[7.62607,47.46291],[7.62217,47.46195],[7.61646,47.44523],[7.6158,47.43275],[7.59207,47.43271],[7.58121,47.42878],[7.57842,47.43491],[7.5689,47.4369],[7.5683,47.42233],[7.58074,47.4147],[7.52524,47.41163],[7.53117,47.40353],[7.51862,47.38822],[7.5113,47.38974],[7.50226,47.38481],[7.49233,47.38523],[7.47841,47.39056],[7.47747,47.40128],[7.46448,47.40251],[7.46092,47.40068],[7.45002,47.40393],[7.44951,47.39976],[7.4434,47.40231],[7.44131,47.40018],[7.44357,47.3889],[7.43732,47.38089],[7.41169,47.38057],[7.41628,47.38479],[7.41449,47.3943],[7.39894,47.39684],[7.39592,47.40338],[7.38869,47.40302],[7.38405,47.41236],[7.37968,47.41281],[7.37584,47.41401],[7.37028,47.41368]]],terms_url:"https://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p2.pdf",terms_text:"Geodaten des Kantons Basel-Landschaft 2015",best:true},{id:"KTBASELSTADT2015",name:"Kanton Basel-Stadt 2015",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.492,47.4817],[7.492,47.6342],[7.784,47.6342],[7.784,47.4817],[7.492,47.4817]]],terms_text:"Kanton Basel-Stadt OF 2015"},{id:"KTBASELSTADT2017",name:"Kanton Basel-Stadt 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.67138,47.59522],[7.67996,47.60078],[7.68451,47.60182],[7.69438,47.60171],[7.69395,47.59667],[7.68708,47.59355],[7.67884,47.58712],[7.68571,47.58538],[7.68906,47.57612],[7.69412,47.5734],[7.6924,47.56691],[7.6847,47.5617],[7.66425,47.56164],[7.64872,47.55689],[7.63035,47.55869],[7.62357,47.55666],[7.62786,47.55145],[7.62738,47.53658],[7.61833,47.53662],[7.61335,47.53262],[7.59962,47.51911],[7.58503,47.51917],[7.58409,47.52636],[7.57713,47.53163],[7.58125,47.53986],[7.5719,47.54148],[7.55387,47.54148],[7.55379,47.55122],[7.55653,47.55828],[7.5537,47.56031],[7.55379,47.57473],[7.56434,47.58122],[7.57936,47.57988],[7.58331,47.59019],[7.58563,47.59233],[7.59207,47.59239],[7.59851,47.59071],[7.60915,47.58643],[7.60923,47.5811],[7.6191,47.58046],[7.63687,47.59314],[7.63782,47.59557],[7.64168,47.59887],[7.64528,47.60026],[7.66494,47.59618],[7.67138,47.59522]]],terms_text:"Kanton Basel-Stadt OF 2017",best:true},{id:"Solothurn-sogis2014-tms",name:"Kanton Solothurn (SOGIS)",type:"tms",template:"https://mapproxy.osm.ch/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[15,19],polygon:[[[7.95595,47.47162],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39022],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.94122,47.30978],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84832,47.27416],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24777],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.6499,47.22083],[7.66308,47.22073],[7.6631,47.21178],[7.66297,47.20273],[7.67617,47.2027],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53095,47.13097],[7.51767,47.13097],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47813,47.07705],[7.46493,47.07708],[7.46498,47.06807],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.3727,47.15796],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.20287],[7.33307,47.2029],[7.33307,47.22096],[7.34614,47.22096],[7.34614,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.5046,47.29288],[7.50473,47.30183],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.3988,47.36484],[7.39889,47.39182],[7.38564,47.39181],[7.38564,47.4008],[7.37234,47.4008],[7.37234,47.40978],[7.34584,47.40978],[7.34584,47.41878],[7.31925,47.41878],[7.31925,47.44578],[7.4121,47.44578],[7.4121,47.49078],[7.42535,47.49078],[7.42535,47.49981],[7.43856,47.49981],[7.43856,47.50876],[7.49177,47.50876],[7.49178,47.63468],[7.7845,47.63428],[7.78415,47.57123],[7.81074,47.57114],[7.81074,47.56216],[7.82395,47.56206],[7.82387,47.54414],[7.86368,47.54397],[7.86363,47.53498],[7.87679,47.53495],[7.87675,47.52599],[7.8901,47.52596],[7.89006,47.51695],[7.90319,47.51692],[7.9031,47.49886],[7.91649,47.49883],[7.91645,47.48976],[7.95612,47.48967],[7.95595,47.47162]]],terms_text:"Orthofoto WMS Solothurn",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"Solothurn-infrared-SOGIS",name:"Kanton Solothurn Infrarot (SOGIS)",type:"wms",template:"https://geoweb.so.ch/wms/sogis_orthofoto.wms?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Orthofoto_CIR_SO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[15,19],polygon:[[[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53093,47.12196],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47816,47.09496],[7.49144,47.09499],[7.4914,47.07702],[7.47816,47.07705],[7.4782,47.06804],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.39913,47.15804],[7.39913,47.14901],[7.3727,47.14898],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.19391],[7.33307,47.19394],[7.33307,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.49149,47.29289],[7.49162,47.30184],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.43862,47.36492],[7.43867,47.37389],[7.42538,47.37395],[7.42543,47.40081],[7.38558,47.4009],[7.38567,47.4098],[7.35915,47.4098],[7.35915,47.41878],[7.37239,47.41884],[7.37247,47.43682],[7.38571,47.43682],[7.38571,47.44104],[7.39563,47.44016],[7.3963,47.44258],[7.40761,47.4411],[7.40793,47.44225],[7.40313,47.44246],[7.39738,47.44331],[7.39832,47.44583],[7.41214,47.44583],[7.41228,47.45478],[7.43867,47.45488],[7.4388,47.47053],[7.45007,47.46941],[7.45007,47.47223],[7.44647,47.47223],[7.44647,47.47381],[7.44293,47.4739],[7.44288,47.47553],[7.43921,47.4756],[7.43921,47.4772],[7.43557,47.47729],[7.43548,47.47899],[7.4174,47.47896],[7.41744,47.48573],[7.42099,47.48573],[7.42108,47.49082],[7.42763,47.49073],[7.42852,47.49349],[7.43099,47.49643],[7.43485,47.49889],[7.4419,47.49552],[7.44665,47.49455],[7.45011,47.49176],[7.45087,47.4907],[7.46451,47.49073],[7.46456,47.48903],[7.46819,47.489],[7.46819,47.48566],[7.47187,47.48573],[7.47192,47.48233],[7.48269,47.48239],[7.48264,47.48388],[7.48623,47.48397],[7.48637,47.48566],[7.48991,47.48566],[7.49,47.4907],[7.4997,47.49073],[7.49965,47.4914],[7.49175,47.49194],[7.49175,47.49513],[7.49822,47.49479],[7.49889,47.49585],[7.49566,47.49628],[7.49171,47.49625],[7.4918,47.49973],[7.50504,47.4997],[7.50504,47.50874],[7.5448,47.50871],[7.54474,47.45482],[7.49169,47.45469],[7.49175,47.44581],[7.46529,47.44577],[7.46522,47.40983],[7.49156,47.40979],[7.49175,47.39192],[7.50489,47.39183],[7.50489,47.40068],[7.51821,47.40077],[7.51834,47.41876],[7.55794,47.41872],[7.55813,47.44581],[7.58453,47.44572],[7.58441,47.43667],[7.61094,47.43662],[7.611,47.4637],[7.59767,47.4637],[7.59793,47.49964],[7.62433,47.49969],[7.62445,47.4906],[7.63778,47.49055],[7.63784,47.4996],[7.67757,47.49947],[7.67745,47.49047],[7.70385,47.49043],[7.70391,47.48146],[7.71711,47.48129],[7.71711,47.45452],[7.70397,47.45452],[7.70385,47.44559],[7.69046,47.44551],[7.69033,47.40957],[7.67713,47.40949],[7.67713,47.40068],[7.65066,47.40068],[7.65047,47.37365],[7.67706,47.37357],[7.67706,47.38251],[7.71667,47.38251],[7.71679,47.37344],[7.74307,47.3734],[7.74307,47.35538],[7.7562,47.35534],[7.75633,47.3464],[7.78261,47.34627],[7.78292,47.36433],[7.79612,47.36428],[7.79619,47.37327],[7.82265,47.37314],[7.82271,47.38229],[7.84912,47.38212],[7.84924,47.39106],[7.86251,47.39097],[7.86263,47.40906],[7.8759,47.40897],[7.87602,47.41803],[7.90242,47.41795],[7.90242,47.40897],[7.92889,47.4088],[7.92914,47.41782],[7.94215,47.41769],[7.94266,47.46276],[7.95592,47.46259],[7.95612,47.47164],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39015],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.9412,47.30992],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84843,47.27415],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24765],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.66305,47.22971],[7.6631,47.21178],[7.67621,47.21169],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70248,47.16663],[7.71567,47.16663],[7.71558,47.15769],[7.70239,47.15766],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792]]],terms_text:"Orthofoto WMS Solothurn",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"KTTHURGAU2017",name:"Kanton Thurgau OF 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTTHURGAU2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[8,21],polygon:[[[8.63768,47.70041],[8.78328,47.6988],[8.78304,47.68533],[8.87027,47.68427],[8.86997,47.6709],[8.89901,47.67047],[8.89867,47.65698],[8.9277,47.65661],[8.92828,47.67015],[8.95726,47.66973],[8.95774,47.68327],[9.19061,47.67994],[9.19027,47.66645],[9.21922,47.66603],[9.21899,47.65256],[9.24784,47.6521],[9.24747,47.63864],[9.3057,47.63765],[9.30526,47.6242],[9.33417,47.62371],[9.33348,47.59674],[9.39151,47.59577],[9.39114,47.58235],[9.42007,47.58176],[9.4186,47.54139],[9.44754,47.54084],[9.44717,47.5273],[9.47605,47.52681],[9.47519,47.49986],[9.50414,47.49935],[9.5031,47.47242],[9.41596,47.47392],[9.41554,47.46045],[9.3576,47.46141],[9.35818,47.47498],[9.32896,47.47534],[9.32864,47.46188],[9.18361,47.4642],[9.18411,47.47769],[9.15492,47.4781],[9.15466,47.46463],[9.06736,47.46583],[9.06718,47.45234],[9.09609,47.45193],[9.09582,47.43853],[9.06663,47.43883],[9.06642,47.42537],[9.00829,47.4262],[9.00714,47.38573],[8.97811,47.38616],[8.9774,47.35913],[8.9194,47.35989],[8.92032,47.38697],[8.89136,47.38725],[8.89286,47.44117],[8.86398,47.44149],[8.86604,47.52251],[8.80784,47.52317],[8.80894,47.56373],[8.77985,47.56403],[8.78024,47.57751],[8.72209,47.57814],[8.72337,47.63213],[8.6652,47.63273],[8.6658,47.6598],[8.63674,47.66],[8.63768,47.70041]]],terms_text:"Kanton Thurgau OF 2017",best:true},{id:"KTZUERICH2015",name:"Kanton Zürich 2015  10cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTZUERICH2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Kanton Zürich Orthophotos 2014/2015",best:true},{id:"Kanton-Zuerich-2015",name:"Kanton Zürich Orthophotos 2014/2015 10cm",type:"wms",template:"https://wms.zh.ch/OrthoZHWMS?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orthophotos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Kanton Zürich Orthophotos 2014/2015",best:true},{id:"kartverket-abas",name:"Kartverket Administrative Boundaries overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.adm_enheter?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=avtaltavgrensningslinje,territorialgrense,riksgrense,fylker,kommuner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/data/Kartdata/Grenser/",terms_text:"© Kartverket",description:"Official administrative boundaries at the national, county and municipality levels",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-luftfartshindre",name:"Kartverket Aviation Obstructions overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.nrl?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nrl3_wms&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[7,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartverket.no/kart/Nasjonalt-register-over-luftfartshindre/",terms_text:"© Kartverket",description:"Vertical obstructions to aircrafts, above 15m in rural areas and 30m in urban areas (e.g. masts, towers, high buildings, power lines)",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-matrikkel",name:"Kartverket Cadastral overlay",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.matrikkel?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=matrikkel_WMS&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[14,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.seeiendom.no/",terms_text:"© Kartverket",description:"Real estate boundaries from the official land register (`matrikkelen´). Monthly update.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-hoydekurver",name:"Kartverket Contour Lines overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.topo4?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=hoydetall5linje,hoydetall5punkt,hoydepunkt,vannpunkt,hoydekurver_1m,hoydekurver_5m,N50Hoydekurver,N250Hoydekurver,N500Hoydekurver,N1000Hoydekurver,N2000Hoydekurver&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[9,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/Prosjekter/Nasjonal-detaljert-hoydemodell/",terms_text:"© Kartverket",description:"Contours for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-dom-skygge",name:"Kartverket DOM Digital Surface Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dom_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dom_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital surface model (DOM), i.e. earth surface including trees, buildings and other objects on top of it.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-dtm-skygge",name:"Kartverket DTM Digital Terrain Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dtm_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dtm_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital terrain model (DTM), i.e. earth surface without trees, buildings and other objects.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-ok-1st",name:"Kartverket Economic Maps (historic)",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.n5raster2?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n5raster_foerstegang_metadata,n5raster_foerstegang&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[11,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kunnskap/historie/kartverkets-historiske-arkiv/",terms_text:"© Kartverket",description:"1st edition of historic Economic maps for Norway 1960-90s (`Økonomisk kartverk´). Available from zoom 16. Please correct local imagery offset.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-friluft",name:"Kartverket Hiking Trails",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.friluftsruter2?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Fotrute&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://kartverket.no/geodataarbeid/temadata/nasjonal-database-for-tur--og-friluftsruter/",terms_text:"© Kartverket",description:"Hiking trails from the Norwegian database `Tur- og Friluftsruter´, including DNT routes.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-fjellskygge",name:"Kartverket Hillshade overlay",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=fjellskygge&zoom={zoom}&x={x}&y={y}",zoomExtent:[9,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartkatalog.geonorge.no/metadata/kartverket/fjellskygge-cache/cca7c129-fe66-4c96-9091-40d92290dd81",terms_text:"© Kartverket",description:"Hillshade for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-historic",name:"Kartverket Historic maps",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.historiskekart?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=amt1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kart/historiske-kart/",terms_text:"© Kartverket",description:"Historic maps - for the time being `Amtskartserien´ 1826-1917.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-topo4",name:"Kartverket N50 topo",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom={zoom}&x={x}&y={y}",zoomExtent:[3,15],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://wiki.openstreetmap.org/wiki/No:Kartverket_import",terms_text:"© Kartverket",description:"Topographic map N50, equivalent to Norway 1:50.000 paper map series.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-sjokart",name:"Kartverket Nautical Charts",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=sjokartraster&zoom={zoom}&x={x}&y={y}",zoomExtent:[3,20],polygon:[[[-15.01273,-60.16205],[33.3326,-60.17016],[33.32144,-73.0009],[-15.0239,-72.99613],[-15.01273,-60.16205]],[[-173.00076,-70.54952],[-125.00321,-70.54878],[-125.00167,-78.99977],[-172.99922,-79.0002],[-173.00076,-70.54952]],[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"https://www.kartverket.no/Kart/Sjokart/",terms_text:"© Kartverket",description:"Norwegian nautical charts (includes Spitsbergen/Svalbard and Antarctica). Raster representation of paper charts. Updated biweekly.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-vegnett",name:"Kartverket Road Network",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.vegnett?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=all&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.kartverket.no/data/kartdata/vegdata/",terms_text:"© Kartverket",description:"Norwegian road network from the National Road database (NVDB). Colours represent national, county, municipal, private and forest roads + footways/cycleways.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"Katowice-buildings",name:"Katowice: Buildings",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=4,5,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"Katowice-aerial_image",name:"Katowice: Orthophotomap (aerial image)",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"kelowna_2012",name:"Kelowna 2012",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png",endDate:"2012-05-14T00:00:00.000Z",startDate:"2012-05-13T00:00:00.000Z",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],description:"High quality aerial imagery taken for the City of Kelowna"},{id:"kelowna_roads",name:"Kelowna Roads overlay",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],overlay:true},{id:"kystverket-navigasjon",name:"Kystverket Navigational Aid overlay",type:"wms",template:"https://nfs.kystverket.no/arcgis/services/nfs/NFSSistOperativ/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=17,16,15,14,12,10,9,8,7,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[12,19],polygon:[[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"http://kystverket.no/Maritim-infrastruktur/Fyr-og-merker-/",terms_text:"© Kystverket",description:"Beacons, buoys, lights and fairways maintained by the Norwegian Coastal Administration",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg/143px-Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg.png",overlay:true},{id:"landsat_233055",name:"Landsat 233055",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png",endDate:"2013-09-03T00:00:00.000Z",startDate:"2013-09-03T00:00:00.000Z",zoomExtent:[5,14],polygon:[[[-60.855,6.1765],[-60.47626,7.91883],[-62.16169,8.27787],[-62.53225,6.53755],[-60.855,6.1765]]],description:"Recent Landsat imagery"},{id:"osmse-ekonomiska",name:"Lantmäteriet Economic Map 1950–1980",type:"tms",template:"https://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.jpeg",zoomExtent:[3,17],polygon:[[[12.71117,55.2666],[14.38109,55.29163],[19.65453,57.24934],[19.85228,59.75087],[17.77587,61.13794],[18.06151,62.27815],[20.97289,63.5779],[24.35668,65.60842],[23.96117,66.79191],[20.61034,66.45189],[17.13866,63.96632],[11.99706,61.03702],[12.29369,60.31607],[10.70067,58.81375],[12.71117,55.2666]]],terms_url:"https://www.lantmateriet.se",terms_text:"© Lantmäteriet",description:"Scan of \"Economic maps\" ca. 1950–1980",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png"},{id:"lantmateriet-orto1960",name:"Lantmäteriet Historic Orthophoto 1960",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_60&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png"},{id:"lantmateriet-orto1975",name:"Lantmäteriet Historic Orthophoto 1975",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_75&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[17.85131,60.87407],[14.74558,60.53889],[11.60239,59.56416],[10.51799,58.66559],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png"},{id:"lu.geoportail.opendata.ortholatest",name:"Latest available ortho geoportail.lu",type:"tms",template:"https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-06-22T00:00:00.000Z",startDate:"2017-06-14T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",best:true,icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"landsat_047026",name:"Latest southwest British Columbia Landsat",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png",endDate:"2013-09-12T00:00:00.000Z",startDate:"2013-09-12T00:00:00.000Z",zoomExtent:[5,13],polygon:[[[-121.93555,47.78206],[-121.57206,48.64101],[-121.20155,49.48462],[-121.83755,49.60232],[-122.4767,49.71617],[-123.11891,49.82688],[-123.76023,49.93358],[-124.08877,49.08705],[-124.41289,48.22526],[-123.79277,48.11973],[-123.17279,48.01096],[-122.55355,47.89823],[-121.93555,47.78206]]],description:"Recent lower-resolution landsat imagery for southwest British Columbia"},{id:"Lausanne-2012",name:"Lausanne - Orthophoto technique 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.66668,46.49441],[6.61637,46.49406],[6.61636,46.49836],[6.60135,46.49825],[6.60131,46.50227],[6.55923,46.50194],[6.55773,46.59687],[6.72895,46.59805],[6.7304,46.49004],[6.67702,46.48978],[6.67703,46.49011],[6.67345,46.49006],[6.67347,46.49041],[6.66672,46.49036],[6.66668,46.49441]]],terms_url:"http://carto.lausanne.ch/lausanne-gc/",terms_text:"Ville de Lausanne - Orthophoto technique 2012"},{id:"LINZ_NZ_Aerial_Imagery",name:"LINZ NZ Aerial Imagery",type:"tms",template:"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/set=2/EPSG:3857/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data",terms_text:"Sourced from LINZ CC-BY 4.0",best:true},{id:"LINZ_NZ_Topo50_Gridless_Maps",name:"LINZ NZ Topo50 Gridless Maps",type:"tms",template:"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/layer=2343/EPSG:3857/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps",terms_text:"CC BY 4.0 Land Information New Zealand"},{id:"ORT10LT",name:"Lithuania - NŽT ORT10LT",type:"tms",template:"https://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[4,18],polygon:[[[26.21384,55.85075],[26.38583,55.70453],[26.63036,55.68067],[26.62053,55.56892],[26.52422,55.50992],[26.55415,55.38883],[26.43993,55.34794],[26.79197,55.3212],[26.82913,55.27635],[26.74346,55.25399],[26.67648,55.15883],[26.46112,55.12856],[26.35774,55.15054],[26.22963,55.10732],[26.27138,55.07759],[26.20851,54.99741],[26.06191,54.94161],[25.85782,54.9276],[25.74298,54.81506],[25.76261,54.5769],[25.53194,54.34182],[25.67716,54.32381],[25.78573,54.23362],[25.78588,54.15506],[25.55508,54.14619],[25.51095,54.17503],[25.58967,54.22858],[25.51362,54.30785],[25.26893,54.27447],[25.0706,54.13363],[24.95737,54.17206],[24.81338,54.14486],[24.77902,54.09991],[24.87128,54.0349],[24.81957,53.99772],[24.68459,53.96211],[24.69787,54.01714],[24.62591,54.0105],[24.43426,53.90144],[24.35206,53.89679],[24.20161,53.97001],[23.96833,53.9267],[23.91302,53.96968],[23.77812,53.89892],[23.70977,53.93945],[23.53704,53.94307],[23.48224,53.98938],[23.52734,54.04735],[23.48586,54.15323],[23.38679,54.22484],[23.04212,54.31597],[23.01021,54.3828],[22.85469,54.4104],[22.792,54.36332],[22.70234,54.4529],[22.68386,54.58597],[22.74897,54.63198],[22.74297,54.72682],[22.88668,54.8135],[22.8204,54.91198],[22.6424,54.97134],[22.58924,55.07024],[22.0806,55.02448],[22.03241,55.0841],[21.91307,55.08168],[21.64919,55.18081],[21.50151,55.18682],[21.38437,55.2937],[21.27098,55.24501],[21.09836,55.25639],[20.94217,55.28245],[21.08635,55.56183],[21.03995,55.83636],[21.06403,56.06995],[21.20478,56.08117],[21.2308,56.16233],[21.5021,56.2955],[21.72359,56.31382],[21.83566,56.37162],[21.96954,56.37665],[22.0153,56.42428],[22.43727,56.4064],[22.68,56.35159],[22.91917,56.37902],[22.94668,56.41465],[23.09325,56.30464],[23.17034,56.36677],[23.30645,56.38305],[23.55717,56.33382],[23.7648,56.37332],[23.76669,56.32381],[24.019,56.32976],[24.12146,56.2489],[24.28574,56.30064],[24.45415,56.25816],[24.57947,56.28824],[24.62841,56.37533],[24.90238,56.48053],[25.12774,56.20591],[25.57714,56.18241],[25.67312,56.14937],[26.21384,55.85075]]],terms_url:"https://www.geoportal.lt",terms_text:"NŽT ORT10LT",best:true},{id:"mapbox_locator_overlay",name:"Locator Overlay",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,16],overzoom:false,terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Shows major features to help orient you.",overlay:true},{id:"Lodz-buildings",name:"Łódź: Buildings",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/WMS_publikowane/LODZ/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Budynki,Ulice,Adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2015",name:"Łódź: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/Ortofotomapa/Ortofotomapa/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2017",name:"Łódź: Orthophotomap 2017 (aerial image)",type:"wms",template:"https://mapa.lodz.pl/3/services/OGC/Ortofotomapa/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Loire_Atlantique-Orthophotos-2012",name:"Loire-Atlantique - Orthophotos 2012 - 20 cm",type:"tms",template:"http://{switch:a,b,c,d,e,f,g,h}.tiles.cg44.makina-corpus.net/ortho-2012/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"Département de Loire-Atlantique"},{id:"Loire_Atlantique-Orthophotos-2016",name:"Loire-Atlantique - Orthophotos 2016 - 10 cm",type:"wms",template:"https://wms-vuduciel2.makina-corpus.net/geoserver/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=cg44:ortho44-2016&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"© Loire-Atlantique ouverture des données publiques"},{id:"Lombardia-Italy-CTR-DBT",name:"Lombardia - Italy (CTR DBT)",type:"wms",template:"https://www.cartografia.servizirl.it/arcgis/services/wms/ctr_wms/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sfondo%20C.T.R.%2010000&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",terms_text:"CTR DBT 10000 Regione Lombardia"},{id:"Lombardia-Italy-CTR",name:"Lombardia - Italy (CTR)",type:"wms",template:"https://www.cartografia.regione.lombardia.it/ArcGIS10/services/wms/ctr_wms/MapServer/WMSServer?STYLES=&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",terms_text:"Regione Lombardia - Infrastruttura per l'informazione territoriale"},{id:"londrina2011",name:"Londrina Ortofoto 2011",type:"tms",template:"https://siglon.londrina.pr.gov.br/arcgis/rest/services/Imagens/Ortofotos_2011_Paranacidade/MapServer/WMTS/tile/1.0.0/Imagens_Ortofotos_2011_Paranacidade/default/GoogleMapsCompatible/{zoom}/{y}/{x}",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-51.10903,-23.39275],[-51.11015,-23.39112],[-51.11198,-23.3896],[-51.11358,-23.38977],[-51.121,-23.38593],[-51.12225,-23.38511],[-51.12483,-23.3835],[-51.12538,-23.38187],[-51.12482,-23.3777],[-51.12446,-23.37505],[-51.12437,-23.3723],[-51.12244,-23.37033],[-51.12302,-23.36643],[-51.12856,-23.36548],[-51.12832,-23.35884],[-51.12477,-23.35476],[-51.12703,-23.35091],[-51.12412,-23.3468],[-51.12025,-23.34781],[-51.11765,-23.33969],[-51.11265,-23.34129],[-51.1094,-23.33489],[-51.10756,-23.33409],[-51.10486,-23.33398],[-51.10253,-23.33419],[-51.09987,-23.33102],[-51.09801,-23.32936],[-51.09999,-23.32831],[-51.10323,-23.32532],[-51.10473,-23.32319],[-51.10466,-23.32129],[-51.10515,-23.31844],[-51.10636,-23.31575],[-51.10661,-23.31467],[-51.1105,-23.31167],[-51.11158,-23.30842],[-51.0995,-23.30947],[-51.0974,-23.30863],[-51.09512,-23.30745],[-51.09202,-23.30494],[-51.09036,-23.30371],[-51.09205,-23.29875],[-51.09269,-23.2975],[-51.09408,-23.29295],[-51.10074,-23.29332],[-51.10102,-23.28871],[-51.10068,-23.28837],[-51.10085,-23.28778],[-51.09938,-23.28664],[-51.09632,-23.27791],[-51.10285,-23.27302],[-51.10836,-23.27034],[-51.1131,-23.2684],[-51.1316,-23.26534],[-51.13188,-23.26201],[-51.13173,-23.25506],[-51.1329,-23.25468],[-51.13296,-23.25075],[-51.13474,-23.25127],[-51.13534,-23.25133],[-51.13517,-23.24359],[-51.13535,-23.24118],[-51.13752,-23.24219],[-51.13885,-23.2435],[-51.14109,-23.24521],[-51.14717,-23.24318],[-51.14761,-23.23828],[-51.14908,-23.23588],[-51.14977,-23.23681],[-51.15139,-23.23854],[-51.15289,-23.23884],[-51.15384,-23.23895],[-51.1582,-23.23814],[-51.16045,-23.23816],[-51.16035,-23.24658],[-51.15912,-23.24783],[-51.16131,-23.24777],[-51.16659,-23.24594],[-51.17193,-23.24582],[-51.17205,-23.24956],[-51.17424,-23.2484],[-51.17514,-23.24932],[-51.17686,-23.24816],[-51.17947,-23.25169],[-51.18135,-23.25381],[-51.18274,-23.25363],[-51.18379,-23.25326],[-51.18496,-23.2533],[-51.18627,-23.25215],[-51.18665,-23.24748],[-51.19118,-23.24914],[-51.19142,-23.25286],[-51.19369,-23.25278],[-51.19384,-23.26074],[-51.20097,-23.26055],[-51.20127,-23.2426],[-51.20994,-23.24278],[-51.2109,-23.26988],[-51.21969,-23.27222],[-51.22597,-23.27453],[-51.22934,-23.2786],[-51.23452,-23.2816],[-51.23498,-23.28325],[-51.23507,-23.28544],[-51.23371,-23.2859],[-51.23216,-23.28802],[-51.2287,-23.29229],[-51.2274,-23.2946],[-51.22679,-23.29548],[-51.2256,-23.29657],[-51.22393,-23.29721],[-51.22048,-23.30073],[-51.21864,-23.3013],[-51.21668,-23.30212],[-51.21424,-23.30441],[-51.21097,-23.30697],[-51.22328,-23.3183],[-51.22439,-23.31459],[-51.22521,-23.31289],[-51.22512,-23.31258],[-51.22521,-23.31251],[-51.22553,-23.31253],[-51.22595,-23.31239],[-51.22617,-23.31183],[-51.22936,-23.31489],[-51.22802,-23.31661],[-51.22789,-23.31902],[-51.22767,-23.32023],[-51.22723,-23.32151],[-51.22739,-23.32223],[-51.22725,-23.32285],[-51.23033,-23.32558],[-51.23046,-23.32671],[-51.22954,-23.32789],[-51.22916,-23.3305],[-51.22929,-23.33178],[-51.22681,-23.33447],[-51.22602,-23.33657],[-51.22473,-23.33839],[-51.2221,-23.34023],[-51.22257,-23.34196],[-51.22381,-23.34339],[-51.22384,-23.34531],[-51.22441,-23.347],[-51.22454,-23.34829],[-51.22404,-23.34968],[-51.22351,-23.35011],[-51.22382,-23.35077],[-51.22305,-23.35174],[-51.2226,-23.35296],[-51.22587,-23.35481],[-51.2265,-23.36706],[-51.22354,-23.36915],[-51.22367,-23.37968],[-51.22038,-23.38163],[-51.21647,-23.3817],[-51.21416,-23.37995],[-51.20928,-23.37395],[-51.20738,-23.36814],[-51.20629,-23.36723],[-51.20472,-23.36627],[-51.19823,-23.36668],[-51.19297,-23.36651],[-51.18986,-23.36544],[-51.18806,-23.36464],[-51.18718,-23.36453],[-51.1858,-23.36374],[-51.18304,-23.36359],[-51.18071,-23.36376],[-51.17907,-23.36158],[-51.17764,-23.35836],[-51.16684,-23.35626],[-51.16614,-23.35854],[-51.16476,-23.36039],[-51.16077,-23.35922],[-51.15983,-23.3666],[-51.16204,-23.36861],[-51.16276,-23.37416],[-51.15845,-23.3758],[-51.15505,-23.37631],[-51.15396,-23.37903],[-51.15299,-23.38105],[-51.15119,-23.38208],[-51.14917,-23.38251],[-51.14722,-23.38216],[-51.14518,-23.38259],[-51.1441,-23.38376],[-51.14512,-23.38808],[-51.1418,-23.3894],[-51.14031,-23.3888],[-51.14068,-23.39161],[-51.14127,-23.39354],[-51.14094,-23.39443],[-51.14046,-23.39536],[-51.13939,-23.3951],[-51.13739,-23.39315],[-51.13609,-23.3898],[-51.13429,-23.38976],[-51.13216,-23.39007],[-51.13172,-23.39286],[-51.12259,-23.38864],[-51.12228,-23.39166],[-51.11883,-23.39317],[-51.11568,-23.39335],[-51.10903,-23.39275]],[[-51.13829,-23.41601],[-51.13331,-23.41867],[-51.13209,-23.41644],[-51.13002,-23.41829],[-51.12869,-23.41901],[-51.12824,-23.42103],[-51.12696,-23.42186],[-51.12533,-23.42269],[-51.12445,-23.42097],[-51.12151,-23.42411],[-51.12063,-23.42327],[-51.11971,-23.42312],[-51.11977,-23.42157],[-51.1188,-23.42155],[-51.11643,-23.42084],[-51.11943,-23.41917],[-51.11787,-23.41678],[-51.11655,-23.41731],[-51.1157,-23.4157],[-51.11512,-23.41309],[-51.11908,-23.41111],[-51.1196,-23.4117],[-51.12052,-23.41489],[-51.12148,-23.41714],[-51.12309,-23.41863],[-51.12755,-23.41654],[-51.12803,-23.4174],[-51.1312,-23.41557],[-51.1308,-23.41477],[-51.13279,-23.41264],[-51.13522,-23.41106],[-51.13586,-23.41096],[-51.13682,-23.41119],[-51.13721,-23.41158],[-51.1373,-23.41324],[-51.13743,-23.41471],[-51.13829,-23.41601]],[[-51.18929,-23.61469],[-51.18869,-23.61385],[-51.18818,-23.61339],[-51.18731,-23.61302],[-51.18629,-23.61314],[-51.18402,-23.61396],[-51.18349,-23.61397],[-51.18183,-23.61284],[-51.1814,-23.61344],[-51.18063,-23.61314],[-51.18001,-23.61409],[-51.17866,-23.61329],[-51.18065,-23.6106],[-51.17972,-23.61018],[-51.18062,-23.60849],[-51.18212,-23.6085],[-51.18261,-23.60775],[-51.1832,-23.60804],[-51.18415,-23.60628],[-51.18511,-23.60666],[-51.18649,-23.6047],[-51.18902,-23.6061],[-51.18821,-23.60742],[-51.18919,-23.60802],[-51.1889,-23.60953],[-51.18962,-23.60993],[-51.19119,-23.61119],[-51.19015,-23.61245],[-51.19054,-23.61276],[-51.19029,-23.61378],[-51.18929,-23.61469]],[[-51.08006,-23.52984],[-51.07962,-23.52205],[-51.08468,-23.52194],[-51.08582,-23.52404],[-51.08589,-23.52704],[-51.08579,-23.52777],[-51.0853,-23.52806],[-51.08514,-23.52857],[-51.08512,-23.52982],[-51.08471,-23.53024],[-51.08343,-23.53024],[-51.0833,-23.52978],[-51.08006,-23.52984]]],terms_url:"http://siglon.londrina.pr.gov.br",terms_text:"Prefeitura do Londrinas, PR"},{id:"LPI_NSW_Administrative_Boundaries_County",name:"LPI NSW Administrative Boundaries County",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=4&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_LGA",name:"LPI NSW Administrative Boundaries LGA",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=6&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_NPWS_Reserve",name:"LPI NSW Administrative Boundaries NPWS Reserve",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=1&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_Parish",name:"LPI NSW Administrative Boundaries Parish",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=3&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_StateForest",name:"LPI NSW Administrative Boundaries State Forest",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=2&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_Suburb",name:"LPI NSW Administrative Boundaries Suburb",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=7&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"NSW_LPI_BaseMap",name:"LPI NSW Base Map",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Base_Map/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,19],polygon:[[[140.99486,-28.95297],[148.96114,-28.89977],[148.98701,-28.48623],[151.01361,-28.47865],[151.10847,-28.70329],[151.87599,-28.68312],[151.93348,-28.40788],[152.25544,-28.23327],[153.06608,-28.21047],[153.14082,-28.1091],[153.47351,-28.11648],[153.35765,-27.69361],[159.49383,-27.69925],[159.4857,-37.84741],[149.52569,-37.82815],[149.91596,-37.487],[148.04859,-36.81317],[147.9681,-36.15679],[146.71477,-36.28666],[145.30046,-36.15679],[144.53007,-36.14751],[142.8398,-35.02543],[142.35686,-34.78025],[141.97741,-34.40162],[140.99503,-34.13718],[140.99486,-28.95297]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017"},{id:"NSW_LPI_Imagery",name:"LPI NSW Imagery",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",best:true},{id:"NSW_LPI_Imagery_Dates",name:"LPI NSW Imagery Dates",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Imagery_Dates/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=0&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"NSW_LPI_TopographicMap",name:"LPI NSW Topographic Map",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Topo_Map/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,16],polygon:[[[140.99884,-28.99924],[148.95024,-28.99937],[148.94988,-28.96653],[148.99983,-28.96653],[149.00009,-28.81658],[149.10007,-28.81658],[149.0997,-28.74885],[148.99985,-28.74974],[148.99982,-28.50003],[151.00005,-28.50052],[151.00059,-28.73258],[151.02395,-28.73274],[151.02413,-28.74188],[151.03293,-28.74188],[151.03383,-28.75054],[151.99998,-28.74953],[151.99998,-28.71645],[152.0334,-28.71661],[152.03322,-28.6832],[152.00007,-28.68335],[151.99988,-28.64163],[151.98299,-28.64139],[151.98317,-28.62491],[151.93313,-28.62475],[151.93341,-28.50007],[151.99989,-28.50023],[151.99986,-28.37496],[152.24997,-28.37507],[152.24994,-28.25001],[152.99972,-28.24986],[152.9999,-28.28324],[153.1165,-28.2834],[153.11659,-28.24986],[153.16663,-28.25001],[153.16672,-28.23316],[153.24999,-28.23324],[153.25003,-28.12497],[153.62496,-28.12508],[153.62484,-28.49991],[153.7498,-28.49999],[153.74959,-28.7498],[153.62481,-28.75011],[153.62497,-28.99993],[153.49977,-29.00006],[153.49984,-29.49951],[153.3748,-29.50005],[153.37541,-29.87503],[153.49991,-29.87514],[153.49991,-30.00009],[153.24989,-29.99976],[153.25002,-30.19177],[153.27482,-30.19162],[153.27482,-30.21685],[153.21661,-30.21661],[153.21661,-30.25006],[153.25002,-30.25006],[153.24975,-30.37519],[153.12436,-30.37497],[153.12465,-30.62504],[153.03317,-30.62505],[153.03339,-30.87508],[153.12492,-30.87503],[153.12493,-31.12505],[153.00824,-31.12497],[153.00829,-31.24998],[153,-31.25],[152.99994,-31.62499],[152.87494,-31.62505],[152.87496,-31.74995],[152.78329,-31.75],[152.7832,-31.87486],[152.74991,-31.87501],[152.75004,-32.00002],[152.6249,-31.99994],[152.62491,-32.5],[152.49998,-32.49996],[152.50003,-32.56664],[152.41667,-32.56634],[152.41676,-32.625],[152.34985,-32.62499],[152.34985,-32.63323],[152.28308,-32.63322],[152.28326,-32.62498],[152.24948,-32.62498],[152.24981,-32.87491],[151.87457,-32.87504],[151.87485,-33.00001],[151.74977,-33.00015],[151.75047,-33.25004],[151.62524,-33.24974],[151.62508,-33.37516],[151.49958,-33.37514],[151.50031,-33.62494],[151.37415,-33.62437],[151.37279,-34.00196],[151.24778,-34.00112],[151.24778,-34.24931],[150.99573,-34.25015],[151.00081,-34.62483],[150.87174,-34.6265],[150.87276,-35.12427],[150.76706,-35.12344],[150.76909,-35.24638],[150.62579,-35.2497],[150.62803,-35.37515],[150.49997,-35.37515],[150.49591,-35.6275],[150.37192,-35.62503],[150.37497,-35.7538],[150.26724,-35.75132],[150.2652,-35.87412],[150.24792,-35.87083],[150.24589,-36.37488],[150.12292,-36.37488],[150.12597,-36.62243],[150.02535,-36.62407],[150.0284,-36.74713],[149.99283,-36.74958],[150.00401,-37.12245],[150.05889,-37.12731],[150.05686,-37.37809],[149.99791,-37.37324],[149.99994,-37.48301],[149.98774,-37.48462],[149.98571,-37.508],[148.06846,-36.80624],[147.99306,-36.138],[147.81483,-36.00556],[147.38939,-36.01137],[147.38221,-36.13103],[146.99725,-36.12755],[146.98863,-36.25283],[146.49564,-36.24471],[146.50426,-36.12639],[145.00118,-36.00795],[145.01541,-36.25421],[144.50725,-36.24765],[144.49912,-36.0211],[143.99654,-35.98105],[143.33826,-35.23318],[142.40976,-34.76694],[142.03614,-34.37588],[140.99652,-34.13858],[140.99884,-28.99924]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017"},{id:"orthophoto_lyon_2012",name:"Lyon Orthophoto 2012-03 10cm",type:"wms",template:"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1830_5150_10cm_CC46,1830_5155_10cm_CC46,1830_5160_10cm_CC46,1830_5165_10cm_CC46,1830_5170_10cm_CC46,1830_5175_10cm_CC46,1830_5180_10cm_CC46,1830_5185_10cm_CC46,1830_5190_10cm_CC46,1835_5150_10cm_CC46,1835_5155_10cm_CC46,1835_5160_10cm_CC46,1835_5165_10cm_CC46,1835_5170_10cm_CC46,1835_5175_10cm_CC46,1835_5180_10cm_CC46,1835_5185_10cm_CC46,1835_5190_10cm_CC46,1840_5150_10cm_CC46,1840_5155_10cm_CC46,1840_5160_10cm_CC46,1840_5165_10cm_CC46,1840_5170_10cm_CC46,1840_5175_10cm_CC46,1840_5180_10cm_CC46,1840_5185_10cm_CC46,1840_5190_10cm_CC46,1845_5150_10cm_CC46,1845_5155_10cm_CC46,1845_5160_10cm_CC46,1845_5165_10cm_CC46,1845_5170_10cm_CC46,1845_5175_10cm_CC46,1845_5180_10cm_CC46,1845_5185_10cm_CC46,1845_5190_10cm_CC46,1850_5155_10cm_CC46,1850_5160_10cm_CC46,1850_5165_10cm_CC46,1850_5170_10cm_CC46,1850_5175_10cm_CC46,1850_5180_10cm_CC46,1850_5185_10cm_CC46,1855_5155_10cm_CC46,1855_5165_10cm_CC46,1855_5170_10cm_CC46,1855_5175_10cm_CC46,1855_5180_10cm_CC46,1855_5185_10cm_CC46,1860_5155_10cm_CC46,1860_5160_10cm_CC46,1860_5165_10cm_CC46,1860_5170_10cm_CC46,1860_5175_10cm_CC46,1860_5180_10cm_CC46,1860_5185_10cm_CC46,1865_5155_10cm_CC46,1865_5160_10cm_CC46,1865_5165_10cm_CC46,1865_5170_10cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-03-01T00:00:00.000Z",startDate:"2012-03-01T00:00:00.000Z",polygon:[[[4.69049,45.54652],[4.83131,45.54652],[4.83131,45.57131],[4.88344,45.57131],[4.88344,45.59745],[5.16622,45.59745],[5.16622,45.74533],[5.10793,45.74533],[5.10793,45.88145],[4.90698,45.88145],[4.90698,45.92107],[4.84377,45.92107],[4.84377,45.94011],[4.71543,45.94011],[4.71543,45.87018],[4.67458,45.87018],[4.67458,45.7178],[4.69567,45.7178],[4.69049,45.54652]]],terms_url:"https://data.grandlyon.com/imagerie/orthophotographie-2012-du-grand-lyon",terms_text:"Grand Lyon Smart Data DSIT"},{id:"orthophoto_lyon_2015_8cm",name:"Lyon Orthophoto 2015-05 8cm",type:"wms",template:"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1835_5155_8cm_CC46,1835_5160_8cm_CC46,1835_5165_8cm_CC46,1835_5170_8cm_CC46,1835_5180_8cm_CC46,1835_5175_8cm_CC46,1845_5175_8cm_CC46,1845_5180_8cm_CC46,1845_5185_8cm_CC46,1845_5190_8cm_CC46,1850_5165_8cm_CC46,1850_5160_8cm_CC46,1850_5155_8cm_CC46,1850_5170_8cm_CC46,1850_5175_8cm_CC46,1850_5180_8cm_CC46,1850_5185_8cm_CC46,1855_5155_8cm_CC46,1855_5160_8cm_CC46,1855_5185_8cm_CC46,1855_5180_8cm_CC46,1855_5175_8cm_CC46,1855_5170_8cm_CC46,1855_5165_8cm_CC46,1860_5160_8cm_CC46,1860_5155_8cm_CC46,1860_5165_8cm_CC46,1835_5185_8cm_CC46,1835_5190_8cm_CC46,1835_5195_8cm_CC46,1840_5160_8cm_CC46,1840_5155_8cm_CC46,1840_5150_8cm_CC46,1830_5195_8cm_CC46,1830_5190_8cm_CC46,1830_5175_8cm_CC46,1830_5170_8cm_CC46,1830_5165_8cm_CC46,1830_5160_8cm_CC46,1830_5155_8cm_CC46,1830_5180_8cm_CC46,1830_5185_8cm_CC46,1835_5150_8cm_CC46,1860_5170_8cm_CC46,1860_5175_8cm_CC46,1840_5180_8cm_CC46,1840_5175_8cm_CC46,1840_5185_8cm_CC46,1840_5190_8cm_CC46,1840_5195_8cm_CC46,1845_5150_8cm_CC46,1845_5155_8cm_CC46,1845_5160_8cm_CC46,1845_5170_8cm_CC46,1845_5165_8cm_CC46,1840_5170_8cm_CC46,1840_5165_8cm_CC46,1860_5180_8cm_CC46,1860_5185_8cm_CC46,1865_5155_8cm_CC46,1865_5160_8cm_CC46,1865_5165_8cm_CC46,1865_5170_8cm_CC46,1830_5150_8cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",polygon:[[[4.66489,45.54688],[4.88253,45.54348],[4.88435,45.59745],[5.16623,45.59242],[5.17217,45.74532],[5.10793,45.74653],[5.11305,45.88145],[4.90698,45.88508],[4.90822,45.92106],[4.84377,45.92212],[4.84497,45.9581],[4.67729,45.96069],[4.66489,45.54688]]],terms_url:"https://data.grandlyon.com/imagerie/orthophotographie-2015-du-grand-lyon",terms_text:"Métropole de Lyon DINSI",best:true},{id:"MainRoadsWA_Road_Hierarchy",name:"Main Roads WA Road Hierarchy",type:"wms",template:"https://services.slip.wa.gov.au/public/services/SLIP_Public_Services/Transport/MapServer/WMSServer?LAYERS=8&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fpng&SRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[129.00009,-31.68764],[128.99872,-14.58225],[127.08984,-12.29707],[124.76074,-12.98315],[121.24512,-15.70766],[119.0918,-17.60214],[115.53223,-18.85431],[112.41211,-20.46819],[111.24756,-22.83695],[111.00586,-25.62172],[111.64307,-29.66896],[111.68701,-32.3614],[112.14844,-34.47034],[113.35693,-36.10238],[116.98242,-36.70366],[119.44336,-36.94989],[122.27783,-36.61553],[125.99121,-35.40696],[127.59521,-34.57895],[128.86963,-33.59632],[129.00009,-31.68764]]],terms_url:"https://catalogue.data.wa.gov.au/dataset/clss-road-hierarchy",terms_text:"Main Roads Western Australia",overlay:true},{id:"mainzlatestaerialimagery",name:"Mainz latest aerial imagery",type:"wms",template:"https://gint.mainz.de/gint1-cgi/mapserv?map=/data/mapbender-int/umn-www/client/a62/luftbild.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_f_mz_2018&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[17,22],polygon:[[[8.10355,49.865],[8.38356,49.865],[8.38356,50.0466],[8.10355,50.0466],[8.10355,49.865]]],terms_url:"https://www.mainz.de/vv/oe/100140100000035141.php#tab-infos",terms_text:"Vermessung und Geoinformation Mainz",icon:"https://www.mainz.de/configuration.inc.php.media/27432/Logo-72px.png"},{id:"major_isidoro",name:"Major Isidoro AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Major%20Isidoro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.94048,-9.57588],[-36.94106,-9.48536],[-37.03215,-9.48606],[-37.03164,-9.57639],[-36.94048,-9.57588]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Mapbox",name:"Mapbox Satellite",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/mapbox.satellite/{zoom}/{x}/{y}@2x.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",tileSize:512,zoomExtent:[0,22],terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/MapBoxSatellite.png"},{id:"Maps4BW-LGL_BW",name:"Maps4BW (LGL-BW, www.lgl-bw.de)",type:"wms",template:"http://www.webatlasde.de/arcgis/services/Maps4BW/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Halbtonvariante&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.06954,49.57679],[9.10577,49.57952],[9.16079,49.58263],[9.24212,49.58402],[9.27192,49.63515],[9.30454,49.65561],[9.36753,49.65893],[9.38253,49.64341],[9.41191,49.66033],[9.39602,49.67143],[9.41828,49.69706],[9.40378,49.71957],[9.37769,49.70357],[9.35828,49.70334],[9.29438,49.73958],[9.31467,49.76859],[9.42435,49.79099],[9.50417,49.78962],[9.51808,49.78214],[9.65623,49.79286],[9.65317,49.73944],[9.63435,49.70076],[9.67054,49.69515],[9.67721,49.71846],[9.71079,49.72918],[9.8014,49.73429],[9.83728,49.70237],[9.87656,49.61362],[9.83362,49.55607],[9.84954,49.54793],[9.87463,49.5836],[9.91419,49.58955],[9.93066,49.56097],[9.92482,49.48951],[10.01787,49.48673],[10.03352,49.52978],[10.06372,49.55129],[10.09052,49.54218],[10.12792,49.51192],[10.11027,49.49272],[10.16753,49.38589],[10.12627,49.3809],[10.14385,49.32772],[10.16061,49.27043],[10.13569,49.26189],[10.14311,49.20387],[10.25161,49.15031],[10.26279,49.12959],[10.26869,49.05202],[10.36527,49.02557],[10.45894,48.93581],[10.46208,48.83947],[10.42886,48.74973],[10.46648,48.73627],[10.49761,48.68581],[10.45007,48.66277],[10.3553,48.65068],[10.32297,48.68241],[10.26028,48.67842],[10.32542,48.60763],[10.31448,48.52323],[10.17973,48.45977],[10.12892,48.45301],[10.10938,48.47445],[10.06355,48.45381],[10.03918,48.45125],[10.04492,48.43158],[10.0152,48.40323],[9.98709,48.38565],[9.97328,48.37944],[9.97549,48.36558],[9.99071,48.3734],[10.00265,48.3632],[9.99992,48.35572],[10.06698,48.28172],[10.08111,48.2253],[10.11306,48.12632],[10.13966,48.11307],[10.14695,48.07455],[10.13763,48.01938],[10.11725,47.9755],[10.11359,47.93422],[10.10709,47.86711],[10.14174,47.80956],[10.0732,47.78686],[10.11825,47.76126],[10.14213,47.70165],[10.13262,47.67678],[10.07445,47.63472],[10.06303,47.66923],[10.00359,47.67526],[9.95808,47.64376],[9.84481,47.67533],[9.83488,47.66042],[9.74926,47.60206],[9.70817,47.60007],[9.65788,47.60599],[9.64742,47.58931],[9.61389,47.57809],[9.56602,47.53274],[9.51199,47.53246],[9.25717,47.65752],[9.18684,47.65697],[9.17591,47.65379],[9.17028,47.65474],[9.15555,47.666],[9.1494,47.66713],[9.13947,47.66367],[9.02005,47.68616],[8.94127,47.65569],[8.89825,47.64821],[8.88263,47.65327],[8.87474,47.6545],[8.87235,47.66971],[8.84949,47.68089],[8.84993,47.70233],[8.81816,47.71242],[8.80108,47.72811],[8.77231,47.71606],[8.81295,47.6959],[8.79373,47.67216],[8.7533,47.68997],[8.72575,47.6917],[8.71002,47.68829],[8.68937,47.69318],[8.67046,47.68235],[8.65783,47.68883],[8.66161,47.71454],[8.70596,47.71584],[8.70932,47.73275],[8.73033,47.75527],[8.72003,47.76273],[8.68871,47.75314],[8.67898,47.78306],[8.64981,47.79435],[8.65592,47.76948],[8.63132,47.75749],[8.61918,47.76216],[8.61351,47.78451],[8.61686,47.79705],[8.568,47.79977],[8.57611,47.79015],[8.57847,47.78102],[8.56315,47.77654],[8.48889,47.76458],[8.45742,47.74126],[8.4623,47.72909],[8.44929,47.71663],[8.41471,47.69991],[8.4273,47.68562],[8.41061,47.6743],[8.46839,47.6568],[8.52474,47.64677],[8.5269,47.66373],[8.56441,47.67261],[8.57853,47.66373],[8.60454,47.6751],[8.63333,47.65212],[8.62386,47.63922],[8.60395,47.63193],[8.61281,47.61327],[8.57951,47.59306],[8.5602,47.59867],[8.56765,47.61442],[8.53394,47.62984],[8.51208,47.61641],[8.46581,47.60137],[8.46631,47.58666],[8.48985,47.59139],[8.5,47.58062],[8.43414,47.5629],[8.39882,47.57559],[8.38525,47.56408],[8.32701,47.56893],[8.29483,47.59077],[8.2948,47.60497],[8.26293,47.60823],[8.22435,47.60446],[8.18644,47.60508],[8.16904,47.59394],[8.13615,47.58246],[8.10503,47.56795],[8.09873,47.55933],[8.08261,47.55624],[8.07095,47.56299],[8.0274,47.54931],[7.94632,47.54209],[7.90966,47.54825],[7.90676,47.5603],[7.88681,47.58765],[7.83987,47.58122],[7.79648,47.55517],[7.69208,47.53137],[7.66583,47.53403],[7.63159,47.56044],[7.63879,47.56619],[7.68607,47.57205],[7.65278,47.59418],[7.62247,47.57767],[7.60473,47.57822],[7.58771,47.59015],[7.52156,47.65161],[7.50399,47.70235],[7.52096,47.77685],[7.55712,47.84839],[7.54946,47.8792],[7.57461,47.93028],[7.61318,47.96804],[7.6119,47.9871],[7.56124,48.03836],[7.57491,48.1258],[7.59534,48.15977],[7.63305,48.19717],[7.66275,48.22473],[7.68466,48.30305],[7.76346,48.49158],[7.80046,48.5126],[7.79958,48.5878],[7.83409,48.64439],[7.91211,48.68899],[7.96723,48.75716],[8.02069,48.78879],[8.04302,48.7956],[8.08647,48.81306],[8.13644,48.89782],[8.19706,48.96021],[8.28161,48.9949],[8.29967,49.02597],[8.31243,49.05996],[8.38654,49.23497],[8.46083,49.28407],[8.48783,49.29326],[8.47577,49.3079],[8.44839,49.31693],[8.45152,49.33135],[8.46288,49.3869],[8.49407,49.40186],[8.49762,49.41583],[8.50721,49.43414],[8.49834,49.44187],[8.47977,49.44391],[8.46414,49.44151],[8.44696,49.44516],[8.43947,49.45214],[8.44407,49.46085],[8.45992,49.46498],[8.46312,49.47135],[8.4554,49.48107],[8.44184,49.49297],[8.41194,49.55852],[8.42193,49.5843],[8.44117,49.59081],[8.45482,49.59157],[8.47738,49.5874],[8.56161,49.52237],[8.61486,49.54175],[8.59165,49.59179],[8.58706,49.61156],[8.65189,49.6209],[8.69494,49.62762],[8.70105,49.59869],[8.68726,49.57096],[8.72597,49.53085],[8.78493,49.51775],[8.81467,49.53187],[8.88863,49.51091],[8.90168,49.50363],[8.90315,49.486],[8.87995,49.46561],[8.83117,49.42147],[8.80845,49.40981],[8.82075,49.39647],[8.83009,49.41316],[8.85107,49.39663],[8.90247,49.44632],[8.93863,49.48179],[8.95154,49.50562],[8.98498,49.51153],[9.03553,49.50079],[9.05731,49.532],[9.10023,49.52728],[9.11009,49.51213],[9.12424,49.51722],[9.11286,49.53337],[9.08284,49.54211],[9.06694,49.56433],[9.06954,49.57679]]],terms_url:"https://www.lgl-bw.de/",terms_text:"Datengrundlage: LGL, www.lgl-bw.de"},{id:"mar_vermelho_al",name:"Mar Vermelho AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Mar%20Vermelho&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.34201,-9.49289],[-36.3422,-9.47533],[-36.34275,-9.4029],[-36.34473,-9.4029],[-36.34537,-9.40279],[-36.34702,-9.40293],[-36.3508,-9.40291],[-36.359,-9.40307],[-36.36109,-9.403],[-36.36289,-9.40307],[-36.3659,-9.40305],[-36.36713,-9.40301],[-36.37571,-9.40307],[-36.38049,-9.40308],[-36.38663,-9.4032],[-36.38852,-9.40312],[-36.39286,-9.40325],[-36.39656,-9.40322],[-36.40309,-9.40327],[-36.41973,-9.40338],[-36.43368,-9.4034],[-36.43355,-9.41685],[-36.43344,-9.42386],[-36.43338,-9.43753],[-36.43329,-9.45012],[-36.433,-9.49359],[-36.40839,-9.4935],[-36.40442,-9.49354],[-36.40008,-9.49351],[-36.39787,-9.49342],[-36.39168,-9.49328],[-36.38757,-9.49331],[-36.38536,-9.49341],[-36.37673,-9.49331],[-36.37427,-9.49319],[-36.36707,-9.49299],[-36.36502,-9.493],[-36.36043,-9.49299],[-36.35955,-9.49295],[-36.35895,-9.49304],[-36.35703,-9.49294],[-36.35665,-9.493],[-36.3526,-9.493],[-36.34767,-9.49297],[-36.34201,-9.49289]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"MassGIS-L3-Parcels",name:"MassGIS L3 Parcels",type:"tms",template:"http://tile.osm.osuosl.org/tiles/massgis_parcels/{zoom}/{x}/{y}.png",polygon:[[[-72.13569,42.03025],[-72.53156,42.03458],[-72.57278,42.03022],[-72.58216,42.02474],[-72.60717,42.02515],[-72.60797,42.03108],[-72.64019,42.03205],[-72.69933,42.03696],[-72.75714,42.03635],[-72.75868,42.02439],[-72.76572,42.02276],[-72.76673,42.00327],[-72.81705,41.99769],[-72.81378,42.03674],[-73.03678,42.03929],[-73.43281,42.05059],[-73.49688,42.04968],[-73.50814,42.08626],[-73.26496,42.74594],[-72.6872,42.73348],[-71.97286,42.71307],[-71.69663,42.70572],[-71.29464,42.69704],[-71.27894,42.71136],[-71.26787,42.72603],[-71.25526,42.73659],[-71.24598,42.74231],[-71.23732,42.74491],[-71.22391,42.74643],[-71.18181,42.73732],[-71.18617,42.79088],[-71.16667,42.80891],[-71.13277,42.82145],[-71.06442,42.80626],[-71.05395,42.83337],[-71.04483,42.84869],[-71.03128,42.85924],[-70.96702,42.86887],[-70.94967,42.87588],[-70.92973,42.88504],[-70.91465,42.88661],[-70.90348,42.88671],[-70.88566,42.88288],[-70.84776,42.86088],[-70.82963,42.86875],[-70.81567,42.87204],[-70.45842,42.67694],[-70.8759,42.35302],[-69.88713,42.0519],[-69.89537,41.21643],[-70.81959,41.23192],[-71.09996,41.43386],[-71.12047,41.49717],[-71.13131,41.59231],[-71.14059,41.6051],[-71.14047,41.62389],[-71.13569,41.6284],[-71.13291,41.6601],[-71.17605,41.6681],[-71.17588,41.67154],[-71.1954,41.67514],[-71.26139,41.7523],[-71.32885,41.7811],[-71.33407,41.79455],[-71.34156,41.79817],[-71.33914,41.80842],[-71.3472,41.8231],[-71.3449,41.828],[-71.3352,41.8355],[-71.3422,41.8448],[-71.33392,41.86229],[-71.34086,41.87872],[-71.33865,41.89865],[-71.38174,41.8932],[-71.38127,42.01885],[-71.49744,42.01725],[-71.52888,42.01499],[-71.79925,42.00807],[-71.80067,42.02351],[-72.0635,42.02735],[-72.13569,42.03025]]]},{id:"geodata.md.gov-MD_SixInchImagery",name:"MD Latest 6 Inch Aerial Imagery",type:"wms",template:"https://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_SixInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Six Inch resolution aerial imagery for the State of Maryland"},{id:"geodata.md.gov-MD_ThreeInchImagery",name:"MD Three Inch Aerial Imagery",type:"wms",template:"https://geodata.md.gov/imap/services/Imagery/MD_ThreeInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_ThreeInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[-76.46299,38.9808],[-76.46326,38.94779],[-76.49499,38.9369],[-76.51617,38.93697],[-76.54763,38.9591],[-76.54745,38.98667],[-76.51559,39.00306],[-76.4839,39.00292],[-76.46299,38.9808]],[[-76.09548,38.84133],[-76.0428,38.8409],[-76.04289,38.8298],[-76.03229,38.8297],[-76.03277,38.79667],[-76.02545,38.79664],[-76.02541,38.77462],[-76.03308,38.77472],[-76.03366,38.73073],[-76.05462,38.73094],[-76.0548,38.72005],[-76.10753,38.72043],[-76.10714,38.75338],[-76.11754,38.75346],[-76.11701,38.79731],[-76.09601,38.79715],[-76.09548,38.84133]],[[-77.23397,39.16838],[-77.25516,39.14647],[-77.25496,39.11343],[-77.18093,39.05337],[-77.14907,39.0477],[-77.12798,39.04779],[-77.10683,39.05325],[-77.10688,39.0917],[-77.11775,39.10827],[-77.16011,39.12485],[-77.15975,39.15214],[-77.17048,39.16302],[-77.21284,39.17272],[-77.23397,39.16838]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Three Inch Resolution Imagery for the cities of Rockville, Gaithersburg and Annapolis"},{id:"geodata.md.gov-MD_ColorBasemap",name:"MD Transportation Basemap",type:"wms",template:"https://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=MD_ColorBasemap&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Maryland State Highway Administration road features and additional Maryland focused landmarks"},{id:"MCGIS-County-NAIP-Imagery-2015",name:"Mesa County GIS NAIP 2015",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/MesaCounty_2015/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-NAIP-Imagery-2017",name:"Mesa County GIS NAIP 2017",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/NAIP_2017/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-10-24T00:00:00.000Z",startDate:"2017-08-26T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-Valleywide-Imagery-2018",name:"Mesa County GIS Valleywide 2018",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/City_Color_2018/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-108.93915,39.23931],[-108.86841,39.23846],[-108.86843,39.23734],[-108.81245,39.23666],[-108.81274,39.22256],[-108.79405,39.22234],[-108.79432,39.20857],[-108.70096,39.20745],[-108.70123,39.1939],[-108.60764,39.19277],[-108.60791,39.17906],[-108.58915,39.17884],[-108.58943,39.1649],[-108.53332,39.16422],[-108.53361,39.14993],[-108.51461,39.14971],[-108.51489,39.13611],[-108.44076,39.13522],[-108.44104,39.12109],[-108.42192,39.12086],[-108.42201,39.1163],[-108.3984,39.11602],[-108.39798,39.13708],[-108.32446,39.13619],[-108.32416,39.15107],[-108.30718,39.15087],[-108.3066,39.18],[-108.28866,39.17979],[-108.28807,39.20939],[-108.26868,39.20916],[-108.26957,39.16484],[-108.2864,39.16505],[-108.28699,39.13571],[-108.30312,39.13591],[-108.3038,39.10194],[-108.32335,39.10218],[-108.32328,39.10574],[-108.32914,39.10581],[-108.32943,39.09121],[-108.34736,39.09142],[-108.34764,39.07715],[-108.36637,39.07738],[-108.36666,39.06268],[-108.38569,39.06291],[-108.38599,39.04799],[-108.42216,39.04843],[-108.42245,39.03377],[-108.44051,39.03399],[-108.44137,38.99101],[-108.42193,38.99077],[-108.42252,38.96127],[-108.44162,38.9615],[-108.44133,38.97595],[-108.46034,38.97618],[-108.46006,38.99024],[-108.47877,38.99047],[-108.47848,39.00485],[-108.51515,39.0053],[-108.51519,39.00287],[-108.51825,39.00291],[-108.51821,39.00517],[-108.53414,39.00536],[-108.53397,39.0139],[-108.54342,39.01401],[-108.54336,39.01733],[-108.5455,39.01735],[-108.54548,39.01855],[-108.65864,39.01991],[-108.65778,39.06287],[-108.67867,39.06313],[-108.67837,39.07793],[-108.69699,39.07816],[-108.69671,39.09203],[-108.71557,39.09225],[-108.71529,39.10619],[-108.7388,39.10648],[-108.73853,39.12033],[-108.75744,39.12056],[-108.75686,39.14927],[-108.79422,39.14972],[-108.79393,39.16386],[-108.83224,39.16432],[-108.83196,39.17845],[-108.85061,39.17868],[-108.85033,39.19302],[-108.86938,39.19325],[-108.86906,39.20925],[-108.90237,39.20965],[-108.90208,39.22384],[-108.93946,39.22429],[-108.93915,39.23931]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"Metropole_Ruhr_RVR-DOP10",name:"Metropole Ruhr: Luftbilder (10 cm)",type:"wms",template:"https://geodaten.metropoleruhr.de/dop/dop?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DOP&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[6.51691,51.81714],[6.52258,51.81469],[6.52281,51.81041],[6.52834,51.81053],[6.53991,51.80134],[6.5511,51.799],[6.56818,51.78992],[6.57476,51.79606],[6.58457,51.79369],[6.59102,51.8024],[6.60911,51.80019],[6.61081,51.79423],[6.63264,51.79981],[6.65946,51.7892],[6.66837,51.77738],[6.7138,51.78084],[6.70876,51.77131],[6.72131,51.76899],[6.7475,51.77035],[6.74862,51.77551],[6.75824,51.77656],[6.7698,51.76649],[6.77219,51.74596],[6.78862,51.74884],[6.79861,51.74217],[6.81927,51.74341],[6.81956,51.73741],[6.82683,51.72983],[6.8403,51.73694],[6.84995,51.73712],[6.85551,51.73636],[6.8586,51.72956],[6.9103,51.74592],[6.90861,51.75275],[6.91511,51.76144],[6.9157,51.7786],[6.93527,51.7738],[6.95606,51.77245],[6.97559,51.79936],[6.98794,51.80129],[6.99485,51.80141],[6.99497,51.79884],[7.02118,51.80014],[7.0244,51.7899],[7.03141,51.78745],[7.0316,51.78317],[7.03847,51.78414],[7.05392,51.77839],[7.06079,51.77936],[7.0609,51.77679],[7.07333,51.777],[7.07867,51.78137],[7.11433,51.78795],[7.13435,51.80542],[7.1616,51.81528],[7.16419,51.8196],[7.19177,51.82174],[7.2141,51.81694],[7.22121,51.81191],[7.23658,51.80785],[7.23668,51.80528],[7.24916,51.80461],[7.2535,51.79953],[7.26179,51.79966],[7.26485,51.79198],[7.26245,51.78252],[7.27229,51.77838],[7.26002,51.77391],[7.26012,51.77134],[7.2688,51.76118],[7.27577,51.75957],[7.27889,51.75019],[7.31079,51.74636],[7.3151,51.74214],[7.31519,51.73957],[7.31102,51.74036],[7.3125,51.73781],[7.32081,51.73707],[7.31169,51.72237],[7.29963,51.71277],[7.2985,51.70589],[7.31069,51.71207],[7.30825,51.70346],[7.32762,51.70202],[7.33057,51.69692],[7.34427,51.69969],[7.34599,51.69028],[7.33919,51.68761],[7.35589,51.68356],[7.35877,51.68017],[7.3781,51.67959],[7.39086,51.66947],[7.40617,51.6654],[7.41031,51.66545],[7.4101,51.67145],[7.43089,51.6683],[7.43892,51.67527],[7.44854,51.67625],[7.44933,51.69341],[7.44094,51.69673],[7.43792,51.7044],[7.42406,51.70593],[7.42245,51.71277],[7.43451,51.72321],[7.44825,51.72511],[7.46718,51.7365],[7.47273,51.73572],[7.4771,51.72892],[7.4826,51.72985],[7.47877,51.72037],[7.48435,51.71872],[7.48449,51.71444],[7.49119,51.72053],[7.49947,51.72063],[7.50214,51.72324],[7.51738,51.72172],[7.51788,51.70629],[7.53035,51.70473],[7.52922,51.69701],[7.53349,51.69277],[7.54458,51.6912],[7.5378,51.68768],[7.54477,51.6852],[7.5528,51.69301],[7.56651,51.69575],[7.56642,51.69832],[7.58706,51.70029],[7.59379,51.70551],[7.6048,51.7065],[7.60743,51.71082],[7.6143,51.71176],[7.61419,51.71518],[7.62663,51.71447],[7.62814,51.7102],[7.64321,51.71381],[7.6531,51.70621],[7.65428,51.71308],[7.668,51.71581],[7.66915,51.72353],[7.68832,51.72889],[7.69283,51.71608],[7.7012,51.71275],[7.71352,51.71631],[7.71481,51.71976],[7.71899,51.71809],[7.71749,51.72236],[7.72163,51.7224],[7.72555,51.73016],[7.73659,51.73028],[7.73638,51.73799],[7.75154,51.73901],[7.7699,51.72378],[7.77119,51.72722],[7.78908,51.72912],[7.79037,51.73256],[7.80282,51.73183],[7.80137,51.73439],[7.80825,51.73531],[7.81228,51.73964],[7.82058,51.73887],[7.82457,51.74491],[7.83287,51.74413],[7.83314,51.73385],[7.83739,51.72961],[7.85815,51.72724],[7.85822,51.72467],[7.86374,51.72472],[7.87187,51.7308],[7.87745,51.72828],[7.88038,51.72145],[7.88875,51.7181],[7.88912,51.70267],[7.90148,51.70536],[7.90568,51.70283],[7.91249,51.70632],[7.92768,51.7056],[7.92912,51.70305],[7.94014,51.704],[7.93746,51.70055],[7.94296,51.70146],[7.96108,51.69305],[7.97631,51.69061],[7.97779,51.68633],[7.9875,51.68385],[7.98761,51.67871],[7.99732,51.67622],[7.9974,51.67279],[7.98365,51.67096],[7.96286,51.67592],[7.95466,51.67242],[7.95366,51.65612],[7.94689,51.65092],[7.94984,51.64237],[7.94443,51.63804],[7.93477,51.6388],[7.93224,51.62935],[7.92406,51.62585],[7.92414,51.62242],[7.91195,51.61374],[7.91632,51.60349],[7.91378,51.59489],[7.87529,51.59282],[7.86837,51.59446],[7.85742,51.59179],[7.85889,51.58837],[7.82749,51.57863],[7.84327,51.55307],[7.83262,51.53925],[7.83277,51.53325],[7.84115,51.52819],[7.8345,51.51955],[7.83755,51.50758],[7.83212,51.50496],[7.83912,51.49988],[7.83923,51.4956],[7.84474,51.49479],[7.8506,51.48028],[7.83418,51.4784],[7.82198,51.47228],[7.80819,51.47471],[7.79876,51.46776],[7.78906,51.47109],[7.76169,51.46823],[7.74785,51.47237],[7.7425,51.46717],[7.73567,51.46623],[7.72864,51.47216],[7.69838,51.4744],[7.67525,51.46728],[7.65606,51.46621],[7.65347,51.46103],[7.63843,51.45914],[7.63589,51.45226],[7.62083,51.45122],[7.61407,51.44772],[7.61977,51.44092],[7.62525,51.44099],[7.62127,51.43666],[7.62825,51.43245],[7.62561,51.42899],[7.63125,51.42391],[7.61633,51.41859],[7.62183,51.4178],[7.62196,51.41352],[7.63313,51.40679],[7.61322,51.38512],[7.60485,51.39017],[7.60609,51.39447],[7.59647,51.39521],[7.58704,51.38995],[7.59,51.38313],[7.58465,51.37878],[7.58644,51.36509],[7.59234,51.35144],[7.59934,51.34638],[7.59257,51.34373],[7.59407,51.33946],[7.58186,51.33588],[7.58334,51.33247],[7.57655,51.33067],[7.57816,51.32298],[7.58373,51.31962],[7.57837,51.31612],[7.58134,51.30844],[7.58547,51.30763],[7.58305,51.29732],[7.56826,51.28942],[7.56582,51.27996],[7.55089,51.27635],[7.54977,51.26862],[7.52923,51.27008],[7.52797,51.26663],[7.51302,51.26387],[7.51049,51.25784],[7.50371,51.25604],[7.50385,51.25175],[7.49563,51.2525],[7.49438,51.24906],[7.49708,51.24995],[7.50271,51.24488],[7.50143,51.24229],[7.48262,51.23262],[7.469,51.23158],[7.46505,51.22724],[7.45129,51.23049],[7.44191,51.22522],[7.44478,51.22098],[7.43534,51.21742],[7.43816,51.21489],[7.43413,51.21312],[7.42995,51.21563],[7.42962,51.22506],[7.42408,51.22756],[7.41182,51.22653],[7.41342,51.2197],[7.39824,51.22463],[7.39521,51.23317],[7.40319,51.23928],[7.3934,51.246],[7.38793,51.24593],[7.38672,51.24162],[7.37853,51.24151],[7.37289,51.24657],[7.35526,51.2429],[7.35405,51.23859],[7.34849,51.24109],[7.339,51.23924],[7.33872,51.24695],[7.32904,51.25024],[7.3238,51.24417],[7.31284,51.24487],[7.31027,51.24054],[7.30481,51.24046],[7.29643,51.24549],[7.29764,51.24979],[7.28262,51.24957],[7.27541,51.25975],[7.2715,51.25455],[7.26734,51.25621],[7.26578,51.26133],[7.27623,51.27434],[7.26764,51.2845],[7.25531,51.28518],[7.26537,51.30847],[7.26521,51.31276],[7.25974,51.31268],[7.26511,51.31533],[7.26365,51.31788],[7.23393,51.308],[7.22973,51.31051],[7.2271,51.3079],[7.22296,51.3087],[7.22309,51.30527],[7.20682,51.30159],[7.20026,51.29463],[7.18792,51.2953],[7.18232,51.29864],[7.16869,51.29757],[7.18065,51.30633],[7.16674,51.31211],[7.16924,51.31815],[7.16503,51.32066],[7.1662,51.32582],[7.15645,51.32996],[7.15351,51.33505],[7.14807,51.33411],[7.14927,51.33842],[7.14513,51.33921],[7.15292,51.34962],[7.14882,51.34956],[7.14731,51.35296],[7.15665,51.35911],[7.15911,51.36601],[7.15189,51.37532],[7.14634,51.37695],[7.13957,51.37513],[7.13802,51.37939],[7.13262,51.37759],[7.127,51.38093],[7.12163,51.37827],[7.12153,51.38084],[7.11742,51.38078],[7.11626,51.37561],[7.11215,51.37555],[7.11205,51.37812],[7.1039,51.37627],[7.09853,51.37361],[7.10004,51.37021],[7.0919,51.36836],[7.08765,51.37172],[7.08088,51.3699],[7.07796,51.37414],[7.0552,51.36176],[7.04973,51.36167],[7.04404,51.36671],[7.03604,51.36144],[7.01944,51.36544],[7.01,51.36185],[7.00745,51.35752],[6.98689,51.35803],[6.98301,51.35282],[6.97743,51.35529],[6.97621,51.35184],[6.96545,51.34737],[6.95033,51.34882],[6.94748,51.35134],[6.9257,51.34839],[6.92422,51.35093],[6.92825,51.35272],[6.92137,51.35346],[6.92391,51.35779],[6.90565,51.36775],[6.90022,51.3668],[6.8904,51.37176],[6.87848,51.36297],[6.86745,51.36449],[6.85115,51.36162],[6.84552,51.36495],[6.84991,51.35903],[6.83385,51.35101],[6.82295,51.34995],[6.81731,51.35328],[6.81615,51.34897],[6.80939,51.34713],[6.80649,51.3505],[6.7941,51.35198],[6.79314,51.34339],[6.77673,51.34308],[6.7475,51.35281],[6.73831,51.34492],[6.72749,51.34214],[6.71287,51.33328],[6.69193,51.34144],[6.66428,51.3469],[6.65435,51.35356],[6.65789,51.36477],[6.67409,51.36938],[6.67794,51.3746],[6.67511,51.37626],[6.6684,51.37356],[6.67309,51.38908],[6.66081,51.38798],[6.65693,51.38362],[6.64602,51.38254],[6.64443,51.3868],[6.63626,51.38577],[6.63586,51.39348],[6.611,51.39726],[6.59479,51.39265],[6.57148,51.39302],[6.56618,51.38948],[6.55797,51.38931],[6.55496,51.39439],[6.54679,51.39337],[6.54505,51.40019],[6.53816,51.4009],[6.52939,51.41101],[6.52596,51.42379],[6.5149,51.42527],[6.51453,51.43213],[6.51987,51.43481],[6.52092,51.44084],[6.51119,51.4432],[6.50821,51.44743],[6.50273,51.44731],[6.50198,51.46101],[6.50709,51.46798],[6.49868,51.47123],[6.49698,51.4772],[6.49012,51.47705],[6.48714,51.48127],[6.4818,51.47859],[6.47608,51.48275],[6.47404,51.49471],[6.46699,51.49799],[6.46245,51.50561],[6.45407,51.508],[6.45497,51.51659],[6.44796,51.51901],[6.45326,51.52255],[6.44876,51.52931],[6.45562,51.52946],[6.47816,51.51966],[6.47499,51.52731],[6.48673,51.53871],[6.46262,51.55191],[6.49612,51.56806],[6.46176,51.56732],[6.42276,51.5759],[6.41912,51.56725],[6.40847,51.56101],[6.38918,51.56144],[6.37657,51.56545],[6.36951,51.56872],[6.36916,51.57471],[6.37726,51.57747],[6.37284,51.58251],[6.37372,51.59111],[6.35235,51.60349],[6.33482,51.59709],[6.32362,51.60026],[6.32067,51.60363],[6.33275,51.60905],[6.33392,51.6125],[6.30035,51.62117],[6.30143,51.62633],[6.29113,51.63725],[6.29225,51.64156],[6.29903,51.64343],[6.32563,51.63632],[6.32819,51.63981],[6.35403,51.64554],[6.35313,51.66095],[6.36553,51.66123],[6.36262,51.66374],[6.37069,51.66735],[6.38091,51.6813],[6.38062,51.68643],[6.37195,51.6931],[6.35808,51.6945],[6.35482,51.703],[6.3682,51.71016],[6.37642,51.7112],[6.38041,51.71387],[6.37731,51.7198],[6.38829,51.7209],[6.38789,51.72775],[6.40932,51.73937],[6.41055,51.74197],[6.40346,51.74524],[6.40597,51.74959],[6.40178,51.75035],[6.40287,51.75552],[6.41405,51.75319],[6.42134,51.7465],[6.42188,51.73708],[6.40877,51.72478],[6.40921,51.71708],[6.4164,51.71209],[6.44839,51.70765],[6.46246,51.70281],[6.47677,51.71855],[6.48908,51.72053],[6.48418,51.73414],[6.48942,51.7394],[6.48908,51.74539],[6.48171,51.75381],[6.53363,51.76434],[6.52478,51.77444],[6.50784,51.78094],[6.4898,51.80714],[6.48961,51.81056],[6.51162,51.81274],[6.51691,51.81714]]],terms_url:"https://www.metropoleruhr.de/regionalverband-ruhr.html",terms_text:"Datengrundlage: Regionalverband Ruhr"},{id:"miljodirektoratet-vern",name:"Miljødirektoratet Protected Areas overlay",type:"wms",template:"https://arcgisproxy.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade,naturvern_punkt&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kart.naturbase.no",terms_text:"© Miljødirektoratet",description:"Norwegian national parks, nature reserves and other protected areas and objects from Naturbase, including Svalbard/Spitsbergen",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"miljodirektoratet-friluftsomrader",name:"Miljødirektoratet Public Recreation Areas overlay",type:"wms",template:"https://arcgisproxy.miljodirektoratet.no/arcgis/services/friluftsliv_statlig_sikra/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=friluftsliv_statlig_sikra&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.miljostatus.no/tema/friluftsliv/statlig-sikra-friluftlivsomrader/",terms_text:"© Miljødirektoratet",description:"Public recreation areas with State ownership (\"friluftsområder\").",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"minador_do_negrao",name:"Minador do Negrão",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Minador%20do%20Negrao&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.8196,-9.35174],[-36.82017,-9.26142],[-36.82465,-9.26133],[-36.83064,-9.26147],[-36.83673,-9.2615],[-36.84228,-9.26148],[-36.84562,-9.2616],[-36.85564,-9.2616],[-36.86214,-9.26159],[-36.8659,-9.26147],[-36.86724,-9.2615],[-36.86952,-9.26149],[-36.87127,-9.26157],[-36.87476,-9.26153],[-36.87816,-9.26163],[-36.88321,-9.2617],[-36.88565,-9.26167],[-36.88857,-9.26148],[-36.89217,-9.26151],[-36.89383,-9.26163],[-36.8974,-9.26175],[-36.91122,-9.26183],[-36.9111,-9.26651],[-36.91112,-9.28542],[-36.91121,-9.29066],[-36.91118,-9.29368],[-36.91099,-9.29929],[-36.91091,-9.30729],[-36.9109,-9.3123],[-36.91083,-9.31597],[-36.91084,-9.32013],[-36.91098,-9.32395],[-36.91099,-9.32587],[-36.91079,-9.32964],[-36.91079,-9.33523],[-36.91074,-9.33944],[-36.91092,-9.34311],[-36.91084,-9.34471],[-36.91066,-9.35229],[-36.89277,-9.35225],[-36.87735,-9.35212],[-36.86463,-9.35203],[-36.85761,-9.35194],[-36.84344,-9.35191],[-36.83115,-9.3518],[-36.8196,-9.35174]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"mml-tausta",name:"MML Background Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/taustakartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Background map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-orto",name:"MML Orthophoto",type:"tms",template:"http://tiles.kartat.kapsi.fi/ortokuva/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",best:true,description:"Ortophotos from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-topo",name:"MML Topographic Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/peruskartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Topographic map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mtbmap-no",name:"MTBmap.no",type:"tms",template:"https://mtbmap.no/tiles/osm/mtbmap/{zoom}/{x}/{y}.jpg",tileSize:512,zoomExtent:[3,14],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.mtbmap.no/",terms_text:"© MTBmap.no",description:"Norwegian mountain biking map from OSM (max zoom 14-16, varies per region)",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/no/MTBmapno.png"},{id:"MunichLatestAerialImagery",name:"Munich latest aerial imagery 60cm",type:"wms",template:"https://ogc.muenchen.de/wms/opendata_luftbild?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=bgl0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[11,22],polygon:[[[11.48878,48.053],[11.55589,48.05323],[11.55583,48.06224],[11.56915,48.06229],[11.56908,48.07128],[11.64986,48.07155],[11.64993,48.06256],[11.70326,48.06274],[11.70313,48.08074],[11.71673,48.08079],[11.71667,48.08968],[11.7299,48.08972],[11.72963,48.12566],[11.74313,48.1257],[11.74292,48.15276],[11.72943,48.15271],[11.72936,48.16152],[11.71612,48.16147],[11.71592,48.18859],[11.7027,48.18855],[11.70263,48.19752],[11.67558,48.19743],[11.67537,48.22446],[11.66176,48.22441],[11.66169,48.23355],[11.64863,48.2335],[11.64857,48.24246],[11.54064,48.2421],[11.54058,48.25093],[11.52735,48.25088],[11.52728,48.26001],[11.47335,48.25983],[11.47356,48.23291],[11.46014,48.23287],[11.46021,48.22373],[11.43336,48.22364],[11.43343,48.21439],[11.3798,48.21421],[11.37987,48.20518],[11.36607,48.20514],[11.36621,48.18741],[11.35259,48.18737],[11.35266,48.17817],[11.33946,48.17813],[11.33973,48.14216],[11.36684,48.14225],[11.36697,48.12443],[11.38083,48.12448],[11.3809,48.11558],[11.44769,48.1158],[11.44804,48.07087],[11.46186,48.07091],[11.46193,48.06193],[11.48872,48.06202],[11.48878,48.053]]],terms_url:"http://www.geodatenservice-muenchen.de/",terms_text:"Datenquelle: dl-de/by-2-0: Landeshauptstadt München – Kommunalreferat – GeodatenService – www.geodatenservice-muenchen.de",icon:"https://www.muenchen.de/media/css/images/favicon_114x114.png"},{id:"openlabs-geoportal-public-transport",name:"Municipality of Tirana - Public Transport (Open Labs GeoPortal) (overlay)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/public-transport@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[19.73762,41.30154],[19.88628,41.27213],[19.86877,41.38582],[19.68338,41.3732],[19.73762,41.30154]]],terms_url:"https://geoportal.openlabs.cc/",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Bus stops & lines provided by the Muncipality of Tirana hosted by Open Labs",overlay:true},{id:"openlabs-geoportal-tirana",name:"Municipality of Tirana (Open Labs GeoPortal)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/tirana@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[19.70226,41.1404],[19.77573,41.11868],[19.86431,41.12126],[20.24986,41.3495],[20.03082,41.41184],[19.92577,41.5204],[19.88869,41.50755],[19.88937,41.42265],[19.81659,41.46177],[19.7335,41.43037],[19.74174,41.37887],[19.65797,41.37475],[19.57214,41.24322],[19.61815,41.22567],[19.67171,41.22722],[19.70226,41.1404]]],terms_url:"https://geoportal.openlabs.cc",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Streets & Builings provided by the Muncipality of Tirana hosted by Open Labs"},{id:"NC-US",name:"NC Latest Orthoimagery",type:"wms",template:"https://services.nconemap.gov/secure/services/Imagery/Orthoimagery_Latest/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",polygon:[[[-81.6792,36.5974],[-80.25359,36.54793],[-75.8409,36.5671],[-75.4323,35.6441],[-75.50475,35.18806],[-75.70525,35.17684],[-76.14745,34.94077],[-76.53472,34.55487],[-76.69676,34.66789],[-77.27904,34.53224],[-77.68828,34.26482],[-77.9435,33.8269],[-78.21288,33.89402],[-78.5301,33.8304],[-79.6693,34.7916],[-80.8122,34.8085],[-80.84685,34.96329],[-80.95122,35.05552],[-81.06383,35.01729],[-81.07482,35.13417],[-82.3632,35.1805],[-82.9989,34.9919],[-84.3333,34.9767],[-84.27184,35.28229],[-84.09056,35.27332],[-83.91478,35.53301],[-83.55498,35.5911],[-83.2556,35.73392],[-82.98644,35.81414],[-82.92327,35.96767],[-82.67882,36.0854],[-82.60192,36.08984],[-82.536,35.96989],[-82.35472,36.14752],[-82.04436,36.14309],[-81.90428,36.33803],[-81.74224,36.37342],[-81.6792,36.5974]]],description:"Most recent true color imagery for the state of North Carolina. The imagery has a pixel resolution of 6 inches and is comprised of imagery flown in 2010, 2012, 2013, and 2014"},{id:"landsat-niger-2012_10",name:"Niger Delta Oct 2012 Landsat",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/niger_oct_2012_321/{zoom}/{x}/{y}.png",endDate:"2012-10-01T00:00:00.000Z",startDate:"2012-10-01T00:00:00.000Z",zoomExtent:[1,13],polygon:[[[-6.92922,13.78574],[-5.13295,13.51884],[-5.07802,13.74039],[-3.60036,13.52418],[-3.54543,13.74039],[-2.06227,13.52685],[-1.3564,16.58454],[-3.17464,16.85285],[-3.22408,16.62665],[-4.72371,16.85022],[-4.76766,16.63455],[-6.27553,16.84759],[-6.92922,13.78574]]]},{id:"geodata.state.nj.us-Infrared2015",name:"NJ 2015 Aerial Imagery (Infrared)",type:"wms",template:"https://geodata.state.nj.us/imagerywms/Infrared2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Infrared2015&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-03T00:00:00.000Z",startDate:"2015-03-29T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],terms_url:"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={E30775F2-6370-4525-8E68-C371ED29BBB3}",terms_text:"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)",description:"Digital orthophotography of New Jersey, Near Infrared, 1 foot resolution"},{id:"geodata.state.nj.us-Natural2015",name:"NJ 2015 Aerial Imagery (Natural Color)",type:"wms",template:"https://geodata.state.nj.us/imagerywms/Natural2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Natural2015&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-03T00:00:00.000Z",startDate:"2015-03-29T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],terms_url:"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={CDC67AB8-ADA1-4B4B-9087-67A82CB9151C}",terms_text:"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)",description:"Digital orthophotography of New Jersey, Natural Color, 1 foot resolution"},{id:"NLSC-EMAP5",name:"NLSC General Map with Contour line",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",description:"The emap from Taiwan National Land Surveying and Mapping Center",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"IBGE_Salvador_Streets",name:"Nomes de Ruas IBGE Salvador-BA",type:"tms",template:"https://api.mapbox.com/styles/v1/wille/cj8lp78dn62wl2rquim47qo0g/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g",zoomExtent:[0,20],polygon:[[[-38.48974,-12.81113],[-38.54485,-13.01392],[-38.47755,-13.03466],[-38.33473,-12.94685],[-38.30006,-12.90669],[-38.33954,-12.90435],[-38.35482,-12.83021],[-38.38091,-12.82184],[-38.40717,-12.86754],[-38.46537,-12.81599],[-38.48974,-12.81113]]],description:"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.",overlay:true},{id:"kelkkareitit",name:"Nordic snowmobile overlay",type:"tms",template:"https://tiles.kelkkareitit.fi/kelkkareitit/{zoom}/{x}/{y}.png",zoomExtent:[3,18],polygon:[[[27.53173,60.21799],[31.35496,62.51233],[31.63513,62.90773],[30.09154,64.91889],[30.21239,65.87473],[29.13573,66.90422],[30.19041,67.67609],[28.70726,68.42748],[29.02587,68.9505],[31.04735,69.53452],[31.78344,70.44784],[28.32274,71.32192],[23.76342,71.29023],[17.1826,69.99806],[12.10691,68.01581],[9.97556,64.85828],[4.13084,61.95963],[4.57029,59.00664],[6.21826,57.95859],[8.14086,57.8506],[10.41502,58.75682],[12.63702,56.0383],[12.7716,55.25095],[14.2932,55.19769],[18.58886,56.84297],[20.69823,59.3444],[27.53173,60.21799]]],terms_url:"https://kelkkareitit.fi/",terms_text:"© Kelkkareitit.fi",description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",icon:"https://kelkkareitit.fi/img/favicon.png",overlay:true},{id:"geovekst-nib",name:"Norway Orthophoto",type:"tms",template:"https://waapi.webatlas.no/maptiles/tiles/webatlas-orto-newup/wa_grid/{zoom}/{x}/{y}.jpeg?api_key=b8e36d51-119a-423b-b156-d744d54123d5",zoomExtent:[0,21],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.norgeibilder.no",terms_text:"© Geovekst",best:true,description:"Most recent Norwegian orthophotos, courtesy of Geovekst and Norkart.",icon:"https://register.geonorge.no/data/organizations/_L_norgeibilder96x96.png"},{id:"npd-offshore",name:"NPD Offshore Installations overlay",type:"wms",template:"http://npdwms.npd.no/NPD_FactMap.asp?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Surface_labels,Surface,Pipelines,Pipelines_labels,Fields_labels,Fields&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,20],polygon:[[[8.51989,57.6454],[3.25195,56.08737],[2.61185,56.59434],[1.96321,57.90482],[1.48178,58.42936],[1.98303,60.31063],[1.78802,61.35659],[-0.49061,63.88725],[1.36226,67.01603],[14.99771,74.50082],[36.99371,74.50155],[36.99989,73.68633],[32.06909,70.27429],[23.97215,70.47356],[16.25974,68.58447],[12.12888,64.81157],[5.38328,61.92862],[5.7678,58.85355],[8.51989,57.6454]]],terms_url:"http://www.npd.no/no/Kart/Faktakart/",terms_text:"© Oljedirektoratet",description:"Production platforms and oil/natural gas fields on the Norwegian continental shelf",icon:"https://register.geonorge.no/data/organizations/870917732_od_liten.png",overlay:true},{id:"nve-snoskred",name:"NVE Avalanche Danger Areas overlay",type:"wms",template:"https://gis3.nve.no/map/services/SkredSnoAktR/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Snoskred-Aktsomhetsomrader&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,13],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/flaum-og-skred/kartlegging/aktsemdkart/aktsomhetskart-for-snoskred/",terms_text:"© NVE",description:"Potential snowslide areas, computed from theoretical height model. Valid for drops higher than 20-50 meters. Dark red=trigger area.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-nettanlegg",name:"NVE Electricity Network overlay",type:"wms",template:"https://gis3.nve.no/map/services/Nettanlegg1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sentralnett,Regionalnett,Distribusjonsnett,Sjokabler,Master og stolper,Transformatorstasjoner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Power lines (high voltage network) including transformers, submarine cables and pylons. Local distribution network is not included.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vannkraft",name:"NVE Hydropower Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vannkraft1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vannkraftverk,Vannvei,Dam&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Hydropower plants including waterways (tunnel, canal, pipeline) and dams",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vindkraft",name:"NVE Wind Power Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vindkraft/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vindkraft_utbygd,Vindkraft_under_bygging,Vindkraftomrade_konsesjonsbehandling,Vindturbin_konsesjonsbehandling&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Wind power turbines, farms and concession areas. Red colour = concession denied.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"orthos.dhses.ny.gov_latest",name:"NYS Orthos Online",type:"wms",template:"https://orthos.dhses.ny.gov/arcgis/services/Latest/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0,1,2,3,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-74.91231,45.03606],[-73.47788,45.02996],[-73.33846,45.03098],[-73.31978,45.00558],[-73.32265,44.98525],[-73.34852,44.9283],[-73.36721,44.8397],[-73.34277,44.81727],[-73.34565,44.77647],[-73.37296,44.73463],[-73.37008,44.67946],[-73.39739,44.64471],[-73.39308,44.60276],[-73.39739,44.54543],[-73.34996,44.51264],[-73.34565,44.49521],[-73.37871,44.4706],[-73.30828,44.43572],[-73.30397,44.41827],[-73.33271,44.33917],[-73.30828,44.27128],[-73.30828,44.25172],[-73.38014,44.14868],[-73.40458,44.04133],[-73.3399,43.79596],[-73.28097,43.64222],[-73.2091,43.54957],[-73.21342,43.51206],[-73.24647,42.67557],[-73.45919,42.14284],[-73.47069,42.03938],[-73.48794,41.73764],[-73.49944,41.64319],[-73.47788,41.62708],[-73.43189,41.57979],[-73.42614,41.56366],[-73.42685,41.45926],[-73.43979,41.40322],[-73.44985,41.38328],[-73.43835,41.37033],[-73.42757,41.35901],[-73.41751,41.3439],[-73.41895,41.27642],[-73.43045,41.24455],[-73.46566,41.19752],[-73.52962,41.14505],[-73.55477,41.13368],[-73.61586,41.13531],[-73.62664,41.10878],[-73.62736,41.05407],[-73.63958,40.99118],[-73.61873,40.98195],[-73.59933,40.96568],[-73.59933,40.93474],[-73.63455,40.91682],[-73.68054,40.89183],[-73.69851,40.87988],[-73.68629,40.87064],[-73.66257,40.87934],[-73.63814,40.90541],[-73.59789,40.91193],[-73.57562,40.9179],[-73.52675,40.92388],[-73.50159,40.94288],[-73.4901,40.95374],[-73.41751,40.96079],[-73.38374,40.96133],[-73.33702,40.95591],[-73.30828,40.93637],[-73.27091,40.92659],[-73.2091,40.91953],[-73.18682,40.92714],[-73.16814,40.93148],[-73.16598,40.95971],[-73.16886,40.97002],[-73.12933,40.98195],[-73.10777,40.98195],[-73.06681,40.9749],[-72.8584,40.97436],[-72.71826,40.98195],[-72.65574,41.00528],[-72.64424,41.00473],[-72.62628,40.99226],[-72.54148,41.03889],[-72.4768,41.06328],[-72.45811,41.08928],[-72.41859,41.09308],[-72.36612,41.13856],[-72.36037,41.1418],[-72.32229,41.15479],[-72.29067,41.16399],[-72.21449,41.18238],[-72.20083,41.19157],[-72.04848,41.25914],[-72.02548,41.2937],[-71.93924,41.30774],[-71.92343,41.30666],[-71.90259,41.2991],[-71.90187,41.28939],[-71.99458,41.24509],[-72.10453,41.19806],[-72.18287,41.16723],[-72.18934,41.16237],[-72.25186,41.12232],[-72.30432,41.10445],[-72.31582,41.09524],[-72.27917,41.08441],[-72.2727,41.08062],[-72.26839,41.04973],[-72.21736,41.04811],[-72.19652,41.04215],[-72.18646,41.05298],[-72.17137,41.0584],[-72.14981,41.05895],[-72.15628,41.09633],[-72.15268,41.1077],[-72.14909,41.14667],[-72.134,41.14505],[-72.07076,41.10553],[-72.07435,41.05678],[-72.08657,41.03185],[-72.10957,41.0069],[-72.08729,41.01287],[-72.06213,41.02534],[-72.04561,41.03239],[-72.01902,41.03293],[-72.00895,41.04215],[-72.00177,41.05136],[-71.96368,41.07737],[-71.922,41.08874],[-71.88966,41.08766],[-71.85588,41.08062],[-71.84582,41.07466],[-71.85588,41.05298],[-71.89038,41.03727],[-71.91625,41.03022],[-71.99099,41.00365],[-72.07938,40.97273],[-72.31941,40.88205],[-72.4423,40.8402],[-72.62771,40.7869],[-72.76569,40.75043],[-72.88499,40.71286],[-72.95973,40.68671],[-73.03735,40.66],[-73.08118,40.64855],[-73.22994,40.61637],[-73.32193,40.6131],[-73.35211,40.61855],[-73.55477,40.56944],[-73.75959,40.57708],[-73.88248,40.54815],[-73.9335,40.53449],[-73.945,40.53395],[-73.94572,40.56289],[-74.08227,40.56234],[-74.08011,40.54924],[-74.12251,40.52084],[-74.15772,40.51373],[-74.18719,40.50117],[-74.22887,40.48696],[-74.26121,40.48532],[-74.2763,40.4957],[-74.27918,40.54378],[-74.26983,40.56671],[-74.25834,40.57217],[-74.22528,40.57217],[-74.226,40.58309],[-74.25115,40.59564],[-74.25259,40.62237],[-74.24324,40.64091],[-74.2339,40.64909],[-74.20228,40.654],[-74.12538,40.65673],[-74.11532,40.69107],[-74.09951,40.68998],[-74.07795,40.71068],[-74.06286,40.7183],[-74.05208,40.7439],[-74.02549,40.79288],[-73.98094,40.86901],[-73.96225,40.92551],[-73.94931,40.96459],[-73.94644,40.99877],[-73.98165,41.01612],[-74.04561,41.04323],[-74.18072,41.09524],[-74.30792,41.14938],[-74.44087,41.21537],[-74.52783,41.25914],[-74.61335,41.30234],[-74.65791,41.31098],[-74.70246,41.33581],[-74.76714,41.38975],[-74.79661,41.41023],[-74.85338,41.42263],[-74.90728,41.43179],[-74.99783,41.47111],[-75.04167,41.52708],[-75.08479,41.59323],[-75.08407,41.61848],[-75.07329,41.66467],[-75.08766,41.70278],[-75.08766,41.71351],[-75.12144,41.76177],[-75.11928,41.79232],[-75.13078,41.81696],[-75.18755,41.83838],[-75.25295,41.84962],[-75.28745,41.85497],[-75.29823,41.88227],[-75.30613,41.9304],[-75.34063,41.94003],[-75.3665,41.9566],[-75.37225,41.97744],[-75.58066,41.97957],[-75.58137,41.92399],[-75.78906,41.92666],[-75.78691,41.98278],[-79.77687,41.98118],[-79.7819,42.20994],[-79.77184,42.28017],[-79.72153,42.29824],[-79.57349,42.36731],[-79.42976,42.46599],[-79.3737,42.49991],[-79.25728,42.54546],[-79.18973,42.5624],[-79.16529,42.56981],[-79.12074,42.62483],[-79.0963,42.64598],[-79.06899,42.6967],[-79.03162,42.71043],[-78.98851,42.72311],[-78.88358,42.77693],[-78.88646,42.8149],[-78.93964,42.88655],[-78.93964,42.93603],[-79.04887,42.96969],[-79.04743,43.05167],[-79.09343,43.05272],[-79.09199,43.09262],[-79.08624,43.26556],[-79.06468,43.27602],[-78.84909,43.33041],[-78.72979,43.35237],[-78.63924,43.37013],[-78.54869,43.37953],[-78.47826,43.38789],[-77.95508,43.38476],[-77.73158,43.34714],[-77.71146,43.34034],[-77.66259,43.31159],[-77.61516,43.28387],[-77.55336,43.253],[-77.5282,43.25509],[-77.45634,43.27864],[-77.42256,43.28492],[-77.16385,43.29433],[-77.0503,43.29381],[-76.94178,43.29329],[-76.91447,43.30793],[-76.85051,43.3163],[-76.80236,43.32832],[-76.75996,43.35184],[-76.64785,43.42809],[-76.54509,43.48026],[-76.51993,43.49486],[-76.44304,43.52717],[-76.4222,43.53811],[-76.28206,43.53863],[-76.23822,43.55686],[-76.24038,43.74147],[-76.30649,43.82915],[-76.31152,43.8675],[-76.34602,43.8618],[-76.40064,43.86128],[-76.47178,43.88408],[-76.46675,43.90893],[-76.4186,43.93119],[-76.37189,43.93223],[-76.36974,43.90272],[-76.33308,43.92964],[-76.27847,43.92964],[-76.27847,43.90427],[-76.26697,43.89599],[-76.23607,43.91204],[-76.19295,43.93326],[-76.19007,43.95086],[-76.21523,43.96017],[-76.25044,43.94982],[-76.31224,43.94775],[-76.30578,43.9762],[-76.33093,44.00464],[-76.39561,44.0248],[-76.39848,44.06251],[-76.37548,44.06457],[-76.3762,44.0909],[-76.47107,44.09297],[-76.46604,44.10948],[-76.44232,44.1296],[-76.39848,44.13218],[-76.39776,44.20435],[-76.3762,44.21671],[-76.23966,44.21929],[-76.23966,44.22804],[-76.21738,44.22856],[-76.21523,44.3479],[-76.11893,44.37103],[-76.04634,44.39157],[-75.93423,44.43418],[-75.83721,44.50341],[-75.76822,44.55823],[-75.69923,44.60379],[-75.63168,44.64829],[-75.56772,44.70501],[-75.50448,44.74586],[-75.45274,44.78157],[-75.31763,44.8723],[-75.15378,44.93745],[-75.09054,44.97305],[-74.97411,45.02793],[-74.91985,45.03682],[-74.91231,45.03606]]],terms_url:"https://gis.ny.gov/gateway/orthoprogram/index.cfm",terms_text:"New York State Statewide Digital Orthoimagery Program",description:"New York State High Resolution Digital Orthoimagery, 1 foot resolution",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/ny/NYS_Orthos_Online.png"},{id:"olho_dagua_do_casado",name:"Olho d'Agua do Casado AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Olho%20Dagua%20do%20Casado&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.7822,-9.54444],[-37.7826,-9.45388],[-37.81147,-9.45412],[-37.81735,-9.45451],[-37.82057,-9.45416],[-37.87394,-9.45428],[-37.87358,-9.54475],[-37.7822,-9.54444]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"osmbe-nl",name:"OpenStreetMap (Belgian Style - Dutch)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-nl/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osmbe-fr",name:"OpenStreetMap (Belgian Style - French)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-fr/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"MAPNIK",name:"OpenStreetMap (Standard)",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png",zoomExtent:[0,19],terms_url:"https://www.openstreetmap.org",terms_text:"© OpenStreetMap contributors, CC-BY-SA","default":true,description:"The default OpenStreetMap layer.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osm-gps",name:"OpenStreetMap GPS traces",type:"tms",template:"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png",zoomExtent:[0,20],terms_url:"https://www.openstreetmap.org/copyright",terms_text:"© OpenStreetMap contributors",terms_html:"<span style='display: inline-block; padding: 0 8px; background-color: rgba(0,0,0,0.5);'><span style='color: #eee;'>GPS Direction:</span> <span style='font-size: 15px; padding-left: 2px; font-weight: bold;'> <span style='color: #0ee;'>&larr;</span> <span style='color: #96f;'>&darr;</span> <span style='color: #6e0;'>&uarr;</span> <span style='color: #f63;'>&rarr;</span> </span></span> © <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>.",description:"Public GPS traces uploaded to OpenStreetMap.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png",overlay:true},{id:"osm-hu-ortho",name:"openstreetmap.hu orthophotos",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/openstreetmap.hu.orthophotos/mercator/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[18.8577,47.44553],[18.86169,47.44883],[18.86491,47.44704],[18.8609,47.44373],[18.8577,47.44553]],[[18.80614,47.59304],[18.81376,47.5974],[18.82295,47.59011],[18.81533,47.58574],[18.80614,47.59304]],[[17.66691,46.92167],[17.66369,46.93033],[17.67207,46.93178],[17.67529,46.92312],[17.66691,46.92167]],[[17.6725,46.93546],[17.67529,46.92708],[17.68409,46.92845],[17.68129,46.93683],[17.6725,46.93546]],[[17.82155,46.96075],[17.82507,46.9547],[17.83347,46.95701],[17.82995,46.96304],[17.82155,46.96075]],[[18.62796,47.19818],[18.63943,47.20324],[18.64953,47.1926],[18.63806,47.18753],[18.62796,47.19818]],[[17.51223,46.8789],[17.51406,46.88166],[17.5214,46.87939],[17.51957,46.87662],[17.51223,46.8789]],[[17.67724,46.91844],[17.68718,46.92344],[17.70594,46.90603],[17.69249,46.89926],[17.68144,46.90951],[17.68275,46.90595],[17.68198,46.90582],[17.68667,46.89926],[17.67947,46.89686],[17.67405,46.90445],[17.67131,46.90398],[17.66666,46.91662],[17.67724,46.91844]],[[18.80776,47.55615],[18.81638,47.55969],[18.81351,47.56305],[18.80473,47.55949],[18.80776,47.55615]],[[18.98706,47.46989],[18.97962,47.47042],[18.98056,47.47648],[18.988,47.47595],[18.98706,47.46989]],[[18.98356,47.41149],[19.00839,47.42511],[19.01568,47.41932],[18.9907,47.40518],[18.98356,47.41149]],[[19.02652,47.87563],[19.03163,47.87613],[19.03305,47.86957],[19.02793,47.86907],[19.02652,47.87563]],[[18.00803,46.86674],[18.01095,46.86028],[18.01323,46.86064],[18.01626,46.8536],[18.01682,46.85371],[18.01852,46.84948],[18.02021,46.84631],[18.02961,46.84829],[18.02742,46.85392],[18.03388,46.85534],[18.03056,46.86395],[18.03367,46.86456],[18.03058,46.87154],[18.00803,46.86674]],[[17.99509,46.87632],[17.98585,46.87595],[17.98535,46.88397],[17.98599,46.88412],[17.98531,46.88537],[17.95829,46.87876],[17.96077,46.87351],[17.92868,46.86631],[17.92467,46.87372],[17.93136,46.87535],[17.92995,46.87822],[17.9553,46.88415],[17.9946,46.89341],[17.99786,46.88671],[17.98771,46.88443],[17.98774,46.88411],[17.99415,46.88442],[17.99509,46.87632]],[[18.86533,47.42808],[18.87291,47.42455],[18.87701,47.42871],[18.86799,47.43238],[18.86774,47.43208],[18.86517,47.43317],[18.86477,47.4327],[18.86441,47.43285],[18.86288,47.43108],[18.86328,47.43092],[18.86288,47.43046],[18.86516,47.42947],[18.86448,47.42875],[18.86553,47.42829],[18.86533,47.42808]],[[19.16232,47.59776],[19.16893,47.59033],[19.17815,47.59512],[19.17291,47.60068],[19.16232,47.59776]],[[18.13162,47.02619],[18.14103,47.02111],[18.13923,47.01957],[18.15704,47.01044],[18.16271,47.00242],[18.16463,46.99571],[18.16639,46.9959],[18.16702,46.99363],[18.17101,46.99454],[18.1722,46.99571],[18.16977,47.00416],[18.17656,47.00709],[18.1761,47.00771],[18.17639,47.00781],[18.17057,47.01414],[18.1748,47.01815],[18.17782,47.01428],[18.18518,47.01746],[18.17933,47.0239],[18.17589,47.02268],[18.17277,47.02434],[18.17219,47.02377],[18.17159,47.02407],[18.16938,47.0221],[18.16216,47.02596],[18.16485,47.02832],[18.16245,47.02947],[18.16323,47.03025],[18.1521,47.03554],[18.15156,47.03498],[18.1503,47.03563],[18.14513,47.03112],[18.14337,47.0322],[18.1454,47.03419],[18.14441,47.03467],[18.14522,47.03539],[18.14168,47.03697],[18.13111,47.02745],[18.13226,47.0269],[18.13162,47.02619]]],terms_text:"openstreetmap.hu"},{id:"lu.geoportail.opendata.ortho2010",name:"Ortho 2010 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2010/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2010-07-02T00:00:00.000Z",startDate:"2010-06-24T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2013",name:"Ortho 2013 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2013/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2013-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2016",name:"Ortho 2016 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2016/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2016-08-16T00:00:00.000Z",startDate:"2013-08-30T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2017",name:"Ortho 2017 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2017/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-06-22T00:00:00.000Z",startDate:"2017-06-14T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"ORTOFOTO_V1",name:"Orthophoto 1st cycle (1994-1999) - Latvia",type:"wms",template:"https://services.lgia.gov.lv/arcfree/services/Ortofoto_v1/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[27.66415,55.75354],[27.68475,55.93319],[28.26703,56.1908],[28.23682,56.49827],[27.82757,56.94886],[27.90997,57.37037],[27.58313,57.56387],[26.93219,57.63598],[26.5202,57.58596],[26.0368,57.87192],[25.1991,58.10487],[24.31744,57.90258],[24.31744,57.19669],[23.93567,56.9788],[23.55115,56.98479],[23.23804,57.10283],[23.14465,57.37333],[22.60632,57.60215],[22.60083,57.76953],[21.66699,57.56681],[21.40057,57.29625],[21.38409,57.0177],[21.04626,56.80026],[20.99133,56.36615],[21.0545,56.0392],[21.28796,56.05608],[21.29895,56.1908],[22.11743,56.41936],[24.44379,56.24425],[24.81183,56.3996],[25.15515,56.1694],[25.58087,56.12962],[26.53668,55.66146],[26.91296,55.66766],[27.0805,55.80991],[27.66415,55.75354]]],terms_text:"Latvijas Ģeotelpiskās informācijas aģentūras brīvais WMS serviss 1994 - 1999.gada Latvijas ortofotokarte"},{id:"ORTOS_DGRF_2004_06",name:"Ortofotos DGRF 2004-2006 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt:8888/wms/produtos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2004-01-01T00:00:00.000Z",zoomExtent:[14,19],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/ortofotos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"ORTOS_DGT_2014_15",name:"Ortofotos Litoral DGT 2014-2015 (WMS)",type:"wms",template:"http://ows.dgterritorio.pt/wss/service/ortos2014-2015-wms/guest?language=por&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortoimagens_2014-2015_Litoral&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[1,20],polygon:[[[-7.38968,37.19205],[-7.52426,37.18002],[-7.89505,36.98171],[-8.15186,37.10886],[-8.65036,37.14062],[-8.95111,37.03545],[-8.78632,37.34833],[-8.76434,37.55111],[-8.7561,38.38258],[-8.47664,38.33466],[-8.47183,38.40141],[-8.66066,38.46596],[-8.66959,38.60882],[-9.142,38.53689],[-8.81104,38.67372],[-8.79318,38.85468],[-8.95935,38.9829],[-9.18732,38.84934],[-9.2395,38.72838],[-9.37821,38.74659],[-9.38233,39.07891],[-9.29169,39.2514],[-9.31915,39.33642],[-9.17084,39.38526],[-9.06372,39.48815],[-9.02252,39.69662],[-8.78632,40.14529],[-8.86322,40.2093],[-8.72589,40.53155],[-8.64075,40.50858],[-8.62427,40.63063],[-8.53089,40.6004],[-8.535,40.71292],[-8.61466,40.89275],[-8.61878,41.10419],[-8.53089,41.16728],[-8.66959,41.21689],[-8.72315,41.41081],[-8.76984,41.65958],[-8.66547,41.73955],[-8.81104,41.72316],[-8.81104,41.85217],[-8.74649,41.9125],[-8.83576,41.93089],[-8.91815,41.84501],[-8.89343,41.70778],[-8.82065,41.50755],[-8.73139,41.16315],[-8.67508,41.069],[-8.68469,40.90729],[-8.93326,40.17573],[-8.88107,40.12219],[-9.11453,39.64694],[-9.11865,39.5623],[-9.3013,39.40543],[-9.43039,39.37571],[-9.34799,39.23864],[-9.45099,39.04799],[-9.45786,38.89317],[-9.53201,38.78835],[-9.50043,38.68551],[-9.28894,38.663],[-9.19418,38.54172],[-9.25324,38.38473],[-9.03488,38.42347],[-8.92502,38.46757],[-8.81241,38.35997],[-8.7973,38.14968],[-8.91953,37.95286],[-8.84262,37.8651],[-8.83988,37.40617],[-9.02664,37.01023],[-8.92914,36.97513],[-8.61466,37.099],[-8.15048,37.05956],[-7.8923,36.93672],[-7.48993,37.15156],[-7.39105,37.15813],[-7.38968,37.19205]]],terms_url:"http://www.dgterritorio.pt/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"OS-historic-25k-OSM_Limited",name:"OS 1:25k historic (OSM)",type:"tms",template:"https://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg",zoomExtent:[6,17],polygon:[[[-6.45854,49.90441],[-6.3872,49.98411],[-6.22968,49.98962],[-6.21713,49.86801],[-6.45512,49.85918],[-6.45854,49.90441]],[[-1.44951,60.86341],[-0.71671,60.85451],[-0.73497,60.43598],[-0.69388,60.41682],[-0.72584,60.39427],[-0.73954,60.04847],[-0.92674,60.04619],[-0.93815,59.82662],[-1.45865,59.8312],[-1.44552,60.0536],[-1.46321,60.0536],[-1.46435,60.063],[-1.57165,60.06385],[-1.56936,60.179],[-1.64356,60.1807],[-1.64356,60.18922],[-1.82162,60.1895],[-1.82048,60.36155],[-1.8416,60.36973],[-1.82162,60.38328],[-1.81799,60.59343],[-1.45317,60.59343],[-1.44951,60.86341]],[[-4.90892,54.42421],[-4.2826,54.44299],[-4.25354,54.02977],[-4.87664,54.02218],[-4.90892,54.42421]],[[-5.86674,59.14446],[-5.776,59.14709],[-5.772,59.10141],[-5.86218,59.09906],[-5.86674,59.14446]],[[-1.70659,59.57036],[-1.55792,59.56935],[-1.55649,59.49657],[-1.70545,59.49758],[-1.70659,59.57036]],[[-7.68658,58.2941],[-7.53306,58.3007],[-7.52564,58.26469],[-7.67973,58.25779],[-7.68658,58.2941]],[[-4.53383,59.03599],[-4.48132,59.03716],[-4.47961,59.01866],[-4.53326,59.01807],[-4.53383,59.03599]],[[-8.67107,57.87699],[-8.46732,57.88973],[-8.44678,57.7907],[-8.65109,57.77792],[-8.67107,57.87699]],[[-5.23955,50.35306],[-5.79201,50.33849],[-5.76005,49.9317],[-4.65514,49.95815],[-4.67797,50.28601],[-4.24422,50.28017],[-4.24878,50.20425],[-3.38129,50.20425],[-3.42238,50.51882],[-3.11648,50.52463],[-3.12105,50.65796],[-2.67364,50.66195],[-2.59535,50.63943],[-2.5905,50.57284],[-2.47912,50.57335],[-2.47589,50.50667],[-2.39679,50.50564],[-2.40164,50.57233],[-1.04003,50.57182],[-1.03357,50.70593],[-0.5493,50.70388],[-0.54607,50.78866],[-0.09247,50.7856],[-0.08763,50.71819],[0.47897,50.71206],[0.48704,50.81825],[0.97615,50.80499],[0.99229,51.01263],[1.44912,51.00044],[1.47818,51.40904],[1.02296,51.42716],[1.03588,51.76409],[1.61054,51.7501],[1.64606,52.156],[1.72677,52.15402],[1.74937,52.44818],[1.78707,52.48116],[1.7591,52.52251],[1.79335,52.96027],[0.37981,52.99585],[0.38952,53.25112],[0.34786,53.25112],[0.32389,53.28219],[0.34615,53.65385],[0.12849,53.65755],[0.11658,53.66747],[0.13506,54.06557],[-0.06098,54.06591],[-0.04142,54.47094],[-0.56627,54.47718],[-0.55921,54.65651],[-1.16656,54.66235],[-1.16374,54.84261],[-1.33162,54.84391],[-1.32571,55.24708],[-1.52945,55.24871],[-1.52418,55.65401],[-1.76388,55.65401],[-1.77337,55.97191],[-2.16079,55.9683],[-2.15433,56.06214],[-2.45781,56.05853],[-2.41906,56.64172],[-2.09622,56.64172],[-2.0833,57.00213],[-1.92834,57.01268],[-1.9181,57.35909],[-1.75022,57.36257],[-1.76959,57.76086],[-3.69376,57.75742],[-3.70667,57.98064],[-3.5969,57.97721],[-3.60336,58.12073],[-3.02223,58.13096],[-3.02869,58.54108],[-2.8479,58.53097],[-2.86081,58.84305],[-2.67962,58.8415],[-2.68419,58.88517],[-2.63397,58.90522],[-2.67962,58.93351],[-2.68876,59.02292],[-2.36687,59.02292],[-2.37029,59.26529],[-2.3429,59.2822],[-2.37144,59.29969],[-2.37372,59.37071],[-2.3429,59.38582],[-2.37258,59.40035],[-2.37144,59.42591],[-3.07342,59.42301],[-3.07114,59.34336],[-3.1031,59.33114],[-3.07456,59.31367],[-3.07228,59.2326],[-3.38503,59.14842],[-3.37476,58.93528],[-3.56538,58.93233],[-3.55483,58.69759],[-5.28086,58.66677],[-5.25342,58.35141],[-5.50685,58.34379],[-5.47618,58.03236],[-5.8975,58.02124],[-5.8523,57.61718],[-6.13963,57.61372],[-6.15416,57.74232],[-6.29137,57.73801],[-6.33657,58.13988],[-6.11219,58.14669],[-6.14738,58.51063],[-6.29348,58.54162],[-6.84137,58.29773],[-7.00574,58.29293],[-7.10162,58.20644],[-7.25731,58.17931],[-7.25311,58.10049],[-7.40707,58.09056],[-7.39135,57.79114],[-7.79099,57.77332],[-7.76242,57.54442],[-7.6985,57.14532],[-7.79438,57.13045],[-7.71676,56.73686],[-7.01221,56.76544],[-6.97992,56.54539],[-7.06386,56.54539],[-7.04449,56.35626],[-6.50068,56.38129],[-6.44914,55.97936],[-6.56329,55.96915],[-6.53937,55.70301],[-6.55955,55.69073],[-6.53453,55.67617],[-6.52162,55.57044],[-5.89126,55.59234],[-5.85601,55.23207],[-5.22936,55.2516],[-5.18371,54.62541],[-3.6656,54.65184],[-3.64962,54.432],[-3.54004,54.43067],[-3.53091,54.02902],[-3.06977,54.03036],[-3.06757,53.82214],[-3.08049,53.77399],[-3.06192,53.74775],[-3.06112,53.6737],[-3.21447,53.67084],[-3.20577,53.42262],[-3.27996,53.35522],[-3.28967,53.36084],[-3.33275,53.36493],[-3.37613,53.35403],[-4.0889,53.34331],[-4.09455,53.4612],[-4.69741,53.44486],[-4.68828,53.33186],[-4.72024,53.28958],[-4.68371,53.24862],[-4.67687,53.15426],[-4.84808,53.14468],[-4.81783,52.74403],[-4.25458,52.75589],[-4.22888,52.25488],[-4.26076,52.25364],[-4.27246,52.24326],[-4.81363,52.23009],[-4.80792,52.11389],[-5.38891,52.09917],[-5.37179,51.91297],[-5.42087,51.91015],[-5.41402,51.84532],[-5.36836,51.84744],[-5.34668,51.55953],[-4.77368,51.57585],[-4.76569,51.48851],[-4.19154,51.49704],[-4.18698,51.43447],[-3.61512,51.44443],[-3.61055,51.37465],[-3.14941,51.37893],[-3.14941,51.29193],[-4.30387,51.27459],[-4.28612,51.05087],[-4.85433,51.03666],[-4.83722,50.72128],[-5.26183,50.70827],[-5.23955,50.35306]],[[-2.15027,60.17132],[-2.00302,60.16961],[-2.00131,60.0997],[-2.14855,60.10112],[-2.15027,60.17132]],[[-6.2086,59.11635],[-6.12299,59.11664],[-6.12185,59.0715],[-6.20974,59.0715],[-6.2086,59.11635]],[[-4.41596,59.0889],[-4.4212,59.07708],[-4.39719,59.07791],[-4.39134,59.08973],[-4.41596,59.0889]]]},{id:"OS-New_Popular_Edition-historic",name:"OS New Popular Edition historic",type:"tms",template:"https://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png",zoomExtent:[6,15],polygon:[[[-3.68466,55.23744],[-3.65106,54.42892],[-3.54463,54.43072],[-3.52815,54.02593],[-3.07016,54.03137],[-3.06123,53.6717],[-3.21298,53.67048],[-3.20371,53.35568],[-4.10424,53.34297],[-4.11042,53.46005],[-4.71124,53.44799],[-4.69339,53.15171],[-4.84307,53.1476],[-4.81595,52.74378],[-4.25342,52.75541],[-4.22733,52.24378],[-4.81303,52.23117],[-4.80754,52.11452],[-5.38913,52.09892],[-5.3493,51.56085],[-4.77252,51.57622],[-4.76772,51.48652],[-4.19299,51.49806],[-4.18956,51.43518],[-3.61278,51.44502],[-3.61072,51.37307],[-3.15067,51.37864],[-3.14723,51.28984],[-4.29462,51.2718],[-4.28363,51.04744],[-4.85423,51.03406],[-4.83707,50.76556],[-5.2621,50.75427],[-5.23395,50.34984],[-5.79562,50.33319],[-5.76228,49.92913],[-4.64717,49.96094],[-4.66914,50.2753],[-4.25166,50.2832],[-4.24617,50.19361],[-3.40159,50.20679],[-3.41395,50.52041],[-3.13105,50.52391],[-3.1338,50.66078],[-2.66963,50.66252],[-2.66688,50.5719],[-1.04228,50.56929],[-1.04502,50.70429],[-0.54652,50.69994],[-0.54103,50.79031],[-0.08784,50.78424],[-0.08887,50.72211],[0.47693,50.70907],[0.48242,50.81939],[0.98024,50.8068],[0.99328,51.01333],[1.44784,51.00036],[1.47805,51.40478],[1.018,51.41634],[1.04272,51.76742],[1.6195,51.75084],[1.65246,52.15456],[1.72662,52.15245],[1.79529,52.9594],[0.60396,52.99123],[0.60327,52.97222],[0.38148,52.97883],[0.39625,53.24796],[0.31934,53.24961],[0.34269,53.65319],[0.11609,53.65726],[0.13738,54.06181],[-0.06243,54.06584],[-0.04183,54.46924],[-0.56781,54.47722],[-0.56163,54.65715],[-1.18098,54.66271],[-1.17755,54.84183],[-1.33342,54.84381],[-1.32655,55.24743],[-1.53117,55.24821],[-1.52636,55.6528],[-1.76394,55.6528],[-1.76257,55.96765],[-2.40321,55.96727],[-2.39772,55.56243],[-2.16151,55.56282],[-2.15808,55.2486],[-2.92158,55.24571],[-3.68466,55.23744]]]},{id:"OS-OpenData_Locator",name:"OS OpenData Locator",type:"tms",template:"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png",zoomExtent:[0,22],polygon:[[[-0.88639,61.11666],[-9.24009,57.92465],[-6.61235,55.46835],[-6.1039,55.40191],[-5.61358,55.06607],[-5.40088,54.90562],[-5.29371,54.77201],[-5.11832,54.5911],[-4.92368,54.38599],[-4.94067,53.59884],[-5.44172,52.27725],[-6.03376,51.6012],[-7.54473,49.33762],[-2.59721,50.2588],[0.65674,50.64047],[1.32419,50.83256],[1.87586,51.19234],[2.05883,52.88863],[-1.61452,56.47933],[-1.21085,57.64972],[-1.69525,59.08903],[0.21543,60.43058],[-0.88639,61.11666]]],overlay:true},{id:"OS-OpenData_StreetView",name:"OS OpenData StreetView",type:"tms",template:"https://{switch:a,b,c}.os.openstreetmap.org/sv/{zoom}/{x}/{y}.png",zoomExtent:[1,18],polygon:[[[-5.82929,50.02297],[-5.82929,50.25482],[-5.37336,50.25482],[-5.37336,50.35306],[-5.1756,50.35306],[-5.1756,50.59254],[-4.99707,50.59254],[-4.99707,50.69356],[-4.79657,50.69356],[-4.79657,50.78221],[-4.69495,50.78221],[-4.69495,50.96074],[-4.60431,50.96074],[-4.60431,51.06921],[-4.37922,51.06921],[-4.37922,51.25218],[-3.90393,51.25218],[-3.90393,51.2917],[-3.71717,51.2917],[-3.71717,51.2453],[-3.14862,51.2453],[-3.14862,51.36207],[-3.74463,51.36207],[-3.74463,51.43404],[-3.82978,51.43404],[-3.82978,51.52982],[-4.08521,51.52982],[-4.08521,51.49393],[-4.37922,51.49393],[-4.37922,51.54272],[-5.14442,51.54272],[-5.14442,51.6296],[-5.73871,51.6296],[-5.73871,51.77404],[-5.50954,51.77404],[-5.50954,51.98026],[-5.1988,51.98026],[-5.1988,52.09734],[-4.88806,52.09734],[-4.88806,52.18316],[-4.49575,52.18316],[-4.49575,52.29257],[-4.30154,52.29257],[-4.30154,52.36853],[-4.18112,52.36853],[-4.18112,52.79337],[-4.44137,52.79337],[-4.44137,52.73696],[-4.85698,52.73696],[-4.85698,52.93173],[-4.7288,52.93173],[-4.7288,53.50386],[-4.15782,53.50386],[-4.15782,53.41135],[-3.31105,53.41135],[-3.31105,53.50386],[-3.23337,53.50386],[-3.23337,54.01592],[-3.39262,54.01592],[-3.39262,54.1981],[-3.55964,54.1981],[-3.55964,54.43373],[-3.7189,54.43373],[-3.7189,54.7219],[-4.30154,54.7219],[-4.30154,54.61407],[-5.04731,54.61407],[-5.04731,54.75329],[-5.22987,54.75329],[-5.22987,55.21908],[-5.65326,55.21908],[-5.65326,55.25009],[-5.89796,55.25009],[-5.89796,55.48225],[-6.59332,55.48225],[-6.59332,56.30134],[-7.17277,56.30134],[-7.17277,56.56018],[-6.81717,56.56018],[-6.81717,56.69917],[-6.53153,56.69917],[-6.53153,56.9067],[-6.81168,56.9067],[-6.81168,57.37166],[-6.8721,57.37166],[-6.8721,57.55189],[-7.09732,57.55189],[-7.09732,57.24111],[-7.17423,57.24111],[-7.17423,56.9067],[-7.37198,56.9067],[-7.37198,56.80759],[-7.5203,56.80759],[-7.5203,56.71425],[-7.83068,56.71425],[-7.83068,56.89946],[-7.64941,56.89946],[-7.64941,57.47396],[-7.83068,57.47396],[-7.83068,57.79156],[-7.47362,57.79156],[-7.47362,58.08606],[-7.18798,58.08606],[-7.18798,58.3672],[-6.80346,58.3672],[-6.80346,58.41558],[-6.63866,58.41558],[-6.63866,58.46733],[-6.51781,58.46733],[-6.51781,58.56256],[-6.05362,58.56256],[-6.05362,58.15688],[-6.14701,58.15688],[-6.14701,58.11059],[-6.27998,58.11059],[-6.27998,57.71227],[-6.15913,57.71227],[-6.15913,57.66676],[-5.93391,57.66676],[-5.93391,57.88925],[-5.80643,57.88925],[-5.80643,57.96218],[-5.61417,57.96218],[-5.61417,58.09112],[-5.49082,58.09112],[-5.49082,58.37333],[-5.31991,58.37333],[-5.31991,58.75015],[-3.572,58.75015],[-3.572,59.20918],[-3.19445,59.20918],[-3.19445,59.47592],[-2.24358,59.47592],[-2.24358,59.13887],[-2.4611,59.13887],[-2.4611,58.81859],[-2.74077,58.81859],[-2.74077,58.58047],[-2.91167,58.58047],[-2.91167,58.11575],[-3.48654,58.11575],[-3.48654,57.74039],[-1.71532,57.74039],[-1.71532,57.22256],[-1.97945,57.22256],[-1.97945,56.87607],[-2.1659,56.87607],[-2.1659,56.63332],[-2.36011,56.63332],[-2.36011,56.04775],[-1.97945,56.04775],[-1.97945,55.86509],[-1.4745,55.86509],[-1.4745,55.24999],[-1.3222,55.24999],[-1.3222,54.82217],[-1.055,54.82217],[-1.055,54.67466],[-0.66188,54.67466],[-0.66188,54.55275],[-0.32476,54.55275],[-0.32476,54.28652],[0.00928,54.28652],[0.00928,53.79385],[0.2082,53.79385],[0.2082,53.52177],[0.41635,53.52177],[0.41635,53.02989],[1.42734,53.02989],[1.42734,52.92021],[1.83339,52.92021],[1.83339,52.04249],[1.52355,52.04249],[1.52355,51.82613],[1.2697,51.82613],[1.2697,51.69675],[1.11665,51.69675],[1.11665,51.44035],[1.52355,51.44035],[1.52355,51.33318],[1.45076,51.33318],[1.45076,51.02076],[1.06999,51.02076],[1.06999,50.90084],[0.77881,50.90084],[0.77881,50.72984],[-0.7256,50.72984],[-0.7256,50.70384],[-1.00744,50.70384],[-1.00744,50.57363],[-2.36253,50.57363],[-2.36253,50.48464],[-2.49878,50.48464],[-2.49878,50.57363],[-3.40964,50.57363],[-3.40964,50.20578],[-3.69224,50.20578],[-3.69224,50.13477],[-5.00547,50.13477],[-5.00547,49.94745],[-5.28395,49.94745],[-5.28395,50.02297],[-5.82929,50.02297]],[[-6.45807,49.86736],[-6.45807,49.94999],[-6.39788,49.94999],[-6.39788,50.00538],[-6.17996,50.00538],[-6.17996,49.91686],[-6.25402,49.91686],[-6.25402,49.86736],[-6.45807,49.86736]],[[-5.83432,49.93216],[-5.83432,49.97546],[-5.76833,49.97546],[-5.76833,49.93216],[-5.83432,49.93216]],[[-1.94838,60.68857],[-1.94838,60.30588],[-1.75431,60.30588],[-1.75431,60.12844],[-1.57549,60.12844],[-1.57549,59.79792],[-1.0317,59.79792],[-1.0317,60.03545],[-0.66269,60.03545],[-0.66269,60.91039],[-1.10344,60.91039],[-1.10344,60.804],[-1.35063,60.804],[-1.35063,60.68857],[-1.94838,60.68857]],[[-2.20338,60.19686],[-2.20338,60.09294],[-1.9864,60.09294],[-1.9864,60.19686],[-2.20338,60.19686]],[[-1.75431,59.56983],[-1.75431,59.46394],[-1.53733,59.46394],[-1.53733,59.56983],[-1.75431,59.56983]],[[-4.5586,59.13705],[-4.5586,58.95691],[-4.2867,58.95691],[-4.2867,59.13705],[-4.5586,59.13705]],[[-6.27877,59.20257],[-6.27877,59.02278],[-5.66506,59.02278],[-5.66506,59.20257],[-6.27877,59.20257]],[[-8.71635,57.94406],[-8.71635,57.73059],[-8.35929,57.73059],[-8.35929,57.94406],[-8.71635,57.94406]],[[-7.6077,50.4021],[-7.6077,50.26887],[-7.39072,50.26887],[-7.39072,50.4021],[-7.6077,50.4021]],[[-7.73043,58.35799],[-7.73043,58.24831],[-7.51345,58.24831],[-7.51345,58.35799],[-7.73043,58.35799]]]},{id:"OS-Scottish_Popular-historic",name:"OS Scottish Popular historic",type:"tms",template:"https://ooc.openstreetmap.org/npescotland/{zoom}/{x}/{y}.jpg",zoomExtent:[6,15],polygon:[[[-6.37546,57.1045],[-6.12998,57.11183],[-6.12586,56.94143],[-6.26045,56.93892],[-6.26045,56.83765],[-6.24259,56.65806],[-6.3552,56.65655],[-6.37649,56.79029],[-7.02812,56.76396],[-6.99636,56.54246],[-7.04391,56.53937],[-7.03206,56.44201],[-6.98331,56.44353],[-6.97593,56.36063],[-6.45271,56.37964],[-6.44035,56.2013],[-6.19315,56.21199],[-6.18354,56.12483],[-6.36379,56.11641],[-6.36173,55.98258],[-6.48944,55.97912],[-6.47777,55.84134],[-6.55467,55.8371],[-6.53545,55.66049],[-6.45442,55.66087],[-6.44412,55.57285],[-6.19985,55.57266],[-5.96845,55.58857],[-5.98562,55.7686],[-5.90665,55.77169],[-5.88949,55.59284],[-5.80983,55.594],[-5.79335,55.41395],[-5.827,55.41395],[-5.80915,55.24247],[-5.61826,55.24873],[-5.62101,55.26713],[-5.46239,55.27026],[-5.48642,55.514],[-5.43836,55.51516],[-5.42943,55.42681],[-5.24129,55.43071],[-5.19464,54.80351],[-5.07105,54.80668],[-5.05221,54.62471],[-4.3223,54.65173],[-4.33123,54.7319],[-4.06786,54.73697],[-4.06786,54.76471],[-3.55699,54.77342],[-3.55837,54.83754],[-2.42098,54.84671],[-2.42647,55.25265],[-2.03097,55.25265],[-2.01449,55.56606],[-1.76455,55.56606],[-1.76455,55.9724],[-2.35026,55.96548],[-2.5796,56.06527],[-2.58234,56.37071],[-2.65032,56.36919],[-2.65581,56.50585],[-2.48965,56.50509],[-2.42785,56.55356],[-2.42373,56.73026],[-2.1628,56.73177],[-2.17104,56.99301],[-2.00075,56.99301],[-1.98479,57.3159],[-1.83476,57.31553],[-1.83441,57.36074],[-1.75167,57.36111],[-1.74893,57.63046],[-1.83613,57.63009],[-1.83544,57.70171],[-2.00436,57.70207],[-2.00367,57.71968],[-3.22281,57.71418],[-3.22629,57.76157],[-3.51331,57.77622],[-3.50914,57.71051],[-3.84766,57.70611],[-3.85182,57.76853],[-3.79925,57.76989],[-3.80474,57.88578],[-3.85556,57.88651],[-3.85937,57.97558],[-3.79513,57.97656],[-3.79483,58.03052],[-3.69733,58.03161],[-3.69458,58.06722],[-3.52391,58.07437],[-3.52978,58.16007],[-3.35774,58.16286],[-3.3483,58.28742],[-3.07638,58.29121],[-3.03004,58.43744],[-3.01768,58.65814],[-2.85837,58.66028],[-2.86524,58.7943],[-2.75812,58.79715],[-2.76636,58.87461],[-2.6208,58.88668],[-2.62766,58.97527],[-2.54114,58.97668],[-2.54217,59.0841],[-2.52363,59.08375],[-2.52913,59.1574],[-2.43849,59.15705],[-2.4378,59.246],[-2.36914,59.24705],[-2.3688,59.40748],[-2.52947,59.40748],[-2.52741,59.33436],[-2.70319,59.33576],[-2.70525,59.40608],[-3.12891,59.40433],[-3.12411,59.15951],[-3.40288,59.1574],[-3.39464,58.9689],[-3.4276,58.96961],[-3.42572,58.88526],[-3.45215,58.87071],[-3.51017,58.86911],[-3.50708,58.78826],[-3.38555,58.79004],[-3.3828,58.6999],[-3.4494,58.69847],[-3.45078,58.65385],[-3.50159,58.65421],[-3.5009,58.62705],[-3.72612,58.62383],[-3.72475,58.60595],[-4.6476,58.5895],[-4.65996,58.67171],[-5.10697,58.66135],[-5.09804,58.58091],[-5.23743,58.57769],[-5.22455,58.26305],[-5.4127,58.25818],[-5.39965,58.12245],[-5.53286,58.11991],[-5.52393,57.99494],[-5.55346,57.99422],[-5.54728,57.93995],[-5.85696,57.93157],[-5.83181,57.73361],[-5.86374,57.73224],[-5.85773,57.66096],[-6.19624,57.64975],[-6.20242,57.72353],[-6.41666,57.7162],[-6.42421,57.75945],[-6.4764,57.75725],[-6.46884,57.71326],[-6.53339,57.71216],[-6.52721,57.6391],[-6.692,57.63395],[-6.68102,57.54341],[-6.78195,57.53826],[-6.75311,57.31608],[-6.50592,57.32498],[-6.49768,57.28084],[-6.4812,57.27824],[-6.47159,57.19203],[-6.38644,57.19352],[-6.37546,57.1045]],[[-7.65043,56.77461],[-7.40667,56.79304],[-7.41972,56.88281],[-7.38676,56.90268],[-7.25836,56.91056],[-7.24806,57.07141],[-7.11485,57.077],[-7.16772,57.43466],[-7.0352,57.44094],[-7.05236,57.69026],[-6.86834,57.6976],[-6.87315,57.71631],[-6.70286,57.72217],[-6.71591,57.81117],[-6.53188,57.81958],[-6.53875,57.88133],[-6.22015,57.89265],[-6.24143,58.09935],[-6.12676,58.10152],[-6.17758,58.53105],[-6.46734,58.52029],[-6.4591,58.45102],[-6.63145,58.44455],[-6.6239,58.39169],[-6.79212,58.38485],[-6.78869,58.34956],[-6.90885,58.34415],[-6.89718,58.25503],[-7.20136,58.24166],[-7.14094,57.83201],[-7.37509,57.82104],[-7.36822,57.69503],[-7.6573,57.68292],[-7.67652,57.80715],[-7.79257,57.80202],[-7.77327,57.67734],[-7.70756,57.68024],[-7.69376,57.59088],[-7.75947,57.58797],[-7.74587,57.49965],[-7.51241,57.5085],[-7.47911,57.29468],[-7.52855,57.2932],[-7.51276,57.05871],[-7.61163,57.05386],[-7.59859,56.87493],[-7.66725,56.87268],[-7.65043,56.77461]],[[-1.46238,59.82831],[-1.21519,59.83107],[-1.21519,59.96194],[-1.10533,59.96056],[-1.0986,60.09498],[-0.97632,60.09346],[-0.96352,60.3476],[-0.74028,60.34484],[-0.7147,60.84722],[-1.08215,60.85901],[-1.08455,60.76944],[-1.21296,60.77011],[-1.21579,60.68079],[-1.23364,60.68113],[-1.23467,60.5909],[-1.27132,60.59191],[-1.27338,60.64581],[-1.45466,60.64648],[-1.45397,60.59224],[-1.6373,60.59292],[-1.63954,60.3507],[-1.73172,60.35095],[-1.73172,60.18067],[-1.64177,60.17931],[-1.64177,60.1448],[-1.46393,60.14344],[-1.46238,59.82831]],[[-6.21496,56.97437],[-6.22525,57.06445],[-6.29117,57.06184],[-6.29237,57.08062],[-6.62162,57.06943],[-6.61338,57.00629],[-6.46163,57.01302],[-6.4582,56.96776],[-6.21496,56.97437]],[[-2.12774,60.10855],[-2.12803,60.16207],[-2.00203,60.16224],[-2.00174,60.10872],[-2.12774,60.10855]],[[-6.68977,56.95804],[-6.69228,56.9759],[-6.65984,56.97726],[-6.65733,56.9594],[-6.68977,56.95804]],[[-7.66365,58.25846],[-7.66844,58.28502],[-7.54896,58.29098],[-7.54417,58.26442],[-7.66365,58.25846]],[[-8.65104,57.78885],[-8.66674,57.875],[-8.48272,57.88449],[-8.46702,57.79836],[-8.65104,57.78885]]]},{id:"osmie_barony",name:"OSMIE Baronies",type:"tms",template:"https://tile.openstreetmap.ie/barony/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_cps",name:"OSMIE Civil Parishes",type:"tms",template:"https://tile.openstreetmap.ie/civilparish/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_dail_ea",name:"OSMIE Dail Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/dail_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_eds",name:"OSMIE EDs",type:"tms",template:"https://tile.openstreetmap.ie/ed/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_local_ea",name:"OSMIE Local Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/local_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tie_not_counties",name:"OSMIE T.ie Land not in Counties",type:"tms",template:"https://www.townlands.ie/tiles/not_counties/{zoom}/{x}/{y}.png",zoomExtent:[2,19],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tds",name:"OSMIE Townlands",type:"tms",template:"https://tile.openstreetmap.ie/townland/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"al_palestina",name:"Palestina AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Palestina&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.28907,-9.71916],[-37.28904,-9.71114],[-37.28911,-9.7022],[-37.28915,-9.69175],[-37.28919,-9.68886],[-37.28927,-9.68069],[-37.28926,-9.67732],[-37.28936,-9.66999],[-37.28936,-9.66599],[-37.28931,-9.66133],[-37.28941,-9.65526],[-37.28946,-9.64556],[-37.2895,-9.63489],[-37.28954,-9.62926],[-37.2964,-9.62885],[-37.31188,-9.62897],[-37.32762,-9.62914],[-37.33181,-9.62919],[-37.34338,-9.62917],[-37.35876,-9.62923],[-37.37175,-9.6293],[-37.37839,-9.62913],[-37.38051,-9.62922],[-37.38061,-9.63143],[-37.38054,-9.63785],[-37.38043,-9.63895],[-37.38053,-9.64147],[-37.38051,-9.64876],[-37.3805,-9.6543],[-37.38043,-9.656],[-37.38024,-9.66028],[-37.38022,-9.66551],[-37.38019,-9.67054],[-37.38016,-9.67896],[-37.38013,-9.68781],[-37.38009,-9.70116],[-37.38003,-9.71053],[-37.3801,-9.71743],[-37.38005,-9.71959],[-37.37932,-9.71954],[-37.37392,-9.71956],[-37.36582,-9.71945],[-37.35849,-9.71946],[-37.35334,-9.71938],[-37.34414,-9.71937],[-37.33423,-9.71923],[-37.32933,-9.71927],[-37.3218,-9.71924],[-37.31983,-9.71927],[-37.31094,-9.7192],[-37.29589,-9.71921],[-37.28907,-9.71916]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"palmeira_dos_indios",name:"Palmeira dos Indios AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Palmeira%20dos%20Indios&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.58664,-9.46124],[-36.58665,-9.45851],[-36.58619,-9.41968],[-36.58604,-9.41452],[-36.58596,-9.40593],[-36.58585,-9.39509],[-36.58579,-9.39163],[-36.58565,-9.38983],[-36.58549,-9.38249],[-36.58529,-9.37965],[-36.58511,-9.37744],[-36.58503,-9.37059],[-36.5889,-9.37058],[-36.59064,-9.37065],[-36.59389,-9.3706],[-36.60037,-9.37073],[-36.61046,-9.37049],[-36.62288,-9.37021],[-36.63377,-9.37002],[-36.63835,-9.36986],[-36.64743,-9.36997],[-36.65141,-9.36994],[-36.65534,-9.36972],[-36.65647,-9.36974],[-36.66111,-9.37024],[-36.66276,-9.37026],[-36.66704,-9.36973],[-36.67052,-9.36966],[-36.67325,-9.36966],[-36.67602,-9.36987],[-36.67593,-9.3726],[-36.67597,-9.37679],[-36.67639,-9.38138],[-36.67654,-9.38464],[-36.67663,-9.39265],[-36.67675,-9.39829],[-36.67689,-9.40875],[-36.67707,-9.41887],[-36.67717,-9.43179],[-36.67724,-9.43395],[-36.67718,-9.43753],[-36.67728,-9.44311],[-36.6773,-9.44933],[-36.67741,-9.45528],[-36.6774,-9.45938],[-36.67735,-9.46017],[-36.67568,-9.46021],[-36.66625,-9.4603],[-36.66224,-9.4603],[-36.65736,-9.46042],[-36.6504,-9.46047],[-36.63543,-9.46065],[-36.61979,-9.46083],[-36.61433,-9.46083],[-36.61029,-9.46097],[-36.60647,-9.46097],[-36.60186,-9.46099],[-36.59426,-9.46112],[-36.58664,-9.46124]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Pangasinan_Bulacan_HiRes",name:"Pangasinán/Bulacan (Philippines HiRes)",type:"tms",template:"https://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png",zoomExtent:[12,19],polygon:[[[120.33659,15.98577],[120.44599,15.984],[120.44613,15.97446],[120.47646,15.97459],[120.59425,15.94683],[120.59806,16.09079],[120.59654,16.198],[120.36854,16.21853],[120.34758,16.04231],[120.33659,15.98577]],[[120.8268,15.3658],[121.2684,15.2602],[121.2699,14.7025],[120.695,14.8423],[120.8268,15.3658]]]},{id:"pao_de_acucar",name:"Pão de Açucar AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Pao%20de%20Acucar&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.39003,-9.78589],[-37.39019,-9.7762],[-37.38993,-9.76575],[-37.38991,-9.75256],[-37.39015,-9.74102],[-37.39003,-9.73201],[-37.39012,-9.72254],[-37.39015,-9.71289],[-37.39019,-9.70341],[-37.3902,-9.69548],[-37.40377,-9.6955],[-37.41728,-9.6956],[-37.43224,-9.69569],[-37.44319,-9.69573],[-37.44723,-9.69582],[-37.45682,-9.69585],[-37.47062,-9.69591],[-37.47373,-9.69591],[-37.47586,-9.69604],[-37.48128,-9.69605],[-37.48131,-9.6989],[-37.48122,-9.70087],[-37.48121,-9.70239],[-37.48135,-9.70545],[-37.48138,-9.71046],[-37.48134,-9.71617],[-37.4812,-9.71875],[-37.48125,-9.72035],[-37.48136,-9.72134],[-37.48134,-9.7241],[-37.4813,-9.72506],[-37.48103,-9.72732],[-37.48102,-9.73088],[-37.48127,-9.73462],[-37.48131,-9.73638],[-37.48131,-9.73893],[-37.48131,-9.74388],[-37.4813,-9.74989],[-37.48122,-9.75315],[-37.48102,-9.75855],[-37.48084,-9.7642],[-37.48085,-9.76526],[-37.48094,-9.76675],[-37.48093,-9.76881],[-37.48084,-9.7721],[-37.48087,-9.77486],[-37.48076,-9.77993],[-37.48081,-9.7863],[-37.46382,-9.78623],[-37.45353,-9.7862],[-37.43979,-9.78611],[-37.42998,-9.78607],[-37.4208,-9.786],[-37.40853,-9.78596],[-37.39545,-9.78593],[-37.39003,-9.78589]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"PCN-Italy-2006",name:"PCN 2006 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_06.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2006.33,OI.ORTOIMMAGINI.2006.32&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"PCN-Lazio_Umbria-2008",name:"PCN 2008 - IT Lazio+Umbria",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_08.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2008.33&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",polygon:[[[12.33149,41.64637],[12.41178,41.64791],[12.41499,41.54635],[12.49574,41.54789],[12.4985,41.49619],[12.57948,41.49843],[12.58062,41.42932],[12.60632,41.4288],[12.60746,41.39663],[12.8293,41.39818],[12.83159,41.34688],[12.9128,41.34843],[12.9151,41.29726],[12.99585,41.2983],[12.99791,41.19636],[13.1679,41.19808],[13.16721,41.24692],[13.41337,41.24829],[13.4152,41.19705],[13.8341,41.19808],[13.83341,41.2476],[13.91737,41.24847],[13.91668,41.39749],[14.0011,41.39784],[13.99996,41.49774],[14.08415,41.49826],[14.08346,41.65014],[14.00087,41.6498],[13.99973,41.75051],[13.83433,41.74965],[13.83364,41.80047],[13.75151,41.79978],[13.7499,41.84987],[13.41841,41.8497],[13.41681,41.95027],[13.33445,41.94959],[13.3333,42.00041],[13.25141,41.99973],[13.25003,42.05051],[13.08509,42.04966],[13.08394,42.097],[13.33399,42.09819],[13.33376,42.1472],[13.41772,42.14822],[13.41635,42.25052],[13.33399,42.24984],[13.33353,42.30094],[13.25141,42.29992],[13.25003,42.54699],[13.41795,42.54817],[13.41589,42.75065],[13.33468,42.74947],[13.33307,42.90056],[13.16836,42.89938],[13.16721,42.95079],[12.96419,42.95012],[12.96258,43.0003],[12.91877,42.9998],[12.91601,43.25078],[12.83526,43.24994],[12.83228,43.50107],[12.66321,43.4994],[12.66482,43.45112],[12.58567,43.44996],[12.58246,43.5508],[12.50171,43.5498],[12.49987,43.65131],[12.16242,43.64915],[12.16494,43.60132],[12.07891,43.5995],[12.0819,43.45196],[11.99541,43.44913],[11.99862,43.34661],[12.07891,43.34795],[12.08075,43.30189],[11.9961,43.29955],[11.99862,43.20214],[11.91237,43.19929],[11.91466,43.15212],[11.83207,43.14944],[11.8323,43.09653],[11.91099,43.09837],[11.91466,42.90191],[11.82909,42.89922],[11.83139,42.85231],[11.74582,42.84945],[11.74811,42.65236],[11.6731,42.64966],[11.67493,42.6105],[11.49485,42.59936],[11.49852,42.49593],[11.57812,42.49796],[11.58156,42.45244],[11.41226,42.44872],[11.41524,42.34656],[11.49599,42.34792],[11.49921,42.29636],[11.57835,42.29822],[11.58225,42.24628],[11.66185,42.24832],[11.66621,42.09649],[11.74536,42.09819],[11.74903,41.99666],[11.91443,41.99922],[11.91535,41.98626],[11.99403,41.98745],[11.99862,41.89685],[12.07868,41.89907],[12.08144,41.84594],[12.16311,41.84799],[12.16563,41.6964],[12.3292,41.69863],[12.33149,41.64637]]]},{id:"PCN-Italy-2012",name:"PCN 2012 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_12.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.ORTOIMMAGINI.2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"Actueel_ortho25_WMS",name:"PDOK aerial imagery Beeldmateriaal.nl 25cm latest",type:"tms",template:"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Actueel_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,19],polygon:[[[3.14377,51.35984],[3.1575,51.24113],[3.33878,51.11544],[3.91281,51.05851],[4.65714,51.28067],[4.89334,51.26348],[5.17899,51.12579],[5.38498,51.13096],[5.54428,51.05678],[5.42069,50.85956],[5.46738,50.70326],[5.65689,50.61926],[6.14853,50.62143],[6.30234,50.85782],[6.29959,50.95438],[6.26389,51.01835],[6.37238,51.09259],[6.40122,51.20114],[6.37375,51.25102],[6.44516,51.31587],[6.42044,51.5496],[6.34354,51.67922],[6.79672,51.76429],[7.04666,51.91024],[7.07138,52.04559],[7.27188,52.17041],[7.30759,52.38551],[7.20596,52.53195],[7.28287,52.61458],[7.29935,52.77853],[7.44217,52.97827],[7.43393,53.28314],[7.04392,53.55159],[6.78299,53.63635],[6.23917,53.54016],[5.6871,53.51241],[5.17349,53.43885],[4.81644,53.23384],[4.65164,53.06583],[4.54178,52.48598],[4.32205,52.19568],[4.08104,52.01369],[4.02199,52.01623],[3.93684,51.96379],[3.95195,51.88079],[3.84483,51.84942],[3.62373,51.70752],[3.65532,51.66069],[3.63335,51.62746],[3.54683,51.62234],[3.39577,51.56091],[3.38203,51.51735],[3.49876,51.43267],[3.32985,51.38556],[3.14377,51.35984]]],terms_url:"https://www.nationaalgeoregister.nl/geonetwork/srv/dut/catalog.search#/search?facet.q=license%2FCC-BY&isChild=%27false%27&resultType=details&any_OR_title_OR_keyword=luchtfoto&fast=index&_content_type=json&from=1&to=20&sortBy=relevance",terms_text:"Kadaster / Beeldmateriaal.nl, CC BY 4.0",best:true,description:"Nationwide data set 25cm resolution color aerial imagery of the most recent year.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/nl/PDOK-Luchtfoto-Beeldmateriaal-25cm-latest.png"},{id:"al_piranhas",name:"Piranhas AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Piranhas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.71918,-9.65236],[-37.71918,-9.63874],[-37.71914,-9.6321],[-37.71924,-9.62114],[-37.71929,-9.61023],[-37.71934,-9.59988],[-37.7194,-9.58891],[-37.71945,-9.57802],[-37.71944,-9.57173],[-37.71952,-9.56684],[-37.71956,-9.56225],[-37.71998,-9.56218],[-37.72258,-9.56195],[-37.72818,-9.56203],[-37.73254,-9.562],[-37.74107,-9.56206],[-37.74845,-9.56202],[-37.75926,-9.56216],[-37.76972,-9.56227],[-37.78036,-9.56244],[-37.78537,-9.56236],[-37.78907,-9.56233],[-37.79562,-9.56245],[-37.79771,-9.56237],[-37.81006,-9.56243],[-37.81061,-9.56241],[-37.81053,-9.56531],[-37.81049,-9.57629],[-37.81046,-9.58742],[-37.81038,-9.59757],[-37.81031,-9.61798],[-37.81018,-9.65197],[-37.81018,-9.6523],[-37.81024,-9.65259],[-37.80664,-9.65245],[-37.80206,-9.65253],[-37.79597,-9.65237],[-37.79179,-9.65252],[-37.78815,-9.65246],[-37.78723,-9.65242],[-37.78035,-9.65241],[-37.77865,-9.65223],[-37.77625,-9.6523],[-37.77475,-9.65219],[-37.77234,-9.65223],[-37.7696,-9.65245],[-37.76623,-9.65251],[-37.76345,-9.65246],[-37.7604,-9.6525],[-37.75102,-9.65237],[-37.75012,-9.65249],[-37.74155,-9.65248],[-37.7403,-9.65239],[-37.73785,-9.65246],[-37.73443,-9.65238],[-37.73106,-9.65243],[-37.72651,-9.65237],[-37.72195,-9.65225],[-37.71992,-9.65228],[-37.71918,-9.65236]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"PNOA-Spain-TMS",name:"PNOA Spain",type:"tms",template:"https://www.ign.es/wmts/pnoa-ma?request=GetTile&service=WMTS&VERSION=1.0.0&Layer=OI.OrthoimageCoverage&Style=default&Format=image/png&TileMatrixSet=GoogleMapsCompatible&TileMatrix={zoom}&TileRow={y}&TileCol={x}",zoomExtent:[0,20],polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]],terms_text:"PNOA",best:true},{id:"poco_das_trincheiras",name:"Poço das Trincheiras AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Poco%20das%20Trincheiras&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.23942,-9.35157],[-37.23947,-9.34387],[-37.23942,-9.33792],[-37.23954,-9.33022],[-37.23973,-9.32791],[-37.23974,-9.3228],[-37.23964,-9.32085],[-37.23971,-9.31864],[-37.2398,-9.31706],[-37.23982,-9.31561],[-37.24053,-9.30933],[-37.24051,-9.30004],[-37.24008,-9.29687],[-37.23998,-9.29546],[-37.23992,-9.29319],[-37.23989,-9.28978],[-37.23995,-9.28818],[-37.24008,-9.28641],[-37.24036,-9.28212],[-37.24038,-9.27897],[-37.24051,-9.27557],[-37.24004,-9.26979],[-37.24018,-9.26721],[-37.24018,-9.26612],[-37.23995,-9.26455],[-37.23983,-9.26151],[-37.24333,-9.26136],[-37.24936,-9.26146],[-37.26445,-9.26161],[-37.28016,-9.26172],[-37.28294,-9.26171],[-37.29581,-9.26178],[-37.30685,-9.26178],[-37.31419,-9.26189],[-37.32437,-9.26192],[-37.33078,-9.26175],[-37.33057,-9.27275],[-37.33048,-9.28007],[-37.33054,-9.28117],[-37.33069,-9.28427],[-37.3307,-9.28535],[-37.33064,-9.28617],[-37.33071,-9.28717],[-37.33064,-9.28769],[-37.33062,-9.29027],[-37.33043,-9.29308],[-37.33038,-9.29655],[-37.33034,-9.30591],[-37.3304,-9.31203],[-37.33038,-9.32194],[-37.33041,-9.3342],[-37.33035,-9.34185],[-37.3303,-9.34783],[-37.33035,-9.35202],[-37.31509,-9.35194],[-37.30011,-9.3519],[-37.29531,-9.35183],[-37.28899,-9.35171],[-37.28497,-9.35182],[-37.27851,-9.35173],[-37.27431,-9.35181],[-37.27115,-9.3517],[-37.26351,-9.35168],[-37.26046,-9.35164],[-37.25402,-9.35177],[-37.24705,-9.35163],[-37.23942,-9.35157]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"e-mapa.net-buildings",name:"polska.e-mapa.net: Buildings",type:"wms",template:"http://wms02.epodgik.pl/cgi-bin/KrajowaIntegracjaEwidencjiGruntow?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://polska.e-mapa.net/",terms_text:"polska.e-mapa.net - Geoportal otwartych danych przestrzennych",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/polskae-mapanetBuildings.png"},{id:"debicki-buildings",name:"Powiat dębicki: Buildings",type:"wms",template:"https://debica.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,adresy,EBU,EBT,S&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.53768,50.01085],[21.51944,50.05423],[21.58099,50.1233],[21.48804,50.18059],[21.13725,50.14835],[21.13939,50.12721],[21.18058,50.12101],[21.14315,50.05965],[21.15356,49.92854],[21.27892,49.92554],[21.22448,49.8861],[21.22362,49.84258],[21.35177,49.8349],[21.36368,49.86838],[21.41585,49.82003],[21.47943,49.8398],[21.52679,49.88911],[21.47689,50.00135],[21.53768,50.01085]]],terms_text:"Powiat dębicki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lancucki-buildings",name:"Powiat łańcucki: Buildings",type:"wms",template:"https://lancut.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.17224,50.10121],[22.12574,50.1079],[22.0823,50.17206],[22.13591,50.1867],[22.173,50.18117],[22.18418,50.22914],[22.235,50.24718],[22.3856,50.16031],[22.40346,50.13331],[22.45275,50.12745],[22.45275,50.10676],[22.41768,50.08997],[22.38364,50.08915],[22.38542,50.05393],[22.35315,50.05067],[22.3562,50.00627],[22.31478,49.99451],[22.32139,49.94614],[22.29979,49.92455],[22.24161,49.92847],[22.20901,49.93728],[22.22382,49.96085],[22.16683,50.00412],[22.1387,50.00251],[22.12015,50.04626],[22.17224,50.10121]]],terms_text:"Powiat łańcucki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lubaczowski-buildings",name:"Powiat lubaczowski: Buildings",type:"wms",template:"https://lubaczow.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=S,EBT,adresy,budynki_ewid&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[23.29224,50.09693],[23.55763,50.25704],[23.51394,50.26643],[23.522,50.29892],[23.40991,50.3083],[23.44482,50.35653],[23.38072,50.3699],[23.38829,50.4058],[23.35821,50.41105],[23.2527,50.36601],[23.19379,50.40529],[23.01962,50.2928],[22.84161,50.30574],[22.83572,50.27037],[22.82426,50.26923],[22.79651,50.20933],[22.86603,50.18949],[22.87414,50.13786],[22.93233,50.1678],[22.88954,50.11501],[22.95351,50.07178],[23.05556,50.04967],[22.99884,49.99028],[23.14951,49.97563],[23.29224,50.09693]]],terms_text:"Powiat lubaczowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznanski-buildings",name:"Powiat poznański: Buildings",type:"wms",template:"http://wms.podgik.poznan.pl/cgi-bin/poznan?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[16.9585,52.46312],[17.03946,52.33605],[16.84291,52.36501],[16.78596,52.46566],[16.70022,52.53819],[16.6415,52.5288],[16.44898,52.36793],[16.47775,52.2696],[16.5659,52.26813],[16.58375,52.17007],[17.08099,52.14981],[17.37124,52.34522],[17.39853,52.44037],[17.35338,52.53949],[17.13689,52.57783],[17.13126,52.6419],[17.01608,52.68366],[16.9158,52.65079],[16.85814,52.58191],[16.7367,52.57459],[16.70022,52.53824],[16.78598,52.46567],[16.9585,52.46312]]],terms_text:"PODGIK Poznań",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatpoznaskiOrthophotomap(aerialimage).png"},{id:"sropczyce-buildings",name:"Powiat ropczycko-sędziszowski: Buildings",type:"wms",template:"https://spropczyce.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.60041,50.21025],[21.74199,50.16538],[21.792,50.17829],[21.81459,50.15264],[21.78741,50.10859],[21.82597,50.09149],[21.82552,50.02925],[21.78666,49.97585],[21.70632,49.96022],[21.683,49.92431],[21.60062,49.91793],[21.54249,49.8862],[21.5188,49.89119],[21.45315,49.99268],[21.50364,50.0198],[21.49298,50.07161],[21.55535,50.11909],[21.50429,50.16559],[21.59816,50.17866],[21.60041,50.21025]]],terms_text:"Powiat ropczycko-sędziszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-buildings",name:"Powiat rzeszowski: Buildings",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,EBT,EBU&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-aerial",name:"Powiat rzeszowski: Orthophotomap (aerial image)",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"stalowowolski-buildings",name:"Powiat stalowowolski: Buildings",type:"wms",template:"https://stalowawola.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,adresy,budynki,centroidy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.017,50.35811],[22.09292,50.44916],[22.06785,50.51434],[22.09722,50.54302],[22.16347,50.52686],[22.23795,50.5503],[22.26768,50.60465],[22.22757,50.6653],[22.16235,50.66969],[22.20843,50.75403],[22.16239,50.80039],[22.0546,50.82234],[21.94394,50.77639],[21.86228,50.80439],[21.83413,50.75035],[21.87465,50.70066],[21.84046,50.65749],[21.97582,50.53164],[21.84797,50.47196],[21.88045,50.3913],[22.017,50.35811]]],terms_text:"Powiat stalowowolski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznan-buildings",name:"Poznań: Buildings",type:"wms",template:"http://wms2.geopoz.poznan.pl:8080/geoserver/sip/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki_ewidencyjne_sql&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2014",name:"Poznań: Orthophotomap 2014 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapa_2014/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2014_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2016",name:"Poznań: Orthophotomap 2016 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapy/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2016_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"PrahaIPRlatestorthophoto",name:"Praha IPR latest orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/letecke_snimky_posledni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"PrahaIPRlow-vegetationorthophoto",name:"Praha IPR low-vegetation orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/mimovegetacni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"przemysl-buildings",name:"Przemyśl: Buildings",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=adresy,budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"przemysl-aerial",name:"Przemyśl: Ortophotomap (aerial image)",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"RABA-KGZ-3000",name:"RABA-KGZ: Slovenia built-up areas",type:"tms",template:"http://wms.openstreetmap.de/tms/RABA3000/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2015 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"RABA-KGZ",name:"RABA-KGZ: Slovenia farmland use",type:"tms",template:"http://wms.openstreetmap.de/tms/RABA/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2015 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"riksantikvaren-kulturminner",name:"Riksantikvaren Heritage Sites overlay",type:"wms",template:"https://kart.ra.no/arcgis/services/Distribusjon/Kulturminner/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.riksantikvaren.no/Veiledning/Data-og-tjenester/Karttjenester",terms_text:"© Riksantikvaren",description:"Archeological and architectural monuments/sites and cultural environments protected by law (''enkeltminner'') from the Norwegian Directorate for Cultural Heritage",icon:"https://www.riksantikvaren.no/extension/riksantikvaren/design/internetsite/images/logo_na.png",overlay:true},{id:"rio2013",name:"Rio Mosaic 2013",type:"wms",template:"http://geo.rio.rj.gov.br/ArcGIS/services/Imagens/Mosaico_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[-43.17709,-22.96971],[-43.14586,-22.96959],[-43.14605,-22.92719],[-43.15625,-22.92731],[-43.15647,-22.87557],[-43.17739,-22.87494],[-43.17742,-22.88553],[-43.19804,-22.88571],[-43.19804,-22.85429],[-43.21875,-22.85444],[-43.21901,-22.83365],[-43.22937,-22.83365],[-43.22934,-22.82371],[-43.19869,-22.82353],[-43.19856,-22.83413],[-43.18826,-22.83398],[-43.18804,-22.84448],[-43.16667,-22.84442],[-43.16683,-22.83404],[-43.15638,-22.83407],[-43.15654,-22.81336],[-43.10436,-22.81306],[-43.10446,-22.80288],[-43.09387,-22.80276],[-43.0941,-22.73998],[-43.13599,-22.73992],[-43.13569,-22.75067],[-43.12573,-22.75055],[-43.12556,-22.77118],[-43.14595,-22.77109],[-43.14612,-22.76055],[-43.17771,-22.76088],[-43.17758,-22.77115],[-43.18807,-22.7713],[-43.18807,-22.78166],[-43.25067,-22.78163],[-43.25057,-22.79198],[-43.28054,-22.79282],[-43.30343,-22.79312],[-43.33353,-22.79297],[-43.33347,-22.80258],[-43.38574,-22.8024],[-43.38542,-22.81255],[-43.41691,-22.81285],[-43.41675,-22.82341],[-43.42717,-22.82335],[-43.4274,-22.83374],[-43.45844,-22.83362],[-43.45864,-22.81276],[-43.48984,-22.813],[-43.48994,-22.7965],[-43.50208,-22.79746],[-43.51543,-22.79737],[-43.52078,-22.79591],[-43.54169,-22.79603],[-43.54179,-22.80234],[-43.54653,-22.80246],[-43.54666,-22.81189],[-43.55251,-22.81279],[-43.56991,-22.81294],[-43.56998,-22.8197],[-43.57361,-22.82326],[-43.58348,-22.82329],[-43.58352,-22.83347],[-43.59391,-22.83374],[-43.59394,-22.85468],[-43.66099,-22.85459],[-43.66099,-22.85983],[-43.70852,-22.86019],[-43.70836,-22.86503],[-43.72206,-22.86488],[-43.72213,-22.86847],[-43.75015,-22.86859],[-43.75009,-22.8753],[-43.76038,-22.87527],[-43.75992,-22.8785],[-43.75976,-22.88457],[-43.76132,-22.88586],[-43.78129,-22.8858],[-43.78126,-22.89591],[-43.80213,-22.89621],[-43.80135,-22.91137],[-43.80119,-22.92758],[-43.79213,-22.92776],[-43.7922,-22.93822],[-43.78191,-22.93799],[-43.78184,-22.94869],[-43.75067,-22.94845],[-43.7506,-22.95909],[-43.72986,-22.95886],[-43.72966,-22.97984],[-43.70904,-22.97966],[-43.70891,-22.99033],[-43.69846,-22.99006],[-43.69836,-23.00065],[-43.66735,-23.00044],[-43.66726,-23.01117],[-43.63125,-23.00937],[-43.63131,-23.02079],[-43.63586,-23.02091],[-43.63602,-23.03164],[-43.67771,-23.03164],[-43.67765,-23.04233],[-43.67086,-23.0423],[-43.67109,-23.0631],[-43.64599,-23.06304],[-43.64605,-23.05276],[-43.60475,-23.05255],[-43.60452,-23.06307],[-43.58381,-23.06289],[-43.58368,-23.08404],[-43.54186,-23.08383],[-43.54195,-23.06319],[-43.52147,-23.06301],[-43.5213,-23.07352],[-43.50043,-23.07337],[-43.50043,-23.04218],[-43.45877,-23.04221],[-43.4587,-23.03194],[-43.43782,-23.03182],[-43.43776,-23.02154],[-43.3235,-23.02121],[-43.3233,-23.04212],[-43.31291,-23.04195],[-43.31275,-23.05267],[-43.30239,-23.05258],[-43.30236,-23.04227],[-43.29194,-23.04215],[-43.29197,-23.03194],[-43.27109,-23.03182],[-43.27119,-23.01093],[-43.26061,-23.01087],[-43.26067,-23.00059],[-43.25057,-23.00047],[-43.25054,-23.01126],[-43.23989,-23.01102],[-43.23986,-23.00062],[-43.21908,-23.0005],[-43.21904,-22.99021],[-43.20901,-22.99009],[-43.20862,-23.08389],[-43.18768,-23.08377],[-43.18761,-23.07334],[-43.13582,-23.07337],[-43.13589,-23.05249],[-43.17732,-23.05255],[-43.17709,-22.96971]]],terms_url:"https://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2013_UTM/MapServer",terms_text:"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{id:"rio2015",name:"Rio Mosaic 2015",type:"wms",template:"https://pgeo3.rio.rj.gov.br/arcgis/services/Imagens/Mosaico_2015_UTM/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-42.30363,-22.43698],[-44.10842,-22.06579],[-44.5313,-23.7863],[-42.70469,-24.16178],[-42.30363,-22.43698]]],terms_url:"https://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2015_UTM/MapServer",terms_text:"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{id:"route500",name:"Route 500",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.fr/route500/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/FR:Servers/tile.openstreetmap.fr#Route500.E2.84.A2.C2.A9.C2.AE",terms_text:"Tiles © cquest@Openstreetmap France, data © IGN, LO/OL",description:"Routes du réseau classé (autoroutes, nationales, départementales)",overlay:true},{id:"Ruda_Slaska-aerial_image",name:"Ruda Śląska: Orthophotomap (aerial image)",type:"wms",template:"https://rudaslaska.geoportal2.pl/map/wmsorto/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.84294,50.32508],[18.84008,50.33091],[18.85132,50.33437],[18.86262,50.3305],[18.88693,50.333],[18.89493,50.3319],[18.90045,50.32562],[18.89713,50.31146],[18.89312,50.31149],[18.89114,50.30778],[18.8972,50.2999],[18.89073,50.29586],[18.90211,50.29204],[18.90706,50.28637],[18.90853,50.27823],[18.93583,50.27379],[18.94106,50.25859],[18.93848,50.25317],[18.95086,50.24267],[18.96531,50.24084],[18.94611,50.22907],[18.89932,50.22516],[18.90251,50.21749],[18.89075,50.21557],[18.89292,50.20913],[18.86474,50.20512],[18.85673,50.22078],[18.85258,50.22331],[18.84619,50.21761],[18.83341,50.21715],[18.83533,50.22307],[18.83051,50.23099],[18.82411,50.23055],[18.81641,50.23709],[18.81619,50.24125],[18.80635,50.24596],[18.80344,50.24293],[18.78831,50.24456],[18.79552,50.2768],[18.81681,50.27732],[18.81919,50.28794],[18.83893,50.29795],[18.83849,50.3004],[18.82699,50.30342],[18.82691,50.32073],[18.83007,50.32371],[18.84294,50.32508]]],terms_text:"Urząd Miasta Ruda Śląska"},{id:"Rzeszow-buildings",name:"Rzeszów: Buildings",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=komunikacja,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"Rzeszow-aerial_image",name:"Rzeszów: Orthophotomap (aerial image)",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=rastry&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"SanJuanMetroAreaUSACEOrthophotos",name:"San Juan Metro Area: 2013 USACE Orthophotos",type:"tms",template:"http://imagery-pr-usace-2013.s3-website-us-east-1.amazonaws.com/tiles/{zoom}/{x}/{y}.jpg",endDate:"2013-03-15T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-66.15007,18.35002],[-66.03337,18.35002],[-66.03328,18.45634],[-66.05464,18.45636],[-66.05463,18.46542],[-66.08303,18.46544],[-66.08302,18.47451],[-66.13034,18.47455],[-66.13034,18.4796],[-66.13983,18.47961],[-66.13984,18.46557],[-66.14995,18.46558],[-66.15007,18.35002]]]},{id:"santana_do_ipanema",name:"Santana do Ipanema AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Santana%20do%20Ipanema&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.20224,-9.41356],[-37.20188,-9.37768],[-37.20208,-9.37455],[-37.20192,-9.36733],[-37.20169,-9.36045],[-37.20172,-9.35501],[-37.20195,-9.35101],[-37.20191,-9.34773],[-37.20175,-9.33835],[-37.2017,-9.33505],[-37.20171,-9.33301],[-37.20142,-9.32833],[-37.20121,-9.32469],[-37.20117,-9.32351],[-37.21425,-9.32346],[-37.21537,-9.3234],[-37.22078,-9.32328],[-37.23727,-9.32313],[-37.25181,-9.32293],[-37.2656,-9.32276],[-37.2803,-9.32259],[-37.29191,-9.32245],[-37.29205,-9.33522],[-37.29304,-9.4122],[-37.28357,-9.41235],[-37.27789,-9.4125],[-37.2716,-9.41249],[-37.26506,-9.41262],[-37.26165,-9.41274],[-37.25499,-9.41276],[-37.24991,-9.41296],[-37.24616,-9.41297],[-37.24108,-9.41303],[-37.23461,-9.41321],[-37.2284,-9.41325],[-37.22165,-9.41335],[-37.21686,-9.41346],[-37.21292,-9.41343],[-37.20224,-9.41356]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Sao_miguel_dos_campos",name:"São Miguel dos Campos AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Sao_miguel_dos_campos&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.1415,-9.83171],[-36.05047,-9.83246],[-36.04959,-9.74246],[-36.14059,-9.74166],[-36.1415,-9.83171]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"GEOSN-DOP-2005",name:"Saxony historical aerial imagery 2005",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-2005/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2005&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=3f38c3f3-03db-4a2a-b6da-2704b9a1d5f0",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-2012_2014",name:"Saxony historical aerial imagery 2012-2014",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop_2012_2014/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2012_2014_rgb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=8c276e3c-88af-462f-8128-6900bc7dd4f8",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-RGB",name:"Saxony latest aerial imagery",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-rgb/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=cd01c334-7e32-482f-bd43-af286707178a",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-CIR",name:"Saxony latest aerial imagery infrared",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-cir/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020_cir&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=ba87bbed-4cb5-4539-a9f5-f863de752f52",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DTK",name:"Saxony topographic map",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dtk-pg-color/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dtk_pg_color&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=d6d24c6d-94ea-447d-8a0c-40afdedeb5c6",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-WebAtlas",name:"Saxony WebAtlasSN",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_webatlas-sn/guest?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vegetation,Siedlung,Gewaesser,Verkehr,Administrative_Einheiten,Beschriftung&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=475a9197-620f-4dcb-b8aa-7f71b626443f",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"Geodatastyrelsen_Denmark",name:"SDFE aerial imagery",type:"tms",template:"https://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[0,21],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_url:"https://download.kortforsyningen.dk/content/vilkaar-og-betingelser",terms_text:"Geodatastyrelsen og Danske Kommuner",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Cadastral_Parcels_INSPIRE_View",name:"SDFE Cadastral Parcels INSPIRE View",type:"wms",template:"https://kortforsyningen.kms.dk/cp_inspire?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=CP.CadastralParcel&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_DTK_Kort25",name:"SDFE DTK Kort25",type:"wms",template:"https://kortforsyningen.kms.dk/topo25?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=topo25_klassisk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Skaermkort",name:"SDFE Skærmkort",type:"wms",template:"https://kortforsyningen.kms.dk/topo_skaermkort?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=dtk_skaermkort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Overflade_Skyggekort_40cm",name:"SDFE Surface Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_overflade_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Terraen_Skyggekort_40cm",name:"SDFE Terrain Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_terraen_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Sicily-ATA2007",name:"Sicily - Italy",type:"wms",template:"http://map.sitr.regione.sicilia.it/ArcGIS/services/WGS84_F33/Ortofoto_ATA20072008_f33/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=default&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[15.71165,38.25894],[15.23718,38.81938],[14.27124,38.55246],[13.15063,38.75408],[11.96411,37.97451],[12.52441,37.54022],[11.87897,36.79609],[12.49695,35.47409],[12.68921,35.46962],[14.57336,36.66401],[15.29709,36.62875],[15.39854,37.42171],[15.71165,38.25894]]]},{id:"Siemianowice_Slaskie-buildings",name:"Siemianowice Śląskie: Buildings",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,drogi,adresy,ulice&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"Siemianowice_Slaskie-aerial_image",name:"Siemianowice Śląskie: Orthophotomap (aerial image)",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"sc2012",name:"SIG Santa Catarina OrtoRGB 2012",type:"wms",template:"http://sigsc.sc.gov.br/sigserver/SIGSC/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OrtoRGB-Landsat-2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[-48.62488,-26.91624],[-48.62416,-26.83409],[-48.56163,-26.83412],[-48.56165,-26.74919],[-48.62675,-26.74918],[-48.62715,-26.73276],[-48.64126,-26.733],[-48.64174,-26.70912],[-48.62414,-26.70913],[-48.62418,-26.50079],[-48.57099,-26.50077],[-48.57155,-26.47415],[-48.55418,-26.47381],[-48.5545,-26.45736],[-48.56155,-26.45747],[-48.56161,-26.41746],[-48.4991,-26.41747],[-48.49909,-26.25081],[-48.43664,-26.25079],[-48.43661,-26.20752],[-48.4601,-26.20751],[-48.46195,-26.1242],[-48.56161,-26.12419],[-48.56163,-25.95753],[-48.62411,-25.95753],[-48.62411,-25.94507],[-48.68838,-25.94607],[-48.6884,-25.95752],[-49.25089,-25.95752],[-49.2509,-25.9992],[-49.31339,-25.9992],[-49.31338,-26.0825],[-49.37591,-26.0825],[-49.37591,-26.12419],[-49.50093,-26.12418],[-49.50092,-26.16586],[-49.68661,-26.16585],[-49.68661,-26.12417],[-49.74907,-26.08246],[-49.74908,-26.04084],[-49.8116,-26.04085],[-49.81159,-25.99918],[-49.93657,-25.99915],[-49.93661,-25.98244],[-50.00091,-25.98288],[-50.00094,-25.99915],[-50.31338,-25.99916],[-50.31342,-26.04083],[-50.37411,-26.04084],[-50.3741,-25.9992],[-50.49914,-25.99918],[-50.49911,-25.98414],[-50.62593,-25.98452],[-50.62595,-26.04084],[-50.6884,-26.04161],[-50.68845,-26.12416],[-50.75094,-26.12414],[-50.75095,-26.20752],[-51.12595,-26.20747],[-51.12595,-26.24913],[-51.18848,-26.24918],[-51.31344,-26.33245],[-51.31347,-26.62414],[-51.4366,-26.62415],[-51.43659,-26.56476],[-51.62409,-26.5641],[-51.62411,-26.5408],[-51.99907,-26.5408],[-52.06158,-26.49911],[-52.06158,-26.45747],[-52.12408,-26.45749],[-52.12406,-26.41579],[-52.37407,-26.4158],[-52.37409,-26.39133],[-52.56156,-26.3894],[-52.56158,-26.37415],[-52.62408,-26.37417],[-52.62409,-26.33247],[-53.12408,-26.33247],[-53.1241,-26.31707],[-53.1618,-26.3165],[-53.16136,-26.29082],[-53.18656,-26.29083],[-53.24907,-26.24911],[-53.24906,-26.23919],[-53.31159,-26.23824],[-53.3741,-26.22882],[-53.43845,-26.22777],[-53.43843,-26.24914],[-53.5616,-26.24916],[-53.56159,-26.23983],[-53.65501,-26.23814],[-53.65623,-26.29263],[-53.67011,-26.31684],[-53.68846,-26.33242],[-53.70322,-26.3741],[-53.70929,-26.38449],[-53.7098,-26.39568],[-53.70619,-26.40722],[-53.70721,-26.45927],[-53.71438,-26.46168],[-53.71476,-26.48118],[-53.73047,-26.49913],[-53.73146,-26.54081],[-53.75096,-26.5408],[-53.75095,-26.62417],[-53.7602,-26.62414],[-53.76125,-26.6675],[-53.75098,-26.66751],[-53.75096,-26.74298],[-53.72737,-26.7434],[-53.72133,-26.74905],[-53.72141,-26.75093],[-53.74571,-26.75943],[-53.74612,-26.77704],[-53.71948,-26.77755],[-53.72084,-26.83416],[-53.70047,-26.83414],[-53.70277,-26.93108],[-53.71168,-26.93091],[-53.71224,-26.95557],[-53.751,-26.95479],[-53.75092,-26.99915],[-53.76467,-26.99915],[-53.8037,-27.03751],[-53.80454,-27.07258],[-53.80809,-27.07249],[-53.80862,-27.09613],[-53.8269,-27.09577],[-53.82762,-27.12414],[-53.84644,-27.12413],[-53.84765,-27.17014],[-53.83506,-27.18932],[-53.83536,-27.20054],[-53.68847,-27.20284],[-53.68849,-27.22789],[-53.43654,-27.23246],[-53.43655,-27.16751],[-53.37598,-27.16751],[-53.37601,-27.23352],[-53.24905,-27.23564],[-53.24905,-27.20922],[-53.06344,-27.20918],[-53.06345,-27.2334],[-52.81348,-27.23685],[-52.81346,-27.27653],[-52.75096,-27.27732],[-52.75096,-27.29249],[-52.4385,-27.29252],[-52.43848,-27.32689],[-52.37603,-27.32753],[-52.37599,-27.3342],[-52.25098,-27.33418],[-52.25099,-27.34669],[-52.18655,-27.34728],[-52.18657,-27.33419],[-52.12598,-27.3342],[-52.12599,-27.36413],[-52.02979,-27.36489],[-52.03036,-27.42442],[-51.97534,-27.42479],[-51.97603,-27.50088],[-51.93845,-27.50085],[-51.93845,-27.54252],[-51.68846,-27.54247],[-51.68847,-27.55742],[-51.59903,-27.5579],[-51.59923,-27.59481],[-51.56351,-27.59498],[-51.56348,-27.62586],[-51.50088,-27.62586],[-51.50095,-27.66754],[-51.43937,-27.6675],[-51.43954,-27.70932],[-51.37597,-27.7095],[-51.37601,-27.75089],[-51.31349,-27.7509],[-51.31346,-27.79253],[-51.18847,-27.79251],[-51.18848,-27.87586],[-51.12598,-27.87586],[-51.12597,-27.91752],[-51.06348,-27.9175],[-51.06347,-27.95919],[-51.00095,-28.00086],[-50.9385,-28.00086],[-50.93849,-28.16755],[-50.81346,-28.16752],[-50.81345,-28.29253],[-50.75096,-28.29251],[-50.68845,-28.33418],[-50.68849,-28.41754],[-50.626,-28.41752],[-50.56352,-28.44094],[-50.43848,-28.44051],[-50.43847,-28.45917],[-50.37597,-28.45921],[-50.37598,-28.47554],[-50.18844,-28.47454],[-50.18849,-28.51143],[-50.12398,-28.51104],[-50.12402,-28.50086],[-49.87597,-28.50085],[-49.87601,-28.5142],[-49.81347,-28.51369],[-49.81347,-28.58255],[-49.83003,-28.58251],[-49.82951,-28.62597],[-49.8759,-28.66572],[-50.001,-28.74915],[-50.001,-29.04083],[-50.03319,-29.04081],[-50.03219,-29.14711],[-50.12602,-29.14774],[-50.12598,-29.16579],[-50.13613,-29.16581],[-50.1885,-29.19623],[-50.1885,-29.31905],[-50.1422,-29.31873],[-50.14208,-29.33422],[-50.126,-29.33418],[-50.12599,-29.36238],[-49.99906,-29.36153],[-49.99904,-29.24031],[-49.93848,-29.23986],[-49.93851,-29.25087],[-49.87601,-29.25087],[-49.876,-29.30098],[-49.82262,-29.30052],[-49.82227,-29.33419],[-49.81347,-29.33422],[-49.81354,-29.3411],[-49.68654,-29.33991],[-49.68651,-29.29255],[-49.62399,-29.29252],[-49.62398,-29.25085],[-49.56149,-29.25083],[-49.56145,-29.16749],[-49.49901,-29.16746],[-49.49902,-29.08419],[-49.4365,-29.08418],[-49.43651,-29.04251],[-49.37405,-29.04248],[-49.37402,-28.9592],[-49.31153,-28.95917],[-49.31152,-28.91749],[-49.24898,-28.9175],[-49.24897,-28.87582],[-49.18655,-28.87585],[-49.18653,-28.83414],[-49.12402,-28.83418],[-49.12401,-28.7925],[-49.06149,-28.79247],[-49.06146,-28.75084],[-48.99903,-28.75085],[-48.99903,-28.70919],[-48.93658,-28.70918],[-48.93658,-28.66752],[-48.87405,-28.66751],[-48.87404,-28.62585],[-48.74912,-28.62585],[-48.74912,-28.54254],[-48.68656,-28.54253],[-48.68658,-28.33417],[-48.62408,-28.33416],[-48.62406,-28.08418],[-48.5616,-28.08418],[-48.56159,-27.95919],[-48.49905,-27.95916],[-48.49904,-27.91581],[-48.56157,-27.9158],[-48.5616,-27.87584],[-48.49902,-27.87586],[-48.49902,-27.83422],[-48.43657,-27.83418],[-48.43661,-27.62583],[-48.37406,-27.62585],[-48.37405,-27.50086],[-48.31157,-27.50086],[-48.31153,-27.24913],[-48.43657,-27.24913],[-48.43654,-27.20916],[-48.37402,-27.2092],[-48.37405,-27.1658],[-48.43656,-27.1658],[-48.43656,-27.12415],[-48.49906,-27.12413],[-48.49907,-27.08667],[-48.50022,-27.08666],[-48.50031,-27.08247],[-48.5616,-27.08248],[-48.56159,-27.04252],[-48.49906,-27.04252],[-48.49906,-26.99913],[-48.56156,-26.99913],[-48.56157,-26.91579],[-48.62488,-26.91624]]],terms_url:"http://sigsc.sds.sc.gov.br/download/termo_sigsc.pdf",terms_text:"Sistema de Informações Geográficas - Governo de Santa Catarina"},{id:"SIGIP-2012",name:"SIGIP - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.71057,46.54396],[6.72968,46.54408],[6.72995,46.52605],[6.71085,46.52596],[6.71113,46.50796],[6.6922,46.50788],[6.6923,46.49883],[6.63531,46.49847],[6.63488,46.52547],[6.65381,46.52558],[6.65361,46.54358],[6.69163,46.54384],[6.69155,46.55284],[6.71047,46.55293],[6.71057,46.54396]]],terms_url:"https://www.sigip.ch/",terms_text:"SIGIP"},{id:"Slovakia-Historic-Maps",name:"Slovakia Historic Maps",type:"tms",template:"http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png",zoomExtent:[0,12],polygon:[[[16.81969,47.49272],[16.81969,49.50303],[22.83883,49.50303],[22.83883,47.49272],[16.81969,47.49272]]],icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"skoterleder",name:"Snowmobile map Sweden",type:"tms",template:"https://tiles.skoterleder.org/tiles/{zoom}/{x}/{y}.png",zoomExtent:[5,14],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[23.87328,65.21069],[30.14647,65.19226],[30.19042,67.62596],[29.43236,69.62651],[27.93822,70.14037],[20.73119,69.2756],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://skoterleder.org/",terms_text:"© Skoterleder.org",description:"Snowmobile trails",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Sweden_road_sign_D9.svg/200px-Sweden_road_sign_D9.svg.png"},{id:"Soskut_Pusztazamor_Tarnok_Diosd_orto_2017",name:"Sóskút, Pusztazámor, Tárnok, Diósd ortophoto 2017",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/Soskut-Tarnok-Pusztazamor-Diosd/mercator/{zoom}/{x}/{y}.png",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",zoomExtent:[11,20],polygon:[[[18.79273,47.37079],[18.79194,47.37048],[18.79139,47.37063],[18.79011,47.37176],[18.78916,47.37345],[18.78722,47.37566],[18.78603,47.37765],[18.78498,47.37905],[18.7837,47.38032],[18.78267,47.38195],[18.7814,47.38368],[18.77934,47.38713],[18.77666,47.3894],[18.76472,47.3967],[18.7617,47.39966],[18.75631,47.40328],[18.75837,47.40653],[18.7588,47.40776],[18.762,47.41217],[18.76304,47.41315],[18.76593,47.41471],[18.77041,47.41766],[18.77247,47.41809],[18.77248,47.4203],[18.8086,47.44041],[18.81742,47.43539],[18.82092,47.43572],[18.82804,47.43755],[18.83021,47.43526],[18.83585,47.43754],[18.84049,47.43346],[18.84765,47.43572],[18.851,47.43281],[18.869,47.43961],[18.87361,47.43597],[18.87499,47.43342],[18.87386,47.43248],[18.87604,47.42797],[18.8605,47.423],[18.86621,47.41798],[18.87243,47.41086],[18.8663,47.40773],[18.86964,47.40471],[18.86777,47.40207],[18.86509,47.40052],[18.87081,47.39838],[18.86772,47.39699],[18.86992,47.39655],[18.87649,47.39478],[18.87749,47.39495],[18.87867,47.39462],[18.88358,47.38996],[18.88291,47.38967],[18.88539,47.3853],[18.87748,47.38339],[18.88181,47.37605],[18.87914,47.37393],[18.88638,47.36923],[18.88206,47.36773],[18.87973,47.36641],[18.8747,47.36252],[18.87282,47.36137],[18.87028,47.36063],[18.86688,47.35853],[18.86234,47.35637],[18.85567,47.35199],[18.84874,47.34728],[18.83192,47.33841],[18.82497,47.34258],[18.8162,47.34925],[18.81079,47.35357],[18.80823,47.356],[18.80645,47.35854],[18.80708,47.35902],[18.80635,47.36021],[18.80465,47.36175],[18.80381,47.36335],[18.80055,47.36545],[18.79988,47.36617],[18.79416,47.36975],[18.79273,47.37079]],[[18.91871,47.40938],[18.91826,47.40998],[18.92067,47.41156],[18.9251,47.41372],[18.93473,47.41917],[18.94063,47.42241],[18.94982,47.41938],[18.95155,47.4175],[18.9569,47.41923],[18.9577,47.41878],[18.95755,47.41435],[18.96211,47.40507],[18.96266,47.40118],[18.96316,47.39903],[18.95446,47.39673],[18.95276,47.39526],[18.95202,47.39362],[18.95119,47.39356],[18.94692,47.39799],[18.94411,47.39845],[18.94161,47.39869],[18.93735,47.39633],[18.93617,47.39683],[18.93122,47.4],[18.9312,47.40023],[18.92924,47.40205],[18.92561,47.40605],[18.92466,47.40635],[18.92293,47.40926],[18.91871,47.40938]]],terms_url:"http://fototerkep.hu",terms_text:"Fototerkep.hu",best:true,description:"5 cm resolution bald image of 4 settlement"},{id:"South_Africa-CD_NGI-Aerial",name:"South Africa CD:NGI Aerial",type:"tms",template:"http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg",zoomExtent:[1,22],polygon:[[[17.83968,-32.79834],[17.88935,-32.69728],[18.00364,-32.69822],[18.09917,-32.74853],[18.28987,-32.55266],[18.29302,-32.04871],[18.10545,-31.6455],[17.85293,-31.3444],[17.548,-30.90217],[17.40445,-30.63747],[17.24937,-30.39917],[16.9937,-29.65436],[16.7988,-29.19437],[16.54941,-28.84159],[16.44987,-28.69188],[16.4491,-28.55158],[16.60026,-28.48257],[16.75141,-28.4487],[16.74622,-28.2459],[16.88551,-28.04729],[16.99295,-28.0244],[17.05297,-28.02571],[17.10076,-28.03388],[17.20115,-28.09305],[17.20263,-28.23284],[17.24746,-28.23382],[17.2508,-28.19889],[17.35119,-28.19759],[17.35156,-28.24427],[17.40158,-28.24524],[17.41491,-28.34898],[17.40083,-28.548],[17.4527,-28.54897],[17.45121,-28.64951],[17.49836,-28.68721],[17.60282,-28.683],[17.64997,-28.69679],[17.65259,-28.73815],[17.80139,-28.73815],[17.99943,-28.75606],[18.00027,-28.79562],[18.15745,-28.87181],[18.50638,-28.87181],[18.61536,-28.82959],[18.90875,-28.82775],[19.1047,-28.94885],[19.19691,-28.93785],[19.24301,-28.85162],[19.23149,-28.80296],[19.25873,-28.70099],[19.44315,-28.69732],[19.55003,-28.49583],[19.69673,-28.49399],[19.69882,-28.44794],[19.85076,-28.44333],[19.84971,-28.40278],[19.99536,-28.39909],[19.98937,-24.74979],[20.29167,-24.91923],[20.47246,-25.15017],[20.65324,-25.45294],[20.73326,-25.6802],[20.8281,-25.89635],[20.84292,-26.21585],[20.65028,-26.48409],[20.65324,-26.82049],[21.08891,-26.84693],[21.67277,-26.839],[21.7765,-26.66963],[21.97211,-26.64314],[22.28034,-26.32747],[22.57078,-26.1334],[22.77528,-25.67752],[23.00052,-25.27619],[23.46583,-25.27351],[23.88372,-25.59737],[24.2364,-25.6134],[24.60391,-25.78966],[25.1107,-25.73894],[25.50784,-25.68554],[25.64418,-25.48238],[25.84193,-24.78054],[25.84664,-24.75385],[26.39285,-24.63329],[26.47391,-24.56533],[26.509,-24.48424],[26.58619,-24.40758],[26.73006,-24.30145],[26.85674,-24.24995],[26.85744,-24.10269],[26.92155,-23.8991],[26.93183,-23.84619],[26.97148,-23.69943],[27.00061,-23.63676],[27.0578,-23.60526],[27.13605,-23.52034],[27.33396,-23.39738],[27.51441,-23.35939],[27.59581,-23.20855],[27.80986,-23.0995],[27.88285,-23.06205],[27.93829,-22.94965],[28.04076,-22.82551],[28.20568,-22.65529],[28.33972,-22.56394],[28.49061,-22.5607],[28.61088,-22.54002],[28.82818,-22.45502],[28.92853,-22.42323],[28.95941,-22.30901],[29.01626,-22.20834],[29.23241,-22.16935],[29.35312,-22.18429],[29.6549,-22.11864],[29.77771,-22.1362],[29.9293,-22.18494],[30.11668,-22.28303],[30.25634,-22.29148],[30.30336,-22.33952],[30.50618,-22.30576],[30.83743,-22.28498],[31.00586,-22.30771],[31.18342,-22.32329],[31.29306,-22.36746],[31.56806,-23.19034],[31.55683,-23.44308],[31.69311,-23.61752],[31.71197,-23.74114],[31.77747,-23.88006],[31.88863,-23.94811],[31.91444,-24.17467],[31.99483,-24.30409],[32.01667,-24.4406],[32.00773,-24.65366],[32.01964,-24.91407],[32.03552,-25.08498],[32.01964,-25.38214],[31.99285,-25.44938],[31.99979,-25.51657],[32.00575,-25.6079],[32.00575,-25.66248],[31.93627,-25.84037],[31.98094,-25.95465],[31.86878,-26.00373],[31.41621,-25.72777],[31.32291,-25.74386],[31.25046,-25.82965],[31.1393,-25.91627],[31.11647,-25.99124],[30.96561,-26.26658],[30.89217,-26.32797],[30.85346,-26.40356],[30.82269,-26.44888],[30.80226,-26.52407],[30.80384,-26.80821],[30.90209,-26.78075],[30.91003,-26.84895],[30.98249,-26.90826],[30.97653,-27.00292],[31.00344,-27.04416],[31.15433,-27.19804],[31.50156,-27.31112],[31.97002,-27.31112],[31.97002,-27.12047],[31.97697,-27.05066],[32.00025,-26.79839],[32.10698,-26.79846],[32.31145,-26.84795],[32.89999,-26.85161],[32.88609,-26.9817],[32.70943,-27.47854],[32.62407,-27.77751],[32.5814,-28.07479],[32.53872,-28.2288],[32.42756,-28.50216],[32.36404,-28.59457],[32.07026,-28.84698],[31.98788,-28.90695],[31.77648,-28.96949],[31.46385,-29.28593],[31.35963,-29.38543],[31.16808,-29.63074],[31.06486,-29.78935],[31.05345,-29.84705],[31.06699,-29.86403],[31.04555,-29.9502],[30.95186,-30.00339],[30.86518,-30.10241],[30.72447,-30.3925],[30.35563,-30.93089],[30.09724,-31.24583],[29.86731,-31.43043],[29.74094,-31.50147],[29.48131,-31.69787],[28.89432,-32.28989],[28.54971,-32.58946],[28.14365,-32.83207],[28.07487,-32.94169],[27.84509,-33.08287],[27.3758,-33.38607],[26.88054,-33.6459],[26.59169,-33.74808],[26.45273,-33.79358],[26.20675,-33.75489],[26.00779,-33.7224],[25.80555,-33.75243],[25.75111,-33.80065],[25.65291,-33.85436],[25.65291,-33.94698],[25.71958,-34.00401],[25.72028,-34.05112],[25.55089,-34.06315],[25.35046,-34.05026],[25.28106,-34.00203],[25.04763,-33.99946],[24.95472,-34.00436],[24.94966,-34.10104],[24.87704,-34.15065],[24.87629,-34.20053],[24.85326,-34.21896],[24.76453,-34.20179],[24.50014,-34.20033],[24.34867,-34.11638],[24.19888,-34.1019],[23.99634,-34.05144],[23.80175,-34.05243],[23.74936,-34.01119],[23.49735,-34.00901],[23.41552,-34.04346],[23.41543,-34.11404],[22.90009,-34.0993],[22.84124,-34.05479],[22.64703,-34.05026],[22.64598,-34.00728],[22.57002,-34.00641],[22.50505,-34.06459],[22.252,-34.06459],[22.22213,-34.10147],[22.16212,-34.1057],[22.17124,-34.15218],[22.15769,-34.21809],[22.00156,-34.21722],[21.9497,-34.322],[21.86115,-34.40071],[21.56147,-34.40201],[21.5468,-34.36612],[21.50174,-34.36699],[21.5007,-34.40201],[21.41949,-34.44652],[21.19787,-34.44782],[21.09882,-34.39913],[21.00337,-34.37539],[20.89319,-34.39971],[20.89766,-34.4854],[20.74468,-34.48281],[20.5042,-34.48626],[20.25272,-34.70148],[20.08035,-34.83619],[19.99233,-34.83791],[19.89907,-34.82758],[19.89383,-34.7936],[19.5973,-34.79618],[19.39297,-34.64202],[19.28771,-34.64048],[19.28614,-34.59866],[19.34744,-34.52445],[19.32853,-34.45344],[19.098,-34.44998],[19.07256,-34.38024],[19.00235,-34.35256],[18.95206,-34.39494],[18.7975,-34.39364],[18.79842,-34.10164],[18.50175,-34.10153],[18.49995,-34.36169],[18.44773,-34.362],[18.44799,-34.35227],[18.39744,-34.3514],[18.39717,-34.3023],[18.35657,-34.30056],[18.34793,-34.20204],[18.29721,-34.19503],[18.29511,-33.99371],[18.33745,-33.99141],[18.34766,-33.84924],[18.34793,-33.78155],[18.41247,-33.74488],[18.36155,-33.65016],[18.2992,-33.58559],[18.21668,-33.44887],[18.13899,-33.39741],[17.94735,-33.16026],[17.88552,-33.05757],[17.84859,-32.96685],[17.83968,-32.85073],[17.83968,-32.79834]]],best:true},{id:"South-Tyrol-Orthofoto2011",name:"South Tyrol Orthofoto 2011",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2011_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{id:"South-Tyrol-Orthofoto2011-20cm",name:"South Tyrol Orthofoto 2011 (highres)",type:"wms",template:"https://geoservices.buergernetz.bz.it/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=P_BZ_OF_2011_EPSG3857,P_BZ_OF_2011_20cm_EPSG3857&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0",description:"Orthophoto of South Tyrol from 2011 with up to 20cm resolution (larger valleys)"},{id:"South-Tyrol-Orthofoto2014",name:"South Tyrol Orthofoto 2014",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[11.71495,46.51227],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.61936,46.43957],[11.62508,46.43957],[11.62508,46.44797],[11.63349,46.44587],[11.63769,46.45846],[11.64399,46.45846],[11.6608,46.44587],[11.66711,46.44587],[11.66711,46.47525],[11.69442,46.47735],[11.69652,46.48575],[11.70913,46.49624],[11.70913,46.50254],[11.71333,46.50254],[11.71495,46.51227]],[[11.61435,46.41535],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20644,46.4156],[11.20485,46.3997],[11.17754,46.3997],[11.17543,46.3871],[11.16703,46.38081],[11.16703,46.36821],[11.16283,46.36821],[11.16283,46.29895],[11.12501,46.29895],[11.12291,46.25488],[11.13131,46.25278],[11.12711,46.24858],[11.16283,46.24858],[11.16283,46.215],[11.24898,46.2129],[11.25108,46.2234],[11.2889,46.2234],[11.2889,46.24019],[11.3015,46.25278],[11.30991,46.25278],[11.31201,46.24858],[11.33722,46.25068],[11.34143,46.26747],[11.34563,46.26747],[11.34773,46.25698],[11.35613,46.24858],[11.41707,46.25278],[11.41917,46.32414],[11.49271,46.32204],[11.48851,46.33044],[11.49901,46.32834],[11.50111,46.34723],[11.52423,46.34723],[11.53894,46.34513],[11.53894,46.32834],[11.55995,46.32414],[11.58306,46.34932],[11.58306,46.37241],[11.60407,46.37241],[11.60617,46.38291],[11.61458,46.38291],[11.62508,46.3934],[11.62508,46.41229],[11.61435,46.41535]],[[11.20663,46.41745],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.96285,46.47718],[10.96952,46.45217],[10.98423,46.45217],[10.98843,46.44587],[10.99894,46.44587],[11.01154,46.42068],[11.04096,46.42068],[11.08088,46.43537],[11.08298,46.47525],[11.15232,46.47525],[11.18804,46.48365],[11.19014,46.47525],[11.20695,46.47315],[11.20485,46.44587],[11.19855,46.44167],[11.19435,46.42698],[11.19014,46.42698],[11.19014,46.42068],[11.20695,46.42068],[11.20663,46.41745]],[[10.47433,46.55501],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.46952,46.62628],[10.47785,46.61797],[10.47785,46.59069],[10.47365,46.59069],[10.47155,46.5676],[10.46314,46.55501],[10.47433,46.55501]],[[10.46925,46.62643],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43626,46.79843],[10.43373,46.81106],[10.42532,46.80686],[10.42532,46.79847],[10.42112,46.79847],[10.41692,46.78587],[10.41692,46.75229],[10.3938,46.7376],[10.3896,46.72081],[10.3854,46.72081],[10.3791,46.69353],[10.3791,46.66834],[10.3833,46.66414],[10.3812,46.64735],[10.3896,46.64525],[10.3938,46.63056],[10.42532,46.62846],[10.44843,46.63476],[10.46925,46.62643]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog/",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{id:"South-Tyrol-Orthofoto-2014-2015",name:"South Tyrol Orthofoto 2014/2015",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_2015_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2015-11-01T00:00:00.000Z",startDate:"2014-07-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 4.0",best:true},{id:"South-Tyrol-Topomap",name:"South Tyrol Topomap",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_BASEMAP_TOPO&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",zoomExtent:[0,20],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano",description:"Topographical basemap of South Tyrol"},{id:"SPW2009",name:"SPW(allonie) 2009-2010 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2009_2010/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2012",name:"SPW(allonie) 2012-2013 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2012_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2015",name:"SPW(allonie) 2015 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2015/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2016",name:"SPW(allonie) 2016 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2016/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_ORTHO_LAST",name:"SPW(allonie) most recent aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_LAST/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_PICC",name:"SPW(allonie) PICC numerical imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/TOPOGRAPHIE/PICC_VDIFF/MapServer/WmsServer?SERVICE=WMS&VERSION=1.1.1&FORMAT=image/png8&TRANSPARENT=FALSE&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&LAYERS=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",projection:"EPSG:3857",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPWrelief2014",name:"SPW(allonie) shaded relief",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/RELIEF/WALLONIE_MNT_2013_2014_HILLSHADE/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"ssb-sentrum",name:"SSB City Centres overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_193&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/arealsentrum/",terms_text:"© SSB",description:"Downtown areas with significant commercial and service activities.",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"ssb-tettsteder",name:"SSB Urban Areas overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_198&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/beftett",terms_text:"© SSB",description:"Human settlements of at least 200 people with less than 200 meters between households",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"Bern-bern2016-tms",name:"Stadt Bern 10cm (2016)",type:"tms",template:"https://mapproxy.osm.ch/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.29431,46.92376],[7.29827,46.92747],[7.30616,46.93095],[7.30433,46.93623],[7.30686,46.94037],[7.32464,46.94328],[7.32845,46.94641],[7.34141,46.94608],[7.34385,46.94737],[7.34346,46.94879],[7.35136,46.94855],[7.35056,46.95021],[7.35309,46.95193],[7.3582,46.95118],[7.3685,46.95662],[7.37151,46.96073],[7.37503,46.95983],[7.37851,46.96147],[7.38062,46.96547],[7.38321,46.9663],[7.3938,46.96693],[7.40005,46.96918],[7.40829,46.96869],[7.42817,46.9738],[7.43271,46.97269],[7.43536,46.96843],[7.43785,46.96843],[7.44125,46.97679],[7.44569,46.97479],[7.44838,46.97564],[7.4477,46.97901],[7.44405,46.97807],[7.44127,46.97982],[7.45067,46.99015],[7.45221,46.98968],[7.45465,46.97782],[7.46804,46.97583],[7.47079,46.97],[7.47019,46.96741],[7.47816,46.97118],[7.48452,46.97016],[7.48613,46.9679],[7.48579,46.96468],[7.47847,46.9629],[7.48029,46.96068],[7.47893,46.95878],[7.47978,46.9566],[7.47701,46.95446],[7.48405,46.94999],[7.48339,46.9452],[7.49556,46.93962],[7.49351,46.93766],[7.4908,46.93876],[7.4895,46.93687],[7.47667,46.93695],[7.47811,46.93625],[7.4747,46.93392],[7.47535,46.93299],[7.4691,46.92924],[7.47077,46.9255],[7.45857,46.93484],[7.44764,46.93043],[7.43542,46.93497],[7.4338,46.93312],[7.43764,46.93074],[7.41469,46.93682],[7.41384,46.93157],[7.40708,46.93038],[7.40806,46.92563],[7.40213,46.9242],[7.40148,46.92119],[7.38757,46.93045],[7.38231,46.92728],[7.38002,46.92989],[7.38087,46.93241],[7.37487,46.93143],[7.37489,46.93271],[7.36807,46.93239],[7.36831,46.93043],[7.36041,46.92859],[7.36056,46.9272],[7.33878,46.92454],[7.33937,46.91967],[7.32746,46.91903],[7.32692,46.9236],[7.32437,46.92519],[7.30823,46.92229],[7.29431,46.92376]]],terms_text:"Orthophoto 2016, Vermessungsamt Stadt Bern",best:true},{id:"Bern-2012",name:"Stadt Bern 10cm/25cm (2012)",type:"tms",template:"https://mapproxy.osm.ch/tiles/bern2012/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,19],polygon:[[[7.3807,47.00952],[7.38073,47.02301],[7.43853,47.02303],[7.43865,47.01408],[7.45174,47.014],[7.45172,47.00503],[7.54111,47.005],[7.54111,46.99873],[7.54378,46.99871],[7.54375,46.98696],[7.55682,46.987],[7.55685,46.96003],[7.51744,46.96001],[7.51744,46.95108],[7.53051,46.95106],[7.53051,46.92407],[7.51741,46.92405],[7.51738,46.91505],[7.53042,46.91507],[7.53048,46.9061],[7.54358,46.90602],[7.54358,46.87905],[7.55659,46.87903],[7.55662,46.8611],[7.54349,46.86104],[7.5434,46.85212],[7.49095,46.85212],[7.49107,46.87907],[7.47794,46.87909],[7.47797,46.89707],[7.45168,46.89713],[7.45171,46.88808],[7.43855,46.88814],[7.43858,46.87015],[7.41233,46.87015],[7.41236,46.87907],[7.39917,46.87911],[7.3992,46.86108],[7.38613,46.86114],[7.3861,46.85218],[7.373,46.85216],[7.37303,46.86112],[7.34677,46.8611],[7.3468,46.88808],[7.25488,46.88796],[7.25485,46.90596],[7.24172,46.90592],[7.24169,46.91497],[7.22856,46.91493],[7.22833,46.96887],[7.24146,46.96891],[7.24149,46.98688],[7.26769,46.98694],[7.26777,46.99593],[7.28078,46.99595],[7.2809,47.0094],[7.3807,47.00952]]],terms_text:"Orthophoto 2012, Vermessungsamt Stadt Bern"},{id:"Uster-2008",name:"Stadt Uster Orthophoto 2008 10cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.68,47.32],[8.74,47.32],[8.74,47.365],[8.68,47.365],[8.68,47.32]]],terms_text:"Stadt Uster Vermessung Orthophoto 2008"},{id:"Zuerich-zh_luftbild2011-tms",name:"Stadt Zürich Luftbild 2011",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Luftbild 2011"},{id:"Zuerich-city_map",name:"Stadtplan Zürich",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[0,21],polygon:[[[8.56681,47.34713],[8.56665,47.34706],[8.56563,47.34684],[8.56575,47.34666],[8.56509,47.34645],[8.54207,47.33502],[8.54073,47.33376],[8.5403,47.33396],[8.54019,47.33372],[8.54042,47.33358],[8.5388,47.33208],[8.53642,47.33076],[8.53622,47.33018],[8.53345,47.32992],[8.5318,47.3295],[8.53145,47.32846],[8.53102,47.32789],[8.52974,47.32777],[8.52969,47.32687],[8.52899,47.32698],[8.52813,47.32685],[8.52802,47.32635],[8.52755,47.32639],[8.52762,47.32616],[8.52579,47.32619],[8.52563,47.32575],[8.52426,47.32608],[8.5242,47.32486],[8.52372,47.32416],[8.52304,47.32433],[8.52193,47.32436],[8.52194,47.32394],[8.51932,47.32401],[8.51868,47.32386],[8.51768,47.3232],[8.51642,47.32308],[8.5156,47.32315],[8.51472,47.32272],[8.51295,47.3229],[8.51162,47.32222],[8.50957,47.32202],[8.5095,47.32165],[8.50788,47.32203],[8.50735,47.32173],[8.50529,47.32144],[8.50476,47.32121],[8.5043,47.32074],[8.50317,47.32022],[8.50241,47.32053],[8.50227,47.32082],[8.50152,47.32129],[8.50102,47.32198],[8.50095,47.32259],[8.5006,47.32278],[8.50078,47.3237],[8.50066,47.32451],[8.50098,47.32595],[8.5015,47.3265],[8.50159,47.32732],[8.50188,47.32765],[8.50132,47.32883],[8.5014,47.32903],[8.50069,47.32979],[8.50087,47.33053],[8.50063,47.3311],[8.50112,47.33183],[8.50075,47.33202],[8.50078,47.33224],[8.50106,47.3326],[8.50191,47.33303],[8.5022,47.33364],[8.50177,47.33412],[8.50152,47.33504],[8.50199,47.33666],[8.50161,47.33728],[8.49877,47.33968],[8.49808,47.34169],[8.49702,47.34247],[8.49709,47.34326],[8.49798,47.34365],[8.4981,47.34387],[8.49817,47.34453],[8.49773,47.34521],[8.49636,47.34648],[8.4951,47.34691],[8.49467,47.3476],[8.49285,47.34828],[8.49206,47.3495],[8.49145,47.34964],[8.49128,47.34983],[8.49089,47.35067],[8.49,47.35056],[8.48813,47.352],[8.48691,47.35203],[8.4868,47.3522],[8.48728,47.35311],[8.4871,47.3534],[8.48501,47.35469],[8.48463,47.35536],[8.48463,47.3567],[8.48426,47.35737],[8.48321,47.35814],[8.48272,47.35907],[8.48205,47.35954],[8.47879,47.36078],[8.47698,47.36029],[8.47365,47.36081],[8.47275,47.36079],[8.47169,47.36132],[8.47053,47.36166],[8.46951,47.36438],[8.4664,47.36574],[8.46583,47.3661],[8.46545,47.36664],[8.46485,47.36681],[8.46427,47.36728],[8.46418,47.36838],[8.4649,47.36897],[8.46482,47.36911],[8.46938,47.37136],[8.47042,47.3726],[8.47022,47.37395],[8.46868,47.37382],[8.46761,47.37357],[8.46544,47.37444],[8.46288,47.37603],[8.45995,47.3775],[8.45638,47.37801],[8.45116,47.37817],[8.45047,47.37836],[8.44847,47.37967],[8.44801,47.38025],[8.45174,47.38062],[8.45371,47.38027],[8.45614,47.38072],[8.45669,47.38094],[8.45673,47.38244],[8.45745,47.38222],[8.45843,47.38231],[8.45841,47.38263],[8.45745,47.38325],[8.45767,47.3834],[8.45756,47.38371],[8.45807,47.38388],[8.46004,47.38594],[8.46088,47.38704],[8.46121,47.38795],[8.46104,47.38803],[8.46381,47.39053],[8.46518,47.39132],[8.46556,47.39113],[8.46618,47.39113],[8.46727,47.39065],[8.46697,47.39131],[8.46739,47.3929],[8.4671,47.39334],[8.46607,47.39378],[8.4651,47.39453],[8.46484,47.39481],[8.46488,47.39508],[8.46535,47.39492],[8.46854,47.39461],[8.47018,47.39401],[8.47066,47.39439],[8.47191,47.39388],[8.47208,47.39408],[8.47152,47.3943],[8.47151,47.3949],[8.4721,47.39517],[8.47301,47.39506],[8.47349,47.396],[8.46516,47.39829],[8.46568,47.39922],[8.46759,47.39873],[8.46806,47.39957],[8.46615,47.40006],[8.4677,47.403],[8.4699,47.40298],[8.47551,47.40381],[8.47815,47.40387],[8.47819,47.40508],[8.47738,47.40517],[8.47705,47.40619],[8.47729,47.40914],[8.47703,47.40935],[8.47543,47.40971],[8.47583,47.41077],[8.47605,47.41072],[8.47628,47.41102],[8.47665,47.41097],[8.47725,47.41194],[8.47488,47.41241],[8.47394,47.41222],[8.47303,47.41146],[8.47268,47.41058],[8.47101,47.41094],[8.47113,47.41137],[8.47085,47.41167],[8.47044,47.41159],[8.47031,47.41253],[8.46876,47.41225],[8.46801,47.41334],[8.46863,47.41363],[8.46857,47.41408],[8.46955,47.41484],[8.47007,47.41557],[8.46913,47.41649],[8.46913,47.41693],[8.46962,47.41752],[8.47158,47.41763],[8.4772,47.41974],[8.47688,47.42016],[8.47783,47.42212],[8.47895,47.42172],[8.47937,47.42113],[8.47972,47.42141],[8.48131,47.42134],[8.48171,47.423],[8.48294,47.42266],[8.48292,47.42222],[8.48609,47.42155],[8.48658,47.42164],[8.48683,47.42186],[8.48796,47.42201],[8.48851,47.42271],[8.49019,47.42234],[8.491,47.4239],[8.49006,47.42435],[8.49007,47.42532],[8.49027,47.42536],[8.49017,47.42578],[8.48552,47.42712],[8.48481,47.42784],[8.48466,47.42873],[8.48437,47.42896],[8.48445,47.42979],[8.48579,47.43103],[8.49562,47.43281],[8.50027,47.43442],[8.50207,47.43467],[8.50364,47.43402],[8.50997,47.43213],[8.51155,47.43116],[8.51274,47.43085],[8.516,47.43174],[8.51628,47.43175],[8.51681,47.43133],[8.51872,47.4319],[8.51979,47.43167],[8.52463,47.43126],[8.52549,47.43316],[8.5303,47.43207],[8.53063,47.43266],[8.533,47.43228],[8.53374,47.43251],[8.53467,47.432],[8.53521,47.43188],[8.53606,47.43187],[8.5374,47.4314],[8.53964,47.43126],[8.5401,47.4311],[8.54033,47.43186],[8.54363,47.43143],[8.54284,47.43289],[8.54311,47.43288],[8.54451,47.4325],[8.54459,47.43262],[8.54607,47.43207],[8.54858,47.43142],[8.55009,47.43128],[8.55098,47.43102],[8.55199,47.43104],[8.55535,47.43066],[8.5561,47.42803],[8.55684,47.42624],[8.55783,47.42554],[8.55697,47.4249],[8.55736,47.42472],[8.5569,47.42424],[8.55723,47.4241],[8.55419,47.4208],[8.56082,47.41817],[8.56129,47.41829],[8.56235,47.41632],[8.56282,47.41643],[8.56323,47.41565],[8.56622,47.41632],[8.56692,47.41629],[8.56735,47.41649],[8.5678,47.41684],[8.56875,47.41855],[8.56903,47.41871],[8.5696,47.41868],[8.56944,47.41926],[8.57223,47.41893],[8.57367,47.42004],[8.57378,47.4178],[8.57342,47.41711],[8.57386,47.41438],[8.57384,47.41324],[8.57331,47.41257],[8.5726,47.41207],[8.573,47.41144],[8.58806,47.40797],[8.58894,47.40756],[8.59312,47.40704],[8.59728,47.40631],[8.59722,47.406],[8.59608,47.40612],[8.59378,47.40222],[8.59622,47.40154],[8.5948,47.39918],[8.59725,47.39851],[8.59644,47.39715],[8.59637,47.39663],[8.59623,47.39646],[8.59453,47.39712],[8.59392,47.39647],[8.59335,47.39614],[8.59208,47.39691],[8.59172,47.39681],[8.59148,47.397],[8.58828,47.3958],[8.58905,47.39501],[8.58995,47.39478],[8.58818,47.39351],[8.58752,47.39321],[8.58747,47.39297],[8.58619,47.3928],[8.58442,47.39195],[8.58369,47.39008],[8.58305,47.38905],[8.58316,47.38831],[8.58437,47.38834],[8.58432,47.38894],[8.58492,47.39011],[8.58528,47.3904],[8.58696,47.39017],[8.5869,47.38977],[8.58765,47.38905],[8.58698,47.38793],[8.59181,47.38638],[8.59307,47.38565],[8.59299,47.38523],[8.59354,47.38522],[8.59274,47.38417],[8.59082,47.38476],[8.59013,47.38381],[8.58966,47.384],[8.58956,47.38373],[8.59217,47.38311],[8.59151,47.38244],[8.59384,47.38081],[8.59407,47.38061],[8.59406,47.38029],[8.59556,47.3796],[8.59574,47.37927],[8.59721,47.37849],[8.59674,47.37782],[8.59702,47.37716],[8.5976,47.37661],[8.59705,47.37589],[8.59778,47.37557],[8.59828,47.3751],[8.59855,47.37473],[8.59813,47.37447],[8.6002,47.37331],[8.60053,47.3734],[8.60096,47.37312],[8.60194,47.37198],[8.60192,47.37171],[8.60324,47.37131],[8.60607,47.36871],[8.60745,47.36816],[8.60812,47.36761],[8.61067,47.3673],[8.612,47.36684],[8.61308,47.36776],[8.61344,47.36779],[8.61366,47.36802],[8.61549,47.3677],[8.61645,47.36841],[8.61665,47.36828],[8.61764,47.36681],[8.61709,47.36626],[8.61682,47.36535],[8.61565,47.36466],[8.61495,47.36458],[8.61557,47.36342],[8.61566,47.36273],[8.61482,47.36263],[8.6147,47.36151],[8.61929,47.36121],[8.61996,47.36104],[8.62174,47.36007],[8.62257,47.35983],[8.62187,47.35946],[8.62133,47.35746],[8.62351,47.35592],[8.62352,47.35561],[8.62544,47.35466],[8.62416,47.35397],[8.62245,47.35364],[8.62209,47.35334],[8.61989,47.35367],[8.61976,47.35385],[8.61844,47.35382],[8.61839,47.35425],[8.61708,47.35414],[8.61569,47.35442],[8.6152,47.3541],[8.61386,47.35402],[8.61255,47.35437],[8.61156,47.35394],[8.61107,47.35352],[8.61042,47.35337],[8.60946,47.35352],[8.60776,47.35333],[8.60607,47.35363],[8.60506,47.35359],[8.6038,47.353],[8.60305,47.35219],[8.6032,47.35207],[8.60294,47.35175],[8.603,47.35076],[8.60262,47.35073],[8.6016,47.35073],[8.60104,47.35105],[8.60026,47.35112],[8.5996,47.35145],[8.59859,47.35145],[8.59824,47.35165],[8.59689,47.3514],[8.59666,47.35161],[8.59596,47.35169],[8.59564,47.3519],[8.59494,47.35161],[8.59454,47.35175],[8.5939,47.35161],[8.5935,47.35211],[8.59229,47.3523],[8.59189,47.35278],[8.59118,47.35321],[8.59047,47.35271],[8.59014,47.35286],[8.58846,47.35289],[8.58797,47.35307],[8.58748,47.35267],[8.5863,47.35288],[8.58591,47.35231],[8.5853,47.35201],[8.58462,47.35141],[8.58417,47.35129],[8.58438,47.35116],[8.58398,47.35085],[8.58348,47.35104],[8.58335,47.35087],[8.58221,47.35101],[8.58246,47.35062],[8.57851,47.34873],[8.57827,47.34888],[8.57786,47.34865],[8.57686,47.34878],[8.57688,47.34859],[8.57625,47.34839],[8.57308,47.34751],[8.573,47.34765],[8.57214,47.34744],[8.57163,47.34728],[8.5717,47.34712],[8.57029,47.34672],[8.56968,47.3476],[8.56741,47.34674],[8.56681,47.34713]]],terms_text:"Stadt Zürich Open Government Data"},{id:"stamen-terrain-background",name:"Stamen Terrain",type:"tms",template:"https://stamen-tiles-{switch:a,b,c,d}.a.ssl.fastly.net/terrain-background/{zoom}/{x}/{y}.jpg",zoomExtent:[4,18],terms_url:"http://maps.stamen.com/#terrain",terms_text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL",icon:"https://stamen.com/wp-content/uploads/2016/07/stamen_compass_rose_small-01.png"},{id:"Surrey-Air_Survey",name:"Surrey Air Survey",type:"tms",template:"https://{switch:a,b,c}.surrey.aerial.openstreetmap.org.uk/layer/gb_surrey_aerial/{zoom}/{x}/{y}.png",endDate:"2009-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[-0.75248,51.08219],[-0.75952,51.08563],[-0.80143,51.14579],[-0.83989,51.14407],[-0.83577,51.18024],[-0.85295,51.20113],[-0.85227,51.20962],[-0.84952,51.2179],[-0.82669,51.24037],[-0.8121,51.24692],[-0.77365,51.24596],[-0.75442,51.23811],[-0.75408,51.23392],[-0.74464,51.23338],[-0.74307,51.28472],[-0.7515,51.30695],[-0.76644,51.3121],[-0.78206,51.32702],[-0.78154,51.33881],[-0.73743,51.37205],[-0.71923,51.37697],[-0.67958,51.3848],[-0.68078,51.39015],[-0.65314,51.39176],[-0.63014,51.39058],[-0.62911,51.39701],[-0.62344,51.39776],[-0.61314,51.42956],[-0.60025,51.44591],[-0.58671,51.44454],[-0.57624,51.4532],[-0.56268,51.45235],[-0.54774,51.447],[-0.53727,51.44486],[-0.5371,51.45267],[-0.54396,51.45459],[-0.54053,51.46989],[-0.53092,51.47609],[-0.50912,51.47448],[-0.5086,51.46957],[-0.49006,51.46828],[-0.45264,51.46069],[-0.44869,51.44293],[-0.44148,51.44186],[-0.44183,51.43694],[-0.41127,51.43801],[-0.40149,51.42795],[-0.38071,51.42624],[-0.38054,51.41617],[-0.34913,51.41382],[-0.3275,51.40375],[-0.30398,51.39904],[-0.30192,51.37547],[-0.30948,51.36969],[-0.31119,51.35297],[-0.29557,51.35415],[-0.29231,51.36733],[-0.2851,51.36808],[-0.27875,51.37719],[-0.26553,51.38372],[-0.24115,51.3848],[-0.21231,51.36283],[-0.21077,51.34986],[-0.19086,51.35029],[-0.15429,51.33388],[-0.14966,51.30577],[-0.10743,51.29665],[-0.08872,51.30996],[-0.08786,51.32208],[-0.0652,51.32154],[-0.06417,51.32648],[-0.05198,51.32637],[-0.05284,51.33463],[-0.03308,51.34309],[0.00192,51.33763],[0.01188,51.3282],[0.01393,51.29944],[0.02029,51.29944],[0.02406,51.30727],[0.03316,51.30867],[0.04552,51.30545],[0.05239,51.28774],[0.06166,51.25778],[0.06406,51.24155],[0.04621,51.21263],[0.04071,51.21091],[0.04483,51.19898],[0.04947,51.19973],[0.05582,51.19446],[0.06114,51.17907],[0.06234,51.15421],[0.05771,51.14171],[0.02046,51.13654],[-0.0446,51.13364],[-0.1567,51.13525],[-0.15721,51.129],[-0.22879,51.11834],[-0.24733,51.11834],[-0.25008,51.12114],[-0.29935,51.1137],[-0.32218,51.11198],[-0.32235,51.10584],[-0.3596,51.10196],[-0.35891,51.11133],[-0.38638,51.11176],[-0.3869,51.10625],[-0.4281,51.09472],[-0.48568,51.09516],[-0.48713,51.08723],[-0.52974,51.08654],[-0.53023,51.07899],[-0.61046,51.07655],[-0.60997,51.08067],[-0.6578,51.07922],[-0.65828,51.07434],[-0.68365,51.07075],[-0.6998,51.07083],[-0.72966,51.07449],[-0.75248,51.08219]]]},{id:"Swietochlowice-2008",name:"Świętochłowice: Orthophotomap 2008 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2008&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2009",name:"Świętochłowice: Orthophotomap 2009 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2009&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2012",name:"Świętochłowice: Orthophotomap 2012 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2012&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Szeged_2011",name:"Szeged orthophoto 2011",type:"tms",template:"http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[20.14599,46.22811],[20.13323,46.22904],[20.12584,46.22987],[20.12233,46.23099],[20.12085,46.23175],[20.11897,46.23351],[20.11312,46.24136],[20.11203,46.2433],[20.11157,46.245],[20.11119,46.24709],[20.11129,46.24877],[20.11159,46.25097],[20.11222,46.2528],[20.11299,46.25427],[20.11354,46.25535],[20.11477,46.2568],[20.13523,46.27685],[20.13664,46.27751],[20.13789,46.27803],[20.13939,46.27835],[20.14088,46.27846],[20.16115,46.27816],[20.16211,46.27816],[20.16359,46.2777],[20.16618,46.27615],[20.16878,46.27386],[20.16961,46.27144],[20.16959,46.27045],[20.17009,46.27044],[20.17399,46.26433],[20.17662,46.25829],[20.1948,46.25492],[20.18587,46.24481],[20.18466,46.24531],[20.17804,46.23831],[20.17818,46.23771],[20.17953,46.2371],[20.17257,46.23002],[20.16983,46.23504],[20.16877,46.23629],[20.16703,46.23785],[20.16594,46.23873],[20.16544,46.239],[20.16548,46.239],[20.16352,46.24014],[20.16021,46.2412],[20.15927,46.24153],[20.15927,46.24158],[20.15835,46.24185],[20.15495,46.24229],[20.15108,46.23515],[20.14938,46.23246],[20.14599,46.22811]]],terms_url:"http://www.geo.u-szeged.hu",terms_text:"SZTE TFGT - University of Szeged",best:true,description:"Inner part of Szeged"},{id:"TW_NLSC_WMS_EMAP6",name:"Taiwan e-Map Open Data",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP6_OPENDATA/default/GoogleMapsCompatible/{zoom}/{y}/{x}",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_LANDSECT",name:"Taiwan Land-Section Data",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LANDSECT&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_Village",name:"Taiwan Village Boundaries",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Village&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TEClines",name:"TEC bus lines",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Lignes/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"TECstops",name:"TEC bus stops",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Poteaux/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"teotonio_vilela",name:"Teotonio Vilela AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Teotonio%20Vilela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.31164,-9.95468],[-36.31158,-9.94382],[-36.31145,-9.93197],[-36.31127,-9.92436],[-36.31123,-9.91848],[-36.31119,-9.91637],[-36.31141,-9.91324],[-36.3111,-9.90922],[-36.31108,-9.90318],[-36.31099,-9.89379],[-36.31089,-9.8842],[-36.31078,-9.87412],[-36.31068,-9.86457],[-36.3318,-9.86432],[-36.34001,-9.86437],[-36.3478,-9.86425],[-36.35917,-9.8642],[-36.37047,-9.86404],[-36.38448,-9.86386],[-36.40164,-9.86364],[-36.40221,-9.9225],[-36.40249,-9.93177],[-36.40259,-9.94183],[-36.40248,-9.94804],[-36.40266,-9.9537],[-36.3855,-9.95384],[-36.38283,-9.95392],[-36.37096,-9.95399],[-36.36232,-9.95423],[-36.34747,-9.95422],[-36.33287,-9.95446],[-36.3291,-9.95456],[-36.32089,-9.95459],[-36.31164,-9.95468]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"tnris.org",name:"Texas Orthophoto",type:"tms",template:"https://txgi.tnris.org/login/path/ecology-fiona-poem-romeo/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=texas&STYLE=&FORMAT=image/png&tileMatrixSet=0to20&tileMatrix=0to20:{zoom}&tileRow={y}&tileCol={x}",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-99.99854,34.56018],[-95.55655,33.99257],[-93.89679,33.61039],[-93.98468,32.04103],[-93.41614,31.02505],[-93.74531,29.57268],[-96.50492,28.23159],[-97.36942,26.95467],[-97.04867,25.8053],[-99.07342,26.32559],[-100.76599,29.02532],[-102.33154,29.84339],[-103.13355,28.88112],[-104.28879,29.28831],[-104.72698,29.94816],[-104.72697,30.23535],[-106.5345,31.78457],[-106.75767,31.78457],[-106.75766,32.04386],[-106.61848,32.04385],[-103.11949,32.04376],[-103.09544,36.50046],[-103.05798,36.54269],[-100.00042,36.54222],[-99.99854,34.56018]]],terms_url:"https://tnris.org/maps-and-data/online-mapping-services",terms_text:"Texas Natural Resources Information System"},{id:"US-TIGER-Roads-2017",name:"TIGER Roads 2017",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cj8dftc3q1ecn2tnx9qhwyj0c/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/TIGER2017RoadsOverlay.png",overlay:true},{id:"tirol.gv.at-contourlines",name:"Tiris: contour lines",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Hoehenschichtlinien 20m&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[15,22],polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif",overlay:true},{id:"tirol.gv.at-DGM",name:"Tiris: DGM (Terrain model)",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image Schummerung_Gelaendemodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-DOM",name:"Tiris: DOM (Surface model)",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image Schummerung_Oberflaechenmodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-orthofoto",name:"Tiris: orthophoto",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_RGB&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-orthofoto-cir",name:"Tiris: orthophoto infrared",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_CIR&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"lu.geoportail.opendata.topo",name:"Topographical Map geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/topo/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",endDate:"2010-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/cartes-topographiques-services-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"Torokbalint-orthophoto-2013",name:"Törökbálint orthophoto 2013",type:"wms",template:"https://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ORTO_2013_5CM_2013SZEPT_TAKARASSAL_512_512&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:3857",endDate:"2013-09-01T00:00:00.000Z",startDate:"2013-09-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu",terms_text:"Törökbálint",description:"5 cm resolution bald image"},{id:"Torokbalint-orthophoto-2015",name:"Törökbálint orthophoto 2015",type:"wms",template:"https://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=TBORTO_2015_20160218&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu/",terms_text:"Törökbálint",best:true,description:"5 cm resolution bald image"},{id:"Toulouse-Orthophotoplan-2007",name:"Toulouse - Orthophotoplan 2007",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2007&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2007-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.192,43.63288],[1.20154,43.63297],[1.20111,43.65549],[1.2228,43.6557],[1.22262,43.66534],[1.22753,43.66538],[1.22754,43.66564],[1.23376,43.66569],[1.23376,43.66502],[1.23512,43.66503],[1.23509,43.66707],[1.24436,43.66716],[1.24416,43.67439],[1.2494,43.67443],[1.2494,43.67466],[1.25557,43.67472],[1.25557,43.67445],[1.25695,43.67447],[1.25688,43.67853],[1.28749,43.67883],[1.28708,43.70132],[1.30882,43.70146],[1.30865,43.71277],[1.33033,43.71295],[1.33002,43.73052],[1.33671,43.73058],[1.33673,43.73122],[1.37343,43.73105],[1.37358,43.72458],[1.46045,43.72529],[1.46078,43.7028],[1.48249,43.70295],[1.48298,43.66921],[1.50468,43.66936],[1.50484,43.65812],[1.52655,43.65827],[1.52669,43.64703],[1.54837,43.64716],[1.54854,43.63594],[1.57022,43.63608],[1.57051,43.61358],[1.54882,43.61343],[1.5491,43.59095],[1.57077,43.59107],[1.57094,43.57983],[1.57937,43.57989],[1.57948,43.57377],[1.58091,43.57378],[1.58109,43.55738],[1.57123,43.55731],[1.57165,43.52355],[1.39848,43.52226],[1.39865,43.51101],[1.3121,43.51025],[1.3119,43.52152],[1.29026,43.52131],[1.28986,43.54382],[1.31152,43.54401],[1.31133,43.55526],[1.30369,43.55519],[1.30361,43.55951],[1.29554,43.55943],[1.29554,43.55955],[1.28956,43.55945],[1.28929,43.57754],[1.26757,43.57736],[1.2674,43.58861],[1.25355,43.5885],[1.25338,43.59563],[1.2518,43.59563],[1.2518,43.59494],[1.23504,43.59478],[1.23504,43.5946],[1.22396,43.5946],[1.22394,43.59947],[1.21397,43.5993],[1.21388,43.60464],[1.20206,43.60448],[1.20195,43.61048],[1.19243,43.61037],[1.192,43.63288]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2011",name:"Toulouse - Orthophotoplan 2011",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2013",name:"Toulouse - Orthophotoplan 2013",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2013&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2015",name:"Toulouse - Orthophotoplan 2015",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2015&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Tours-Orthophoto-2008_2010",name:"Tours - Orthophotos 2008-2010",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}",endDate:"2011-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[0.54575,47.46526],[0.54585,47.46082],[0.53922,47.4607],[0.53935,47.45624],[0.5328,47.4561],[0.5329,47.45157],[0.52619,47.4514],[0.52659,47.44249],[0.50009,47.44207],[0.50024,47.43758],[0.4936,47.43743],[0.4937,47.43293],[0.46061,47.43246],[0.46072,47.42798],[0.4541,47.42781],[0.45493,47.40539],[0.46154,47.40545],[0.46191,47.39649],[0.46843,47.3966],[0.46913,47.37864],[0.47571,47.37876],[0.47621,47.3652],[0.48283,47.36535],[0.48296,47.36083],[0.47635,47.36074],[0.47665,47.35173],[0.47005,47.35162],[0.4702,47.34713],[0.46375,47.34701],[0.45714,47.34241],[0.45729,47.33791],[0.45067,47.33781],[0.45084,47.33331],[0.44422,47.3332],[0.44438,47.32871],[0.43114,47.3285],[0.43163,47.315],[0.43824,47.31511],[0.43838,47.31062],[0.47145,47.31114],[0.47131,47.31566],[0.47789,47.31575],[0.47807,47.31128],[0.48468,47.31136],[0.48486,47.30687],[0.49144,47.30698],[0.49174,47.29797],[0.48516,47.29787],[0.48543,47.28887],[0.47885,47.28877],[0.47916,47.27978],[0.48578,47.2799],[0.48591,47.27539],[0.49254,47.2755],[0.49267,47.27101],[0.4993,47.27111],[0.49943,47.26661],[0.51927,47.26692],[0.51942,47.26242],[0.52602,47.26252],[0.52587,47.26702],[0.5457,47.26734],[0.54555,47.27183],[0.55877,47.27204],[0.55863,47.27652],[0.56523,47.27663],[0.56508,47.28112],[0.57168,47.28123],[0.57152,47.28572],[0.57814,47.28583],[0.57799,47.29033],[0.5846,47.29043],[0.58431,47.29942],[0.5975,47.29961],[0.59766,47.29514],[0.65716,47.296],[0.6573,47.29151],[0.6705,47.29172],[0.67035,47.29621],[0.68362,47.29637],[0.68343,47.30089],[0.69006,47.30096],[0.68992,47.30547],[0.7362,47.30612],[0.73608,47.31061],[0.7559,47.31089],[0.75577,47.31539],[0.76238,47.31547],[0.76223,47.31999],[0.77549,47.32015],[0.77497,47.33882],[0.77458,47.35163],[0.76804,47.35159],[0.76759,47.36053],[0.77424,47.36062],[0.77335,47.39213],[0.76674,47.39202],[0.76644,47.40108],[0.77306,47.40111],[0.77289,47.41013],[0.76618,47.41002],[0.76603,47.4145],[0.75276,47.4143],[0.75298,47.40981],[0.74624,47.4097],[0.74594,47.42322],[0.73923,47.42315],[0.73887,47.43661],[0.73233,47.43652],[0.73219,47.44106],[0.7255,47.44098],[0.72542,47.44535],[0.73188,47.44548],[0.73185,47.45011],[0.73845,47.45023],[0.73831,47.45463],[0.74494,47.45474],[0.74432,47.4772],[0.73107,47.47697],[0.7309,47.48154],[0.71762,47.48126],[0.71779,47.47684],[0.69777,47.4765],[0.69805,47.47198],[0.69145,47.47189],[0.69173,47.46302],[0.6851,47.46293],[0.68494,47.46735],[0.67826,47.46733],[0.67798,47.47622],[0.67141,47.47616],[0.67104,47.4882],[0.65773,47.48797],[0.65782,47.48504],[0.65119,47.48483],[0.65147,47.47586],[0.64482,47.47572],[0.64493,47.47126],[0.6118,47.47075],[0.61188,47.46631],[0.60528,47.46612],[0.60542,47.46166],[0.59888,47.46155],[0.59902,47.45709],[0.57249,47.45669],[0.57218,47.46565],[0.54575,47.46526]]],terms_url:"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto",terms_text:"Orthophoto Tour(s) Plus 2008"},{id:"Tours-Orthophoto-2013",name:"Tours - Orthophotos 2013",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/tours_2013/{zoom}/{x}/{y}",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[0.77512,47.32983],[0.77427,47.35617],[0.77053,47.35611],[0.77024,47.36512],[0.77398,47.36517],[0.7728,47.40148],[0.7904,47.40147],[0.78988,47.4103],[0.79117,47.41047],[0.79108,47.41942],[0.79392,47.41942],[0.79319,47.43733],[0.79834,47.43742],[0.79808,47.45544],[0.80044,47.45541],[0.80138,47.46426],[0.80074,47.46899],[0.79396,47.47331],[0.78405,47.47323],[0.78387,47.47871],[0.77606,47.47859],[0.77585,47.48204],[0.77066,47.48219],[0.77044,47.4859],[0.76096,47.49092],[0.75718,47.49092],[0.73753,47.50336],[0.7259,47.50588],[0.71113,47.50576],[0.70418,47.50408],[0.69109,47.50038],[0.69045,47.49718],[0.67757,47.49683],[0.67757,47.49353],[0.66427,47.49301],[0.6635,47.48953],[0.65088,47.48958],[0.65133,47.48032],[0.64734,47.4803],[0.64747,47.47852],[0.64474,47.47846],[0.64479,47.47575],[0.64238,47.47578],[0.64225,47.47302],[0.63835,47.47294],[0.63792,47.47131],[0.60513,47.47079],[0.60513,47.46632],[0.59852,47.46603],[0.59878,47.46156],[0.592,47.46156],[0.59226,47.45976],[0.58084,47.45971],[0.58007,47.46145],[0.57234,47.46139],[0.57222,47.46512],[0.55874,47.46489],[0.5466,47.46052],[0.53269,47.45355],[0.52677,47.45315],[0.52677,47.45152],[0.52231,47.45123],[0.52256,47.44804],[0.51977,47.44776],[0.52007,47.44247],[0.4975,47.4416],[0.49716,47.44049],[0.49355,47.44015],[0.49355,47.43573],[0.47943,47.43575],[0.46171,47.42819],[0.45643,47.42088],[0.45489,47.41229],[0.45506,47.40218],[0.46149,47.40193],[0.46167,47.39641],[0.46879,47.39602],[0.47016,47.35173],[0.45677,47.3515],[0.45729,47.34254],[0.43085,47.34196],[0.43196,47.30602],[0.47154,47.3067],[0.47257,47.28004],[0.48527,47.28004],[0.48578,47.27084],[0.49935,47.27107],[0.49917,47.26245],[0.55273,47.26304],[0.55222,47.27201],[0.56561,47.27224],[0.56526,47.28156],[0.59118,47.28156],[0.59067,47.29099],[0.66912,47.29169],[0.6832,47.29564],[0.6832,47.30077],[0.69658,47.30123],[0.69641,47.3024],[0.71006,47.30245],[0.72293,47.30589],[0.72285,47.31043],[0.74165,47.31084],[0.75426,47.31392],[0.7625,47.31815],[0.76207,47.32013],[0.76619,47.32009],[0.76956,47.32207],[0.77233,47.32508],[0.77336,47.3267],[0.77512,47.32983]]],terms_url:"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto",terms_text:"Orthophoto Tour(s)plus 2013"},{id:"trafikverket-baninfo",name:"Trafikverket Railway Network",type:"wms",template:"https://geo-baninfo.trafikverket.se/mapservice/wms.axd/BanInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Spar_Huvud_och_sidospar&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[7,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish railway network, including sidings",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat",name:"Trafikverket Road Network",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagtrafiknat,Funkvagklass,Farjeled&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB road network",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-extra",name:"Trafikverket Road Network extra",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagnummer,Vaghinder,Rastplats,Rastficka,Hallplats,Farthinder,BroTunnel,ATK_Matplats&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-navn",name:"Trafikverket Street Names",type:"tms",template:"https://mapproxy.openstreetmap.se/tiles/1.0.0/nvdb_names/EPSG3857/{zoom}/{x}/{y}.png",zoomExtent:[15,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB street names",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"US_Forest_Service_roads_overlay",name:"U.S. Forest Roads Overlay",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/glassman/cjf4qjmps0tgv2qpahj977mvz/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1IjoiZ2xhc3NtYW4iLCJhIjoiRjk3dWdwYyJ9.Tg_fMJWxygeKBgVTrZHmGA",zoomExtent:[0,20],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]],description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USForestService-overlay.png",overlay:true},{id:"US_Forest_Service_roads",name:"U.S. Forest Service roads",type:"tms",template:"https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png",zoomExtent:[0,19],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]]},{id:"Zuerich-zh_uebersichtsplan-tms",name:"Übersichtsplan Zürich",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.60231,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33679],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{id:"UkraineKyiv2014DZK",name:"Ukraine - Kyiv 2014 (DZK)",type:"tms",template:"http://map.land.gov.ua/map/ortho_kiev/{zoom}/{x}/{-y}.jpg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[30.30752,50.57184],[30.33155,50.57402],[30.37687,50.57925],[30.42288,50.58143],[30.4318,50.58579],[30.44416,50.58797],[30.45515,50.58754],[30.46545,50.58449],[30.46819,50.57751],[30.49085,50.57489],[30.51351,50.57489],[30.52519,50.57402],[30.55608,50.55221],[30.58424,50.53869],[30.5966,50.53781],[30.60896,50.5365],[30.64329,50.5352],[30.65496,50.53563],[30.65496,50.54305],[30.66045,50.54916],[30.66801,50.55439],[30.67762,50.55876],[30.68792,50.56137],[30.70783,50.55614],[30.71127,50.56356],[30.71127,50.57838],[30.72157,50.58231],[30.71882,50.58972],[30.72981,50.59103],[30.74011,50.58841],[30.76208,50.58536],[30.77306,50.58274],[30.78336,50.57795],[30.80259,50.57141],[30.81014,50.56617],[30.82182,50.55439],[30.82525,50.53956],[30.81701,50.53432],[30.79504,50.52909],[30.78474,50.52559],[30.76276,50.51992],[30.76208,50.5125],[30.75315,50.50769],[30.74354,50.50376],[30.73805,50.49721],[30.74629,50.49197],[30.75521,50.48847],[30.74835,50.48236],[30.75178,50.47537],[30.75315,50.46794],[30.74835,50.46138],[30.75178,50.45439],[30.78886,50.43646],[30.7971,50.43165],[30.80328,50.41765],[30.8225,50.40846],[30.82044,50.40102],[30.82319,50.39358],[30.81289,50.39095],[30.80122,50.39139],[30.78954,50.39314],[30.77787,50.3927],[30.77856,50.3857],[30.77169,50.38001],[30.76208,50.37519],[30.75109,50.37256],[30.73873,50.37256],[30.72775,50.37475],[30.71813,50.37957],[30.71539,50.36512],[30.71127,50.35855],[30.70577,50.35241],[30.69753,50.34716],[30.68586,50.34453],[30.65084,50.34058],[30.63848,50.34014],[30.62681,50.33795],[30.62887,50.3305],[30.64947,50.29279],[30.66663,50.28314],[30.67144,50.27656],[30.6632,50.27085],[30.65153,50.26997],[30.64535,50.27612],[30.63368,50.27787],[30.62132,50.27656],[30.61857,50.2691],[30.62956,50.25637],[30.6378,50.25154],[30.64535,50.23792],[30.64398,50.2309],[30.63917,50.22387],[30.62956,50.21992],[30.6069,50.2164],[30.59591,50.2186],[30.59042,50.23353],[30.5863,50.241],[30.57531,50.25505],[30.56501,50.25944],[30.5657,50.2669],[30.56432,50.29718],[30.56638,50.30463],[30.5657,50.31209],[30.55677,50.31691],[30.54441,50.31735],[30.52587,50.32699],[30.51489,50.3305],[30.50253,50.33182],[30.48055,50.33664],[30.47163,50.34146],[30.46957,50.34935],[30.47025,50.35679],[30.46201,50.36205],[30.4524,50.35679],[30.44004,50.35548],[30.43661,50.36512],[30.43111,50.37212],[30.43661,50.37826],[30.43455,50.3857],[30.40914,50.39883],[30.39678,50.40014],[30.3906,50.40671],[30.37069,50.41546],[30.36314,50.42159],[30.3597,50.42902],[30.3597,50.43646],[30.35696,50.44389],[30.3446,50.44477],[30.32056,50.44258],[30.29585,50.44477],[30.28349,50.44477],[30.27799,50.43864],[30.27525,50.43165],[30.26563,50.42771],[30.25396,50.42902],[30.24572,50.42377],[30.23542,50.42771],[30.2416,50.43427],[30.2416,50.44214],[30.23679,50.4487],[30.23885,50.45613],[30.24297,50.46313],[30.24915,50.46968],[30.25671,50.47493],[30.26083,50.48192],[30.26563,50.48847],[30.26907,50.49983],[30.26151,50.50595],[30.26357,50.51381],[30.26975,50.51992],[30.28898,50.52821],[30.29722,50.53345],[30.30271,50.54],[30.30203,50.54741],[30.30477,50.55483],[30.32743,50.55221],[30.33086,50.55919],[30.32262,50.56486],[30.31233,50.56835],[30.30752,50.57184]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"Ukraine-orto10000-2012",name:"Ukraine - Orthophotomaps 2012",type:"tms",template:"http://212.26.144.110/tile2/orto_10000/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[23.6193,51.65491],[24.09803,51.64047],[24.39723,51.89353],[25.19178,51.95913],[26.12263,51.92224],[26.49829,51.80933],[27.09005,51.77026],[27.62861,51.62603],[28.02422,51.59093],[28.28021,51.68172],[28.37662,51.5806],[28.82542,51.5682],[29.19111,51.64253],[29.41718,51.4399],[29.67316,51.51238],[29.82276,51.47512],[30.21837,51.50824],[30.54417,51.30709],[30.63726,51.38599],[30.51425,51.63634],[30.983,52.09005],[31.2822,52.07984],[31.48832,52.13497],[32.11,52.05531],[32.31279,52.11864],[32.43912,52.32434],[32.93114,52.28368],[33.29683,52.39337],[33.75561,52.35277],[34.35734,51.78055],[34.14457,51.76409],[34.05813,51.67965],[34.22103,51.47098],[34.25095,51.30085],[34.7197,51.19056],[35.11199,51.21139],[35.1818,51.08626],[35.38792,51.03402],[35.40787,50.62878],[35.62063,50.38563],[36.06944,50.4513],[36.21571,50.41106],[36.31212,50.28802],[36.4717,50.32624],[36.59138,50.2519],[37.46571,50.45977],[37.735,50.11353],[38.05747,49.9384],[38.19377,49.95765],[38.19045,50.07514],[38.35002,50.08154],[38.41651,49.98972],[38.73899,49.97476],[39.00827,49.83344],[39.14457,49.89987],[39.27755,49.78195],[39.54018,49.74544],[39.79949,49.58406],[40.18845,49.6013],[40.0588,49.50424],[40.20508,49.24666],[39.93247,49.06185],[39.71638,49.01608],[40.08872,48.85448],[39.79617,48.78443],[39.69311,48.65283],[39.86266,48.5693],[39.99231,48.31348],[39.83274,47.92287],[39.74297,47.83144],[39.57675,47.81135],[38.86532,47.85153],[38.77555,47.68618],[38.38327,47.60106],[38.30348,47.52704],[38.30016,47.23891],[38.13393,47.05577],[37.5455,47.05124],[37.31279,46.87654],[37.20973,46.92651],[36.96039,46.83107],[36.7443,46.61685],[36.72436,46.7719],[36.4451,46.72407],[36.10601,46.4728],[36.20574,46.66022],[35.92316,46.64424],[35.43114,46.39948],[35.10202,45.97138],[35.0455,45.75145],[35.47436,45.33],[35.86,45.53297],[35.9963,45.43274],[36.11598,45.51899],[36.66452,45.4514],[36.65454,45.34168],[36.50494,45.31363],[36.47502,45.24111],[36.48832,45.04884],[35.81013,44.98539],[35.5076,45.11222],[35.42782,44.93364],[35.12196,44.76394],[34.67649,44.75686],[33.985,44.37078],[33.68912,44.38504],[33.38327,44.50608],[33.35002,44.589],[33.55282,44.93128],[33.42981,45.1263],[33.19377,45.14271],[32.83141,45.33935],[32.60534,45.30896],[32.44577,45.3557],[32.50893,45.47005],[32.87795,45.68181],[33.57941,45.90665],[33.58938,46.02681],[33.25694,46.07065],[33.02422,45.97138],[31.61133,46.19506],[31.27555,46.61457],[30.87662,46.56887],[30.43446,45.98756],[29.69643,45.55159],[29.79284,45.46306],[29.73965,45.15913],[29.47369,45.41407],[29.18114,45.38373],[28.74896,45.22004],[28.56611,45.23409],[28.29018,45.33],[28.23367,45.49103],[28.31678,45.56789],[28.483,45.54228],[28.47303,45.73753],[28.95175,46.03143],[29.02489,46.18125],[28.9318,46.49569],[29.18779,46.57116],[29.59337,46.45448],[29.81944,46.46593],[29.95574,46.68759],[29.8959,46.8197],[29.56013,46.96963],[29.54683,47.29982],[29.14789,47.50234],[29.23101,47.77562],[29.17117,47.934],[28.86864,47.99411],[28.63593,48.16513],[28.44311,48.06525],[28.36332,48.17178],[28.25694,48.15404],[27.735,48.43494],[27.55547,48.45258],[26.92383,48.34884],[26.36532,48.17178],[26.1193,47.97408],[25.3846,47.91618],[24.91585,47.70408],[24.52024,47.94291],[24.18446,47.90058],[23.58274,48.00523],[23.43646,47.96963],[23.15388,48.10522],[23.07077,47.98743],[22.858,47.9585],[22.76824,48.09856],[22.58539,48.103],[22.51558,48.2161],[22.11332,48.4217],[22.49896,49.06621],[22.58872,49.11193],[22.87795,49.04006],[22.7217,49.18151],[22.71837,49.64652],[23.24364,50.105],[24.04484,50.49785],[24.05813,50.68779],[23.9451,50.81399],[24.10135,50.85388],[23.62928,51.29462],[23.6193,51.65491]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"uniao_dos_palmares",name:"União dos Palmares AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Uniao%20dos%20Palmares&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.97725,-9.20752],[-35.9772,-9.19398],[-35.97694,-9.19053],[-35.97678,-9.18607],[-35.97702,-9.18208],[-35.97704,-9.17968],[-35.97682,-9.17734],[-35.97664,-9.17517],[-35.97701,-9.17518],[-35.97696,-9.1707],[-35.97674,-9.17066],[-35.97661,-9.16645],[-35.97618,-9.16222],[-35.9761,-9.16026],[-35.97661,-9.16026],[-35.97672,-9.14608],[-35.97654,-9.14122],[-35.97666,-9.1332],[-35.97653,-9.12184],[-35.97648,-9.11748],[-35.98618,-9.11755],[-35.98947,-9.11733],[-36.00561,-9.11733],[-36.01859,-9.11736],[-36.04601,-9.11722],[-36.06734,-9.11698],[-36.06756,-9.16134],[-36.06771,-9.16405],[-36.06745,-9.16408],[-36.06756,-9.16657],[-36.06777,-9.16654],[-36.06798,-9.20701],[-36.0498,-9.20711],[-36.04671,-9.20698],[-36.02941,-9.20709],[-36.01355,-9.20718],[-35.99318,-9.20733],[-35.97725,-9.20752]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"URBIS2009",name:"URBIS 2009 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2009&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2012",name:"URBIS 2012 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2012&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2014",name:"URBIS 2014 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2014&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[4.4001,50.76373],[4.43093,50.77254],[4.43586,50.77237],[4.46549,50.78373],[4.48189,50.78835],[4.48269,50.79849],[4.46363,50.80686],[4.46407,50.81546],[4.48204,50.81699],[4.48103,50.82343],[4.47465,50.83505],[4.47403,50.84587],[4.46712,50.85447],[4.45257,50.85797],[4.45017,50.86151],[4.42968,50.86764],[4.43423,50.87384],[4.44147,50.87513],[4.44381,50.88004],[4.43534,50.88977],[4.43968,50.89475],[4.43287,50.90363],[4.42096,50.90917],[4.42023,50.91387],[4.38315,50.91381],[4.37879,50.90637],[4.37334,50.90289],[4.36241,50.906],[4.34824,50.90611],[4.33955,50.90685],[4.32771,50.90515],[4.31471,50.89842],[4.30413,50.89498],[4.2871,50.89192],[4.28725,50.88532],[4.29293,50.88265],[4.27948,50.8736],[4.27347,50.86822],[4.27364,50.85871],[4.27688,50.85575],[4.27644,50.84376],[4.26664,50.8405],[4.25488,50.83992],[4.24755,50.83453],[4.24799,50.82866],[4.24357,50.82599],[4.24376,50.81356],[4.25233,50.81268],[4.25649,50.80711],[4.27025,50.8073],[4.27222,50.80537],[4.28414,50.80241],[4.28885,50.80434],[4.29544,50.8043],[4.30046,50.79506],[4.31076,50.79299],[4.31444,50.78372],[4.32628,50.77221],[4.34194,50.76891],[4.34474,50.77029],[4.37535,50.76577],[4.3755,50.76381],[4.4001,50.76373]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2015",name:"URBIS 2015 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2015&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2016",name:"UrbIS-Ortho 2016",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2016&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2017",name:"UrbIS-Ortho 2017",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2017&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbisAdmFR",name:"UrbisAdm FR",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisFR&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbisAdmNL",name:"UrbisAdm NL",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisNL&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISfr2013",name:"URBISfr numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisFR/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISnl2013",name:"URBISnl numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisNL/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"USGS-Large_Scale",name:"USGS Large Scale Imagery",type:"tms",template:"http://{switch:a,b,c}.tile.openstreetmap.us/usgs_large_scale/{zoom}/{x}/{y}.jpg",zoomExtent:[12,20],polygon:[[[-123.25493,48.7529],[-123.25493,48.55923],[-123.19222,48.55923],[-123.19222,48.43484],[-122.94196,48.43484],[-122.94196,48.37208],[-122.88062,48.37208],[-122.88062,48.30948],[-122.81676,48.30948],[-122.81676,48.19046],[-123.00411,48.19046],[-123.00411,48.12759],[-123.05842,48.12759],[-123.05842,48.19051],[-123.25411,48.19051],[-123.25411,48.1275],[-123.37066,48.1275],[-123.37066,48.19084],[-124.05826,48.19084],[-124.05826,48.25344],[-124.18152,48.25344],[-124.18152,48.31647],[-124.43191,48.31647],[-124.43191,48.37826],[-124.55646,48.37826],[-124.55646,48.44083],[-124.75551,48.44083],[-124.75551,48.1915],[-124.81853,48.1915],[-124.81853,48.12284],[-124.7553,48.12284],[-124.7553,47.55353],[-124.38121,47.55353],[-124.38121,47.12187],[-124.19289,47.12187],[-124.19289,43.75694],[-124.44434,43.75694],[-124.44434,43.14256],[-124.63989,43.14256],[-124.63989,42.61945],[-124.44385,42.61945],[-124.44385,39.80807],[-123.88157,39.80807],[-123.88157,39.11028],[-123.75805,39.11028],[-123.75805,38.49688],[-123.27028,38.49688],[-123.27028,37.93319],[-122.81481,37.93319],[-122.81481,37.80196],[-122.56643,37.80196],[-122.56643,36.93196],[-121.8784,36.93196],[-121.8784,36.68976],[-122.00347,36.68976],[-122.00347,36.43411],[-121.94142,36.43411],[-121.94142,35.92976],[-121.5041,35.92976],[-121.5041,35.81003],[-121.37903,35.81003],[-121.37903,35.42392],[-120.94265,35.42392],[-120.94265,35.18497],[-120.8172,35.18497],[-120.8172,35.12199],[-120.69184,35.12199],[-120.69184,34.49668],[-120.50459,34.49668],[-120.50459,34.43397],[-120.00788,34.43397],[-120.00788,34.36826],[-119.52835,34.36826],[-119.52835,34.05764],[-119.0061,34.05764],[-119.0061,33.99753],[-118.50463,33.99753],[-118.50463,33.86946],[-118.44132,33.86946],[-118.44132,33.68653],[-118.06691,33.68653],[-118.06691,33.30638],[-117.503,33.30638],[-117.503,33.05003],[-117.31882,33.05003],[-117.31882,32.62059],[-117.1917,32.62059],[-117.1917,32.49746],[-116.7465,32.49746],[-116.7465,32.56092],[-115.99701,32.56092],[-115.99701,32.62649],[-114.88081,32.62649],[-114.88081,32.43408],[-114.62945,32.43408],[-114.62945,32.37316],[-114.44474,32.37316],[-114.44474,32.30754],[-114.25576,32.30754],[-114.25576,32.24446],[-114.06803,32.24446],[-114.06803,32.18291],[-113.81665,32.18291],[-113.81665,32.12076],[-113.63074,32.12076],[-113.63074,32.05651],[-113.44175,32.05651],[-113.44175,31.99844],[-113.2546,31.99844],[-113.2546,31.93254],[-113.06807,31.93254],[-113.06807,31.87181],[-112.81611,31.87181],[-112.81611,31.81042],[-112.63088,31.81042],[-112.63088,31.74647],[-112.44189,31.74647],[-112.44189,31.6856],[-112.25719,31.6856],[-112.25719,31.62104],[-112.00338,31.62104],[-112.00338,31.55958],[-111.81562,31.55958],[-111.81562,31.49702],[-111.62786,31.49702],[-111.62786,31.43399],[-111.4419,31.43399],[-111.4419,31.37339],[-111.25597,31.37339],[-111.25597,31.31132],[-108.18458,31.31132],[-108.18458,31.74595],[-106.50651,31.74595],[-106.50651,31.68423],[-106.37973,31.68423],[-106.37973,31.62175],[-106.31743,31.62175],[-106.31743,31.49682],[-106.25518,31.49682],[-106.25518,31.43449],[-106.19247,31.43449],[-106.19247,31.37213],[-106.00392,31.37213],[-106.00392,31.30933],[-105.94166,31.30933],[-105.94166,31.24575],[-105.87982,31.24575],[-105.87982,31.18362],[-105.81623,31.18362],[-105.81623,31.12072],[-105.69212,31.12072],[-105.69212,31.05848],[-105.63029,31.05848],[-105.63029,30.93283],[-105.50444,30.93283],[-105.50444,30.87159],[-105.4413,30.87159],[-105.4413,30.80846],[-105.37815,30.80846],[-105.37815,30.74718],[-105.19047,30.74718],[-105.19047,30.68432],[-105.12862,30.68432],[-105.12862,30.61997],[-105.00365,30.61997],[-105.00365,30.55891],[-104.9418,30.55891],[-104.9418,30.49632],[-104.8782,30.49632],[-104.8782,30.30983],[-104.81553,30.30983],[-104.81553,30.24783],[-104.75361,30.24783],[-104.75361,29.93539],[-104.69095,29.93539],[-104.69095,29.80902],[-104.62913,29.80902],[-104.62913,29.68436],[-104.56599,29.68436],[-104.56599,29.62235],[-104.50372,29.62235],[-104.50372,29.55954],[-104.44101,29.55954],[-104.44101,29.49748],[-104.25376,29.49748],[-104.25376,29.37167],[-104.1292,29.37167],[-104.1292,29.30916],[-104.06887,29.30916],[-104.06887,29.24673],[-103.81873,29.24673],[-103.81873,29.18431],[-103.75574,29.18431],[-103.75574,29.12232],[-103.56675,29.12232],[-103.56675,29.05981],[-103.50498,29.05981],[-103.50498,28.99675],[-103.31658,28.99675],[-103.31658,28.93469],[-103.05976,28.93469],[-103.05976,29.0593],[-102.99797,29.0593],[-102.99797,29.12129],[-102.93314,29.12129],[-102.93314,29.18486],[-102.8096,29.18486],[-102.8096,29.25262],[-102.87013,29.25262],[-102.87013,29.3081],[-102.80967,29.3081],[-102.80967,29.37155],[-102.74757,29.37155],[-102.74757,29.55819],[-102.68455,29.55819],[-102.68455,29.68477],[-102.49678,29.68477],[-102.49678,29.74577],[-102.30866,29.74577],[-102.30866,29.80866],[-102.19093,29.80866],[-102.19093,29.74601],[-101.50499,29.74601],[-101.50499,29.68468],[-101.38058,29.68468],[-101.38058,29.55945],[-101.31751,29.55945],[-101.31751,29.49589],[-101.19101,29.49589],[-101.19101,29.43261],[-101.0675,29.43261],[-101.0675,29.30881],[-100.94189,29.30881],[-100.94189,29.24562],[-100.81673,29.24562],[-100.81673,29.11904],[-100.75227,29.11904],[-100.75227,29.05782],[-100.69254,29.05782],[-100.69254,28.87204],[-100.62902,28.87204],[-100.62902,28.80954],[-100.56799,28.80954],[-100.56799,28.62255],[-100.50404,28.62255],[-100.50404,28.55838],[-100.44218,28.55838],[-100.44218,28.49683],[-100.37943,28.49683],[-100.37943,28.30929],[-100.31719,28.30929],[-100.31719,28.18357],[-100.25448,28.18357],[-100.25448,28.12139],[-100.12823,28.12139],[-100.12823,28.05921],[-100.06595,28.05921],[-100.06595,27.99661],[-100.00239,27.99661],[-100.00239,27.93322],[-99.94265,27.93322],[-99.94265,27.74547],[-99.81685,27.74547],[-99.81685,27.68343],[-99.75413,27.68343],[-99.75413,27.62215],[-99.62916,27.62215],[-99.62916,27.5589],[-99.56728,27.5589],[-99.56728,27.43538],[-99.50418,27.43538],[-99.50418,27.3774],[-99.56718,27.3774],[-99.56718,27.24637],[-99.50498,27.24637],[-99.50498,26.99656],[-99.44274,26.99656],[-99.44274,26.8728],[-99.38006,26.8728],[-99.38006,26.80682],[-99.31907,26.80682],[-99.31907,26.74736],[-99.25375,26.74736],[-99.25375,26.62101],[-99.19106,26.62101],[-99.19106,26.49567],[-99.13006,26.49567],[-99.13006,26.37138],[-99.00295,26.37138],[-99.00295,26.30938],[-98.81657,26.30938],[-98.81657,26.24578],[-98.69201,26.24578],[-98.69201,26.18371],[-98.44409,26.18371],[-98.44409,26.12172],[-98.38232,26.12172],[-98.38232,26.05965],[-98.25327,26.05965],[-98.25327,25.99869],[-98.01091,25.99869],[-98.01091,25.99323],[-97.69323,25.99323],[-97.69323,25.93341],[-97.63139,25.93341],[-97.63139,25.86959],[-97.50468,25.86959],[-97.50468,25.80735],[-97.30834,25.80735],[-97.30834,25.87312],[-97.24563,25.87312],[-97.24563,25.93537],[-97.11389,25.93537],[-97.11389,27.68092],[-97.0571,27.68092],[-97.0571,27.81082],[-95.58108,27.81082],[-95.58108,28.74688],[-94.27104,28.74688],[-94.27104,29.55941],[-92.50299,29.55941],[-92.50299,29.49748],[-91.87762,29.49748],[-91.87762,29.3727],[-91.37842,29.3727],[-91.37842,29.24683],[-91.3154,29.24683],[-91.3154,29.18443],[-91.12947,29.18443],[-91.12947,29.12326],[-91.00526,29.12326],[-91.00526,28.99684],[-89.45002,28.99684],[-89.45002,28.86774],[-88.81043,28.86774],[-88.81043,30.18419],[-85.87915,30.18419],[-85.87915,29.5455],[-84.83681,29.5455],[-84.83681,29.62252],[-84.74828,29.62252],[-84.74828,29.68362],[-84.68589,29.68362],[-84.68589,29.74684],[-83.6297,29.74684],[-83.6297,29.43244],[-83.31749,29.43244],[-83.31749,29.05794],[-82.87966,29.05794],[-82.87966,27.74535],[-82.81828,27.74535],[-82.81828,26.92909],[-82.37968,26.92909],[-82.37968,26.36942],[-81.87771,26.36942],[-81.87771,25.80597],[-81.50369,25.80597],[-81.50369,25.74748],[-81.44055,25.74748],[-81.44055,25.68515],[-81.31559,25.68515],[-81.31559,25.5601],[-81.25385,25.5601],[-81.25385,25.43424],[-81.1902,25.43424],[-81.1902,25.12343],[-81.12881,25.12343],[-81.12881,25.06194],[-81.06492,25.06194],[-81.06492,24.81578],[-81.62895,24.81578],[-81.62895,24.75384],[-81.69072,24.75384],[-81.69072,24.68994],[-81.81732,24.68994],[-81.81732,24.62792],[-82.191,24.62792],[-82.191,24.49629],[-81.62166,24.49629],[-81.62166,24.55948],[-81.37201,24.55948],[-81.37201,24.62207],[-81.05933,24.62207],[-81.05933,24.68483],[-80.93471,24.68483],[-80.93471,24.74748],[-80.74711,24.74748],[-80.74711,24.81006],[-80.36299,24.81006],[-80.36299,25.11759],[-80.12234,25.11759],[-80.12234,25.74724],[-80.05885,25.74724],[-80.05885,26.37083],[-79.99584,26.37083],[-79.99584,26.9398],[-80.05873,26.9398],[-80.05873,27.12775],[-80.12263,27.12775],[-80.12263,27.25343],[-80.1847,27.25343],[-80.1847,27.37812],[-80.24617,27.37812],[-80.24617,27.56587],[-80.30948,27.56587],[-80.30948,27.75303],[-80.37215,27.75303],[-80.37215,27.87745],[-80.43515,27.87745],[-80.43515,28.00334],[-80.49661,28.00334],[-80.49661,28.12773],[-80.55872,28.12773],[-80.55872,28.37235],[-80.49663,28.37235],[-80.49663,29.51603],[-81.12136,29.51603],[-81.12136,31.6847],[-80.60187,31.6847],[-80.60187,32.24753],[-79.4921,32.24753],[-79.4921,32.99703],[-79.11165,32.99703],[-79.11165,33.37295],[-78.61536,33.37295],[-78.61536,33.80976],[-77.9317,33.80976],[-77.9317,33.87182],[-77.86923,33.87182],[-77.86923,34.05525],[-77.68264,34.05525],[-77.68264,34.29746],[-77.24535,34.29746],[-77.24535,34.55986],[-76.49733,34.55986],[-76.49733,34.6228],[-76.43376,34.6228],[-76.43376,34.68493],[-76.37321,34.68493],[-76.37321,34.74677],[-76.30594,34.74677],[-76.30594,34.80855],[-76.2468,34.80855],[-76.2468,34.87284],[-76.18259,34.87284],[-76.18259,34.93353],[-76.12081,34.93353],[-76.12081,34.99524],[-75.9979,34.99524],[-75.9979,35.05782],[-75.87034,35.05782],[-75.87034,35.12191],[-75.74622,35.12191],[-75.74622,35.18189],[-75.49297,35.18189],[-75.49297,35.3083],[-75.43257,35.3083],[-75.43257,35.75425],[-75.49699,35.75425],[-75.49699,37.81056],[-75.3083,37.81056],[-75.3083,37.87201],[-75.2456,37.87201],[-75.2456,37.99548],[-75.18288,37.99548],[-75.18288,38.05851],[-75.11848,38.05851],[-75.11848,38.24691],[-75.05921,38.24691],[-75.05921,38.37043],[-74.99481,38.37043],[-74.99481,38.87184],[-74.48783,38.87184],[-74.48783,39.30894],[-74.17663,39.30894],[-74.17663,39.62247],[-74.0567,39.62247],[-74.0567,39.93318],[-73.9959,39.93318],[-73.9959,40.18549],[-73.93416,40.18549],[-73.93416,40.49595],[-73.8723,40.49595],[-73.8723,40.55271],[-71.80745,40.55271],[-71.80745,41.3088],[-70.88251,41.3088],[-70.88251,41.18498],[-70.74619,41.18498],[-70.74619,41.30919],[-70.43376,41.30919],[-70.43376,41.49639],[-69.93343,41.49639],[-69.93343,41.62308],[-69.86986,41.62308],[-69.86986,41.87769],[-69.93579,41.87769],[-69.93579,42.00323],[-69.99758,42.00323],[-69.99758,42.06502],[-70.06061,42.06502],[-70.06061,42.12943],[-70.55729,42.12943],[-70.55729,43.24871],[-70.49741,43.24871],[-70.49741,43.30922],[-70.37042,43.30922],[-70.37042,43.37196],[-70.30857,43.37196],[-70.30857,43.49699],[-70.18392,43.49699],[-70.18392,43.62235],[-70.05758,43.62235],[-70.05758,43.68502],[-69.74552,43.68502],[-69.74552,43.74766],[-69.24728,43.74766],[-69.24728,43.8107],[-69.05607,43.8107],[-69.05607,43.87172],[-68.99505,43.87172],[-68.99505,43.9982],[-68.49637,43.9982],[-68.49637,44.05974],[-68.3081,44.05974],[-68.3081,44.12214],[-68.18518,44.12214],[-68.18518,44.30814],[-67.9956,44.30814],[-67.9956,44.37275],[-67.8103,44.37275],[-67.8103,44.43518],[-67.49653,44.43518],[-67.49653,44.49688],[-67.37102,44.49688],[-67.37102,44.56006],[-67.18488,44.56006],[-67.18488,44.62133],[-67.12212,44.62133],[-67.12212,44.68679],[-67.05936,44.68679],[-67.05936,44.74737],[-66.93111,44.74737],[-66.93111,44.94066],[-66.99468,44.94066],[-66.99468,45.00245],[-67.05958,45.00245],[-67.05958,45.12734],[-67.1202,45.12734],[-67.1202,45.19101],[-67.24698,45.19101],[-67.24698,45.25344],[-67.31775,45.25344],[-67.31775,45.18984],[-67.37075,45.18984],[-67.37075,45.2534],[-67.43269,45.2534],[-67.43269,45.30834],[-67.37086,45.30834],[-67.37086,45.4397],[-67.43056,45.4397],[-67.43056,45.49501],[-67.37099,45.49501],[-67.37099,45.62645],[-67.6215,45.62645],[-67.6215,45.68961],[-67.68383,45.68961],[-67.68383,45.75326],[-67.74621,45.75326],[-67.74621,47.12682],[-67.87001,47.12682],[-67.87001,47.19003],[-67.93238,47.19003],[-67.93238,47.25397],[-67.99594,47.25397],[-67.99594,47.31497],[-68.12067,47.31497],[-68.12067,47.37808],[-68.44232,47.37808],[-68.44232,47.31661],[-68.63143,47.31661],[-68.63143,47.25447],[-68.9978,47.25447],[-68.9978,47.43989],[-69.06072,47.43989],[-69.06072,47.50476],[-69.25381,47.50476],[-69.25381,47.43981],[-69.31793,47.43981],[-69.31793,47.3786],[-69.44385,47.3786],[-69.44385,47.31563],[-69.50382,47.31563],[-69.50382,47.25258],[-69.56678,47.25258],[-69.56678,47.19109],[-69.63035,47.19109],[-69.63035,47.1287],[-69.69331,47.1287],[-69.69331,47.06543],[-69.75571,47.06543],[-69.75571,47.00428],[-69.81804,47.00428],[-69.81804,46.94153],[-69.8804,46.94153],[-69.8804,46.87925],[-69.94217,46.87925],[-69.94217,46.81774],[-70.00631,46.81774],[-70.00631,46.69203],[-70.07043,46.69203],[-70.07043,46.44259],[-70.19459,46.44259],[-70.19459,46.37859],[-70.2562,46.37859],[-70.2562,46.31526],[-70.32037,46.31526],[-70.32037,46.06512],[-70.3815,46.06512],[-70.3815,45.93552],[-70.32016,45.93552],[-70.32016,45.87948],[-70.44931,45.87948],[-70.44931,45.75387],[-70.507,45.75387],[-70.507,45.69169],[-70.63166,45.69169],[-70.63166,45.62916],[-70.75755,45.62916],[-70.75755,45.44147],[-70.88099,45.44147],[-70.88099,45.37806],[-71.13328,45.37806],[-71.13328,45.31515],[-71.38303,45.31515],[-71.38303,45.25342],[-71.50764,45.25342],[-71.50764,45.06557],[-73.94189,45.06557],[-73.94189,45.00312],[-74.74697,45.00312],[-74.74697,45.0649],[-74.8801,45.0649],[-74.8801,45.0029],[-75.06625,45.0029],[-75.06625,44.94152],[-75.25394,44.94152],[-75.25394,44.8776],[-75.37896,44.8776],[-75.37896,44.81535],[-75.44313,44.81535],[-75.44313,44.75361],[-75.56666,44.75361],[-75.56666,44.69099],[-75.62902,44.69099],[-75.62902,44.6285],[-75.75405,44.6285],[-75.75405,44.56638],[-75.81731,44.56638],[-75.81731,44.50289],[-75.87995,44.50289],[-75.87995,44.37849],[-76.13003,44.37849],[-76.13003,44.31592],[-76.1927,44.31592],[-76.1927,44.25344],[-76.31826,44.25344],[-76.31826,44.19167],[-76.3793,44.19167],[-76.3793,44.06537],[-76.44276,44.06537],[-76.44276,43.99638],[-76.31703,43.99638],[-76.31703,43.94146],[-76.50766,43.94146],[-76.50766,43.87233],[-76.383,43.87233],[-76.383,43.80919],[-76.25341,43.80919],[-76.25341,43.56652],[-76.50648,43.56652],[-76.50648,43.50339],[-76.63312,43.50339],[-76.63312,43.44323],[-76.69511,43.44323],[-76.69511,43.37869],[-76.81778,43.37869],[-76.81778,43.31807],[-77.682,43.31807],[-77.682,43.37894],[-78.05659,43.37894],[-78.05659,43.43969],[-78.43897,43.43969],[-78.43897,43.37944],[-78.88034,43.37944],[-78.88034,43.31497],[-79.12989,43.31497],[-79.12989,43.24293],[-79.06696,43.24293],[-79.06696,43.12999],[-79.12989,43.12999],[-79.12989,43.05773],[-79.07126,43.05773],[-79.07126,42.92949],[-78.94326,42.92949],[-78.94326,42.75422],[-79.06944,42.75422],[-79.06944,42.69416],[-79.13344,42.69416],[-79.13344,42.6297],[-79.19475,42.6297],[-79.19475,42.56635],[-79.37868,42.56635],[-79.37868,42.50334],[-79.4443,42.50334],[-79.4443,42.44106],[-79.56799,42.44106],[-79.56799,42.37753],[-79.69062,42.37753],[-79.69062,42.31711],[-79.81646,42.31711],[-79.81646,42.25345],[-80.00524,42.25345],[-80.00524,42.19092],[-80.19168,42.19092],[-80.19168,42.12726],[-80.3168,42.12726],[-80.3168,42.06699],[-80.50632,42.06699],[-80.50632,42.00343],[-80.69305,42.00343],[-80.69305,41.94151],[-80.94404,41.94151],[-80.94404,41.87812],[-81.19427,41.87812],[-81.19427,41.81665],[-81.31901,41.81665],[-81.31901,41.75455],[-81.44184,41.75455],[-81.44184,41.69096],[-81.50535,41.69096],[-81.50535,41.63016],[-82.74701,41.63016],[-82.74701,41.75369],[-82.88391,41.75369],[-82.88391,41.56561],[-82.99572,41.56561],[-82.99572,41.62704],[-83.12578,41.62704],[-83.12578,41.68784],[-83.24747,41.68784],[-83.24747,41.75369],[-83.37373,41.75369],[-83.37373,41.80928],[-83.3106,41.80928],[-83.3106,41.87161],[-83.24747,41.87161],[-83.24747,41.93614],[-83.18434,41.93614],[-83.18434,41.99609],[-83.12077,41.99609],[-83.12077,42.24648],[-83.05892,42.24648],[-83.05892,42.30896],[-82.86853,42.30896],[-82.86853,42.37177],[-82.80722,42.37177],[-82.80722,42.55855],[-82.75537,42.55855],[-82.75537,42.49549],[-82.5599,42.49549],[-82.5599,42.55855],[-82.49678,42.55855],[-82.49678,42.68336],[-82.43289,42.68336],[-82.43289,42.93422],[-82.37006,42.93422],[-82.37006,43.06481],[-82.43289,43.06481],[-82.43289,43.19176],[-82.49475,43.19176],[-82.49475,43.50346],[-82.55713,43.50346],[-82.55713,43.81609],[-82.61979,43.81609],[-82.61979,43.94221],[-82.68395,43.94221],[-82.68395,44.00226],[-82.74653,44.00226],[-82.74653,44.06705],[-82.87087,44.06705],[-82.87087,44.12919],[-83.00852,44.12919],[-83.00852,44.06648],[-83.13361,44.06648],[-83.13361,44.00539],[-83.24145,44.00539],[-83.24145,44.9962],[-83.18061,44.9962],[-83.18061,45.0673],[-83.24552,45.0673],[-83.24552,45.12874],[-83.30659,45.12874],[-83.30659,45.25515],[-83.37061,45.25515],[-83.37061,45.31659],[-83.43256,45.31659],[-83.43256,45.37921],[-83.61784,45.37921],[-83.61784,45.44197],[-83.80843,45.44197],[-83.80843,45.50362],[-84.05507,45.50362],[-84.05507,45.56479],[-84.12352,45.56479],[-84.12352,45.62878],[-84.18075,45.62878],[-84.18075,45.69147],[-84.31116,45.69147],[-84.31116,45.93371],[-83.821,45.93371],[-83.821,45.87251],[-83.49681,45.87251],[-83.49681,45.93371],[-83.43381,45.93371],[-83.43381,46.00169],[-83.49627,46.00169],[-83.49627,46.06682],[-83.56,46.06682],[-83.56,46.12616],[-83.99546,46.12616],[-83.99546,46.19317],[-84.05918,46.19317],[-84.05918,46.3815],[-84.11526,46.3815],[-84.11526,46.49536],[-84.05918,46.49536],[-84.05918,46.56827],[-84.25795,46.56827],[-84.25795,46.50512],[-84.30719,46.50512],[-84.30719,46.56827],[-84.44154,46.56827],[-84.44154,46.50453],[-84.99657,46.50453],[-84.99657,46.68429],[-84.92982,46.68429],[-84.92982,46.81808],[-85.31659,46.81808],[-85.31659,46.75358],[-87.55626,46.75358],[-87.55626,47.44074],[-87.68254,47.44074],[-87.68254,47.50356],[-88.25607,47.50356],[-88.25607,47.44337],[-88.44174,47.44337],[-88.44174,47.37899],[-88.50683,47.37899],[-88.50683,47.31539],[-88.63128,47.31539],[-88.63128,47.25398],[-88.75696,47.25398],[-88.75696,47.19347],[-88.88383,47.19347],[-88.88383,47.12847],[-88.94342,47.12847],[-88.94342,47.06621],[-89.07087,47.06621],[-89.07087,47.00268],[-89.25656,47.00268],[-89.25656,46.94108],[-90.36777,46.94108],[-90.36777,47.68448],[-90.307,47.68448],[-90.307,47.74602],[-89.99486,47.74602],[-89.99486,47.80827],[-89.80486,47.80827],[-89.80486,47.87006],[-89.67977,47.87006],[-89.67977,47.93396],[-89.49338,47.93396],[-89.49338,47.9958],[-89.42847,47.9958],[-89.42847,48.06564],[-89.99327,48.06564],[-89.99327,48.1283],[-90.74559,48.1283],[-90.74559,48.18931],[-90.80873,48.18931],[-90.80873,48.25221],[-91.06776,48.25221],[-91.06776,48.19167],[-91.19462,48.19167],[-91.19462,48.1279],[-91.68142,48.1279],[-91.68142,48.2526],[-91.93219,48.2526],[-91.93219,48.31425],[-91.99297,48.31425],[-91.99297,48.37808],[-92.31894,48.37808],[-92.31894,48.25291],[-92.37322,48.25291],[-92.37322,48.31534],[-92.43223,48.31534],[-92.43223,48.44114],[-92.49772,48.44114],[-92.49772,48.50178],[-92.56794,48.50178],[-92.56794,48.43958],[-92.62105,48.43958],[-92.62105,48.56508],[-92.80868,48.56508],[-92.80868,48.62869],[-92.80868,48.62674],[-92.93318,48.62674],[-92.93318,48.69221],[-93.00517,48.69221],[-93.00517,48.6283],[-93.12259,48.6283],[-93.12259,48.69221],[-93.31908,48.69221],[-93.31908,48.62674],[-93.50495,48.62674],[-93.50495,48.56352],[-93.74746,48.56352],[-93.74746,48.62674],[-93.81355,48.62674],[-93.81355,48.68988],[-94.24531,48.68988],[-94.24531,48.75543],[-94.61832,48.75543],[-94.61832,48.94104],[-94.6809,48.94104],[-94.6809,49.00297],[-94.74415,49.00297],[-94.74415,49.25361],[-94.80841,49.25361],[-94.80841,49.37841],[-95.11924,49.37841],[-95.11924,49.44253],[-95.19343,49.44253],[-95.19343,49.00353],[-96.87069,49.00353],[-96.87069,49.06561],[-99.00493,49.06561],[-99.00493,49.00507],[-109.36993,49.00507],[-109.36993,49.06682],[-109.50587,49.06682],[-109.50587,49.00507],[-114.183,49.00507],[-114.183,49.06873],[-114.75787,49.06873],[-114.75787,49.00507],[-115.43373,49.00507],[-115.43373,49.06714],[-116.50627,49.06714],[-116.50627,49.00507],[-117.30895,49.00507],[-117.30895,49.06598],[-119.88295,49.06598],[-119.88295,49.00507],[-120.12086,49.00507],[-120.12086,49.06784],[-121.44516,49.06784],[-121.44516,49.00507],[-121.93118,49.00507],[-121.93118,49.06561],[-122.81748,49.06561],[-122.81748,49.00291],[-122.87952,49.00291],[-122.87952,48.9347],[-122.81746,48.9347],[-122.81746,48.8102],[-122.75389,48.8102],[-122.75389,48.75338],[-122.87129,48.75338],[-122.87129,48.81539],[-123.00554,48.81539],[-123.00554,48.75295],[-123.12969,48.75295],[-123.12969,48.69022],[-123.18382,48.69022],[-123.18382,48.7529],[-123.25493,48.7529]],[[-122.93417,37.75215],[-122.93475,37.6842],[-123.0679,37.6849],[-123.06737,37.74753],[-123.12926,37.74785],[-123.12869,37.81569],[-123.05907,37.81532],[-123.05959,37.75281],[-122.93417,37.75215]],[[-71.62995,41.25409],[-71.49665,41.25414],[-71.49656,41.12297],[-71.62986,41.12291],[-71.62995,41.25409]],[[-70.31843,41.37752],[-70.31834,41.24482],[-70.19066,41.24487],[-70.19062,41.1886],[-69.9336,41.1887],[-69.93373,41.37919],[-69.99507,41.37917],[-69.99511,41.44316],[-70.07078,41.44313],[-70.0707,41.31449],[-70.24617,41.31443],[-70.24621,41.37755],[-70.31843,41.37752]],[[-68.94034,43.94041],[-68.68569,43.9405],[-68.68565,43.87218],[-68.74654,43.87216],[-68.7465,43.81025],[-68.80908,43.81023],[-68.80903,43.74673],[-68.87731,43.7467],[-68.87735,43.81178],[-68.94025,43.81176],[-68.94034,43.94041]],[[-123.12915,49.06451],[-122.99542,49.06451],[-122.99542,48.93432],[-123.12915,48.93432],[-123.12915,49.06451]],[[-82.94071,24.75359],[-82.87194,24.75359],[-82.87194,24.69057],[-82.74462,24.69057],[-82.74462,24.62146],[-82.8088,24.62146],[-82.8088,24.55949],[-82.94071,24.55949],[-82.94071,24.75359]]],icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{id:"USGS-Scanned_Topographic",name:"USGS Topographic Maps",type:"tms",template:"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png",zoomExtent:[0,16],polygon:[[[-55.99594,52.00107],[-112.02896,52.00107],[-112.03995,56.01308],[-120.00494,56.00592],[-120.01712,60.01202],[-132.00197,60.00239],[-132.01208,63.00193],[-133.96883,63.0005],[-133.9724,63.99225],[-141.04429,63.98726],[-141.06879,69.92046],[-156.24893,71.51583],[-160.44571,70.83527],[-167.08145,68.42906],[-164.08218,67.03914],[-169.01504,65.68269],[-166.57608,64.50778],[-161.82999,64.05006],[-165.08194,63.2603],[-168.02628,59.78623],[-162.53311,59.73089],[-162.35733,58.55905],[-157.83096,58.31753],[-158.00674,57.52404],[-168.22403,53.51022],[-166.55411,53.14277],[-158.77579,54.88541],[-158.6824,55.74964],[-156.55106,56.00848],[-156.15555,56.77466],[-154.70535,56.14337],[-152.07413,57.37035],[-151.62918,58.22653],[-152.00821,58.98056],[-145.9877,60.24741],[-140.38467,59.48634],[-136.53946,57.8061],[-133.79288,54.83483],[-133.33145,53.14277],[-131.46378,51.69838],[-128.52493,51.74602],[-129.79385,50.90159],[-124.56436,47.49786],[-124.03702,45.48627],[-124.6962,42.90428],[-124.49844,40.34146],[-122.80655,37.53929],[-119.99405,33.37085],[-117.24747,32.5412],[-111.13907,31.1977],[-106.70059,31.23529],[-103.20694,28.64618],[-101.84463,29.8158],[-99.20792,26.28744],[-96.79092,25.75432],[-96.92276,27.96911],[-93.47305,29.68226],[-88.94669,28.87732],[-88.6171,30.17736],[-86.2001,30.36713],[-84.96963,29.43379],[-84.09073,30.06333],[-82.97012,28.95426],[-82.97012,27.26824],[-81.25626,25.07956],[-82.09122,24.56105],[-80.06973,24.76073],[-79.85001,27.11188],[-81.27823,30.70777],[-78.99307,33.20554],[-75.03799,35.5983],[-75.85098,37.24252],[-73.74161,40.4586],[-69.89639,41.60224],[-70.68741,43.17629],[-66.93008,44.69516],[-66.53458,43.08007],[-64.20547,43.35229],[-59.50333,45.73221],[-59.51431,46.24762],[-60.0032,46.25901],[-59.99222,47.24506],[-59.00894,47.2376],[-58.99796,47.50267],[-56.51504,47.50267],[-56.52603,46.7477],[-53.99918,46.7477],[-53.9772,46.48358],[-52.49405,46.46354],[-52.50504,48.75361],[-52.99667,48.75451],[-53.01315,49.99551],[-55.00168,50.0061],[-55.03738,53.74721],[-56.00418,53.73421],[-55.99594,52.00107]],[[-59.50127,43.74954],[-60.5024,43.74954],[-60.5024,44],[-59.9984,44],[-59.9984,44.2494],[-59.50127,44.2494],[-59.50127,43.74954]],[[-155.95024,20.49523],[-157.32675,20.49153],[-157.32903,21.23181],[-155.95251,21.23549],[-155.95024,20.49523]],[[-157.64488,21.24845],[-158.28534,21.24674],[-158.2869,21.74996],[-157.64643,21.75167],[-157.64488,21.24845]],[[-156.12602,20.3247],[-154.74617,20.32841],[-154.74174,18.87578],[-156.1216,18.87203],[-156.12602,20.3247]],[[-159.29077,22.24504],[-159.2893,21.76857],[-160.28917,21.76591],[-160.29064,22.24239],[-159.29077,22.24504]]],terms_url:"https://caltopo.com",terms_text:"© Caltopo",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{id:"USSR-Latvia",name:"USSR - Latvia",type:"wms",template:"http://www.gisnet.lv/cgi-bin/topo?FORMAT=image/jpeg&VERSION=1.1.1&service=WMS&REQUEST=GetMap&LAYERS=DTO,DTC,DIVDPTC,PD,VS,DS,PS,M&SRS={proj}&WIDTH={width}&height={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[26.63086,57.56889],[25.16968,58.04882],[22.54395,57.76866],[21.54419,57.53352],[21.01685,56.81892],[21.01685,56.03523],[22.03857,56.38958],[24.71924,56.33481],[26.75171,55.66519],[28.19092,56.13943],[27.78442,57.40946],[26.63086,57.56889]]]},{id:"sjcgis.org-General_Basemap_WM",name:"Vector Streetmap for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,19],polygon:[[[-123.27402,48.69297],[-123.00773,48.76726],[-123.00762,48.83158],[-122.7835,48.75842],[-122.6934,48.65852],[-122.76745,48.60361],[-122.74484,48.38708],[-123.24822,48.28353],[-123.11452,48.42261],[-123.21904,48.54857],[-123.27402,48.69297]]],best:true,description:"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{id:"Vercors-Orthophotos-1999",name:"Vercors (Réserve naturelle des Hauts-Plateaux du Vercors) - Orthophoto - 1999 - 1 m",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/PNRVercors-RHP-1999/{zoom}/{x}/{y}",endDate:"1999-01-01T00:00:00.000Z",startDate:"1999-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[5.43565,44.99918],[5.43193,44.9229],[5.43624,44.92284],[5.43472,44.89001],[5.43303,44.88995],[5.43065,44.85026],[5.43387,44.85014],[5.43285,44.82638],[5.43548,44.82626],[5.43497,44.8139],[5.44106,44.81372],[5.43717,44.74098],[5.4546,44.74044],[5.45282,44.70425],[5.5211,44.70245],[5.5233,44.73858],[5.58904,44.73684],[5.59298,44.81263],[5.5879,44.81299],[5.58977,44.84947],[5.58823,44.84938],[5.58972,44.87351],[5.53863,44.87503],[5.53947,44.88686],[5.52834,44.88733],[5.53002,44.92012],[5.53319,44.92012],[5.53761,44.99624],[5.43565,44.99918]]],terms_text:"Parc Naturel du Vercors"},{id:"vicosa_al",name:"Viçosa AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Vicosa&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.198,-9.42067],[-36.19777,-9.41789],[-36.1978,-9.41528],[-36.19801,-9.41074],[-36.19789,-9.40857],[-36.19793,-9.40637],[-36.19797,-9.40561],[-36.19793,-9.40405],[-36.19799,-9.40312],[-36.19827,-9.40028],[-36.19829,-9.39496],[-36.19789,-9.39169],[-36.19844,-9.38932],[-36.19837,-9.3862],[-36.19794,-9.38167],[-36.19801,-9.37972],[-36.19834,-9.37867],[-36.19832,-9.37698],[-36.19817,-9.37586],[-36.19852,-9.37139],[-36.19822,-9.36239],[-36.19862,-9.35319],[-36.19849,-9.35097],[-36.19857,-9.34852],[-36.1988,-9.34668],[-36.1986,-9.34349],[-36.19877,-9.34084],[-36.19895,-9.33301],[-36.19877,-9.33039],[-36.28958,-9.33114],[-36.28938,-9.33319],[-36.2895,-9.33538],[-36.28925,-9.34124],[-36.28945,-9.34291],[-36.28928,-9.34521],[-36.28897,-9.37311],[-36.28915,-9.37481],[-36.28892,-9.37708],[-36.2889,-9.38541],[-36.28872,-9.38633],[-36.28872,-9.39343],[-36.28887,-9.39558],[-36.28877,-9.40129],[-36.28862,-9.40652],[-36.28872,-9.40715],[-36.28877,-9.42133],[-36.198,-9.42067]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"wien.gv.at-labels",name:"Vienna: Beschriftungen (annotations)",type:"tms",template:"https://maps.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[12,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif",overlay:true},{id:"wien.gv.at-gp",name:"Vienna: Mehrzweckkarte (general purpose)",type:"tms",template:"https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[10,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{id:"wien.gv.at-aerial_image",name:"Vienna: Orthofoto (aerial image)",type:"tms",template:"https://maps.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[10,19],polygon:[[[16.14995,48.10832],[16.14989,48.33315],[16.61873,48.33296],[16.61749,48.10813],[16.46644,48.10819],[16.46644,48.10744],[16.18104,48.10756],[16.18104,48.10831],[16.14995,48.10832]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{id:"Ville_de_Nyon-HD-2010",name:"Ville de Nyon - Orthophoto 2010 HD 5cm/pi",type:"tms",template:"http://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.24859,46.38252],[6.24848,46.38715],[6.24378,46.38944],[6.24182,46.39109],[6.2414,46.39159],[6.23919,46.39222],[6.23973,46.39373],[6.2379,46.3946],[6.23713,46.39698],[6.23071,46.40107],[6.22789,46.39903],[6.22326,46.40219],[6.22066,46.40189],[6.21582,46.40462],[6.21393,46.40698],[6.20989,46.40563],[6.20928,46.40528],[6.20985,46.40434],[6.20501,46.40332],[6.20527,46.40104],[6.20906,46.40131],[6.20951,46.4013],[6.2149,46.4008],[6.21154,46.39808],[6.21057,46.3968],[6.20954,46.39449],[6.21229,46.39243],[6.21374,46.39168],[6.21639,46.39079],[6.21296,46.38736],[6.21532,46.38514],[6.21403,46.38424],[6.2126,46.38232],[6.21211,46.38102],[6.21212,46.37992],[6.21231,46.37901],[6.21318,46.37697],[6.21454,46.37494],[6.21359,46.37463],[6.21365,46.37276],[6.22133,46.3699],[6.22752,46.36555],[6.22752,46.36541],[6.23738,46.37356],[6.24404,46.37842],[6.24859,46.38252]]],terms_url:"http://www.nyon.ch/fr/officiel/services-offices/informatique-et-population-776-3911",terms_text:"Ville de Nyon"},{id:"VGIN-BuildingFootprints_WM",name:"Virginia Building Footprint Map Service",type:"tms",template:"https://gismaps.vita.virginia.gov/arcgis/rest/services/VA_Base_layers/VA_Building_Footprints/MapServer/tile/{zoom}/{y}/{x}",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=bcd049dfcdc342a7a08ec81644eeb339",terms_text:"Virginia Geographic Information Network (VGIN)",description:"Virginia Building Footprint Map Service",overlay:true},{id:"VGIN-Imagery_WM",name:"Virginia Imagery Service - Most Recent, WGS Web Mercator (VBMP)",type:"tms",template:"https://gismaps.vita.virginia.gov/arcgis/rest/services/MostRecentImagery/MostRecentImagery_WGS/MapServer/tile/{zoom}/{y}/{x}",endDate:"2018-08-01T00:00:00.000Z",startDate:"2013-04-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=36386a7e7dae4032a33cb0b83a1711f1",terms_text:"Virginia Geographic Information Network (VGIN)",description:"The most recently available VBMP orthoimagery for all of Virginia."},{id:"VGIN-PropertyLines_WM",name:"Virginia Tax Parcels Map Service",type:"tms",template:"https://gismaps.vita.virginia.gov/arcgis/rest/services/VA_Base_layers/VA_Parcels/MapServer/tile/{zoom}/{y}/{x}",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=f1dccaf1f42e40cbba791feae2e23690",terms_text:"Virginia Geographic Information Network (VGIN)",description:"A statewide Parcel service showing property ownership outlines where available",overlay:true},{id:"vogis.cnv.at-DGM",name:"VoGIS: DGM (Terrain model)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_terrain&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-DOM",name:"VoGIS: DOM (Surface model)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_surface&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-ef2012_12cm",name:"VoGIS: Echtfarbenbild 2012 (12cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2012_12cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[9.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-ef2015_10cm",name:"VoGIS: Echtfarbenbild 2015 (10cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2015_10cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[9.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-wi2015_20cm",name:"VoGIS: Echtfarbenbild Winter 2015 (20cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=wi2015_20cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[10.17039,46.82979],[10.17108,46.93644],[10.18413,46.94113],[10.1855,47.10157],[10.23906,47.10437],[10.24283,47.15611],[10.25691,47.18704],[10.24558,47.27597],[10.25313,47.32347],[10.26893,47.32626],[10.26446,47.41102],[10.13194,47.4087],[10.13434,47.46107],[10.11752,47.46153],[10.11889,47.47337],[10.08731,47.47429],[10.08491,47.50724],[10.06843,47.507],[10.0674,47.5215],[10.02345,47.52428],[10.00079,47.57943],[9.84904,47.57757],[9.85042,47.61462],[9.72751,47.61277],[9.7203,47.59089],[9.70347,47.58915],[9.70313,47.54491],[9.68219,47.54491],[9.68047,47.55348],[9.56391,47.54931],[9.56202,47.53958],[9.55172,47.53958],[9.55172,47.53402],[9.52168,47.53471],[9.52701,47.30497],[9.50503,47.30264],[9.50091,47.23368],[9.52357,47.23228],[9.52426,47.16557],[9.54486,47.16405],[9.54383,47.15448],[9.57232,47.15401],[9.57026,47.12809],[9.59018,47.12867],[9.59189,47.10029],[9.57232,47.10017],[9.57713,47.02861],[9.72407,47.03048],[9.72304,47.01749],[9.77454,47.01562],[9.77626,47.00555],[9.79274,47.00391],[9.7948,46.99127],[9.83874,46.99314],[9.84012,46.90349],[9.89024,46.90725],[9.88543,46.88707],[9.95925,46.89141],[9.962,46.87675],[10.0001,46.87862],[9.99667,46.85715],[10.01864,46.85656],[10.02345,46.83073],[10.17039,46.82979]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"wroclaw-orto2015",name:"Wrocław: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis1.um.wroc.pl/arcgis/services/ogc/OGC_ortofoto_2015/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[17.14217,51.12846],[17.15659,51.1499],[17.15933,51.16056],[17.15899,51.17886],[17.14371,51.18155],[17.13024,51.18128],[17.12466,51.17396],[17.11436,51.17746],[17.0778,51.17746],[17.07642,51.1766],[17.07548,51.16825],[17.06698,51.16745],[17.04698,51.17493],[17.03376,51.17729],[17.02741,51.17729],[17.02733,51.18246],[17.02252,51.18816],[17.01299,51.18816],[17.0093,51.18499],[17.00312,51.18504],[17.00261,51.20016],[16.99162,51.20559],[16.97008,51.20763],[16.96424,51.20989],[16.95394,51.20968],[16.94656,51.20586],[16.9233,51.2001],[16.90811,51.21043],[16.89927,51.21027],[16.89292,51.2071],[16.88322,51.2071],[16.88073,51.20489],[16.88047,51.19666],[16.88322,51.19048],[16.87403,51.18719],[16.87026,51.18203],[16.85455,51.18031],[16.8421,51.18488],[16.82434,51.18467],[16.82056,51.17875],[16.82099,51.16373],[16.82502,51.15647],[16.80915,51.15194],[16.80657,51.14613],[16.80648,51.1366],[16.80769,51.13595],[16.81687,51.13601],[16.8161,51.13337],[16.81636,51.12459],[16.82932,51.12329],[16.83266,51.11834],[16.82923,51.11386],[16.82923,51.10993],[16.83215,51.10869],[16.84949,51.10826],[16.85661,51.09899],[16.87901,51.09252],[16.88862,51.09258],[16.89197,51.09667],[16.92107,51.09662],[16.9209,51.09263],[16.91661,51.0812],[16.91686,51.07942],[16.93514,51.07948],[16.93849,51.0736],[16.95248,51.06686],[16.95068,51.05806],[16.95454,51.05369],[16.96188,51.0473],[16.96879,51.04568],[16.98072,51.04584],[16.98424,51.05197],[16.99969,51.04668],[17.00776,51.04422],[17.01973,51.04169],[17.03286,51.0419],[17.03415,51.04673],[17.04509,51.04339],[17.06363,51.04339],[17.07037,51.05286],[17.08363,51.04428],[17.095,51.04368],[17.10633,51.04376],[17.10835,51.04684],[17.10822,51.05377],[17.10226,51.05868],[17.11136,51.0716],[17.12341,51.07179],[17.12299,51.07856],[17.15088,51.07861],[17.17277,51.09344],[17.17277,51.09956],[17.17697,51.10303],[17.17676,51.1092],[17.16363,51.1203],[17.14217,51.12846]]],terms_text:"Urząd Miasta Wrocław",icon:"https://i.imgur.com/PRqROXB.png"},{id:"Zabrze-2011",name:"Zabrze: Orthophotomap 2011 (aerial image)",type:"wms",template:"http://siot.um.zabrze.pl/arcgis/services/UMZ_Ortofoto_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.74396,50.2753],[18.75586,50.27523],[18.75578,50.27633],[18.74516,50.28105],[18.74609,50.28886],[18.75084,50.28948],[18.74832,50.2957],[18.73379,50.29618],[18.73208,50.31571],[18.73613,50.31646],[18.73882,50.32763],[18.73725,50.33016],[18.73121,50.33169],[18.73054,50.3344],[18.73422,50.3371],[18.73428,50.34097],[18.73866,50.34308],[18.75419,50.34182],[18.75982,50.34624],[18.75438,50.34744],[18.75119,50.34979],[18.74603,50.36876],[18.75705,50.3692],[18.7639,50.36754],[18.77263,50.37628],[18.78436,50.37077],[18.78713,50.37295],[18.79821,50.37048],[18.80466,50.37561],[18.80165,50.37718],[18.80164,50.38222],[18.80509,50.38317],[18.81527,50.38167],[18.81446,50.37515],[18.82183,50.36883],[18.81737,50.36802],[18.82104,50.35843],[18.8159,50.35336],[18.81687,50.35076],[18.82294,50.35156],[18.83281,50.34962],[18.83474,50.3443],[18.84615,50.34448],[18.86293,50.32852],[18.8607,50.32776],[18.85088,50.33191],[18.84578,50.32923],[18.84891,50.32352],[18.83179,50.32028],[18.83192,50.30483],[18.84451,50.30286],[18.84429,50.29627],[18.82282,50.28615],[18.82845,50.28482],[18.82745,50.27972],[18.82322,50.27994],[18.8214,50.27414],[18.81392,50.27309],[18.79981,50.27351],[18.7987,50.2613],[18.7923,50.24641],[18.78261,50.24583],[18.76416,50.25145],[18.75396,50.25669],[18.75004,50.26402],[18.73991,50.26738],[18.73421,50.27084],[18.74396,50.2753]]],terms_text:"Urząd Miasta Zabrza"}];
23657
23658   var presets = {aerialway:{fields:["aerialway"],geometry:["point","vertex","line"],tags:{aerialway:"*"},terms:["ski lift","funifor","funitel"],searchable:false,name:"Aerialway"},aeroway:{icon:"maki-airport",fields:["aeroway"],geometry:["point","vertex","line","area"],tags:{aeroway:"*"},searchable:false,name:"Aeroway"},amenity:{fields:["amenity"],geometry:["point","vertex","area"],tags:{amenity:"*"},searchable:false,name:"Amenity"},circular:{geometry:["vertex","line"],fields:["name"],tags:{junction:"circular"},name:"Traffic Circle",searchable:false},highway:{fields:["name","highway"],geometry:["point","vertex","line","area"],tags:{highway:"*"},searchable:false,name:"Highway"},place:{fields:["name","place"],geometry:["point","vertex","area"],tags:{place:"*"},searchable:false,name:"Place"},power:{geometry:["point","vertex","line","area"],tags:{power:"*"},fields:["power"],searchable:false,name:"Power"},railway:{fields:["railway"],geometry:["point","vertex","line","area"],tags:{railway:"*"},searchable:false,name:"Railway"},roundabout:{geometry:["vertex","line"],fields:["name"],tags:{junction:"roundabout"},name:"Roundabout",searchable:false},waterway:{fields:["name","waterway"],geometry:["point","vertex","line","area"],tags:{waterway:"*"},searchable:false,name:"Waterway"},address:{fields:["address"],geometry:["point","vertex","area"],tags:{"addr:*":"*"},addTags:{},removeTags:{},reference:{key:"addr"},name:"Address",matchScore:0.15},"advertising/billboard":{fields:["direction","lit"],geometry:["point","vertex","line"],tags:{advertising:"billboard"},name:"Billboard"},"advertising/column":{fields:["direction","lit"],geometry:["point","area"],tags:{advertising:"column"},name:"Advertising Column"},"aerialway/station":{icon:"maki-aerialway",geometry:["point","vertex","area"],fields:["aerialway/access","aerialway/summer/access","elevation","building_area"],tags:{aerialway:"station"},name:"Aerialway Station",searchable:false},"aerialway/cable_car":{geometry:["line"],terms:["tramway","ropeway"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/heating"],tags:{aerialway:"cable_car"},name:"Cable Car"},"aerialway/chair_lift":{geometry:["line"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"chair_lift"},name:"Chair Lift"},"aerialway/drag_lift":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"drag_lift"},name:"Drag Lift"},"aerialway/gondola":{geometry:["line"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"gondola"},name:"Gondola"},"aerialway/goods":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"goods"},name:"Goods Aerialway"},"aerialway/magic_carpet":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration","aerialway/heating"],tags:{aerialway:"magic_carpet"},name:"Magic Carpet Lift"},"aerialway/mixed_lift":{geometry:["line"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"mixed_lift"},name:"Mixed Lift"},"aerialway/platter":{geometry:["line"],terms:["button lift","poma lift"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"platter"},name:"Platter Lift"},"aerialway/pylon":{geometry:["point","vertex"],fields:["ref"],tags:{aerialway:"pylon"},name:"Aerialway Pylon"},"aerialway/rope_tow":{geometry:["line"],terms:["handle tow","bugel lift"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"rope_tow"},name:"Rope Tow Lift"},"aerialway/t-bar":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],terms:["tbar"],tags:{aerialway:"t-bar"},name:"T-bar Lift"},"aeroway/aerodrome":{icon:"maki-airport",geometry:["point","area"],fields:["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],terms:["aerodrome","aeroway","airplane","airport","jet","plane"],tags:{aeroway:"aerodrome"},matchScore:0.9,name:"Airport"},"aeroway/apron":{icon:"maki-airport",geometry:["area"],terms:["ramp"],fields:["ref","surface"],tags:{aeroway:"apron"},name:"Apron"},"aeroway/gate":{icon:"maki-airport",geometry:["point"],fields:["ref_aeroway_gate"],tags:{aeroway:"gate"},name:"Airport Gate"},"aeroway/hangar":{geometry:["area"],fields:["name","building_area"],tags:{aeroway:"hangar"},name:"Hangar"},"aeroway/helipad":{icon:"maki-heliport",geometry:["point","area"],fields:["ref"],terms:["helicopter","helipad","heliport"],tags:{aeroway:"helipad"},name:"Helipad"},"aeroway/runway":{geometry:["line","area"],terms:["landing strip"],fields:["ref_runway","surface","length","width"],tags:{aeroway:"runway"},name:"Runway"},"aeroway/taxiway":{geometry:["line"],fields:["ref_taxiway","surface"],tags:{aeroway:"taxiway"},name:"Taxiway"},"aeroway/terminal":{icon:"maki-airport",geometry:["point","area"],terms:["airport","aerodrome"],fields:["name","operator","building_area"],tags:{aeroway:"terminal"},name:"Airport Terminal"},"allotments/plot":{geometry:["area"],fields:["name","ref"],tags:{allotments:"plot"},reference:{key:"allotments",value:"plot"},name:"Community Garden Plot"},"amenity/bus_station":{icon:"maki-bus",fields:["name","building_area","operator","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"bus_station"},name:"Bus Station / Terminal",searchable:false},"amenity/coworking_space":{icon:"maki-commercial",fields:["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"coworking_space"},name:"Coworking Space",searchable:false},"amenity/ferry_terminal":{icon:"maki-ferry",fields:["name","network","operator","address","building_area"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"ferry_terminal"},name:"Ferry Station / Terminal",searchable:false},"amenity/nursing_home":{icon:"maki-wheelchair",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],tags:{amenity:"nursing_home"},reference:{key:"social_facility",value:"nursing_home"},name:"Nursing Home",searchable:false},"amenity/register_office":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],tags:{amenity:"register_office"},reference:{key:"government",value:"register_office"},name:"Register Office",searchable:false},"amenity/scrapyard":{icon:"maki-car",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{amenity:"scrapyard"},reference:{key:"industrial",value:"scrap_yard"},name:"Scrap Yard",searchable:false},"amenity/swimming_pool":{icon:"maki-swimming",geometry:["point","vertex","area"],tags:{amenity:"swimming_pool"},reference:{key:"leisure",value:"swimming_pool"},name:"Swimming Pool",searchable:false},"amenity/animal_boarding":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_boarding"],geometry:["point","area"],terms:["boarding","cat","cattery","dog","horse","kennel","kitten","pet","pet boarding","pet care","pet hotel","puppy","reptile"],tags:{amenity:"animal_boarding"},name:"Animal Boarding Facility"},"amenity/animal_breeding":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_breeding"],geometry:["point","area"],terms:["breeding","bull","cat","cow","dog","horse","husbandry","kitten","livestock","pet breeding","puppy","reptile"],tags:{amenity:"animal_breeding"},name:"Animal Breeding Facility"},"amenity/animal_shelter":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_shelter"],geometry:["point","area"],terms:["adoption","aspca","cat","dog","horse","kitten","pet care","pet rescue","puppy","raptor","reptile","rescue","spca"],tags:{amenity:"animal_shelter"},name:"Animal Shelter"},"amenity/arts_centre":{icon:"maki-theatre",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"arts_centre"},name:"Arts Center"},"amenity/atm":{icon:"maki-bank",fields:["operator","network","cash_in","currency_multi","drive_through"],geometry:["point","vertex"],terms:["money","cash","machine"],tags:{amenity:"atm"},name:"ATM"},"amenity/bank":{icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],terms:["credit union","check","deposit","fund","investment","repository","reserve","safe","savings","stock","treasury","trust","vault"],tags:{amenity:"bank"},name:"Bank"},"amenity/bar":{icon:"maki-bar",fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],geometry:["point","area"],terms:["dive","beer","bier","booze"],tags:{amenity:"bar"},name:"Bar"},"amenity/bbq":{icon:"maki-bbq",fields:["covered","fuel","access_simple"],geometry:["point"],terms:["bbq","grill"],tags:{amenity:"bbq"},name:"Barbecue/Grill"},"amenity/bench":{icon:"temaki-bench",fields:["backrest"],geometry:["point","vertex","line"],terms:["seat"],tags:{amenity:"bench"},name:"Bench"},"amenity/bicycle_parking":{icon:"maki-bicycle",fields:["bicycle_parking","capacity","operator","covered","access_simple"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_parking"},name:"Bicycle Parking"},"amenity/bicycle_rental":{icon:"maki-bicycle",fields:["capacity","network","operator","payment_multi"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_rental"},name:"Bicycle Rental"},"amenity/bicycle_repair_station":{icon:"maki-bicycle",fields:["operator","brand","opening_hours","fee","service/bicycle"],geometry:["point","vertex"],terms:["bike","repair","chain","pump"],tags:{amenity:"bicycle_repair_station"},name:"Bicycle Repair Tool Stand"},"amenity/biergarten":{icon:"maki-beer",fields:["name","address","building","opening_hours","smoking","outdoor_seating","brewery"],geometry:["point","area"],tags:{amenity:"biergarten"},terms:["beer","bier","booze"],name:"Biergarten"},"amenity/boat_rental":{fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"boat_rental"},name:"Boat Rental"},"amenity/bureau_de_change":{icon:"maki-bank",fields:["name","currency_multi","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["bureau de change","money changer"],tags:{amenity:"bureau_de_change"},name:"Currency Exchange"},"amenity/cafe":{icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],geometry:["point","area"],terms:["bistro","coffee","tea"],tags:{amenity:"cafe"},name:"Cafe"},"amenity/car_pooling":{icon:"maki-car",fields:["name","operator","capacity"],geometry:["point","area"],tags:{amenity:"car_pooling"},name:"Car Pooling"},"amenity/car_rental":{icon:"maki-car",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental"},name:"Car Rental"},"amenity/car_sharing":{icon:"maki-car",fields:["name","operator","capacity","payment_multi"],geometry:["point","area"],tags:{amenity:"car_sharing"},name:"Car Sharing"},"amenity/car_wash":{icon:"maki-car",fields:["address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"car_wash"},name:"Car Wash"},"amenity/casino":{icon:"temaki-dice",fields:["name","operator","address","building_area","opening_hours","payment_multi","smoking"],geometry:["point","area"],terms:["gambling","roulette","craps","poker","blackjack"],tags:{amenity:"casino"},name:"Casino"},"amenity/charging_station":{icon:"maki-car",fields:["operator","capacity"],geometry:["point"],tags:{amenity:"charging_station"},terms:["EV","Electric Vehicle","Supercharger"],name:"Charging Station"},"amenity/childcare":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["daycare","orphanage","playgroup"],tags:{amenity:"childcare"},name:"Nursery/Childcare"},"amenity/cinema":{icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["drive-in","film","flick","movie","theater","picture","show","screen"],tags:{amenity:"cinema"},name:"Cinema"},"amenity/clinic":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["medical","urgentcare"],tags:{amenity:"clinic"},addTags:{amenity:"clinic",healthcare:"clinic"},removeTags:{amenity:"clinic",healthcare:"clinic"},reference:{key:"amenity",value:"clinic"},name:"Clinic"},"amenity/clinic/abortion":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"clinic",healthcare:"clinic","healthcare:speciality":"abortion"},reference:{key:"amenity",value:"clinic"},name:"Abortion Clinic"},"amenity/clinic/fertility":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["egg","fertility","reproductive","sperm","ovulation"],tags:{amenity:"clinic",healthcare:"clinic","healthcare:speciality":"fertility"},reference:{key:"amenity",value:"clinic"},name:"Fertility Clinic"},"amenity/clock":{icon:"temaki-clock",fields:["name","support","display","visibility","date","faces"],geometry:["point","vertex"],tags:{amenity:"clock"},name:"Clock"},"amenity/college":{icon:"maki-college",fields:["name","operator","address","internet_access","internet_access/ssid"],geometry:["point","area"],terms:["university"],tags:{amenity:"college"},name:"College Grounds"},"amenity/community_centre":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["event","hall"],tags:{amenity:"community_centre"},name:"Community Center"},"amenity/compressed_air":{icon:"maki-car",geometry:["point","area"],tags:{amenity:"compressed_air"},name:"Compressed Air"},"amenity/courthouse":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],geometry:["point","area"],tags:{amenity:"courthouse"},name:"Courthouse"},"amenity/crematorium":{icon:"maki-cemetery",fields:["name","website","phone","opening_hours","wheelchair"],geometry:["area","point"],tags:{amenity:"crematorium"},terms:["cemetery","funeral"],name:"Crematorium"},"amenity/dentist":{icon:"maki-dentist",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["tooth","teeth"],tags:{amenity:"dentist"},addTags:{amenity:"dentist",healthcare:"dentist"},removeTags:{amenity:"dentist",healthcare:"dentist"},reference:{key:"amenity",value:"dentist"},name:"Dentist"},"amenity/doctors":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["medic*","physician"],tags:{amenity:"doctors"},addTags:{amenity:"doctors",healthcare:"doctor"},removeTags:{amenity:"doctors",healthcare:"doctor"},reference:{key:"amenity",value:"doctors"},name:"Doctor"},"amenity/dojo":{icon:"maki-pitch",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],terms:["martial arts","dojang"],tags:{amenity:"dojo"},name:"Dojo / Martial Arts Academy"},"amenity/drinking_water":{icon:"maki-drinking-water",geometry:["point"],tags:{amenity:"drinking_water"},terms:["fountain","potable"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"driving_school"},name:"Driving School"},"amenity/embassy":{icon:"maki-embassy",fields:["name","country","address","building_area"],geometry:["point","area"],tags:{amenity:"embassy"},name:"Embassy"},"amenity/fast_food":{icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food"},terms:["restaurant","takeaway"],name:"Fast Food"},"amenity/fire_station":{icon:"maki-fire-station",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:[],tags:{amenity:"fire_station"},name:"Fire Station"},"amenity/food_court":{icon:"maki-restaurant",fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],geometry:["point","area"],terms:["fast food","restaurant","food"],tags:{amenity:"food_court"},name:"Food Court"},"amenity/fountain":{icon:"temaki-fountain",fields:["name"],geometry:["point","area"],tags:{amenity:"fountain"},name:"Fountain"},"amenity/fuel":{icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],terms:["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],tags:{amenity:"fuel"},name:"Gas Station"},"amenity/grave_yard":{icon:"maki-cemetery",fields:["religion","denomination"],geometry:["point","area"],tags:{amenity:"grave_yard"},name:"Graveyard"},"amenity/grit_bin":{fields:["access_simple"],geometry:["point","vertex"],tags:{amenity:"grit_bin"},terms:["salt","sand"],name:"Grit Bin"},"amenity/hospital":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","emergency"],geometry:["point","area"],terms:["clinic","doctor","emergency room","health","infirmary","institution","sanatorium","sanitarium","sick","surgery","ward"],tags:{amenity:"hospital"},addTags:{amenity:"hospital",healthcare:"hospital"},removeTags:{amenity:"hospital",healthcare:"hospital"},reference:{key:"amenity",value:"hospital"},name:"Hospital Grounds"},"amenity/hunting_stand":{icon:"temaki-binoculars",fields:["access_simple"],geometry:["point","vertex","area"],terms:["game","gun","lookout","rifle","shoot*","wild","watch"],tags:{amenity:"hunting_stand"},name:"Hunting Stand"},"amenity/ice_cream":{icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],terms:["gelato","sorbet","sherbet","frozen","yogurt"],tags:{amenity:"ice_cream"},name:"Ice Cream Shop"},"amenity/internet_cafe":{icon:"temaki-antenna",fields:["name","operator","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],geometry:["point","area"],terms:["cybercafe","taxiphone","teleboutique","coffee","cafe","net","lanhouse"],tags:{amenity:"internet_cafe"},name:"Internet Cafe"},"amenity/kindergarten":{icon:"maki-school",fields:["name","operator","address"],geometry:["point","area"],terms:["kindergarden","pre-school"],tags:{amenity:"kindergarten"},name:"Preschool/Kindergarten Grounds"},"amenity/library":{icon:"maki-library",fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],geometry:["point","area"],terms:["book"],tags:{amenity:"library"},name:"Library"},"amenity/love_hotel":{icon:"maki-heart",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"love_hotel"},name:"Love Hotel"},"amenity/marketplace":{icon:"maki-shop",fields:["name","operator","address","building","opening_hours"],geometry:["point","area"],tags:{amenity:"marketplace"},name:"Marketplace"},"amenity/monastery":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area"],geometry:["point","area"],terms:["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","monastery","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],tags:{amenity:"monastery"},name:"Monastery Grounds"},"amenity/motorcycle_parking":{icon:"fas-motorcycle",fields:["capacity","operator","covered","access_simple"],geometry:["point","vertex","area"],tags:{amenity:"motorcycle_parking"},name:"Motorcycle Parking"},"amenity/music_school":{icon:"maki-school",fields:["name","operator","address"],geometry:["point","area"],terms:["school of music"],tags:{amenity:"music_school"},name:"Music School"},"amenity/nightclub":{icon:"maki-bar",fields:["name","operator","address","building_area","opening_hours","smoking"],geometry:["point","area"],tags:{amenity:"nightclub"},terms:["disco*","night club","dancing","dance club"],name:"Nightclub"},"amenity/parking_entrance":{icon:"maki-entrance-alt1",fields:["access_simple","ref"],geometry:["vertex"],tags:{amenity:"parking_entrance"},name:"Parking Garage Entrance/Exit"},"amenity/parking_space":{fields:["capacity"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"parking_space"},matchScore:0.95,name:"Parking Space"},"amenity/parking":{icon:"maki-parking",fields:["name","operator","parking","capacity","fee","access_simple","supervised","park_ride","surface","maxstay"],geometry:["point","vertex","area"],tags:{amenity:"parking"},terms:[],name:"Car Parking"},"amenity/pavilion":{icon:"maki-shelter",fields:["name","building_area","bench","bin"],geometry:["point","vertex","area"],tags:{amenity:"shelter",shelter_type:"pavilion"},name:"Pavilion"},"amenity/pharmacy":{icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy"},addTags:{amenity:"pharmacy",healthcare:"pharmacy"},removeTags:{amenity:"pharmacy",healthcare:"pharmacy"},reference:{key:"amenity",value:"pharmacy"},terms:["apothecary","drug*","med*","prescription"],name:"Pharmacy"},"amenity/place_of_worship":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area","service_times"],geometry:["point","area"],terms:["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],tags:{amenity:"place_of_worship"},name:"Place of Worship"},"amenity/place_of_worship/buddhist":{icon:"maki-buddhism",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["stupa","vihara","monastery","temple","pagoda","zendo","dojo"],tags:{amenity:"place_of_worship",religion:"buddhist"},reference:{key:"amenity",value:"place_of_worship"},name:"Buddhist Temple"},"amenity/place_of_worship/christian":{icon:"maki-religious-christian",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["christian","abbey","basilica","bethel","cathedral","chancel","chantry","chapel","fold","house of God","house of prayer","house of worship","minster","mission","oratory","parish","sacellum","sanctuary","shrine","tabernacle","temple"],tags:{amenity:"place_of_worship",religion:"christian"},reference:{key:"amenity",value:"place_of_worship"},name:"Church"},"amenity/place_of_worship/hindu":{icon:"temaki-hinduism",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["kovil","devasthana","mandir","kshetram","alayam","shrine","temple"],tags:{amenity:"place_of_worship",religion:"hindu"},reference:{key:"amenity",value:"place_of_worship"},name:"Hindu Temple"},"amenity/place_of_worship/jewish":{icon:"maki-religious-jewish",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["jewish"],tags:{amenity:"place_of_worship",religion:"jewish"},reference:{key:"amenity",value:"place_of_worship"},name:"Synagogue"},"amenity/place_of_worship/muslim":{icon:"maki-religious-muslim",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["muslim"],tags:{amenity:"place_of_worship",religion:"muslim"},reference:{key:"amenity",value:"place_of_worship"},name:"Mosque"},"amenity/place_of_worship/shinto":{icon:"temaki-shinto",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["kami","torii"],tags:{amenity:"place_of_worship",religion:"shinto"},reference:{key:"amenity",value:"place_of_worship"},name:"Shinto Shrine"},"amenity/place_of_worship/sikh":{icon:"temaki-sikhism",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["gurudwara","temple"],tags:{amenity:"place_of_worship",religion:"sikh"},reference:{key:"amenity",value:"place_of_worship"},name:"Sikh Temple"},"amenity/place_of_worship/taoist":{icon:"temaki-taoism",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["daoist","monastery","temple"],tags:{amenity:"place_of_worship",religion:"taoist"},reference:{key:"amenity",value:"place_of_worship"},name:"Taoist Temple"},"amenity/planetarium":{icon:"maki-museum",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["museum","astronomy","observatory"],tags:{amenity:"planetarium"},name:"Planetarium"},"amenity/police":{icon:"maki-police",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],tags:{amenity:"police"},name:"Police"},"amenity/post_box":{icon:"maki-post",fields:["operator","collection_times","drive_through","ref"],geometry:["point","vertex"],tags:{amenity:"post_box"},terms:["letter","post"],name:"Mailbox"},"amenity/post_office":{icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["letter","mail"],tags:{amenity:"post_office"},name:"Post Office"},"amenity/prison":{icon:"maki-prison",fields:["name","operator","address"],geometry:["point","area"],terms:["cell","jail"],tags:{amenity:"prison"},name:"Prison Grounds"},"amenity/pub":{icon:"maki-beer",fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],geometry:["point","area"],tags:{amenity:"pub"},terms:["alcohol","drink","dive","beer","bier","booze"],name:"Pub"},"amenity/public_bath":{icon:"maki-water",fields:["name","bath/type","bath/open_air","bath/sand_bath","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"public_bath"},terms:["onsen","foot bath","hot springs"],name:"Public Bath"},"amenity/public_bookcase":{icon:"maki-library",fields:["name","operator","capacity","website"],geometry:["point","area"],terms:["library","bookcrossing"],tags:{amenity:"public_bookcase"},name:"Public Bookcase"},"amenity/ranger_station":{icon:"maki-ranger-station",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["visitor center","visitor centre","permit center","permit centre","backcountry office","warden office","warden center"],tags:{amenity:"ranger_station"},name:"Ranger Station"},"amenity/recycling_centre":{icon:"maki-recycling",fields:["name","operator","address","building","opening_hours","recycling_accepts"],geometry:["point","area"],terms:["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling",recycling_type:"centre"},reference:{key:"recycling_type",value:"*"},name:"Recycling Center"},"amenity/recycling":{icon:"maki-recycling",fields:["recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling"},addTags:{amenity:"recycling",recycling_type:"container"},removeTags:{amenity:"recycling",recycling_type:"container"},reference:{key:"amenity",value:"recycling"},name:"Recycling Container"},"amenity/restaurant":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant"},name:"Restaurant"},"amenity/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["operator","access_simple","fee","water_point"],geometry:["point","vertex","area"],terms:["Motor Home","Camper","Sanitary","Dump Station","Elsan","CDP","CTDP","Chemical Toilet"],tags:{amenity:"sanitary_dump_station"},name:"RV Toilet Disposal"},"amenity/school":{icon:"maki-school",fields:["name","operator","address","religion","denomination"],geometry:["point","area"],terms:["academy","elementary school","middle school","high school"],tags:{amenity:"school"},name:"School Grounds"},"amenity/shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","bin"],geometry:["point","vertex","area"],terms:["lean-to","gazebo","picnic"],tags:{amenity:"shelter"},name:"Shelter"},"amenity/shower":{icon:"temaki-shower",fields:["operator","opening_hours","fee","supervised","building_area","access_simple"],geometry:["point","vertex","area"],terms:["rain closet"],tags:{amenity:"shower"},name:"Shower"},"amenity/smoking_area":{icon:"fas-smoking",fields:["name","shelter","bin","bench","opening_hours"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"smoking_area"},name:"Smoking Area"},"amenity/social_facility":{icon:"temaki-social_facility",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility"},name:"Social Facility"},"amenity/social_facility/food_bank":{icon:"temaki-social_facility",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility",social_facility:"food_bank"},reference:{key:"social_facility",value:"food_bank"},name:"Food Bank"},"amenity/social_facility/group_home":{icon:"maki-wheelchair",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],terms:["old","senior","living","care home","assisted living"],tags:{amenity:"social_facility",social_facility:"group_home","social_facility:for":"senior"},reference:{key:"social_facility",value:"group_home"},name:"Elderly Group Home"},"amenity/social_facility/homeless_shelter":{icon:"temaki-social_facility",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["houseless","unhoused","displaced"],tags:{amenity:"social_facility",social_facility:"shelter","social_facility:for":"homeless"},reference:{key:"social_facility",value:"shelter"},name:"Homeless Shelter"},"amenity/social_facility/nursing_home":{icon:"maki-wheelchair",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],terms:["elderly","living","nursing","old","senior","assisted living"],tags:{amenity:"social_facility",social_facility:"nursing_home","social_facility:for":"senior"},reference:{key:"social_facility",value:"nursing_home"},name:"Nursing Home"},"amenity/studio":{icon:"maki-karaoke",fields:["name","studio","address","building_area"],geometry:["point","area"],terms:["recording","radio","television"],tags:{amenity:"studio"},name:"Studio"},"amenity/taxi":{icon:"fas-taxi",fields:["name","operator","capacity"],geometry:["point","vertex","area"],terms:["cab"],tags:{amenity:"taxi"},name:"Taxi Stand"},"amenity/telephone":{icon:"maki-telephone",fields:["operator","phone","fee","payment_multi","covered","indoor","booth"],geometry:["point","vertex"],tags:{amenity:"telephone"},terms:["phone"],name:"Telephone"},"amenity/theatre":{icon:"maki-theatre",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["theatre","performance","play","musical"],tags:{amenity:"theatre"},name:"Theater"},"amenity/toilets":{icon:"maki-toilet",fields:["toilets/disposal","operator","building_area","access_simple","gender","fee","diaper"],geometry:["point","vertex","area"],terms:["bathroom","restroom","outhouse","privy","head","lavatory","latrine","water closet","WC","W.C."],tags:{amenity:"toilets"},name:"Toilets"},"amenity/townhall":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["village","city","government","courthouse","municipal"],tags:{amenity:"townhall"},name:"Town Hall"},"amenity/university":{icon:"maki-college",fields:["name","operator","address","internet_access","internet_access/ssid"],geometry:["point","area"],terms:["college"],tags:{amenity:"university"},name:"University Grounds"},"amenity/vending_machine":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:[],tags:{amenity:"vending_machine"},name:"Vending Machine"},"amenity/vending_machine/news_papers":{icon:"temaki-vending_machine",fields:["vending","operator","fee","payment_multi","currency_multi"],geometry:["point"],terms:["newspaper"],tags:{amenity:"vending_machine",vending:"news_papers"},reference:{key:"vending",value:"newspapers"},name:"Newspaper Vending Machine",searchable:false},"amenity/vending_machine/cigarettes":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["cigarette"],tags:{amenity:"vending_machine",vending:"cigarettes"},reference:{key:"vending",value:"cigarettes"},name:"Cigarette Vending Machine"},"amenity/vending_machine/coffee":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["coffee"],tags:{amenity:"vending_machine",vending:"coffee"},reference:{key:"vending",value:"coffee"},name:"Coffee Vending Machine"},"amenity/vending_machine/condoms":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["condom"],tags:{amenity:"vending_machine",vending:"condoms"},reference:{key:"vending",value:"condoms"},name:"Condom Vending Machine"},"amenity/vending_machine/drinks":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["drink","soda","beverage","juice","pop"],tags:{amenity:"vending_machine",vending:"drinks"},reference:{key:"vending",value:"drinks"},name:"Drink Vending Machine"},"amenity/vending_machine/electronics":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["cable","charger","earbud","headphone","phone","tablet"],tags:{amenity:"vending_machine",vending:"electronics"},reference:{key:"vending",value:"electronics"},name:"Electronics Vending Machine"},"amenity/vending_machine/elongated_coin":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["coin","crush","elongated","flatten","penny","souvenir"],tags:{amenity:"vending_machine",vending:"elongated_coin"},reference:{key:"vending",value:"elongated_coin"},name:"Flat Coin Vending Machine"},"amenity/vending_machine/excrement_bags":{icon:"temaki-vending_machine",fields:["vending","operator","fee","payment_multi","currency_multi"],geometry:["point"],terms:["excrement bags","poop","dog","animal"],tags:{amenity:"vending_machine",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},name:"Excrement Bag Vending Machine"},"amenity/vending_machine/feminine_hygiene":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["condom","tampon","pad","woman","women","menstrual hygiene products","personal care"],tags:{amenity:"vending_machine",vending:"feminine_hygiene"},reference:{key:"vending",value:"feminine_hygiene"},name:"Feminine Hygiene Vending Machine"},"amenity/vending_machine/food":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["food"],tags:{amenity:"vending_machine",vending:"food"},reference:{key:"vending",value:"food"},name:"Food Vending Machine"},"amenity/vending_machine/fuel":{icon:"maki-fuel",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],tags:{amenity:"vending_machine",vending:"fuel"},reference:{key:"vending",value:"fuel"},name:"Gas Pump"},"amenity/vending_machine/ice_cream":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["chocolate","ice cream","frozen","popsicle","vanilla"],tags:{amenity:"vending_machine",vending:"ice_cream"},reference:{key:"vending",value:"ice_cream"},name:"Ice Cream Vending Machine"},"amenity/vending_machine/newspapers":{icon:"temaki-vending_machine",fields:["vending","operator","fee","payment_multi","currency_multi"],geometry:["point"],terms:["newspaper"],tags:{amenity:"vending_machine",vending:"newspapers"},reference:{key:"vending",value:"newspapers"},name:"Newspaper Vending Machine"},"amenity/vending_machine/parcel_pickup_dropoff":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["parcel","mail","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},name:"Parcel Pickup/Dropoff Vending Machine"},"amenity/vending_machine/parking_tickets":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["parking","ticket"],tags:{amenity:"vending_machine",vending:"parking_tickets"},reference:{key:"vending",value:"parking_tickets"},matchScore:0.94,name:"Parking Ticket Vending Machine"},"amenity/vending_machine/public_transport_tickets":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["bus","train","ferry","rail","ticket","transportation"],tags:{amenity:"vending_machine",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},name:"Transit Ticket Vending Machine"},"amenity/vending_machine/stamps":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["mail","postage","stamp"],tags:{amenity:"vending_machine",vending:"stamps"},reference:{key:"vending",value:"stamps"},name:"Postage Vending Machine"},"amenity/vending_machine/sweets":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["candy","gum","chip","pretzel","cookie","cracker"],tags:{amenity:"vending_machine",vending:"sweets"},reference:{key:"vending",value:"sweets"},name:"Snack Vending Machine"},"amenity/veterinary":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["pet clinic","veterinarian","animal hospital","pet doctor"],tags:{amenity:"veterinary"},name:"Veterinary"},"amenity/waste_basket":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex"],tags:{amenity:"waste_basket"},terms:["bin","garbage","rubbish","litter","trash"],name:"Waste Basket"},"amenity/waste_disposal":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex","area"],tags:{amenity:"waste_disposal"},terms:["garbage","rubbish","litter","trash"],name:"Garbage Dumpster"},"amenity/waste_transfer_station":{icon:"maki-waste-basket",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["dump","garbage","recycling","rubbish","scrap","trash"],tags:{amenity:"waste_transfer_station"},name:"Waste Transfer Station"},"amenity/waste/dog_excrement":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex","area"],tags:{amenity:"waste_basket",waste:"dog_excrement"},reference:{key:"waste",value:"dog_excrement"},terms:["bin","garbage","rubbish","litter","trash","poo","dog"],name:"Dog Excrement Bin"},"amenity/water_point":{icon:"maki-drinking-water",geometry:["area","vertex","point"],tags:{amenity:"water_point"},name:"RV Drinking Water"},"amenity/watering_place":{icon:"maki-drinking-water",geometry:["area","vertex","point"],tags:{amenity:"watering_place"},name:"Animal Watering Place"},area:{fields:["name"],geometry:["area"],tags:{area:"yes"},name:"Area",matchScore:0.1},"area/highway":{fields:["name","area/highway"],geometry:["area"],tags:{"area:highway":"*"},name:"Road Surface"},"attraction/amusement_ride":{icon:"maki-amusement-park",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","carnival ride"],tags:{attraction:"amusement_ride"},name:"Amusement Ride"},"attraction/animal":{icon:"maki-zoo",fields:["name","operator"],geometry:["point","area"],terms:["zoo","theme park","animal park","lion","tiger","bear"],tags:{attraction:"animal"},name:"Animal"},"attraction/big_wheel":{icon:"maki-amusement-park",fields:["name","operator","height","opening_hours"],geometry:["point"],terms:["ferris wheel","theme park","amusement ride"],tags:{attraction:"big_wheel"},name:"Big Wheel"},"attraction/bumper_car":{icon:"maki-car",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","dodgem cars","autoscooter"],tags:{attraction:"bumper_car"},name:"Bumper Car"},"attraction/bungee_jumping":{icon:"maki-pitch",fields:["name","operator","height","opening_hours"],geometry:["point","area"],terms:["theme park","bungy jumping","jumping platform"],tags:{attraction:"bungee_jumping"},name:"Bungee Jumping"},"attraction/carousel":{icon:"maki-horse-riding",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","roundabout","merry-go-round","galloper","jumper","horseabout","flying horses"],tags:{attraction:"carousel"},name:"Carousel"},"attraction/dark_ride":{icon:"maki-rail-metro",fields:["name","operator","opening_hours"],geometry:["point","line","area"],terms:["theme park","ghost train"],tags:{attraction:"dark_ride"},name:"Dark Ride"},"attraction/drop_tower":{icon:"temaki-tower",fields:["name","operator","height","opening_hours"],geometry:["point","area"],terms:["theme park","amusement ride","gondola","tower","big drop"],tags:{attraction:"drop_tower"},name:"Drop Tower"},"attraction/maze":{icon:"maki-amusement-park",fields:["name","operator"],geometry:["point","area"],terms:["theme park","amusement ride","labyrinth"],tags:{attraction:"maze"},name:"Maze"},"attraction/pirate_ship":{icon:"maki-danger",fields:["name","operator","opening_hours"],geometry:["point"],terms:["theme park","carnival ride","amusement ride"],tags:{attraction:"pirate_ship"},name:"Pirate Ship"},"attraction/river_rafting":{icon:"maki-ferry",fields:["name","operator","opening_hours"],geometry:["point","line"],terms:["theme park","aquatic park","water park","rafting simulator","river rafting ride","river rapids ride"],tags:{attraction:"river_rafting"},name:"River Rafting"},"attraction/roller_coaster":{icon:"maki-amusement-park",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","amusement ride"],tags:{attraction:"roller_coaster"},name:"Roller Coaster"},"attraction/train":{icon:"maki-rail",fields:["name","operator","fee","opening_hours"],geometry:["point","line"],terms:["theme park","rackless train","road train","Tschu-Tschu train","dotto train","park train"],tags:{attraction:"train"},name:"Tourist Train"},"attraction/water_slide":{icon:"maki-swimming",fields:["name","operator","opening_hours"],geometry:["line","area"],terms:["theme park","aquatic park","water park","flumes","water chutes","hydroslides"],tags:{attraction:"water_slide"},name:"Water Slide"},barrier:{icon:"maki-roadblock",geometry:["point","vertex","line","area"],tags:{barrier:"*"},fields:["barrier"],name:"Barrier",matchScore:0.4},"barrier/entrance":{icon:"maki-entrance-alt1",geometry:["vertex"],tags:{barrier:"entrance"},name:"Entrance",searchable:false},"barrier/block":{icon:"maki-roadblock",fields:["access"],geometry:["point","vertex"],tags:{barrier:"block"},name:"Block"},"barrier/bollard":{icon:"maki-roadblock",fields:["access"],geometry:["point","vertex","line"],tags:{barrier:"bollard"},name:"Bollard"},"barrier/border_control":{icon:"maki-roadblock",fields:["access","building_area"],geometry:["vertex","area"],tags:{barrier:"border_control"},name:"Border Control"},"barrier/cattle_grid":{icon:"maki-barrier",geometry:["vertex"],tags:{barrier:"cattle_grid"},name:"Cattle Grid"},"barrier/city_wall":{icon:"maki-barrier",fields:["height"],geometry:["line","area"],tags:{barrier:"city_wall"},name:"City Wall"},"barrier/cycle_barrier":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"cycle_barrier"},name:"Cycle Barrier"},"barrier/ditch":{icon:"maki-roadblock",geometry:["line","area"],tags:{barrier:"ditch"},name:"Trench",matchScore:0.25},"barrier/fence":{icon:"maki-fence",fields:["fence_type","height"],geometry:["line"],tags:{barrier:"fence"},name:"Fence",matchScore:0.25},"barrier/gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex","line"],tags:{barrier:"gate"},name:"Gate"},"barrier/hedge":{fields:["height"],geometry:["line","area"],tags:{barrier:"hedge"},name:"Hedge",matchScore:0.25},"barrier/kerb":{icon:"maki-wheelchair",fields:["kerb","tactile_paving"],geometry:["vertex","line"],tags:{barrier:"kerb"},name:"Kerb"},"barrier/kissing_gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex"],tags:{barrier:"kissing_gate"},name:"Kissing Gate"},"barrier/lift_gate":{icon:"maki-roadblock",fields:["access"],geometry:["vertex","line"],tags:{barrier:"lift_gate"},name:"Lift Gate"},"barrier/retaining_wall":{fields:["height"],geometry:["line","area"],tags:{barrier:"retaining_wall"},name:"Retaining Wall"},"barrier/stile":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"stile"},name:"Stile"},"barrier/toll_booth":{icon:"maki-roadblock",fields:["access","building_area"],geometry:["vertex","area"],tags:{barrier:"toll_booth"},name:"Toll Booth"},"barrier/wall":{icon:"maki-barrier",fields:["wall","height"],geometry:["line","area"],tags:{barrier:"wall"},name:"Wall",matchScore:0.25},"boundary/administrative":{name:"Administrative Boundary",geometry:["line"],tags:{boundary:"administrative"},fields:["name","admin_level"]},building:{icon:"maki-home",fields:["name","building","levels","height","address"],geometry:["point","area"],tags:{building:"*"},matchScore:0.6,terms:[],name:"Building"},"building/bunker":{fields:["name","address","levels","height"],geometry:["area"],tags:{building:"bunker"},matchScore:0.5,name:"Bunker",searchable:false},"building/entrance":{icon:"maki-entrance-alt1",geometry:["vertex"],tags:{building:"entrance"},name:"Entrance/Exit",searchable:false},"building/train_station":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["point","vertex","area"],tags:{building:"train_station"},matchScore:0.5,name:"Train Station",searchable:false},"building/apartments":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"apartments"},matchScore:0.5,name:"Apartments"},"building/barn":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"barn"},matchScore:0.5,name:"Barn"},"building/boathouse":{icon:"maki-harbor",fields:["name","levels","height","address"],geometry:["area"],tags:{building:"boathouse"},matchScore:0.5,terms:[],name:"Boathouse"},"building/bungalow":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"bungalow"},terms:["home","detached"],matchScore:0.5,name:"Bungalow"},"building/cabin":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"cabin"},matchScore:0.5,name:"Cabin"},"building/cathedral":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"cathedral"},matchScore:0.5,name:"Cathedral Building"},"building/chapel":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"chapel"},matchScore:0.5,name:"Chapel Building"},"building/church":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"church"},matchScore:0.5,name:"Church Building"},"building/civic":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["university"],tags:{building:"college"},matchScore:0.5,name:"College Building"},"building/commercial":{icon:"maki-suitcase",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"commercial"},matchScore:0.5,name:"Commercial Building"},"building/construction":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"construction"},matchScore:0.5,name:"Building Under Construction"},"building/detached":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"detached"},terms:["home","single","family","residence","dwelling"],matchScore:0.5,name:"Detached House"},"building/dormitory":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"dormitory"},matchScore:0.5,name:"Dormitory"},"building/farm_auxiliary":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"farm_auxiliary"},matchScore:0.5,name:"Farm Building"},"building/farm":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"farm"},matchScore:0.5,name:"Farm House"},"building/garage":{icon:"fas-warehouse",fields:["name","capacity"],geometry:["area"],tags:{building:"garage"},matchScore:0.5,name:"Garage"},"building/garages":{icon:"fas-warehouse",fields:["name","capacity"],geometry:["area"],tags:{building:"garages"},matchScore:0.5,name:"Garages"},"building/grandstand":{icon:"maki-building",fields:["name","height"],geometry:["area"],tags:{building:"grandstand"},terms:["tribune","stand","stands","bleachers"],matchScore:0.5,name:"Grandstand"},"building/greenhouse":{icon:"maki-garden-center",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"greenhouse"},matchScore:0.5,name:"Greenhouse"},"building/hospital":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"hospital"},matchScore:0.5,name:"Hospital Building"},"building/hotel":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"hotel"},matchScore:0.5,name:"Hotel Building"},"building/house":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"house"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"House"},"building/hut":{geometry:["area"],fields:["name"],tags:{building:"hut"},matchScore:0.5,name:"Hut"},"building/industrial":{icon:"maki-industry",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"industrial"},matchScore:0.5,name:"Industrial Building"},"building/kindergarten":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["kindergarden","pre-school"],tags:{building:"kindergarten"},matchScore:0.5,name:"Preschool/Kindergarten Building"},"building/mosque":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"mosque"},matchScore:0.5,name:"Mosque Building"},"building/public":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"public"},matchScore:0.5,name:"Public Building"},"building/residential":{icon:"maki-residential-community",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"residential"},matchScore:0.5,name:"Residential Building"},"building/retail":{icon:"maki-commercial",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"retail"},matchScore:0.5,name:"Retail Building"},"building/roof":{icon:"maki-shelter",fields:["name","address","layer"],geometry:["area"],tags:{building:"roof"},matchScore:0.5,name:"Roof"},"building/ruins":{icon:"temaki-ruins",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"ruins"},matchScore:0.5,name:"Building Ruins"},"building/school":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["academy","elementary school","middle school","high school"],tags:{building:"school"},matchScore:0.5,name:"School Building"},"building/semidetached_house":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"semidetached_house"},terms:["home","double","duplex","twin","family","residence","dwelling"],matchScore:0.5,name:"Semi-Detached House"},"building/service":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"service"},matchScore:0.5,name:"Service Building"},"building/shed":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"shed"},matchScore:0.5,name:"Shed"},"building/stable":{icon:"maki-horse-riding",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"stable"},matchScore:0.5,name:"Stable"},"building/stadium":{icon:"maki-stadium",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"stadium"},matchScore:0.5,name:"Stadium Building"},"building/static_caravan":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"static_caravan"},matchScore:0.5,name:"Static Mobile Home"},"building/temple":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"temple"},matchScore:0.5,name:"Temple Building"},"building/terrace":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"terrace"},terms:["home","terrace","brownstone","family","residence","dwelling"],matchScore:0.5,name:"Row Houses"},"building/transportation":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"transportation"},matchScore:0.5,name:"Transportation Building"},"building/university":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["college"],tags:{building:"university"},matchScore:0.5,name:"University Building"},"building/warehouse":{icon:"maki-warehouse",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"warehouse"},matchScore:0.5,name:"Warehouse"},"camp_site/camp_pitch":{icon:"maki-campsite",fields:["name","ref"],geometry:["point","area"],terms:["tent","rv"],tags:{camp_site:"camp_pitch"},name:"Camp Pitch"},club:{icon:"maki-heart",fields:["name","club","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{club:"*"},terms:["social"],name:"Club"},craft:{icon:"temaki-tools",fields:["name","craft","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"*"},terms:[],name:"Craft"},"craft/jeweler":{icon:"maki-marker-stroked",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"jeweler"},reference:{key:"shop",value:"jewelry"},name:"Jeweler",searchable:false},"craft/locksmith":{icon:"maki-marker-stroked",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"locksmith"},reference:{key:"shop",value:"locksmith"},name:"Locksmith",searchable:false},"craft/optician":{icon:"maki-marker-stroked",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"optician"},reference:{key:"shop",value:"optician"},name:"Optician",searchable:false},"craft/tailor":{icon:"maki-clothing-store",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["clothes","suit"],tags:{craft:"tailor"},reference:{key:"shop",value:"tailor"},name:"Tailor",searchable:false},"craft/basket_maker":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"basket_maker"},name:"Basket Maker"},"craft/beekeeper":{icon:"maki-farm",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"beekeeper"},name:"Beekeeper"},"craft/blacksmith":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"blacksmith"},name:"Blacksmith"},"craft/boatbuilder":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"boatbuilder"},matchScore:0.4,name:"Boat Builder"},"craft/bookbinder":{icon:"maki-library",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["book repair"],tags:{craft:"bookbinder"},name:"Bookbinder"},"craft/brewery":{icon:"temaki-storage_tank",fields:["name","operator","address","building_area","opening_hours","product"],geometry:["point","area"],terms:["alcohol","beer","beverage","bier","booze","cider"],tags:{craft:"brewery"},name:"Brewery"},"craft/carpenter":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["woodworker"],tags:{craft:"carpenter"},name:"Carpenter"},"craft/carpet_layer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"carpet_layer"},name:"Carpet Layer"},"craft/caterer":{icon:"maki-restaurant",fields:["name","cuisine","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"caterer"},name:"Caterer"},"craft/chimney_sweeper":{icon:"temaki-chimney",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"chimney_sweeper"},name:"Chimney Sweeper"},"craft/clockmaker":{icon:"temaki-clock",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"clockmaker"},name:"Clockmaker"},"craft/confectionery":{icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["sweet","candy"],tags:{craft:"confectionery"},name:"Candy Maker"},"craft/distillery":{icon:"temaki-storage_tank",fields:["name","operator","address","building_area","opening_hours","product"],geometry:["point","area"],terms:["alcohol","beverage","bourbon","booze","brandy","gin","hooch","liquor","mezcal","moonshine","rum","scotch","spirits","still","tequila","vodka","whiskey","whisky"],tags:{craft:"distillery"},name:"Distillery"},"craft/dressmaker":{icon:"maki-clothing-store",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["seamstress"],tags:{craft:"dressmaker"},name:"Dressmaker"},"craft/electrician":{icon:"temaki-power",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["power","wire"],tags:{craft:"electrician"},name:"Electrician"},"craft/electronics_repair":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"electronics_repair"},name:"Electronics Repair Shop"},"craft/gardener":{icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["landscaper","grounds keeper"],tags:{craft:"gardener"},name:"Gardener"},"craft/glaziery":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["glass","stained-glass","window"],tags:{craft:"glaziery"},name:"Glaziery"},"craft/handicraft":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"handicraft"},name:"Handicraft"},"craft/hvac":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["heat*","vent*","air conditioning"],tags:{craft:"hvac"},name:"HVAC"},"craft/insulator":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"insulation"},name:"Insulator"},"craft/key_cutter":{icon:"fas-key",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"key_cutter"},name:"Key Cutter"},"craft/metal_construction":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"metal_construction"},name:"Metal Construction"},"craft/painter":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"painter"},name:"Painter"},"craft/photographer":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"photographer"},name:"Photographer"},"craft/photographic_laboratory":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["film"],tags:{craft:"photographic_laboratory"},name:"Photographic Laboratory"},"craft/plasterer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"plasterer"},name:"Plasterer"},"craft/plumber":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["pipe"],tags:{craft:"plumber"},name:"Plumber"},"craft/pottery":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["ceramic"],tags:{craft:"pottery"},name:"Pottery"},"craft/rigger":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"rigger"},name:"Rigger"},"craft/roofer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"roofer"},name:"Roofer"},"craft/saddler":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"saddler"},name:"Saddler"},"craft/sailmaker":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"sailmaker"},name:"Sailmaker"},"craft/sawmill":{icon:"maki-logging",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["lumber"],tags:{craft:"sawmill"},name:"Sawmill"},"craft/scaffolder":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"scaffolder"},name:"Scaffolder"},"craft/sculptor":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"sculptor"},name:"Sculptor"},"craft/shoemaker":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["cobbler"],tags:{craft:"shoemaker"},name:"Shoemaker"},"craft/stonemason":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["masonry"],tags:{craft:"stonemason"},name:"Stonemason"},"craft/tiler":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"tiler"},name:"Tiler"},"craft/tinsmith":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"tinsmith"},name:"Tinsmith"},"craft/upholsterer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"upholsterer"},name:"Upholsterer"},"craft/watchmaker":{icon:"temaki-clock",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"watchmaker"},name:"Watchmaker"},"craft/window_construction":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["glass"],tags:{craft:"window_construction"},name:"Window Construction"},"craft/winery":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"winery"},name:"Winery"},embankment:{geometry:["line"],tags:{embankment:"yes"},name:"Embankment",matchScore:0.2},"emergency/designated":{fields:[],geometry:["line"],tags:{emergency:"designated"},terms:[],name:"Emergency Access Designated",searchable:false,matchScore:0.01},"emergency/destination":{fields:[],geometry:["line"],tags:{emergency:"destination"},terms:[],name:"Emergency Access Destination",searchable:false,matchScore:0.01},"emergency/no":{fields:[],geometry:["line"],tags:{emergency:"no"},terms:[],name:"Emergency Access No",searchable:false,matchScore:0.01},"emergency/official":{fields:[],geometry:["line"],tags:{emergency:"official"},terms:[],name:"Emergency Access Official",searchable:false,matchScore:0.01},"emergency/private":{fields:[],geometry:["line"],tags:{emergency:"private"},terms:[],name:"Emergency Access Private",searchable:false,matchScore:0.01},"emergency/yes":{fields:[],geometry:["line"],tags:{emergency:"yes"},terms:[],name:"Emergency Access Yes",searchable:false,matchScore:0.01},"emergency/ambulance_station":{icon:"fas-ambulance",fields:["name","operator","building_area","address"],geometry:["point","area"],terms:["EMS","EMT","rescue"],tags:{emergency:"ambulance_station"},name:"Ambulance Station"},"emergency/defibrillator":{icon:"maki-defibrillator",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["AED"],tags:{emergency:"defibrillator"},name:"Defibrillator"},"emergency/fire_alarm":{icon:"fas-bell",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_alarm_box"},name:"Fire Alarm Call Box"},"emergency/fire_extinguisher":{icon:"fas-fire-extinguisher",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_extinguisher"},name:"Fire Extinguisher"},"emergency/fire_hydrant":{icon:"temaki-fire_hydrant",fields:["fire_hydrant/type","fire_hydrant/position","ref","operator"],geometry:["point","vertex"],terms:["fire plug"],tags:{emergency:"fire_hydrant"},name:"Fire Hydrant"},"emergency/first_aid_kit":{icon:"fas-medkit",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["bandage","first aid","med","med kit","medic*","medkit"],tags:{emergency:"first_aid_kit"},name:"First Aid Kit"},"emergency/life_ring":{icon:"fas-life-ring",fields:["ref","operator"],geometry:["point","vertex"],terms:["life buoy","kisby ring","kisbie ring","perry buoy"],tags:{emergency:"life_ring"},name:"Life Ring"},"emergency/lifeguard":{icon:"fas-life-ring",fields:["ref","operator","building_area","opening_hours"],geometry:["point","area"],terms:["CPR","rescue"],tags:{emergency:"lifeguard"},name:"Lifeguard"},"emergency/phone":{icon:"maki-emergency-phone",fields:["ref","operator","covered","indoor","booth"],geometry:["point","vertex"],tags:{emergency:"phone"},name:"Emergency Phone"},"emergency/siren":{icon:"fas-volume-up",fields:["siren/purpose","siren/type","ref","operator"],geometry:["point","vertex"],terms:["air raid","loud","noise","storm","tornado","warning"],tags:{emergency:"siren"},name:"Siren"},"emergency/water_tank":{icon:"maki-water",fields:["name","ref","operator"],geometry:["point","vertex"],terms:["water tank","cistern","reservoir"],tags:{emergency:"water_tank"},name:"Emergency Water Tank"},entrance:{icon:"maki-entrance-alt1",geometry:["vertex"],terms:["entrance","exit","door"],tags:{entrance:"*"},fields:["entrance","access_simple","address"],name:"Entrance/Exit"},"footway/crossing-raised":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Raised Street Crossing"},"footway/crossing":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing"},reference:{key:"footway",value:"crossing"},terms:[],name:"Street Crossing"},"footway/crosswalk-raised":{icon:"iD-highway-footway",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","flat top","hump","speed","slow"],name:"Raised Pedestrian Crosswalk"},"footway/crosswalk":{icon:"iD-highway-footway",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing"],name:"Pedestrian Crosswalk"},"footway/sidewalk":{icon:"iD-highway-footway",fields:["surface","lit","width","structure","access"],geometry:["line"],tags:{highway:"footway",footway:"sidewalk"},reference:{key:"footway",value:"sidewalk"},terms:[],name:"Sidewalk"},ford:{geometry:["vertex"],tags:{ford:"yes"},name:"Ford"},"golf/bunker":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"bunker",natural:"sand"},terms:["hazard","bunker"],reference:{key:"golf",value:"bunker"},name:"Sand Trap"},"golf/fairway":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"fairway",landuse:"grass"},reference:{key:"golf",value:"fairway"},name:"Fairway"},"golf/green":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"green",landuse:"grass",leisure:"pitch",sport:"golf"},reference:{key:"golf",value:"green"},name:"Putting Green"},"golf/hole":{icon:"maki-golf",fields:["name","ref_golf_hole","par","handicap"],geometry:["line"],tags:{golf:"hole"},name:"Golf Hole"},"golf/lateral_water_hazard_area":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"lateral_water_hazard",natural:"water"},reference:{key:"golf",value:"lateral_water_hazard"},name:"Lateral Water Hazard"},"golf/lateral_water_hazard_line":{icon:"maki-golf",fields:["name"],geometry:["line"],tags:{golf:"lateral_water_hazard"},name:"Lateral Water Hazard"},"golf/rough":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"rough",landuse:"grass"},reference:{key:"golf",value:"rough"},name:"Rough"},"golf/tee":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"tee",landuse:"grass"},terms:["teeing ground"],reference:{key:"golf",value:"tee"},name:"Tee Box"},"golf/water_hazard_area":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"water_hazard",natural:"water"},reference:{key:"golf",value:"water_hazard"},name:"Water Hazard"},"golf/water_hazard_line":{icon:"maki-golf",fields:["name"],geometry:["line"],tags:{golf:"water_hazard"},name:"Water Hazard"},healthcare:{icon:"maki-hospital",fields:["name","healthcare","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],tags:{healthcare:"*"},terms:["clinic","doctor","disease","health","institution","sick","surgery","wellness"],name:"Healthcare Facility"},"healthcare/alternative":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["acupuncture","anthroposophical","applied kinesiology","aromatherapy","ayurveda","herbalism","homeopathy","hydrotherapy","hypnosis","naturopathy","osteopathy","reflexology","reiki","shiatsu","traditional","tuina","unani"],tags:{healthcare:"alternative"},name:"Alternative Medicine"},"healthcare/alternative/chiropractic":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["back","pain","spine"],tags:{healthcare:"alternative","healthcare:speciality":"chiropractic"},name:"Chiropractor"},"healthcare/audiologist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["ear","hearing","sound"],tags:{healthcare:"audiologist"},name:"Audiologist"},"healthcare/birthing_center":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"birthing_center"},name:"Birthing Center"},"healthcare/blood_donation":{icon:"maki-blood-bank",fields:["name","operator","healthcare/speciality","blood_components","address","building_area","opening_hours"],geometry:["point","area"],terms:["blood bank","blood donation","blood transfusion","apheresis","plasmapheresis","plateletpheresis","stem cell donation"],tags:{healthcare:"blood_donation"},name:"Blood Donor Center"},"healthcare/hospice":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["terminal","illness"],tags:{healthcare:"hospice"},name:"Hospice"},"healthcare/laboratory":{icon:"maki-hospital",fields:["name","operator","website","ref","address","opening_hours"],geometry:["point","area"],terms:["medical_laboratory","medical_lab","blood_check"],tags:{healthcare:"laboratory"},name:"Medical Laboratory"},"healthcare/midwife":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"midwife"},name:"Midwife"},"healthcare/occupational_therapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["therapist","therapy"],tags:{healthcare:"occupational_therapist"},name:"Occupational Therapist"},"healthcare/optometrist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["eye","glasses","lasik","lenses","vision"],tags:{healthcare:"optometrist"},name:"Optometrist"},"healthcare/physiotherapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["physical","therapist","therapy"],tags:{healthcare:"physiotherapist"},name:"Physiotherapist"},"healthcare/podiatrist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["foot","feet","nails"],tags:{healthcare:"podiatrist"},name:"Podiatrist"},"healthcare/psychotherapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],tags:{healthcare:"psychotherapist"},name:"Psychotherapist"},"healthcare/rehabilitation":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["rehab","therapist","therapy"],tags:{healthcare:"rehabilitation"},name:"Rehabilitation Facility"},"healthcare/speech_therapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["speech","therapist","therapy","voice"],tags:{healthcare:"speech_therapist"},name:"Speech Therapist"},"highway/bus_stop":{icon:"maki-bus",fields:["name","network","operator","bench","shelter"],geometry:["point","vertex"],tags:{highway:"bus_stop"},name:"Bus Stop / Platform",searchable:false},"highway/bridleway":{fields:["name","surface","width","structure","access"],icon:"iD-highway-bridleway",geometry:["line"],tags:{highway:"bridleway"},terms:["bridleway","equestrian","horse","trail"],name:"Bridle Path"},"highway/bus_guideway":{icon:"iD-highway-bus-guideway",fields:["name","operator","oneway"],geometry:["line"],tags:{highway:"bus_guideway"},addTags:{highway:"bus_guideway",access:"no",bus:"designated"},removeTags:{highway:"bus_guideway",access:"no",bus:"designated"},terms:[],name:"Bus Guideway"},"highway/corridor":{icon:"iD-highway-footway",fields:["name","width","level","access_simple"],geometry:["line"],tags:{highway:"corridor"},terms:["gallery","hall","hallway","indoor","passage","passageway"],name:"Indoor Corridor"},"highway/crossing-raised":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Raised Street Crossing"},"highway/crossing":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing"},reference:{key:"highway",value:"crossing"},terms:[],name:"Street Crossing"},"highway/crosswalk-raised":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","flat top","hump","speed","slow"],name:"Raised Pedestrian Crosswalk"},"highway/crosswalk":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing"],name:"Pedestrian Crosswalk"},"highway/cycleway":{icon:"iD-highway-cycleway",fields:["name","oneway","surface","lit","width","structure","access"],geometry:["line"],tags:{highway:"cycleway"},terms:["bike"],name:"Cycle Path"},"highway/elevator":{icon:"temaki-elevator",fields:["access_simple","opening_hours","maxweight","ref"],geometry:["vertex"],tags:{highway:"elevator"},terms:["lift"],name:"Elevator"},"highway/footway":{icon:"iD-highway-footway",fields:["name","surface","lit","width","structure","access"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"footway"},name:"Foot Path"},"highway/give_way":{icon:"temaki-yield",fields:["direction_vertex"],geometry:["vertex"],tags:{highway:"give_way"},terms:["give way","yield","sign"],name:"Yield Sign"},"highway/living_street":{icon:"iD-highway-living-street",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","access","cycleway"],geometry:["line"],tags:{highway:"living_street"},name:"Living Street"},"highway/mini_roundabout":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"mini_roundabout"},fields:["direction_clock"],name:"Mini-Roundabout"},"highway/motorway_junction":{icon:"temaki-junction",fields:["ref_highway_junction","name"],geometry:["vertex"],tags:{highway:"motorway_junction"},terms:["exit"],name:"Motorway Junction / Exit"},"highway/motorway_link":{icon:"iD-highway-motorway-link",fields:["name","ref_road_number","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"motorway_link"},addTags:{highway:"motorway_link",oneway:"yes"},removeTags:{highway:"motorway_link",oneway:"yes"},terms:["exit","ramp","road","street","on ramp","off ramp"],name:"Motorway Link"},"highway/motorway":{icon:"iD-highway-motorway",fields:["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","maxheight","toll","access"],geometry:["line"],tags:{highway:"motorway"},terms:["autobahn","expressway","freeway","highway","interstate","parkway","road","street","thruway","turnpike"],name:"Motorway"},"highway/passing_place":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"passing_place"},terms:["turnout, pullout"],name:"Passing Place"},"highway/path":{icon:"iD-highway-path",fields:["name","surface","width","structure","access","incline","sac_scale","trail_visibility","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","ref"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"path"},name:"Path"},"highway/pedestrian_area":{icon:"temaki-pedestrian",fields:["name","surface","lit","width","structure","access"],geometry:["area"],tags:{highway:"pedestrian",area:"yes"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Area"},"highway/pedestrian_line":{icon:"iD-highway-footway",fields:["name","surface","lit","width","oneway","structure","access"],geometry:["line"],tags:{highway:"pedestrian"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Street"},"highway/primary_link":{icon:"iD-highway-primary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","maxheight","ref_road_number","cycleway","structure","access"],geometry:["line"],tags:{highway:"primary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Primary Link"},"highway/primary":{icon:"iD-highway-primary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"primary"},terms:["road","street"],name:"Primary Road"},"highway/raceway":{icon:"iD-highway-unclassified",fields:["name","oneway","surface","sport_racing_motor","lit","width","lanes","structure"],geometry:["point","line","area"],tags:{highway:"raceway"},addTags:{highway:"raceway",sport:"motor"},terms:["auto*","formula one","kart","motocross","nascar","race*","track"],name:"Racetrack (Motorsport)"},"highway/residential":{icon:"iD-highway-residential",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],geometry:["line"],tags:{highway:"residential"},terms:["road","street"],name:"Residential Road"},"highway/rest_area":{icon:"maki-car",fields:["name"],geometry:["point","vertex","area"],tags:{highway:"rest_area"},terms:["rest stop"],name:"Rest Area"},"highway/road":{icon:"iD-highway-road",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"road"},terms:["road","street"],name:"Unknown Road"},"highway/secondary_link":{icon:"iD-highway-secondary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"secondary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Secondary Link"},"highway/secondary":{icon:"iD-highway-secondary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"secondary"},terms:["road","street"],name:"Secondary Road"},"highway/service":{icon:"iD-highway-service",fields:["name","service","oneway","maxspeed","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"service"},terms:["road","street"],name:"Service Road"},"highway/service/alley":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"alley"},reference:{key:"service",value:"alley"},name:"Alley"},"highway/service/drive-through":{icon:"iD-highway-service",fields:["name","oneway","covered","maxheight","maxspeed","structure","access","surface"],geometry:["line"],tags:{highway:"service",service:"drive-through"},reference:{key:"service",value:"drive-through"},name:"Drive-Through"},"highway/service/driveway":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"driveway"},reference:{key:"service",value:"driveway"},name:"Driveway"},"highway/service/emergency_access":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"emergency_access"},reference:{key:"service",value:"emergency_access"},name:"Emergency Access"},"highway/service/parking_aisle":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"parking_aisle"},reference:{key:"service",value:"parking_aisle"},name:"Parking Aisle"},"highway/services":{icon:"maki-car",fields:["name"],geometry:["point","vertex","area"],tags:{highway:"services"},terms:["services","travel plaza","service station"],name:"Service Area"},"highway/speed_camera":{icon:"maki-attraction",geometry:["point","vertex"],fields:["direction","ref"],tags:{highway:"speed_camera"},terms:[],name:"Speed Camera"},"highway/steps":{icon:"iD-highway-steps",fields:["surface","lit","width","incline_steps","handrail","step_count"],geometry:["line"],tags:{highway:"steps"},terms:["stairs","staircase"],name:"Steps"},"highway/stop":{icon:"temaki-stop",fields:["stop","direction_vertex"],geometry:["vertex"],tags:{highway:"stop"},terms:["stop","halt","sign"],name:"Stop Sign"},"highway/street_lamp":{icon:"temaki-bulb",geometry:["point","vertex"],tags:{highway:"street_lamp"},fields:["lamp_type","direction","ref"],terms:["streetlight","street light","lamp","light","gaslight"],name:"Street Lamp"},"highway/tertiary_link":{icon:"iD-highway-tertiary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"tertiary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Tertiary Link"},"highway/tertiary":{icon:"iD-highway-tertiary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"tertiary"},terms:["road","street"],name:"Tertiary Road"},"highway/track":{icon:"iD-highway-track",fields:["name","tracktype","surface","width","structure","access","incline","smoothness","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale"],geometry:["line"],tags:{highway:"track"},terms:["woods road","forest road","logging road","fire road","farm road","agricultural road","ranch road","carriage road","primitive","unmaintained","rut","offroad","4wd","4x4","four wheel drive","atv","quad","jeep","double track","two track"],name:"Unmaintained Track Road"},"highway/traffic_mirror":{geometry:["point","vertex"],fields:["direction"],tags:{highway:"traffic_mirror"},terms:["blind spot","convex","corner","curved","roadside","round","safety","sphere","visibility"],name:"Traffic Mirror"},"highway/traffic_signals":{icon:"temaki-traffic_signals",geometry:["vertex"],tags:{highway:"traffic_signals"},fields:["traffic_signals","traffic_signals/direction"],terms:["light","stoplight","traffic light"],name:"Traffic Signals"},"highway/trunk_link":{icon:"iD-highway-trunk-link",fields:["name","ref_road_number","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"trunk_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Trunk Link"},"highway/trunk":{icon:"iD-highway-trunk",fields:["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","toll","access"],geometry:["line"],tags:{highway:"trunk"},terms:["road","street"],name:"Trunk Road"},"highway/turning_circle":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"turning_circle"},terms:["cul-de-sac"],name:"Turning Circle"},"highway/turning_loop":{icon:"maki-circle",geometry:["vertex"],tags:{highway:"turning_loop"},terms:["cul-de-sac"],name:"Turning Loop (Island)"},"highway/unclassified":{icon:"iD-highway-unclassified",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],geometry:["line"],tags:{highway:"unclassified"},terms:["road","street"],name:"Minor/Unclassified Road"},historic:{icon:"temaki-ruins",fields:["historic","inscription"],geometry:["point","vertex","area"],tags:{historic:"*"},name:"Historic Site"},"historic/archaeological_site":{icon:"temaki-ruins",fields:["name","site_type","historic/civilization","inscription"],geometry:["point","vertex","area"],tags:{historic:"archaeological_site"},name:"Archaeological Site"},"historic/boundary_stone":{icon:"temaki-milestone",fields:["name","inscription"],geometry:["point","vertex"],tags:{historic:"boundary_stone"},name:"Boundary Stone"},"historic/castle":{icon:"maki-castle",fields:["name","castle_type","building_area","historic/civilization"],geometry:["point","area"],tags:{historic:"castle"},name:"Castle"},"historic/memorial":{icon:"maki-monument",fields:["name","memorial","inscription"],geometry:["point","vertex","area"],terms:["dedicatory","epitaph","remember","remembrance","memory","monument","stolperstein"],tags:{historic:"memorial"},name:"Memorial"},"historic/monument":{icon:"maki-monument",fields:["name","inscription"],geometry:["point","vertex","area"],tags:{historic:"monument"},name:"Monument"},"historic/ruins":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription"],geometry:["point","vertex","area"],tags:{historic:"ruins"},name:"Ruins"},"historic/tomb":{icon:"maki-cemetery",fields:["name","tomb","building_area","inscription"],geometry:["point","area"],tags:{historic:"tomb"},name:"Tomb"},"historic/wayside_cross":{icon:"maki-religious-christian",fields:["name","inscription"],geometry:["point","vertex","area"],tags:{historic:"wayside_cross"},name:"Wayside Cross"},"historic/wayside_shrine":{icon:"maki-landmark",fields:["name","religion","denomination","inscription"],geometry:["point","vertex","area"],tags:{historic:"wayside_shrine"},name:"Wayside Shrine"},junction:{icon:"temaki-junction",fields:["name"],geometry:["vertex","area"],tags:{junction:"yes"},name:"Junction"},landuse:{fields:["name","landuse"],geometry:["area"],tags:{landuse:"*"},matchScore:0.9,name:"Land Use"},"landuse/farm":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["point","area"],tags:{landuse:"farm"},terms:[],name:"Farmland",searchable:false},"landuse/allotments":{icon:"maki-garden-center",geometry:["area"],fields:["name"],tags:{landuse:"allotments"},terms:["allotment","garden"],name:"Community Garden"},"landuse/aquaculture":{icon:"maki-aquarium",fields:["name","operator","produce"],geometry:["area"],tags:{landuse:"aquaculture"},terms:["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],name:"Aquaculture"},"landuse/basin":{icon:"maki-water",fields:["name"],geometry:["area"],tags:{landuse:"basin"},terms:[],name:"Basin"},"landuse/brownfield":{geometry:["area"],fields:["name"],tags:{landuse:"brownfield"},terms:[],matchScore:0.9,name:"Brownfield"},"landuse/cemetery":{icon:"maki-cemetery",fields:["name","religion","denomination"],geometry:["area"],tags:{landuse:"cemetery"},terms:[],name:"Cemetery"},"landuse/churchyard":{icon:"maki-religious-christian",fields:["name","religion","denomination"],geometry:["area"],tags:{landuse:"churchyard"},terms:[],name:"Churchyard"},"landuse/commercial":{icon:"maki-suitcase",fields:["name"],geometry:["area"],tags:{landuse:"commercial"},terms:[],matchScore:0.9,name:"Commercial Area"},"landuse/construction":{icon:"temaki-tools",fields:["name","construction","operator"],geometry:["area"],tags:{landuse:"construction"},terms:[],name:"Construction"},"landuse/farmland":{icon:"maki-farm",fields:["name","operator","crop","produce"],geometry:["area"],tags:{landuse:"farmland"},terms:["crop","grow","plant"],name:"Farmland"},"landuse/farmyard":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["area"],tags:{landuse:"farmyard"},terms:["crop","grow","plant"],name:"Farmyard"},"landuse/forest":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle","produce"],geometry:["area"],tags:{landuse:"forest"},terms:["cut","forest","lumber","tree"],name:"Forest"},"landuse/garages":{icon:"fas-warehouse",geometry:["area"],fields:["name"],tags:{landuse:"garages"},terms:[],name:"Garage Landuse"},"landuse/grass":{geometry:["area"],tags:{landuse:"grass"},terms:[],name:"Grass"},"landuse/greenfield":{geometry:["area"],fields:["name"],tags:{landuse:"greenfield"},terms:[],matchScore:0.9,name:"Greenfield"},"landuse/greenhouse_horticulture":{icon:"maki-garden",fields:["name","operator"],geometry:["area"],terms:["flower","greenhouse","horticulture","grow","vivero"],tags:{landuse:"greenhouse_horticulture"},matchScore:0.9,name:"Greenhouse Horticulture"},"landuse/harbour":{icon:"maki-harbor",fields:["name","operator"],geometry:["area"],terms:["boat"],tags:{landuse:"harbour"},name:"Harbor"},"landuse/industrial":{icon:"maki-industry",fields:["name","industrial"],geometry:["area"],tags:{landuse:"industrial"},terms:[],matchScore:0.9,name:"Industrial Area"},"landuse/industrial/scrap_yard":{icon:"maki-car",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{industrial:"scrap_yard"},addTags:{landuse:"industrial",industrial:"scrap_yard"},removeTags:{landuse:"industrial",industrial:"scrap_yard"},reference:{key:"industrial",value:"scrap_yard"},terms:["car","junk","metal","salvage","scrap","u-pull-it","vehicle","wreck","yard"],name:"Scrap Yard"},"landuse/industrial/slaughterhouse":{icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{industrial:"slaughterhouse"},addTags:{landuse:"industrial",industrial:"slaughterhouse"},removeTags:{landuse:"industrial",industrial:"slaughterhouse"},reference:{key:"industrial",value:"slaughterhouse"},terms:["abattoir","beef","butchery","calf","chicken","cow","killing house","meat","pig","pork","poultry","shambles","stockyard"],name:"Slaughterhouse"},"landuse/landfill":{geometry:["area"],fields:["name"],tags:{landuse:"landfill"},terms:["dump"],name:"Landfill"},"landuse/meadow":{icon:"maki-garden",geometry:["area"],fields:["name"],tags:{landuse:"meadow"},terms:[],name:"Meadow"},"landuse/military":{icon:"temaki-military",fields:["name"],geometry:["area"],tags:{landuse:"military"},terms:[],matchScore:0.9,name:"Military Area"},"landuse/military/airfield":{icon:"maki-airfield",fields:["name","iata","icao"],geometry:["point","area"],tags:{military:"airfield"},addTags:{aeroway:"aerodrome",landuse:"military",military:"airfield"},removeTags:{aeroway:"aerodrome",landuse:"military",military:"airfield"},reference:{key:"military",value:"airfield"},terms:["aerodrome","aeroway","air force","airplane","airport","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],name:"Military Airfield"},"landuse/military/barracks":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"barracks"},addTags:{landuse:"military",military:"barracks"},removeTags:{landuse:"military",military:"barracks"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Barracks"},"landuse/military/bunker":{icon:"temaki-military",fields:["name","bunker_type","building_area"],geometry:["point","area"],tags:{military:"bunker"},addTags:{building:"bunker",landuse:"military",military:"bunker"},removeTags:{building:"bunker",landuse:"military",military:"bunker"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Military Bunker"},"landuse/military/checkpoint":{icon:"maki-barrier",fields:["name"],geometry:["point","vertex","area"],tags:{military:"checkpoint"},addTags:{landuse:"military",military:"checkpoint"},removeTags:{landuse:"military",military:"checkpoint"},terms:["air force","army","base","force","guard","marine","navy","troop","war"],name:"Checkpoint"},"landuse/military/danger_area":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"danger_area"},addTags:{landuse:"military",military:"danger_area"},removeTags:{landuse:"military",military:"danger_area"},terms:["air force","army","base","blast","bomb","explo*","force","guard","mine","marine","navy","troop","war"],name:"Danger Area"},"landuse/military/naval_base":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"naval_base"},addTags:{landuse:"military",military:"naval_base"},removeTags:{landuse:"military",military:"naval_base"},terms:["base","fight","force","guard","marine","navy","ship","sub","troop","war"],name:"Naval Base"},"landuse/military/nuclear_explosion_site":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"nuclear_explosion_site"},addTags:{landuse:"military",military:"nuclear_explosion_site"},removeTags:{landuse:"military",military:"nuclear_explosion_site"},terms:["atom","blast","bomb","detonat*","nuke","site","test"],name:"Nuclear Explosion Site"},"landuse/military/obstacle_course":{icon:"temaki-military",geometry:["point","area"],tags:{military:"obstacle_course"},addTags:{landuse:"military",military:"obstacle_course"},removeTags:{landuse:"military",military:"obstacle_course"},terms:["army","base","force","guard","marine","navy","troop","war"],name:"Obstacle Course"},"landuse/military/office":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"office"},addTags:{landuse:"military",military:"office"},removeTags:{landuse:"military",military:"office"},terms:["air force","army","base","enlist","fight","force","guard","marine","navy","recruit","troop","war"],name:"Military Office"},"landuse/military/range":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"range"},addTags:{landuse:"military",military:"range"},removeTags:{landuse:"military",military:"range"},terms:["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],name:"Military Range"},"landuse/military/training_area":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"training_area"},addTags:{landuse:"military",military:"training_area"},removeTags:{landuse:"military",military:"training_area"},terms:["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],name:"Training Area"},"landuse/orchard":{icon:"maki-park-alt1",fields:["name","operator","trees"],geometry:["area"],tags:{landuse:"orchard"},terms:["fruit"],name:"Orchard"},"landuse/plant_nursery":{icon:"maki-garden",fields:["name","operator","plant"],geometry:["area"],tags:{landuse:"plant_nursery"},terms:["flower","garden","grow","vivero"],name:"Plant Nursery"},"landuse/quarry":{geometry:["area"],fields:["name"],tags:{landuse:"quarry"},terms:[],name:"Quarry"},"landuse/railway":{icon:"maki-rail",fields:["operator"],geometry:["area"],tags:{landuse:"railway"},terms:["rail","train","track"],name:"Railway Corridor"},"landuse/recreation_ground":{icon:"maki-pitch",geometry:["area"],fields:["name"],tags:{landuse:"recreation_ground"},terms:["playing fields"],name:"Recreation Ground"},"landuse/religious":{icon:"maki-place-of-worship",geometry:["area"],fields:["name","religion","denomination"],tags:{landuse:"religious"},terms:[],name:"Religious Area"},"landuse/residential":{icon:"maki-building",geometry:["area"],tags:{landuse:"residential"},terms:[],matchScore:0.9,name:"Residential Area"},"landuse/retail":{icon:"maki-commercial",geometry:["area"],fields:["name"],tags:{landuse:"retail"},matchScore:0.9,name:"Retail Area"},"landuse/vineyard":{fields:["name","operator","grape_variety"],geometry:["area"],tags:{landuse:"vineyard"},addTags:{landuse:"vineyard",crop:"grape"},removeTags:{landuse:"vineyard",crop:"grape",grape_variety:"*"},terms:["grape","wine"],name:"Vineyard"},leisure:{icon:"maki-pitch",fields:["name","leisure"],geometry:["point","vertex","area"],tags:{leisure:"*"},name:"Leisure"},"leisure/adult_gaming_centre":{icon:"temaki-dice",fields:["name","operator","address","building_area","opening_hours","smoking"],geometry:["point","area"],terms:["gambling","slot machine"],tags:{leisure:"adult_gaming_centre"},name:"Adult Gaming Center"},"leisure/amusement_arcade":{icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["pay-to-play games","video games","driving simulators","pinball machines"],tags:{leisure:"amusement_arcade"},name:"Amusement Arcade"},"leisure/beach_resort":{icon:"temaki-beach",fields:["name","address","fee"],geometry:["point","area"],tags:{leisure:"beach_resort"},name:"Beach Resort"},"leisure/bird_hide":{icon:"temaki-binoculars",fields:["building_area"],geometry:["point","area"],tags:{leisure:"bird_hide"},terms:["machan","ornithology"],name:"Bird Hide"},"leisure/bleachers":{geometry:["point","area"],tags:{leisure:"bleachers"},terms:["crowd","bench","sports","stand","stands","seat","seating"],name:"Bleachers"},"leisure/bowling_alley":{icon:"temaki-bowling",fields:["name","operator","address","building_area","opening_hours","smoking"],geometry:["point","area"],terms:["bowling center"],tags:{leisure:"bowling_alley"},name:"Bowling Alley"},"leisure/common":{icon:"temaki-pedestrian",geometry:["point","area"],fields:["name"],terms:["open space"],tags:{leisure:"common"},name:"Common"},"leisure/dance":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style","opening_hours"],geometry:["point","area"],terms:["ballroom","jive","swing","tango","waltz"],tags:{leisure:"dance"},name:"Dance Hall"},"leisure/dancing_school":{icon:"maki-music",fields:["name","operator","address","opening_hours","dance/style"],geometry:["point","area"],terms:["jive","swing","tango","waltz","dance teaching"],tags:{leisure:"dance","dance:teaching":"yes"},reference:{key:"leisure",value:"dance"},name:"Dance School"},"leisure/dog_park":{icon:"maki-dog-park",geometry:["point","area"],fields:["name"],terms:[],tags:{leisure:"dog_park"},name:"Dog Park"},"leisure/firepit":{icon:"maki-fire-station",fields:["access_simple"],geometry:["point","area"],tags:{leisure:"firepit"},terms:["fireplace","campfire"],name:"Firepit"},"leisure/fitness_centre":{icon:"maki-pitch",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre"},terms:["health","gym","leisure","studio"],name:"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{icon:"maki-pitch",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],terms:["studio"],tags:{leisure:"fitness_centre",sport:"yoga"},reference:{key:"sport",value:"yoga"},name:"Yoga Studio"},"leisure/fitness_station":{icon:"maki-pitch",fields:["fitness_station","ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station"},addTags:{leisure:"fitness_station",sport:"fitness"},removeTags:{leisure:"fitness_station",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","trim trail"],name:"Outdoor Fitness Station"},"leisure/fitness_station/balance_beam":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"balance_beam"},addTags:{leisure:"fitness_station",fitness_station:"balance_beam",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"balance_beam",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["balance","exercise","fitness","gym","trim trail"],name:"Exercise Balance Beam"},"leisure/fitness_station/box":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"box"},addTags:{leisure:"fitness_station",fitness_station:"box",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"box",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["box","exercise","fitness","gym","jump","trim trail"],name:"Exercise Box"},"leisure/fitness_station/horizontal_bar":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_bar"},addTags:{leisure:"fitness_station",fitness_station:"horizontal_bar",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"horizontal_bar",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","chinup","chin up","exercise","fitness","gym","pullup","pull up","trim trail"],name:"Exercise Horizontal Bar"},"leisure/fitness_station/horizontal_ladder":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_ladder"},addTags:{leisure:"fitness_station",fitness_station:"horizontal_ladder",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"horizontal_ladder",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","chinup","chin up","exercise","fitness","gym","ladder","monkey bars","pullup","pull up","trim trail"],name:"Exercise Monkey Bars"},"leisure/fitness_station/hyperextension":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"hyperextension"},addTags:{leisure:"fitness_station",fitness_station:"hyperextension",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"hyperextension",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["back","exercise","extension","fitness","gym","roman chair","trim trail"],name:"Hyperextension Station"},"leisure/fitness_station/parallel_bars":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"parallel_bars"},addTags:{leisure:"fitness_station",fitness_station:"parallel_bars",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"parallel_bars",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","dip","exercise","fitness","gym","trim trail"],name:"Parallel Bars"},"leisure/fitness_station/push-up":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"push-up"},addTags:{leisure:"fitness_station",fitness_station:"push-up",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"push-up",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","exercise","fitness","gym","pushup","push up","trim trail"],name:"Push-Up Station"},"leisure/fitness_station/rings":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"rings"},addTags:{leisure:"fitness_station",fitness_station:"rings",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"rings",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","muscle up","pullup","pull up","trim trail"],name:"Exercise Rings"},"leisure/fitness_station/sign":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sign"},addTags:{leisure:"fitness_station",fitness_station:"sign",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"sign",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","trim trail"],name:"Exercise Instruction Sign"},"leisure/fitness_station/sit-up":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sit-up"},addTags:{leisure:"fitness_station",fitness_station:"sit-up",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"sit-up",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["crunch","exercise","fitness","gym","situp","sit up","trim trail"],name:"Sit-Up Station"},"leisure/fitness_station/stairs":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"stairs"},addTags:{leisure:"fitness_station",fitness_station:"stairs",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"stairs",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","steps","trim trail"],name:"Exercise Stairs"},"leisure/garden":{icon:"maki-garden",fields:["name","access_simple"],geometry:["point","vertex","area"],tags:{leisure:"garden"},name:"Garden"},"leisure/golf_course":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["links"],tags:{leisure:"golf_course"},name:"Golf Course"},"leisure/hackerspace":{icon:"maki-commercial",fields:["name","address","building_area","opening_hours","website"],geometry:["point","area"],terms:["makerspace","hackspace","hacklab"],tags:{leisure:"hackerspace"},name:"Hackerspace"},"leisure/horse_riding":{icon:"maki-horse-riding",fields:["name","access_simple","operator","address","building"],geometry:["point","area"],terms:["equestrian","stable"],tags:{leisure:"horse_riding"},name:"Horseback Riding Facility"},"leisure/ice_rink":{icon:"maki-pitch",fields:["name","seasonal","sport_ice","operator","address","building","opening_hours"],geometry:["point","area"],terms:["hockey","skating","curling"],tags:{leisure:"ice_rink"},name:"Ice Rink"},"leisure/marina":{icon:"maki-harbor",fields:["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],terms:["boat"],tags:{leisure:"marina"},name:"Marina"},"leisure/miniature_golf":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["crazy golf","mini golf","putt-putt"],tags:{leisure:"miniature_golf"},name:"Miniature Golf"},"leisure/nature_reserve":{icon:"maki-park",geometry:["point","area"],fields:["name"],tags:{leisure:"nature_reserve"},terms:["protected","wildlife"],name:"Nature Reserve"},"leisure/outdoor_seating":{icon:"maki-picnic-site",geometry:["point","area"],fields:["name","operator"],terms:["al fresco","beer garden","dining","cafe","restaurant","pub","bar","patio"],tags:{leisure:"outdoor_seating"},name:"Outdoor Seating Area"},"leisure/park":{icon:"maki-park",geometry:["point","area"],fields:["name"],terms:["esplanade","estate","forest","garden","grass","green","grounds","lawn","lot","meadow","parkland","place","playground","plaza","pleasure garden","recreation area","square","tract","village green","woodland"],tags:{leisure:"park"},name:"Park"},"leisure/picnic_table":{icon:"maki-picnic-site",geometry:["point"],tags:{leisure:"picnic_table"},terms:["bench"],name:"Picnic Table"},"leisure/pitch":{icon:"maki-pitch",fields:["name","sport","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch"},terms:["field"],name:"Sport Pitch"},"leisure/pitch/american_football":{icon:"maki-america-football",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"american_football"},reference:{key:"sport",value:"american_football"},terms:[],name:"American Football Field"},"leisure/pitch/badminton":{icon:"maki-tennis",fields:["name","surface","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"badminton"},reference:{key:"sport",value:"badminton"},terms:[],name:"Badminton Court"},"leisure/pitch/baseball":{icon:"maki-baseball",fields:["name","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"baseball"},reference:{key:"sport",value:"baseball"},terms:[],name:"Baseball Diamond"},"leisure/pitch/basketball":{icon:"maki-basketball",fields:["name","surface","hoops","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"basketball"},reference:{key:"sport",value:"basketball"},terms:[],name:"Basketball Court"},"leisure/pitch/beachvolleyball":{icon:"maki-basketball",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"beachvolleyball"},addTags:{leisure:"pitch",sport:"beachvolleyball",surface:"sand"},removeTags:{leisure:"pitch",sport:"beachvolleyball",surface:"sand"},reference:{key:"sport",value:"beachvolleyball"},terms:["volleyball"],name:"Beach Volleyball Court"},"leisure/pitch/boules":{icon:"maki-pitch",fields:["name","boules","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"boules"},reference:{key:"sport",value:"boules"},terms:["bocce","lyonnaise","pétanque"],name:"Boules/Bocce Court"},"leisure/pitch/bowls":{icon:"maki-pitch",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"bowls"},reference:{key:"sport",value:"bowls"},terms:[],name:"Bowling Green"},"leisure/pitch/cricket":{icon:"maki-cricket",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"cricket"},reference:{key:"sport",value:"cricket"},terms:[],name:"Cricket Field"},"leisure/pitch/equestrian":{icon:"maki-horse-riding",fields:["name","surface","lit","building"],geometry:["point","area"],tags:{leisure:"pitch",sport:"equestrian"},reference:{key:"sport",value:"equestrian"},terms:["dressage","equestrian","horse","horseback","riding"],name:"Riding Arena"},"leisure/pitch/rugby_league":{icon:"maki-america-football",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"rugby_league"},reference:{key:"sport",value:"rugby_league"},terms:[],name:"Rugby League Field"},"leisure/pitch/rugby_union":{icon:"maki-america-football",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"rugby_union"},reference:{key:"sport",value:"rugby_union"},terms:[],name:"Rugby Union Field"},"leisure/pitch/skateboard":{icon:"maki-pitch",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"skateboard"},reference:{key:"sport",value:"skateboard"},terms:[],name:"Skate Park"},"leisure/pitch/soccer":{icon:"maki-soccer",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"soccer"},reference:{key:"sport",value:"soccer"},terms:["football"],name:"Soccer Field"},"leisure/pitch/table_tennis":{icon:"maki-tennis",fields:["name","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"table_tennis"},reference:{key:"sport",value:"table_tennis"},terms:["table tennis","ping pong"],name:"Ping Pong Table"},"leisure/pitch/tennis":{icon:"maki-tennis",fields:["name","surface","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"tennis"},reference:{key:"sport",value:"tennis"},terms:[],name:"Tennis Court"},"leisure/pitch/volleyball":{icon:"maki-basketball",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"volleyball"},reference:{key:"sport",value:"volleyball"},terms:[],name:"Volleyball Court"},"leisure/playground":{icon:"maki-playground",fields:["name","operator","surface","playground/max_age","playground/min_age","access_simple"],geometry:["point","area"],terms:["jungle gym","play area"],tags:{leisure:"playground"},name:"Playground"},"leisure/resort":{icon:"maki-lodging",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{leisure:"resort"},name:"Resort"},"leisure/running_track":{icon:"maki-pitch",fields:["surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["point","line","area"],tags:{leisure:"track",sport:"running"},terms:["race*","running","sprint","track"],name:"Racetrack (Running)"},"leisure/sauna":{icon:"fas-thermometer-three-quarters",fields:["name","operator","address","opening_hours","access_simple","fee"],geometry:["point","area"],tags:{leisure:"sauna"},name:"Sauna"},"leisure/slipway":{icon:"temaki-beach",fields:["access_simple"],geometry:["point","line"],terms:["boat launch","boat ramp"],tags:{leisure:"slipway"},name:"Slipway"},"leisure/sports_centre":{icon:"maki-pitch",fields:["name","sport","building","address","opening_hours"],geometry:["point","area"],tags:{leisure:"sports_centre"},terms:[],name:"Sports Center / Complex"},"leisure/sports_centre/swimming":{icon:"maki-swimming",fields:["name","access_simple","operator","address","building"],geometry:["point","area"],terms:["dive","water"],tags:{leisure:"sports_centre",sport:"swimming"},reference:{key:"sport",value:"swimming"},name:"Swimming Pool Facility"},"leisure/stadium":{icon:"maki-pitch",fields:["name","sport","address"],geometry:["point","area"],tags:{leisure:"stadium"},name:"Stadium"},"leisure/swimming_pool":{icon:"maki-swimming",fields:["name","access_simple","operator","address"],geometry:["point","area"],terms:["dive","water"],tags:{leisure:"swimming_pool"},name:"Swimming Pool"},"leisure/track":{icon:"iD-highway-road",fields:["surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["point","line","area"],tags:{leisure:"track"},terms:["cycle","dog","greyhound","horse","race*","track"],name:"Racetrack (Non-Motorsport)"},"leisure/water_park":{icon:"maki-swimming",fields:["name","operator","address"],geometry:["point","area"],terms:["swim","pool","dive"],tags:{leisure:"water_park"},name:"Water Park"},line:{fields:["name"],geometry:["line"],tags:{},name:"Line",matchScore:0.1},man_made:{icon:"temaki-storage_tank",fields:["name","man_made"],geometry:["point","vertex","line","area"],tags:{man_made:"*"},name:"Man Made"},"man_made/embankment":{geometry:["line"],tags:{man_made:"embankment"},name:"Embankment",searchable:false},"man_made/adit":{icon:"maki-triangle",geometry:["point","area"],fields:["operator","direction"],terms:["entrance","underground","mine","cave"],tags:{man_made:"adit"},name:"Adit"},"man_made/antenna":{icon:"temaki-antenna",fields:["height","communication_multi"],geometry:["point"],terms:["broadcast","cell phone","cell","communication","mobile phone","radio","television","transmission","tv"],tags:{man_made:"antenna"},name:"Antenna"},"man_made/breakwater":{geometry:["line","area"],tags:{man_made:"breakwater"},name:"Breakwater"},"man_made/bridge":{geometry:["area"],tags:{man_made:"bridge"},name:"Bridge"},"man_made/bunker_silo":{icon:"temaki-silo",fields:["content"],geometry:["point","area"],terms:["Silage","Storage"],tags:{man_made:"bunker_silo"},name:"Bunker Silo"},"man_made/chimney":{icon:"temaki-chimney",geometry:["point","area"],tags:{man_made:"chimney"},name:"Chimney"},"man_made/clearcut":{icon:"maki-logging",geometry:["area"],tags:{man_made:"clearcut"},terms:["cut","forest","lumber","tree","wood"],name:"Clearcut Forest"},"man_made/crane":{icon:"temaki-crane",fields:["operator","height","crane/type"],geometry:["point","line","vertex","area"],tags:{man_made:"crane"},name:"Crane"},"man_made/cutline":{icon:"maki-logging",geometry:["line"],tags:{man_made:"cutline"},name:"Cut line"},"man_made/flagpole":{icon:"maki-embassy",geometry:["point"],tags:{man_made:"flagpole"},name:"Flagpole"},"man_made/gasometer":{icon:"temaki-storage_tank",fields:["content","building_area"],geometry:["point","area"],terms:["gas holder"],tags:{man_made:"gasometer"},name:"Gasometer"},"man_made/groyne":{geometry:["line","area"],tags:{man_made:"groyne"},name:"Groyne"},"man_made/lighthouse":{icon:"maki-lighthouse",fields:["building_area"],geometry:["point","area"],tags:{man_made:"lighthouse"},name:"Lighthouse"},"man_made/mast":{icon:"temaki-antenna",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],tags:{man_made:"mast"},name:"Mast"},"man_made/monitoring_station":{icon:"temaki-antenna",geometry:["point","area"],fields:["monitoring_multi","operator"],terms:["weather","earthquake","seismology","air","gps"],tags:{man_made:"monitoring_station"},name:"Monitoring Station"},"man_made/observation":{icon:"temaki-tower",geometry:["point","area"],terms:["lookout tower","fire tower"],tags:{man_made:"tower","tower:type":"observation"},name:"Observation Tower"},"man_made/observatory":{geometry:["point","area"],terms:["astronomical","meteorological"],tags:{man_made:"observatory"},name:"Observatory"},"man_made/petroleum_well":{icon:"temaki-storage_tank",geometry:["point"],terms:["drilling rig","oil derrick","oil drill","oil horse","oil rig","oil pump","petroleum well","pumpjack"],tags:{man_made:"petroleum_well"},name:"Oil Well"},"man_made/pier":{icon:"iD-highway-footway",fields:["name","surface","lit","width","access"],geometry:["line","area"],terms:["dock","jetty"],tags:{man_made:"pier"},name:"Pier"},"man_made/pipeline":{icon:"iD-pipeline-line",fields:["location","operator","substance","layer"],geometry:["line"],tags:{man_made:"pipeline"},name:"Pipeline"},"man_made/pumping_station":{icon:"maki-water",geometry:["point","area"],tags:{man_made:"pumping_station"},name:"Pumping Station"},"man_made/silo":{icon:"temaki-silo",fields:["crop","building_area"],geometry:["point","area"],terms:["grain","corn","wheat"],tags:{man_made:"silo"},name:"Silo"},"man_made/storage_tank":{icon:"temaki-storage_tank",fields:["content","building_area"],geometry:["point","area"],terms:["water","oil","gas","petrol"],tags:{man_made:"storage_tank"},name:"Storage Tank"},"man_made/surveillance_camera":{icon:"maki-attraction",geometry:["point","vertex"],fields:["surveillance","surveillance/type","camera/type","camera/mount","camera/direction","surveillance/zone","contact/webcam"],terms:["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],tags:{man_made:"surveillance","surveillance:type":"camera"},name:"Surveillance Camera"},"man_made/surveillance":{icon:"maki-attraction",geometry:["point","vertex"],fields:["surveillance","surveillance/type","surveillance/zone","direction"],terms:["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],tags:{man_made:"surveillance"},name:"Surveillance"},"man_made/survey_point":{icon:"maki-monument",fields:["ref"],geometry:["point","vertex"],terms:["trig point","triangulation pillar","trigonometrical station"],tags:{man_made:"survey_point"},name:"Survey Point"},"man_made/tower":{icon:"temaki-tower",fields:["tower/type","tower/construction","height"],geometry:["point","area"],tags:{man_made:"tower"},name:"Tower"},"man_made/wastewater_plant":{icon:"maki-water",fields:["name","operator","address"],geometry:["point","area"],terms:["sewage*","water treatment plant","reclamation plant"],tags:{man_made:"wastewater_plant"},name:"Wastewater Plant"},"man_made/water_tower":{icon:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_tower"},name:"Water Tower"},"man_made/water_well":{icon:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_well"},name:"Water Well"},"man_made/water_works":{icon:"maki-water",fields:["name","operator","address"],geometry:["point","area"],tags:{man_made:"water_works"},name:"Water Works"},"man_made/watermill":{icon:"maki-buddhism",fields:["building_area"],geometry:["point","area"],terms:["water","wheel","mill"],tags:{man_made:"watermill"},name:"Watermill"},"man_made/windmill":{icon:"temaki-windmill",fields:["building_area"],geometry:["point","area"],terms:["wind","wheel","mill"],tags:{man_made:"windmill"},name:"Windmill"},"man_made/works":{icon:"maki-industry",fields:["name","operator","address","building_area","product"],geometry:["point","area"],terms:["assembly","build","brewery","car","plant","plastic","processing","manufacture","refinery"],tags:{man_made:"works"},name:"Factory"},manhole:{icon:"maki-circle-stroked",fields:["manhole","operator","label","ref"],geometry:["point","vertex"],tags:{manhole:"*"},terms:["cover","hole","sewer","sewage","telecom"],name:"Manhole"},"manhole/drain":{icon:"maki-water",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"drain"},terms:["cover","drain","hole","rain","sewer","sewage","storm"],name:"Storm Drain"},"manhole/telecom":{icon:"maki-circle-stroked",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"telecom"},terms:["cover","phone","hole","telecom","telephone","bt"],name:"Telecom Manhole"},natural:{icon:"maki-natural",fields:["name","natural"],geometry:["point","vertex","area"],tags:{natural:"*"},name:"Natural"},"natural/bare_rock":{geometry:["area"],tags:{natural:"bare_rock"},terms:["rock"],name:"Bare Rock"},"natural/bay":{icon:"temaki-beach",geometry:["point","area"],fields:["name"],tags:{natural:"bay"},terms:[],name:"Bay"},"natural/beach":{icon:"temaki-beach",fields:["surface"],geometry:["point","area"],tags:{natural:"beach"},terms:["shore"],name:"Beach"},"natural/cave_entrance":{icon:"maki-triangle",geometry:["point","area"],fields:["fee","access_simple","direction"],tags:{natural:"cave_entrance"},terms:["cavern","hollow","grotto","shelter","cavity"],name:"Cave Entrance"},"natural/cliff":{icon:"maki-triangle",fields:["name","height"],geometry:["point","vertex","line","area"],tags:{natural:"cliff"},terms:["crag","escarpment","rock face","scarp"],name:"Cliff"},"natural/coastline":{geometry:["line"],tags:{natural:"coastline"},terms:["shore"],name:"Coastline"},"natural/fell":{geometry:["area"],tags:{natural:"fell"},terms:[],name:"Fell"},"natural/glacier":{geometry:["area"],tags:{natural:"glacier"},terms:[],name:"Glacier"},"natural/grassland":{geometry:["area"],tags:{natural:"grassland"},terms:["prairie","savanna"],name:"Grassland"},"natural/heath":{geometry:["area"],tags:{natural:"heath"},terms:[],name:"Heath"},"natural/mud":{geometry:["area"],tags:{natural:"mud"},terms:["wetland"],name:"Mud"},"natural/peak":{icon:"maki-mountain",fields:["name","elevation"],geometry:["point","vertex"],tags:{natural:"peak"},terms:["acme","aiguille","alp","climax","crest","crown","hill","mount","mountain","pinnacle","summit","tip","top"],name:"Peak"},"natural/reef":{icon:"temaki-beach",geometry:["point","area"],tags:{natural:"reef"},terms:["barrier","coral","ocean","sand","shoal"],name:"Reef"},"natural/ridge":{geometry:["line"],tags:{natural:"ridge"},terms:["crest"],name:"Ridge"},"natural/saddle":{icon:"maki-triangle-stroked",fields:["elevation"],geometry:["point","vertex"],tags:{natural:"saddle"},terms:["pass","mountain pass","top"],name:"Saddle"},"natural/sand":{geometry:["area"],tags:{natural:"sand"},terms:["desert"],name:"Sand"},"natural/scree":{geometry:["area"],tags:{natural:"scree"},terms:["loose rocks"],name:"Scree"},"natural/scrub":{geometry:["area"],tags:{natural:"scrub"},terms:["bush","shrubs"],name:"Scrub"},"natural/spring":{icon:"maki-water",fields:["name","intermittent"],geometry:["point","vertex"],tags:{natural:"spring"},terms:[],name:"Spring"},"natural/tree_row":{icon:"maki-park",fields:["leaf_type","leaf_cycle","denotation"],geometry:["line"],tags:{natural:"tree_row"},terms:[],name:"Tree row"},"natural/tree":{icon:"maki-park",fields:["leaf_type_singular","leaf_cycle_singular","denotation"],geometry:["point","vertex"],tags:{natural:"tree"},terms:[],name:"Tree"},"natural/volcano":{icon:"maki-volcano",fields:["name","elevation","volcano/status","volcano/type"],geometry:["point","vertex"],tags:{natural:"volcano"},terms:["mountain","crater"],name:"Volcano"},"natural/water":{icon:"maki-water",fields:["water"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/lake":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"lake"},reference:{key:"natural",value:"water"},terms:["lakelet","loch","mere"],name:"Lake"},"natural/water/pond":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"pond"},reference:{key:"natural",value:"water"},terms:["lakelet","millpond","tarn","pool","mere"],name:"Pond"},"natural/water/reservoir":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"natural",value:"water"},name:"Reservoir"},"natural/wetland":{icon:"maki-wetland",fields:["wetland"],geometry:["point","area"],tags:{natural:"wetland"},terms:["bog","marsh","reedbed","swamp","tidalflat"],name:"Wetland"},"natural/wood":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle"],geometry:["point","area"],tags:{natural:"wood"},terms:["tree"],name:"Wood"},"noexit/yes":{icon:"maki-barrier",geometry:["vertex"],terms:["no exit","road end","dead end"],tags:{noexit:"yes"},reference:{key:"noexit",value:"*"},name:"No Exit"},office:{icon:"maki-suitcase",fields:["name","office","address","building_area","opening_hours","smoking"],geometry:["point","vertex","area"],tags:{office:"*"},terms:[],name:"Office"},"office/administrative":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"administrative"},terms:[],searchable:false,name:"Administrative Office"},"office/physician":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"physician"},searchable:false,name:"Physician"},"office/travel_agent":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"travel_agent"},reference:{key:"shop",value:"travel_agency"},terms:[],name:"Travel Agency",searchable:false},"office/accountant":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"accountant"},terms:[],name:"Accountant Office"},"office/adoption_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"adoption_agency"},terms:[],name:"Adoption Agency"},"office/advertising_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"advertising_agency"},terms:["ad","ad agency","advert agency","advertising","marketing"],name:"Advertising Agency"},"office/architect":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"architect"},terms:[],name:"Architect Office"},"office/association":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"association"},terms:["association","non-profit","nonprofit","organization","society"],name:"Nonprofit Organization Office"},"office/charity":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"charity"},terms:["charitable organization"],name:"Charity Office"},"office/company":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","smoking"],geometry:["point","area"],tags:{office:"company"},terms:[],name:"Corporate Office"},"office/coworking":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["coworking","office"],tags:{office:"coworking"},reference:{key:"amenity",value:"coworking_space"},name:"Coworking Space"},"office/educational_institution":{icon:"maki-school",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"educational_institution"},terms:[],name:"Educational Institution"},"office/employment_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"employment_agency"},terms:["job"],name:"Employment Agency"},"office/energy_supplier":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"energy_supplier"},terms:["electricity","energy company","energy utility","gas utility"],name:"Energy Supplier Office"},"office/estate_agent":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"estate_agent"},terms:[],name:"Real Estate Office"},"office/financial":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"financial"},terms:[],name:"Financial Office"},"office/forestry":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"forestry"},terms:["forest","ranger"],name:"Forestry Office"},"office/foundation":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"foundation"},terms:[],name:"Foundation Office"},"office/government":{icon:"maki-town-hall",fields:["name","government","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"government"},terms:[],name:"Government Office"},"office/government/register_office":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],terms:["clerk","marriage","death","birth","certificate"],tags:{office:"government",government:"register_office"},reference:{key:"government",value:"register_office"},name:"Register Office"},"office/government/tax":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],terms:["fiscal authorities","revenue office","tax office"],tags:{office:"government",government:"tax"},reference:{key:"government",value:"tax"},name:"Tax and Revenue Office"},"office/guide":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"guide"},terms:["dive guide","mountain guide","tour guide"],name:"Tour Guide Office"},"office/insurance":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"insurance"},terms:[],name:"Insurance Office"},"office/it":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"it"},terms:["computer","information","software","technology"],name:"Information Technology Office"},"office/lawyer":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"lawyer"},terms:[],name:"Law Office"},"office/lawyer/notary":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"lawyer",lawyer:"notary"},reference:{key:"office",value:"notary"},searchable:false,name:"Notary Office"},"office/moving_company":{icon:"maki-warehouse",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"moving_company"},terms:["relocation"],name:"Moving Company Office"},"office/newspaper":{icon:"maki-library",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"newspaper"},terms:[],name:"Newspaper Office"},"office/ngo":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","smoking"],geometry:["point","area"],tags:{office:"ngo"},terms:["ngo","non government","non-government","organization","organisation"],name:"NGO Office"},"office/notary":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"notary"},terms:["clerk","deeds","estate","signature","wills"],name:"Notary Office"},"office/political_party":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"political_party"},terms:[],name:"Political Party"},"office/private_investigator":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"private_investigator"},terms:["PI","private eye","private detective"],name:"Private Investigator Office"},"office/quango":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"quango"},terms:["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],name:"Quasi-NGO Office"},"office/research":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"research"},terms:[],name:"Research Office"},"office/surveyor":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"surveyor"},terms:[],name:"Surveyor Office"},"office/tax_advisor":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"tax_advisor"},terms:["tax","tax consultant"],name:"Tax Advisor Office"},"office/telecommunication":{icon:"maki-telephone",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"telecommunication"},terms:["communication","internet","phone","voice"],name:"Telecom Office"},"office/therapist":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"therapist"},terms:["therapy"],name:"Therapist Office"},"office/water_utility":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],tags:{office:"water_utility"},terms:["water board","utility"],name:"Water Utility Office"},piste:{icon:"maki-skiing",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["point","line","area"],terms:["ski","sled","sleigh","snowboard","nordic","downhill","snowmobile"],tags:{"piste:type":"*"},name:"Piste/Ski Trail"},"place/farm":{icon:"maki-farm",geometry:["point","area"],fields:["name"],tags:{place:"farm"},name:"Farm",searchable:false},"place/city":{icon:"maki-city",fields:["name","population"],geometry:["point","area"],tags:{place:"city"},name:"City"},"place/hamlet":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"hamlet"},name:"Hamlet"},"place/island":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"island"},name:"Island"},"place/islet":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"islet"},name:"Islet"},"place/isolated_dwelling":{icon:"maki-home",geometry:["point","area"],fields:["name"],tags:{place:"isolated_dwelling"},name:"Isolated Dwelling"},"place/locality":{icon:"maki-triangle-stroked",geometry:["point","area"],fields:["name"],tags:{place:"locality"},name:"Locality"},"place/neighbourhood":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"neighbourhood"},terms:["neighbourhood"],name:"Neighborhood"},"place/plot":{icon:"maki-triangle-stroked",fields:["name"],geometry:["point","area"],tags:{place:"plot"},terms:["tract","land","lot","parcel"],name:"Plot"},"place/quarter":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"quarter"},terms:["boro","borough","quarter"],name:"Sub-Borough / Quarter"},"place/square":{geometry:["point","area"],fields:["name"],tags:{place:"square"},name:"Square"},"place/suburb":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"suburb"},terms:["boro","borough","quarter"],name:"Borough / Suburb"},"place/town":{icon:"maki-town",fields:["name","population"],geometry:["point","area"],tags:{place:"town"},name:"Town"},"place/village":{icon:"maki-village",fields:["name","population"],geometry:["point","area"],tags:{place:"village"},name:"Village"},"playground/balance_beam":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"balancebeam"},name:"Play Balance Beam"},"playground/basket_spinner":{icon:"maki-playground",geometry:["point"],terms:["basket rotator"],tags:{playground:"basketrotator"},name:"Basket Spinner"},"playground/basket_swing":{icon:"maki-playground",geometry:["point"],tags:{playground:"basketswing"},name:"Basket Swing"},"playground/climbing_frame":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"climbingframe"},name:"Climbing Frame"},"playground/cushion":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"cushion"},name:"Bouncy Cushion"},"playground/horizontal_bar":{icon:"maki-pitch",fields:["height"],geometry:["point"],terms:["high bar"],tags:{playground:"horizontal_bar"},name:"Play Horizontal Bar"},"playground/rocker":{icon:"maki-playground",geometry:["point"],tags:{playground:"springy"},name:"Spring Rider",terms:["spring rocker","springy rocker"]},"playground/roundabout":{icon:"maki-stadium",fields:["bench"],geometry:["point","area"],tags:{playground:"roundabout"},name:"Play Roundabout",terms:["merry-go-round"]},"playground/sandpit":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"sandpit"},name:"Sandpit"},"playground/seesaw":{icon:"maki-playground",geometry:["point"],tags:{playground:"seesaw"},name:"Seesaw"},"playground/slide":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"slide"},name:"Slide"},"playground/structure":{icon:"maki-pitch",geometry:["point","area"],tags:{playground:"structure"},name:"Play Structure"},"playground/swing":{icon:"maki-playground",fields:["capacity","playground/baby","wheelchair"],geometry:["point"],tags:{playground:"swing"},name:"Swing"},"playground/zipwire":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"zipwire"},name:"Zip Wire"},point:{fields:["name"],geometry:["point"],tags:{},name:"Point",matchScore:0.1},"power/sub_station":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"sub_station"},reference:{key:"power",value:"substation"},name:"Substation",searchable:false},"power/generator":{icon:"temaki-power",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],geometry:["point","vertex","area"],terms:["hydro","solar","turbine","wind"],tags:{power:"generator"},name:"Power Generator"},"power/generator/source_nuclear":{icon:"temaki-radiation",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],geometry:["point","vertex","area"],terms:["fission","generator","nuclear","nuke","reactor"],tags:{power:"generator","generator:source":"nuclear","generator:method":"fission"},reference:{key:"generator:source",value:"nuclear"},name:"Nuclear Reactor"},"power/generator/source_wind":{icon:"temaki-wind_turbine",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","height","ref"],geometry:["point","vertex","area"],terms:["generator","turbine","windmill","wind"],tags:{power:"generator","generator:source":"wind","generator:method":"wind_turbine"},reference:{key:"generator:source",value:"wind"},name:"Wind Turbine"},"power/line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"line"},name:"Power Line"},"power/minor_line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"minor_line"},name:"Minor Power Line"},"power/plant":{icon:"maki-industry",fields:["name","operator","address","plant/output/electricity","start_date"],geometry:["area"],tags:{power:"plant"},addTags:{power:"plant",landuse:"industrial"},removeTags:{power:"plant",landuse:"industrial"},terms:["coal","gas","generat*","hydro","nuclear","power","station"],name:"Power Station Grounds"},"power/pole":{fields:["ref"],geometry:["point","vertex"],tags:{power:"pole"},name:"Power Pole"},"power/substation":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"substation"},name:"Substation"},"power/switch":{icon:"temaki-power",fields:["switch","operator","location","cables","voltage","ref"],geometry:["point","vertex","area"],tags:{power:"switch"},name:"Power Switch"},"power/tower":{fields:["ref"],geometry:["vertex"],tags:{power:"tower"},name:"High-Voltage Tower"},"power/transformer":{icon:"temaki-power",fields:["transformer","operator","location","rating","devices","phases","frequency","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration","ref"],geometry:["point","vertex","area"],tags:{power:"transformer"},name:"Transformer"},"public_transport/linear_platform_aerialway":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",aerialway:"yes"},reference:{key:"public_transport",value:"platform"},terms:["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],name:"Aerialway Stop / Platform"},"public_transport/linear_platform_bus":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["line"],tags:{public_transport:"platform",bus:"yes"},addTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","platform","public transit","public transportation","transit","transportation"],name:"Bus Stop / Platform"},"public_transport/linear_platform_ferry":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",ferry:"yes"},reference:{key:"public_transport",value:"platform"},terms:["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],name:"Ferry Stop / Platform"},"public_transport/linear_platform_light_rail":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",light_rail:"yes"},addTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},removeTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Stop / Platform"},"public_transport/linear_platform_monorail":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",monorail:"yes"},addTags:{public_transport:"platform",monorail:"yes",railway:"platform"},removeTags:{public_transport:"platform",monorail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],name:"Monorail Stop / Platform"},"public_transport/linear_platform_subway":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",subway:"yes"},addTags:{public_transport:"platform",subway:"yes",railway:"platform"},removeTags:{public_transport:"platform",subway:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Stop / Platform"},"public_transport/linear_platform_train":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",train:"yes"},addTags:{public_transport:"platform",train:"yes",railway:"platform"},removeTags:{public_transport:"platform",train:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["platform","public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Stop / Platform"},"public_transport/linear_platform_tram":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["line"],tags:{public_transport:"platform",tram:"yes"},addTags:{public_transport:"platform",tram:"yes",railway:"platform"},removeTags:{public_transport:"platform",tram:"yes",railway:"platform"},reference:{key:"public_transport",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Stop / Platform"},"public_transport/linear_platform_trolleybus":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",trolleybus:"yes"},addTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stop / Platform"},"public_transport/linear_platform":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Stop / Platform",matchScore:0.2},"public_transport/platform_aerialway":{icon:"maki-aerialway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",aerialway:"yes"},reference:{key:"public_transport",value:"platform"},terms:["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],name:"Aerialway Stop / Platform"},"public_transport/platform_bus":{icon:"maki-bus",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["point","area"],tags:{public_transport:"platform",bus:"yes"},addTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","platform","public transit","public transportation","transit","transportation"],name:"Bus Stop / Platform"},"public_transport/platform_ferry":{icon:"maki-ferry",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",ferry:"yes"},reference:{key:"public_transport",value:"platform"},terms:["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],name:"Ferry Stop / Platform"},"public_transport/platform_light_rail":{icon:"temaki-light_rail",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",light_rail:"yes"},addTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},removeTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Stop / Platform"},"public_transport/platform_monorail":{icon:"temaki-monorail",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",monorail:"yes"},addTags:{public_transport:"platform",monorail:"yes",railway:"platform"},removeTags:{public_transport:"platform",monorail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],name:"Monorail Stop / Platform"},"public_transport/platform_subway":{icon:"temaki-subway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",subway:"yes"},addTags:{public_transport:"platform",subway:"yes",railway:"platform"},removeTags:{public_transport:"platform",subway:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Stop / Platform"},"public_transport/platform_train":{icon:"maki-rail",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",train:"yes"},addTags:{public_transport:"platform",train:"yes",railway:"platform"},removeTags:{public_transport:"platform",train:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["platform","public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Stop / Platform"},"public_transport/platform_tram":{icon:"temaki-tram",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["point","area"],tags:{public_transport:"platform",tram:"yes"},addTags:{public_transport:"platform",tram:"yes",railway:"platform"},removeTags:{public_transport:"platform",tram:"yes",railway:"platform"},reference:{key:"public_transport",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Stop / Platform"},"public_transport/platform_trolleybus":{icon:"temaki-trolleybus",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",trolleybus:"yes"},addTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stop / Platform"},"public_transport/platform":{icon:"maki-bus",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Stop / Platform",matchScore:0.2},"public_transport/station_aerialway":{icon:"maki-aerialway",fields:["name","network","operator","aerialway/access","aerialway/summer/access","elevation","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",aerialway:"yes"},reference:{key:"aerialway",value:"station"},terms:["aerialway","cable car","public transit","public transportation","station","terminal","transit","transportation"],name:"Aerialway Station"},"public_transport/station_bus":{icon:"maki-bus",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",bus:"yes"},addTags:{public_transport:"station",bus:"yes",amenity:"bus_station"},removeTags:{public_transport:"station",bus:"yes",amenity:"bus_station"},reference:{key:"amenity",value:"bus_station"},terms:["bus","public transit","public transportation","station","terminal","transit","transportation"],name:"Bus Station / Terminal"},"public_transport/station_ferry":{icon:"maki-ferry",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",ferry:"yes"},addTags:{public_transport:"station",ferry:"yes",amenity:"ferry_terminal"},removeTags:{public_transport:"station",ferry:"yes",amenity:"ferry_terminal"},reference:{key:"amenity",value:"ferry_terminal"},terms:["boat","dock","ferry","pier","public transit","public transportation","station","terminal","transit","transportation"],name:"Ferry Station / Terminal"},"public_transport/station_light_rail":{icon:"temaki-light_rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",light_rail:"yes"},addTags:{public_transport:"station",light_rail:"yes",railway:"station",station:"light_rail"},removeTags:{public_transport:"station",light_rail:"yes",railway:"station",station:"light_rail"},reference:{key:"station",value:"light_rail"},terms:["electric","light rail","public transit","public transportation","rail","station","terminal","track","tram","trolley","transit","transportation"],name:"Light Rail Station"},"public_transport/station_monorail":{icon:"temaki-monorail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",monorail:"yes"},addTags:{public_transport:"station",monorail:"yes",railway:"station"},removeTags:{public_transport:"station",monorail:"yes",railway:"station"},reference:{key:"railway",value:"station"},terms:["monorail","public transit","public transportation","rail","station","terminal","transit","transportation"],name:"Monorail Station"},"public_transport/station_subway":{icon:"temaki-subway",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",subway:"yes"},addTags:{public_transport:"station",subway:"yes",railway:"station",station:"subway"},removeTags:{public_transport:"station",subway:"yes",railway:"station",station:"subway"},reference:{key:"station",value:"subway"},terms:["metro","public transit","public transportation","rail","station","subway","terminal","track","transit","transportation","underground"],name:"Subway Station"},"public_transport/station_train_halt":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",train:"yes",railway:"halt"},reference:{key:"railway",value:"halt"},terms:["halt","public transit","public transportation","rail","station","track","train","transit","transportation","whistle stop"],name:"Train Station (Halt / Request)"},"public_transport/station_train":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",train:"yes"},addTags:{public_transport:"station",train:"yes",railway:"station"},removeTags:{public_transport:"station",train:"yes",railway:"station"},reference:{key:"railway",value:"station"},terms:["public transit","public transportation","rail","station","terminal","track","train","transit","transportation"],name:"Train Station"},"public_transport/station_tram":{icon:"temaki-tram",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",tram:"yes"},reference:{key:"public_transport",value:"station"},terms:["electric","light rail","public transit","public transportation","rail","station","streetcar","terminal","track","tram","trolley","transit","transportation"],name:"Tram Station"},"public_transport/station_trolleybus":{icon:"temaki-trolleybus",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",trolleybus:"yes"},addTags:{public_transport:"station",trolleybus:"yes",amenity:"bus_station"},removeTags:{public_transport:"station",trolleybus:"yes",amenity:"bus_station"},reference:{key:"amenity",value:"bus_station"},terms:["bus","electric","public transit","public transportation","station","streetcar","terminal","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Station / Terminal"},"public_transport/station":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station"},terms:["public transit","public transportation","station","terminal","transit","transportation"],name:"Transit Station",matchScore:0.2},"public_transport/stop_area":{icon:"maki-bus",fields:["name","ref","network","operator"],geometry:["relation"],tags:{type:"public_transport",public_transport:"stop_area"},addTags:{type:"public_transport",public_transport:"stop_area","public_transport:version":"2"},removeTags:{type:"public_transport",public_transport:"stop_area","public_transport:version":"2"},reference:{key:"public_transport",value:"stop_area"},name:"Transit Stop Area"},"public_transport/stop_position_aerialway":{icon:"maki-aerialway",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",aerialway:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["aerialway","cable car","public transit","public transportation","transit","transportation"],name:"Aerialway Stopping Location"},"public_transport/stop_position_bus":{icon:"maki-bus",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",bus:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["bus","public transit","public transportation","transit","transportation"],name:"Bus Stopping Location"},"public_transport/stop_position_ferry":{icon:"maki-ferry",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",ferry:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["boat","dock","ferry","pier","public transit","public transportation","transit","transportation"],name:"Ferry Stopping Location"},"public_transport/stop_position_light_rail":{icon:"temaki-light_rail",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",light_rail:"yes"},addTags:{public_transport:"stop_position",light_rail:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",light_rail:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["electric","light rail","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Stopping Location"},"public_transport/stop_position_monorail":{icon:"temaki-monorail",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",monorail:"yes"},addTags:{public_transport:"stop_position",monorail:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",monorail:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["monorail","public transit","public transportation","rail","transit","transportation"],name:"Monorail Stopping Location"},"public_transport/stop_position_subway":{icon:"temaki-subway",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",subway:"yes"},addTags:{public_transport:"stop_position",subway:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",subway:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["metro","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Stopping Location"},"public_transport/stop_position_train":{icon:"maki-rail",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",train:"yes"},addTags:{public_transport:"stop_position",train:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",train:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Stopping Location"},"public_transport/stop_position_tram":{icon:"temaki-tram",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",tram:"yes"},addTags:{public_transport:"stop_position",tram:"yes",railway:"tram_stop"},removeTags:{public_transport:"stop_position",tram:"yes",railway:"tram_stop"},reference:{key:"public_transport",value:"stop_position"},terms:["electric","light rail","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Stopping Location"},"public_transport/stop_position_trolleybus":{icon:"temaki-trolleybus",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",trolleybus:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["bus","electric","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stopping Location"},"public_transport/stop_position":{icon:"maki-bus",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position"},terms:["public transit","public transportation","transit","transportation"],name:"Transit Stopping Location",matchScore:0.2},"railway/halt":{icon:"maki-rail",geometry:["point","vertex"],tags:{railway:"halt"},terms:["break","interrupt","rest","wait","interruption"],name:"Train Station (Halt / Request)",searchable:false},"railway/platform":{icon:"iD-highway-footway",fields:["name","ref_platform","surface","lit","shelter"],geometry:["line","area"],tags:{railway:"platform"},name:"Train Stop / Platform",searchable:false},"railway/station":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],tags:{railway:"station"},terms:["train station","station"],name:"Train Station",searchable:false},"railway/tram_stop":{icon:"temaki-tram",fields:["name","network","operator"],geometry:["vertex"],tags:{railway:"tram_stop"},terms:["light rail","streetcar","tram","trolley"],name:"Tram Stopping Position",searchable:false},"railway/abandoned":{icon:"iD-railway-abandoned",fields:["name","structure","service_rail","usage_rail"],geometry:["line"],tags:{railway:"abandoned"},terms:[],name:"Abandoned Railway"},"railway/buffer_stop":{icon:"temaki-buffer_stop",geometry:["vertex"],tags:{railway:"buffer_stop"},terms:["stop","halt","buffer"],name:"Buffer Stop"},"railway/crossing":{icon:"temaki-pedestrian",geometry:["vertex"],tags:{railway:"crossing"},terms:["crossing","pedestrian crossing","railroad crossing","level crossing","grade crossing","path through railroad","train crossing"],name:"Railway Crossing (Path)"},"railway/derail":{icon:"maki-roadblock",geometry:["vertex"],tags:{railway:"derail"},terms:["derailer"],name:"Railway Derailer"},"railway/disused":{icon:"iD-railway-disused",fields:["structure","service_rail","usage_rail"],geometry:["line"],tags:{railway:"disused"},terms:[],name:"Disused Railway"},"railway/funicular":{icon:"iD-railway-rail",geometry:["line"],terms:["venicular","cliff railway","cable car","cable railway","funicular railway"],fields:["structure","gauge","service_rail"],tags:{railway:"funicular"},name:"Funicular"},"railway/level_crossing":{icon:"maki-cross",geometry:["vertex"],tags:{railway:"level_crossing"},terms:["crossing","railroad crossing","level crossing","grade crossing","road through railroad","train crossing"],name:"Railway Crossing (Road)"},"railway/light_rail":{icon:"iD-railway-light-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"light_rail"},terms:["light rail","streetcar","trolley"],name:"Light Rail"},"railway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["railway/position"],tags:{railway:"milestone"},terms:["milestone","marker"],name:"Railway Milestone"},"railway/miniature":{icon:"iD-railway-rail",geometry:["line"],tags:{railway:"miniature"},fields:["name","structure","gauge","electrified","service_rail"],terms:["rideable miniature railway","narrow gauge railway","minimum gauge railway"],name:"Miniature Railway"},"railway/monorail":{icon:"iD-railway-monorail",fields:["name","structure","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"monorail"},terms:[],name:"Monorail"},"railway/narrow_gauge":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"narrow_gauge"},terms:["narrow gauge railway","narrow gauge railroad"],name:"Narrow Gauge Rail"},"railway/rail":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","maxspeed","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"rail"},terms:[],name:"Rail"},"railway/signal":{icon:"temaki-railway_signals",geometry:["point","vertex"],fields:["railway/position","railway/signal/direction","ref"],tags:{railway:"signal"},terms:["signal","lights"],name:"Railway Signal"},"railway/subway_entrance":{icon:"maki-entrance",geometry:["point","vertex"],fields:["name"],tags:{railway:"subway_entrance"},terms:["metro","transit"],name:"Subway Entrance"},"railway/subway":{icon:"iD-railway-subway",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"subway"},terms:["metro","transit"],name:"Subway"},"railway/switch":{icon:"temaki-junction",geometry:["vertex"],tags:{railway:"switch"},terms:["switch","points"],name:"Railway Switch"},"railway/train_wash":{icon:"maki-rail",geometry:["point","vertex","area"],fields:["operator","building_area"],tags:{railway:"wash"},terms:["wash","clean"],name:"Train Wash"},"railway/tram":{icon:"iD-railway-light-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"tram"},terms:["light rail","streetcar","tram","trolley"],name:"Tram"},relation:{icon:"iD-relation",fields:["name","relation"],geometry:["relation"],tags:{},name:"Relation"},"route/ferry":{icon:"iD-ferry-line",geometry:["line"],fields:["name","operator","duration","access"],tags:{route:"ferry"},name:"Ferry Route"},shop:{icon:"maki-shop",fields:["name","shop","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"*"},terms:[],name:"Shop"},"shop/fishmonger":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"fishmonger"},reference:{key:"shop",value:"seafood"},name:"Fishmonger",searchable:false},"shop/furnace":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["oven","stove"],tags:{shop:"furnace"},name:"Furnace Store",searchable:false},"shop/vacant":{icon:"maki-shop",fields:["name","address","building_area"],geometry:["point","area"],tags:{shop:"vacant"},name:"Vacant Shop",searchable:false},"shop/agrarian":{icon:"maki-shop",fields:["name","operator","agrarian","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["agricultural inputs","agricultural machines","seeds","pesticides","fertilizer","agricultural tools"],tags:{shop:"agrarian"},name:"Farm Supply Shop"},"shop/alcohol":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],terms:["alcohol","beer","booze","wine"],tags:{shop:"alcohol"},name:"Liquor Store"},"shop/anime":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"anime"},terms:["manga","japan","cosplay","figurine","dakimakura"],name:"Anime Shop"},"shop/antiques":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"antiques"},name:"Antiques Shop"},"shop/appliance":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["air conditioner","appliance","dishwasher","dryer","freezer","fridge","grill","kitchen","oven","refrigerator","stove","washer","washing machine"],tags:{shop:"appliance"},name:"Appliance Store"},"shop/art":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["art*","exhibit*","gallery"],tags:{shop:"art"},name:"Art Store"},"shop/baby_goods":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"baby_goods"},name:"Baby Goods Store"},"shop/bag":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["handbag","purse"],tags:{shop:"bag"},name:"Bag/Luggage Store"},"shop/bakery":{icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery"},name:"Bakery"},"shop/bathroom_furnishing":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bathroom_furnishing"},name:"Bathroom Furnishing Store"},"shop/beauty":{icon:"maki-shop",fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],geometry:["point","area"],terms:["spa","salon","tanning"],tags:{shop:"beauty"},name:"Beauty Shop"},"shop/beauty/nails":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["manicure","pedicure"],tags:{shop:"beauty",beauty:"nails"},reference:{key:"shop",value:"beauty"},name:"Nail Salon"},"shop/beauty/tanning":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beauty",beauty:"tanning"},reference:{key:"leisure",value:"tanning_salon"},name:"Tanning Salon"},"shop/bed":{icon:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed"},name:"Bedding/Mattress Store"},"shop/beverages":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages"},name:"Beverage Store"},"shop/bicycle":{icon:"maki-bicycle",fields:["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],geometry:["point","area"],terms:["bike","repair"],tags:{shop:"bicycle"},name:"Bicycle Shop"},"shop/bookmaker":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["betting"],tags:{shop:"bookmaker"},name:"Bookmaker"},"shop/books":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books"},name:"Book Store"},"shop/boutique":{icon:"maki-shop",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"boutique"},name:"Boutique"},"shop/butcher":{icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["meat"],tags:{shop:"butcher"},name:"Butcher"},"shop/candles":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"candles"},name:"Candle Shop"},"shop/car_parts":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto"],tags:{shop:"car_parts"},name:"Car Parts Store"},"shop/car_repair":{icon:"maki-car",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto","garage","service"],tags:{shop:"car_repair"},name:"Car Repair Shop"},"shop/car":{icon:"maki-car",fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto"],tags:{shop:"car"},name:"Car Dealership"},"shop/carpet":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["rug"],tags:{shop:"carpet"},name:"Carpet Store"},"shop/charity":{icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],terms:["thrift","op shop","nonprofit"],tags:{shop:"charity"},name:"Charity Store"},"shop/cheese":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cheese"},name:"Cheese Store"},"shop/chemist":{icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist"},terms:["apothecary","med*","drug*","gift"],name:"Drugstore"},"shop/chocolate":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chocolate"},name:"Chocolate Store"},"shop/clothes":{icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes"},name:"Clothing Store"},"shop/coffee":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"coffee"},name:"Coffee Store"},"shop/computer":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"computer"},name:"Computer Store"},"shop/confectionery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["sweet"],tags:{shop:"confectionery"},name:"Candy Store"},"shop/convenience":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience"},name:"Convenience Store"},"shop/copyshop":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"copyshop"},name:"Copy Store"},"shop/cosmetics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics"},name:"Cosmetics Store"},"shop/craft":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"craft"},terms:["art*","paint*","frame"],name:"Arts and Crafts Store"},"shop/curtain":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["drape*","window"],tags:{shop:"curtain"},name:"Curtain Store"},"shop/dairy":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["milk","egg","cheese"],tags:{shop:"dairy"},name:"Dairy Store"},"shop/deli":{icon:"maki-restaurant",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["lunch","meat","sandwich"],tags:{shop:"deli"},name:"Deli"},"shop/department_store":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store"},name:"Department Store"},"shop/doityourself":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself"},name:"DIY Store"},"shop/dry_cleaning":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"dry_cleaning"},name:"Dry Cleaner"},"shop/e-cigarette":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"e-cigarette"},terms:["electronic","vapor"],name:"E-Cigarette Shop"},"shop/electronics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["appliance","audio","blueray","camera","computer","dvd","home theater","radio","speaker","tv","video"],tags:{shop:"electronics"},name:"Electronics Store"},"shop/erotic":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic"},name:"Erotic Store"},"shop/fabric":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["sew"],tags:{shop:"fabric"},name:"Fabric Store"},"shop/farm":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["farm shop","farm stand"],tags:{shop:"farm"},name:"Produce Stand"},"shop/fashion":{icon:"maki-shop",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"fashion"},name:"Fashion Store"},"shop/florist":{icon:"maki-florist",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["flower"],tags:{shop:"florist"},name:"Florist"},"shop/frame":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"frame"},terms:["art*","paint*","photo*","frame"],name:"Framing Shop"},"shop/funeral_directors":{icon:"maki-cemetery",fields:["name","operator","address","building_area","religion","denomination"],geometry:["point","area"],terms:["undertaker","memorial home"],tags:{shop:"funeral_directors"},name:"Funeral Home"},"shop/furniture":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["chair","sofa","table"],tags:{shop:"furniture"},name:"Furniture Store"},"shop/garden_centre":{icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["landscape","mulch","shrub","tree"],tags:{shop:"garden_centre"},name:"Garden Center"},"shop/gas":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["cng","lpg","natural gas","propane","refill","tank"],tags:{shop:"gas"},name:"Bottled Gas Shop"},"shop/gift":{icon:"maki-gift",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["souvenir"],tags:{shop:"gift"},name:"Gift Shop"},"shop/greengrocer":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["fruit","vegetable"],tags:{shop:"greengrocer"},name:"Greengrocer"},"shop/hairdresser":{icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["barber"],tags:{shop:"hairdresser"},name:"Hairdresser"},"shop/hardware":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hardware"},name:"Hardware Store"},"shop/health_food":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["wholefood","vitamins","vegetarian","vegan"],tags:{shop:"health_food"},name:"Health Food Shop"},"shop/hearing_aids":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hearing_aids"},name:"Hearing Aids Store"},"shop/herbalist":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"herbalist"},name:"Herbalist"},"shop/hifi":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["stereo","video"],tags:{shop:"hifi"},name:"Hifi Store"},"shop/houseware":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["home","household"],tags:{shop:"houseware"},name:"Houseware Store"},"shop/interior_decoration":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"interior_decoration"},name:"Interior Decoration Store"},"shop/jewelry":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["diamond","gem","ring"],tags:{shop:"jewelry"},name:"Jeweler"},"shop/kiosk":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk"},name:"Kiosk"},"shop/kitchen":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"kitchen"},name:"Kitchen Design Store"},"shop/laundry":{icon:"maki-laundry",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"laundry"},name:"Laundry"},"shop/leather":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"leather"},name:"Leather Store"},"shop/locksmith":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["key","lockpick"],tags:{shop:"locksmith"},name:"Locksmith"},"shop/lottery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"lottery"},name:"Lottery Shop"},"shop/mall":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["shopping"],tags:{shop:"mall"},name:"Mall"},"shop/massage":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"massage"},name:"Massage Shop"},"shop/medical_supply":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"medical_supply"},name:"Medical Supply Store"},"shop/mobile_phone":{icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone"},name:"Mobile Phone Store"},"shop/money_lender":{icon:"maki-bank",fields:["name","operator","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender"},name:"Money Lender"},"shop/motorcycle_repair":{icon:"fas-motorcycle",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto","bike","garage","motorcycle","repair","service"],tags:{shop:"motorcycle_repair"},name:"Motorcycle Repair Shop"},"shop/motorcycle":{icon:"fas-motorcycle",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["bike"],tags:{shop:"motorcycle"},name:"Motorcycle Dealership"},"shop/music":{icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["CD","vinyl"],tags:{shop:"music"},name:"Music Store"},"shop/musical_instrument":{icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["guitar"],tags:{shop:"musical_instrument"},name:"Musical Instrument Store"},"shop/newsagent":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"newsagent"},name:"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"nutrition_supplements"},name:"Nutrition Supplements Store"},"shop/optician":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["eye","glasses"],tags:{shop:"optician"},name:"Optician"},"shop/organic":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket",organic:"only"},name:"Organic Goods Store"},"shop/outdoor":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["camping","climbing","hiking"],tags:{shop:"outdoor"},name:"Outdoors Store"},"shop/paint":{icon:"maki-water",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint"},name:"Paint Store"},"shop/pastry":{icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pastry"},terms:["patisserie","cake shop","cakery"],name:"Pastry Shop"},"shop/pawnbroker":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pawnbroker"},name:"Pawn Shop"},"shop/perfumery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery"},name:"Perfume Store"},"shop/pet_grooming":{icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["dog"],tags:{shop:"pet_grooming"},name:"Pet Grooming Store"},"shop/pet":{icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["animal","cat","dog","fish","kitten","puppy","reptile"],tags:{shop:"pet"},name:"Pet Store"},"shop/photo":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["camera","film"],tags:{shop:"photo"},name:"Photography Store"},"shop/pyrotechnics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pyrotechnics"},name:"Fireworks Store"},"shop/radiotechnics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"radiotechnics"},name:"Radio/Electronic Component Store"},"shop/religion":{icon:"maki-shop",fields:["name","operator","address","building_area","religion","denomination","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"religion"},name:"Religious Store"},"shop/scuba_diving":{icon:"maki-swimming",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"scuba_diving"},name:"Scuba Diving Shop"},"shop/seafood":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["fishmonger"],tags:{shop:"seafood"},name:"Seafood Shop"},"shop/second_hand":{icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],terms:["secondhand","second hand","resale","thrift","used"],tags:{shop:"second_hand"},name:"Consignment/Thrift Store"},"shop/shoes":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes"},name:"Shoe Store"},"shop/sports":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports"},name:"Sporting Goods Store"},"shop/stationery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["card","paper"],tags:{shop:"stationery"},name:"Stationery Store"},"shop/storage_rental":{icon:"maki-shop",fields:["name","operator","address","building","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"storage_rental"},name:"Storage Rental"},"shop/supermarket":{icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["grocery","store","shop"],tags:{shop:"supermarket"},name:"Supermarket"},"shop/tailor":{icon:"maki-clothing-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["clothes","suit"],tags:{shop:"tailor"},name:"Tailor"},"shop/tattoo":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tattoo"},name:"Tattoo Parlor"},"shop/tea":{icon:"maki-teahouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tea"},name:"Tea Store"},"shop/ticket":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"ticket"},name:"Ticket Seller"},"shop/tiles":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tiles"},name:"Tile Shop"},"shop/tobacco":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tobacco"},name:"Tobacco Shop"},"shop/toys":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys"},name:"Toy Store"},"shop/trade":{icon:"maki-shop",fields:["name","trade","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"trade"},name:"Trade Shop"},"shop/travel_agency":{icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency"},name:"Travel Agency"},"shop/tyres":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres"},name:"Tire Store"},"shop/vacuum_cleaner":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"vacuum_cleaner"},name:"Vacuum Cleaner Store"},"shop/variety_store":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store"},name:"Variety Store"},"shop/video_games":{icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video_games"},name:"Video Game Store"},"shop/video":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["DVD"],tags:{shop:"video"},name:"Video Store"},"shop/watches":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"watches"},name:"Watches Shop"},"shop/water_sports":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"water_sports"},name:"Watersport/Swim Shop"},"shop/weapons":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["ammo","gun","knife","knives"],tags:{shop:"weapons"},name:"Weapon Shop"},"shop/wholesale":{icon:"maki-warehouse",fields:["name","operator","wholesale","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["warehouse club","cash and carry"],tags:{shop:"wholesale"},name:"Wholesale Store"},"shop/window_blind":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"window_blind"},name:"Window Blind Store"},"shop/wine":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"wine"},name:"Wine Shop"},tourism:{icon:"maki-attraction",fields:["name","tourism"],geometry:["point","vertex","area"],tags:{tourism:"*"},name:"Tourism"},"tourism/alpine_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["climbing hut"],tags:{tourism:"alpine_hut"},name:"Alpine Hut"},"tourism/apartment":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"apartment"},name:"Guest Apartment / Condo"},"tourism/aquarium":{icon:"maki-aquarium",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["fish","sea","water"],tags:{tourism:"aquarium"},name:"Aquarium"},"tourism/artwork":{icon:"maki-art-gallery",fields:["name","artwork_type","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork"},terms:["mural","sculpture","statue"],name:"Artwork"},"tourism/attraction":{icon:"maki-star",fields:["name","operator","address"],geometry:["point","vertex","area"],tags:{tourism:"attraction"},name:"Tourist Attraction"},"tourism/camp_site":{icon:"maki-campsite",fields:["name","operator","address","access_simple","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],terms:["tent","rv"],tags:{tourism:"camp_site"},name:"Campground"},"tourism/caravan_site":{icon:"maki-bus",fields:["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],terms:["Motor Home","Camper"],tags:{tourism:"caravan_site"},name:"RV Park"},"tourism/chalet":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["holiday","holiday cottage","holiday home","vacation","vacation home"],tags:{tourism:"chalet"},name:"Holiday Cottage"},"tourism/gallery":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["art*","exhibit*","paint*","photo*","sculpt*"],tags:{tourism:"gallery"},name:"Art Gallery"},"tourism/guest_house":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"guest_house"},terms:["B&B","Bed and Breakfast"],name:"Guest House"},"tourism/hostel":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hostel"},name:"Hostel"},"tourism/hotel":{icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel"},name:"Hotel"},"tourism/information":{icon:"maki-information",fields:["information","operator","address","building_area"],geometry:["point","vertex","area"],tags:{tourism:"information"},name:"Information"},"tourism/information/board":{icon:"maki-information",fields:["name","operator","board_type","direction"],geometry:["point","vertex"],tags:{tourism:"information",information:"board"},reference:{key:"information",value:"board"},name:"Information Board"},"tourism/information/guidepost":{icon:"maki-information",fields:["name","elevation","operator","ref"],geometry:["point","vertex"],terms:["signpost"],tags:{tourism:"information",information:"guidepost"},reference:{key:"information",value:"guidepost"},name:"Guidepost"},"tourism/information/map":{icon:"maki-information",fields:["operator","map_type","map_size","direction"],geometry:["point","vertex"],tags:{tourism:"information",information:"map"},reference:{key:"information",value:"map"},name:"Map"},"tourism/information/office":{icon:"maki-information",fields:["name","operator","address","building_area"],geometry:["point","vertex","area"],tags:{tourism:"information",information:"office"},reference:{key:"information",value:"office"},name:"Tourist Information Office"},"tourism/motel":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"motel"},name:"Motel"},"tourism/museum":{icon:"maki-museum",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["art*","exhibit*","gallery","foundation","hall","institution","paint*","photo*","sculpt*"],tags:{tourism:"museum"},name:"Museum"},"tourism/picnic_site":{icon:"maki-picnic-site",fields:["name","operator","address","access_simple","capacity","smoking"],geometry:["point","vertex","area"],terms:["camp"],tags:{tourism:"picnic_site"},name:"Picnic Site"},"tourism/theme_park":{icon:"maki-amusement-park",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{tourism:"theme_park"},name:"Theme Park"},"tourism/trail_riding_station":{icon:"maki-horse-riding",fields:["name","horse_stables","horse_riding","horse_dressage","address","phone","website","description"],geometry:["point","area"],tags:{tourism:"trail_riding_station"},name:"Trail Riding Station",matchScore:2},"tourism/viewpoint":{icon:"temaki-binoculars",geometry:["point","vertex"],fields:["direction"],tags:{tourism:"viewpoint"},name:"Viewpoint"},"tourism/wilderness_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["wilderness hut","backcountry hut","bothy"],tags:{tourism:"wilderness_hut"},name:"Wilderness Hut"},"tourism/zoo":{icon:"maki-zoo",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["animal"],tags:{tourism:"zoo"},name:"Zoo"},traffic_calming:{icon:"temaki-diamond",fields:["traffic_calming","direction_vertex"],geometry:["vertex","line"],tags:{traffic_calming:"*"},terms:["bump","hump","slow","speed"],name:"Traffic Calming"},"traffic_calming/bump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["hump","speed","slow"],tags:{traffic_calming:"bump"},name:"Speed Bump"},"traffic_calming/chicane":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["driveway link","speed","slow"],tags:{traffic_calming:"chicane"},name:"Traffic Chicane"},"traffic_calming/choker":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"choker"},name:"Traffic Choker"},"traffic_calming/cushion":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","hump","speed","slow"],tags:{traffic_calming:"cushion"},name:"Speed Cushion"},"traffic_calming/dip":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"dip"},name:"Dip"},"traffic_calming/hump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","speed","slow"],tags:{traffic_calming:"hump"},name:"Speed Hump"},"traffic_calming/island":{icon:"temaki-diamond",geometry:["vertex"],terms:["circle","roundabout","slow"],tags:{traffic_calming:"island"},name:"Traffic Island"},"traffic_calming/rumble_strip":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["audible lines","sleeper lines","growlers"],tags:{traffic_calming:"rumble_strip"},name:"Rumble Strip"},"traffic_calming/table":{icon:"temaki-diamond",fields:["surface"],geometry:["vertex"],tags:{traffic_calming:"table"},terms:["flat top","hump","speed","slow"],name:"Speed Table"},"type/multipolygon":{icon:"iD-multipolygon",geometry:["area","relation"],tags:{type:"multipolygon"},removeTags:{},name:"Multipolygon",searchable:false,matchScore:0.1},"type/boundary":{icon:"iD-boundary",fields:["name","boundary"],geometry:["relation"],tags:{type:"boundary"},name:"Boundary"},"type/boundary/administrative":{icon:"iD-boundary",fields:["name","admin_level"],geometry:["relation"],tags:{type:"boundary",boundary:"administrative"},reference:{key:"boundary",value:"administrative"},name:"Administrative Boundary"},"type/restriction":{icon:"iD-restriction",fields:["name","restriction","except"],geometry:["relation"],tags:{type:"restriction"},name:"Restriction"},"type/restriction/no_left_turn":{icon:"iD-restriction-no-left-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_left_turn"},name:"No Left Turn"},"type/restriction/no_right_turn":{icon:"iD-restriction-no-right-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_right_turn"},name:"No Right Turn"},"type/restriction/no_straight_on":{icon:"iD-restriction-no-straight-on",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_straight_on"},name:"No Straight On"},"type/restriction/no_u_turn":{icon:"iD-restriction-no-u-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_u_turn"},name:"No U-turn"},"type/restriction/only_left_turn":{icon:"iD-restriction-only-left-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_left_turn"},name:"Only Left Turn"},"type/restriction/only_right_turn":{icon:"iD-restriction-only-right-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_right_turn"},name:"Only Right Turn"},"type/restriction/only_straight_on":{icon:"iD-restriction-only-straight-on",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_straight_on"},name:"Only Straight On"},"type/restriction/only_u_turn":{icon:"iD-restriction-only-u-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_u_turn"},name:"Only U-turn"},"type/route_master":{icon:"iD-route-master",fields:["name","route_master","ref","operator","network"],geometry:["relation"],tags:{type:"route_master"},name:"Route Master"},"type/route":{icon:"iD-route",fields:["name","route","ref_route","operator","network"],geometry:["relation"],tags:{type:"route"},name:"Route"},"type/route/bicycle":{icon:"iD-route-bicycle",fields:["name","ref_route","network_bicycle","cycle_network"],geometry:["relation"],tags:{type:"route",route:"bicycle"},name:"Cycle Route"},"type/route/bus":{icon:"iD-route-bus",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"bus"},name:"Bus Route"},"type/route/detour":{icon:"iD-route-detour",fields:["name","ref_route"],geometry:["relation"],tags:{type:"route",route:"detour"},name:"Detour Route"},"type/route/ferry":{icon:"iD-route-ferry",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"ferry"},name:"Ferry Route"},"type/route/foot":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot"],geometry:["relation"],tags:{type:"route",route:"foot"},name:"Foot Route"},"type/route/hiking":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot","description","distance"],geometry:["relation"],tags:{type:"route",route:"hiking"},name:"Hiking Route"},"type/route/horse":{icon:"iD-route-horse",fields:["name","ref_route","operator","network_horse","description","distance"],geometry:["relation"],tags:{type:"route",route:"horse"},name:"Riding Route"},"type/route/light_rail":{icon:"iD-route-light-rail",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"light_rail"},name:"Light Rail Route"},"type/route/pipeline":{icon:"iD-route-pipeline",fields:["name","ref_route","operator"],geometry:["relation"],tags:{type:"route",route:"pipeline"},name:"Pipeline Route"},"type/route/piste":{icon:"iD-route-piste",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"piste"},name:"Piste/Ski Route"},"type/route/power":{icon:"iD-route-power",fields:["name","ref_route","operator"],geometry:["relation"],tags:{type:"route",route:"power"},name:"Power Route"},"type/route/road":{icon:"iD-route-road",fields:["name","ref_route","network_road"],geometry:["relation"],tags:{type:"route",route:"road"},name:"Road Route"},"type/route/subway":{icon:"iD-route-subway",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"subway"},name:"Subway Route"},"type/route/train":{icon:"iD-route-train",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"train"},name:"Train Route"},"type/route/tram":{icon:"iD-route-tram",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"tram"},name:"Tram Route"},"type/site":{icon:"iD-relation",fields:["name","site"],geometry:["relation"],tags:{type:"site"},name:"Site"},"type/waterway":{icon:"iD-route-water",fields:["name","waterway","ref"],geometry:["relation"],tags:{type:"waterway"},name:"Waterway"},vertex:{fields:["name"],geometry:["vertex"],tags:{},name:"Other",matchScore:0.1},"waterway/boatyard":{icon:"maki-harbor",fields:["name","operator"],geometry:["area","vertex","point"],tags:{waterway:"boatyard"},name:"Boatyard"},"waterway/canal":{icon:"iD-waterway-canal",fields:["name","width","intermittent"],geometry:["line"],tags:{waterway:"canal"},name:"Canal"},"waterway/dam":{icon:"maki-dam",geometry:["point","vertex","line","area"],fields:["name"],tags:{waterway:"dam"},name:"Dam"},"waterway/ditch":{icon:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"ditch"},name:"Ditch"},"waterway/dock":{icon:"maki-harbor",fields:["name","dock","operator"],geometry:["area","vertex","point"],terms:["boat","ship","vessel","marine"],tags:{waterway:"dock"},name:"Wet Dock / Dry Dock"},"waterway/drain":{icon:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"drain"},name:"Drain"},"waterway/fuel":{icon:"maki-fuel",fields:["name","operator","address","opening_hours","fuel_multi"],geometry:["point","area"],terms:["petrol","gas","diesel","boat"],tags:{waterway:"fuel"},name:"Marine Fuel Station"},"waterway/river":{icon:"iD-waterway-river",fields:["name","structure_waterway","width","intermittent"],geometry:["line"],terms:["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],tags:{waterway:"river"},name:"River"},"waterway/riverbank":{icon:"maki-water",geometry:["area"],tags:{waterway:"riverbank"},name:"Riverbank"},"waterway/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["name","operator","access_simple","fee","water_point"],geometry:["point","vertex","area"],terms:["Boat","Watercraft","Sanitary","Dump Station","Pumpout","Pump out","Elsan","CDP","CTDP","Chemical Toilet"],tags:{waterway:"sanitary_dump_station"},name:"Marine Toilet Disposal"},"waterway/stream_intermittent":{icon:"iD-waterway-stream",fields:["name","structure_waterway","width","intermittent"],geometry:["line"],terms:["arroyo","beck","branch","brook","burn","course","creek","drift","flood","flow","gully","run","runnel","rush","spate","spritz","tributary","wadi","wash","watercourse"],tags:{waterway:"stream",intermittent:"yes"},reference:{key:"waterway",value:"stream"},name:"Intermittent Stream"},"waterway/stream":{icon:"iD-waterway-stream",fields:["name","structure_waterway","width","intermittent"],geometry:["line"],terms:["beck","branch","brook","burn","course","creek","current","drift","flood","flow","freshet","race","rill","rindle","rivulet","run","runnel","rush","spate","spritz","surge","tide","torrent","tributary","watercourse"],tags:{waterway:"stream"},name:"Stream"},"waterway/water_point":{icon:"maki-drinking-water",geometry:["area","vertex","point"],tags:{waterway:"water_point"},name:"Marine Drinking Water"},"waterway/waterfall":{icon:"maki-water",fields:["name","height","width","intermittent"],geometry:["vertex"],terms:["fall"],tags:{waterway:"waterfall"},name:"Waterfall"},"waterway/weir":{icon:"maki-dam",geometry:["vertex","line"],tags:{waterway:"weir"},name:"Weir"},"amenity/arts_centre/Świetlica wiejska":{tags:{name:"Świetlica wiejska",amenity:"arts_centre"},name:"Świetlica wiejska",icon:"maki-theatre",geometry:["point","area"],fields:["name","address","building_area","opening_hours"],suggestion:true},"amenity/arts_centre/Дом культуры":{tags:{name:"Дом культуры",amenity:"arts_centre"},name:"Дом культуры",icon:"maki-theatre",geometry:["point","area"],fields:["name","address","building_area","opening_hours"],suggestion:true},"amenity/bank/ABANCA":{tags:{name:"ABANCA",amenity:"bank"},name:"ABANCA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ABN AMRO":{tags:{name:"ABN AMRO",amenity:"bank"},name:"ABN AMRO",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ABSA":{tags:{name:"ABSA",amenity:"bank"},name:"ABSA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/AIB":{tags:{name:"AIB",amenity:"bank"},name:"AIB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ANZ":{tags:{name:"ANZ",amenity:"bank"},name:"ANZ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ASB Bank":{tags:{name:"ASB Bank",amenity:"bank"},name:"ASB Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ATB Financial":{tags:{name:"ATB Financial",amenity:"bank"},name:"ATB Financial",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/AXA":{tags:{name:"AXA",amenity:"bank"},name:"AXA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Agribank":{tags:{name:"Agribank",amenity:"bank"},name:"Agribank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Akbank":{tags:{name:"Akbank",amenity:"bank"},name:"Akbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Alior Bank":{tags:{name:"Alior Bank",amenity:"bank"},name:"Alior Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Allahabad Bank":{tags:{name:"Allahabad Bank",amenity:"bank"},name:"Allahabad Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Allied Bank":{tags:{name:"Allied Bank",amenity:"bank"},name:"Allied Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Alpha Bank":{tags:{name:"Alpha Bank",amenity:"bank"},name:"Alpha Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Andhra Bank":{tags:{name:"Andhra Bank",amenity:"bank"},name:"Andhra Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Antonveneta":{tags:{name:"Antonveneta",amenity:"bank"},name:"Antonveneta",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Argenta":{tags:{name:"Argenta",amenity:"bank"},name:"Argenta",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Asia United Bank":{tags:{name:"Asia United Bank",amenity:"bank"},name:"Asia United Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Askari Bank":{tags:{name:"Askari Bank",amenity:"bank"},name:"Askari Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Associated Bank":{tags:{name:"Associated Bank",amenity:"bank"},name:"Associated Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Axis Bank":{tags:{name:"Axis Bank",amenity:"bank"},name:"Axis Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BAC":{tags:{name:"BAC",amenity:"bank"},name:"BAC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BAWAG PSK":{tags:{name:"BAWAG PSK",amenity:"bank"},name:"BAWAG PSK",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BB&T":{tags:{name:"BB&T",amenity:"bank"},name:"BB&T",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBBank":{tags:{name:"BBBank",amenity:"bank"},name:"BBBank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBK":{tags:{name:"BBK",amenity:"bank"},name:"BBK",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBVA":{tags:{name:"BBVA",amenity:"bank"},name:"BBVA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBVA Bancomer":{tags:{name:"BBVA Bancomer",amenity:"bank"},name:"BBVA Bancomer",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBVA Compass":{tags:{name:"BBVA Compass",amenity:"bank"},name:"BBVA Compass",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBVA Continental":{tags:{name:"BBVA Continental",amenity:"bank"},name:"BBVA Continental",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBVA Francés":{tags:{name:"BBVA Francés",amenity:"bank"},name:"BBVA Francés",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BCA":{tags:{name:"BCA",amenity:"bank"},name:"BCA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BCI":{tags:{name:"BCI",amenity:"bank"},name:"BCI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BCP":{tags:{name:"BCP",amenity:"bank"},name:"BCP",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BCR":{tags:{name:"BCR",amenity:"bank"},name:"BCR",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BDO":{tags:{name:"BDO",amenity:"bank"},name:"BDO",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BGŻ BNP Paribas":{tags:{name:"BGŻ BNP Paribas",amenity:"bank"},name:"BGŻ BNP Paribas",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BMCE":{tags:{name:"BMCE",amenity:"bank"},name:"BMCE",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BMN":{tags:{name:"BMN",amenity:"bank"},name:"BMN",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BMO":{tags:{name:"BMO",amenity:"bank"},name:"BMO",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BMO Harris Bank":{tags:{name:"BMO Harris Bank",amenity:"bank"},name:"BMO Harris Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BNA":{tags:{name:"BNA",amenity:"bank"},name:"BNA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BNI":{tags:{name:"BNI",amenity:"bank"},name:"BNI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BNL":{tags:{name:"BNL",amenity:"bank"},name:"BNL",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BNP Paribas":{tags:{name:"BNP Paribas",amenity:"bank"},name:"BNP Paribas",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BNP Paribas Fortis":{tags:{name:"BNP Paribas Fortis",amenity:"bank"},name:"BNP Paribas Fortis",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BOC":{tags:{name:"BOC",amenity:"bank"},name:"BOC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BPH":{tags:{name:"BPH",amenity:"bank"},name:"BPH",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BPI":{tags:{name:"BPI",amenity:"bank"},name:"BPI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BPI Family Savings Bank":{tags:{name:"BPI Family Savings Bank",amenity:"bank"},name:"BPI Family Savings Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BRD":{tags:{name:"BRD",amenity:"bank"},name:"BRD",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BRED":{tags:{name:"BRED",amenity:"bank"},name:"BRED",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BRI":{tags:{name:"BRI",amenity:"bank"},name:"BRI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BW-Bank":{tags:{name:"BW-Bank",amenity:"bank"},name:"BW-Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BZ WBK":{tags:{name:"BZ WBK",amenity:"bank"},name:"BZ WBK",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banamex":{tags:{name:"Banamex",amenity:"bank"},name:"Banamex",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banc Sabadell":{tags:{name:"Banc Sabadell",amenity:"bank"},name:"Banc Sabadell",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Intesa":{tags:{name:"Banca Intesa",amenity:"bank"},name:"Banca Intesa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca March":{tags:{name:"Banca March",amenity:"bank"},name:"Banca March",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Popolare di Milano":{tags:{name:"Banca Popolare di Milano",amenity:"bank"},name:"Banca Popolare di Milano",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Popolare di Novara":{tags:{name:"Banca Popolare di Novara",amenity:"bank"},name:"Banca Popolare di Novara",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Popolare di Sondrio":{tags:{name:"Banca Popolare di Sondrio",amenity:"bank"},name:"Banca Popolare di Sondrio",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Popolare di Verona":{tags:{name:"Banca Popolare di Verona",amenity:"bank"},name:"Banca Popolare di Verona",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Popolare di Vicenza":{tags:{name:"Banca Popolare di Vicenza",amenity:"bank"},name:"Banca Popolare di Vicenza",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Românească":{tags:{name:"Banca Românească",amenity:"bank"},name:"Banca Românească",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Sella":{tags:{name:"Banca Sella",amenity:"bank"},name:"Banca Sella",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Transilvania":{tags:{name:"Banca Transilvania",amenity:"bank"},name:"Banca Transilvania",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Agrario":{tags:{name:"Banco Agrario",amenity:"bank"},name:"Banco Agrario",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Azteca":{tags:{name:"Banco Azteca",amenity:"bank"},name:"Banco Azteca",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco BCI":{tags:{name:"Banco BCI",amenity:"bank"},name:"Banco BCI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Continental":{tags:{name:"Banco Continental",amenity:"bank"},name:"Banco Continental",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Estado":{tags:{name:"Banco Estado",amenity:"bank"},name:"Banco Estado",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Fassil":{tags:{name:"Banco Fassil",amenity:"bank"},name:"Banco Fassil",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco G&T Continental":{tags:{name:"Banco G&T Continental",amenity:"bank"},name:"Banco G&T Continental",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco General":{tags:{name:"Banco General",amenity:"bank"},name:"Banco General",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Industrial":{tags:{name:"Banco Industrial",amenity:"bank"},name:"Banco Industrial",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Internacional":{tags:{name:"Banco Internacional",amenity:"bank"},name:"Banco Internacional",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Nacional":{tags:{name:"Banco Nacional",amenity:"bank"},name:"Banco Nacional",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Nación":{tags:{name:"Banco Nación",amenity:"bank"},name:"Banco Nación",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Pastor":{tags:{name:"Banco Pastor",amenity:"bank"},name:"Banco Pastor",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Pichincha":{tags:{name:"Banco Pichincha",amenity:"bank"},name:"Banco Pichincha",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Popular":{tags:{name:"Banco Popular",amenity:"bank"},name:"Banco Popular",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Provincia":{tags:{name:"Banco Provincia",amenity:"bank"},name:"Banco Provincia",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Sabadell":{tags:{name:"Banco Sabadell",amenity:"bank"},name:"Banco Sabadell",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Santander":{tags:{name:"Banco Santander",amenity:"bank"},name:"Banco Santander",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Sol":{tags:{name:"Banco Sol",amenity:"bank"},name:"Banco Sol",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Bogotá":{tags:{name:"Banco de Bogotá",amenity:"bank"},name:"Banco de Bogotá",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Chile":{tags:{name:"Banco de Chile",amenity:"bank"},name:"Banco de Chile",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Costa Rica":{tags:{name:"Banco de Costa Rica",amenity:"bank"},name:"Banco de Costa Rica",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Desarrollo Banrural":{tags:{name:"Banco de Desarrollo Banrural",amenity:"bank"},name:"Banco de Desarrollo Banrural",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Occidente":{tags:{name:"Banco de Occidente",amenity:"bank"},name:"Banco de Occidente",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Venezuela":{tags:{name:"Banco de Venezuela",amenity:"bank"},name:"Banco de Venezuela",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de la Nación":{tags:{name:"Banco de la Nación",amenity:"bank"},name:"Banco de la Nación",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de la Nación Argentina":{tags:{name:"Banco de la Nación Argentina",amenity:"bank"},name:"Banco de la Nación Argentina",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco di Napoli":{tags:{name:"Banco di Napoli",amenity:"bank"},name:"Banco di Napoli",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco di Sardegna":{tags:{name:"Banco di Sardegna",amenity:"bank"},name:"Banco di Sardegna",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco do Brasil":{tags:{name:"Banco do Brasil",amenity:"bank"},name:"Banco do Brasil",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco do Nordeste":{tags:{name:"Banco do Nordeste",amenity:"bank"},name:"Banco do Nordeste",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BancoEstado":{tags:{name:"BancoEstado",amenity:"bank"},name:"BancoEstado",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bancolombia":{tags:{name:"Bancolombia",amenity:"bank"},name:"Bancolombia",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bancomer":{tags:{name:"Bancomer",amenity:"bank"},name:"Bancomer",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bancpost":{tags:{name:"Bancpost",amenity:"bank"},name:"Bancpost",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banesco":{tags:{name:"Banesco",amenity:"bank"},name:"Banesco",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bangkok Bank":{tags:{name:"Bangkok Bank",amenity:"bank"},name:"Bangkok Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Al Habib":{tags:{name:"Bank Al Habib",amenity:"bank"},name:"Bank Al Habib",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Alfalah":{tags:{name:"Bank Alfalah",amenity:"bank"},name:"Bank Alfalah",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Austria":{tags:{name:"Bank Austria",amenity:"bank"},name:"Bank Austria",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank BCA":{tags:{name:"Bank BCA",amenity:"bank"},name:"Bank BCA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank BNI":{tags:{name:"Bank BNI",amenity:"bank"},name:"Bank BNI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank BPH":{tags:{name:"Bank BPH",amenity:"bank"},name:"Bank BPH",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank BRI":{tags:{name:"Bank BRI",amenity:"bank"},name:"Bank BRI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Danamon":{tags:{name:"Bank Danamon",amenity:"bank"},name:"Bank Danamon",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Mandiri":{tags:{name:"Bank Mandiri",amenity:"bank"},name:"Bank Mandiri",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Mega":{tags:{name:"Bank Mega",amenity:"bank"},name:"Bank Mega",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Spółdzielczy":{tags:{name:"Bank Spółdzielczy",amenity:"bank"},name:"Bank Spółdzielczy",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Zachodni WBK":{tags:{name:"Bank Zachodni WBK",amenity:"bank"},name:"Bank Zachodni WBK",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Africa":{tags:{name:"Bank of Africa",amenity:"bank"},name:"Bank of Africa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of America":{tags:{name:"Bank of America",amenity:"bank"},name:"Bank of America",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Baroda":{tags:{name:"Bank of Baroda",amenity:"bank"},name:"Bank of Baroda",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Ceylon":{tags:{name:"Bank of Ceylon",amenity:"bank"},name:"Bank of Ceylon",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of China":{tags:{name:"Bank of China",amenity:"bank"},name:"Bank of China",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Commerce":{tags:{name:"Bank of Commerce",amenity:"bank"},name:"Bank of Commerce",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of India":{tags:{name:"Bank of India",amenity:"bank"},name:"Bank of India",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Ireland":{tags:{name:"Bank of Ireland",amenity:"bank"},name:"Bank of Ireland",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Montreal":{tags:{name:"Bank of Montreal",amenity:"bank"},name:"Bank of Montreal",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of New Zealand":{tags:{name:"Bank of New Zealand",amenity:"bank"},name:"Bank of New Zealand",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Scotland":{tags:{name:"Bank of Scotland",amenity:"bank"},name:"Bank of Scotland",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of the West":{tags:{name:"Bank of the West",amenity:"bank"},name:"Bank of the West",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bankia":{tags:{name:"Bankia",amenity:"bank"},name:"Bankia",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bankinter":{tags:{name:"Bankinter",amenity:"bank"},name:"Bankinter",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banner Bank":{tags:{name:"Banner Bank",amenity:"bank"},name:"Banner Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banorte":{tags:{name:"Banorte",amenity:"bank"},name:"Banorte",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banque Atlantique":{tags:{name:"Banque Atlantique",amenity:"bank"},name:"Banque Atlantique",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banque Nationale":{tags:{name:"Banque Nationale",amenity:"bank"},name:"Banque Nationale",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banque Populaire":{tags:{name:"Banque Populaire",amenity:"bank"},name:"Banque Populaire",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banrisul":{tags:{name:"Banrisul",amenity:"bank"},name:"Banrisul",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banrural":{tags:{name:"Banrural",amenity:"bank"},name:"Banrural",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Barclays":{tags:{name:"Barclays",amenity:"bank"},name:"Barclays",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bcc":{tags:{name:"Bcc",amenity:"bank"},name:"Bcc",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Belfius":{tags:{name:"Belfius",amenity:"bank"},name:"Belfius",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bendigo Bank":{tags:{name:"Bendigo Bank",amenity:"bank"},name:"Bendigo Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Berliner Volksbank":{tags:{name:"Berliner Volksbank",amenity:"bank"},name:"Berliner Volksbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bicentenario":{tags:{name:"Bicentenario",amenity:"bank"},name:"Bicentenario",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bradesco":{tags:{name:"Bradesco",amenity:"bank"},name:"Bradesco",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Budapest Bank":{tags:{name:"Budapest Bank",amenity:"bank"},name:"Budapest Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CBAO":{tags:{name:"CBAO",amenity:"bank"},name:"CBAO",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CEC Bank":{tags:{name:"CEC Bank",amenity:"bank"},name:"CEC Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CGD":{tags:{name:"CGD",amenity:"bank"},name:"CGD",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CIB Bank":{tags:{name:"CIB Bank",amenity:"bank"},name:"CIB Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CIBC":{tags:{name:"CIBC",amenity:"bank"},name:"CIBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CIC":{tags:{name:"CIC",amenity:"bank"},name:"CIC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CIMB Bank":{tags:{name:"CIMB Bank",amenity:"bank"},name:"CIMB Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CNEP":{tags:{name:"CNEP",amenity:"bank"},name:"CNEP",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caisse Desjardins":{tags:{name:"Caisse Desjardins",amenity:"bank"},name:"Caisse Desjardins",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caisse d'Épargne":{tags:{name:"Caisse d'Épargne",amenity:"bank"},name:"Caisse d'Épargne",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caixa":{tags:{name:"Caixa",amenity:"bank"},name:"Caixa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caixa Econômica Federal":{tags:{name:"Caixa Econômica Federal",amenity:"bank"},name:"Caixa Econômica Federal",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caixa Geral de Depósitos":{tags:{name:"Caixa Geral de Depósitos",amenity:"bank"},name:"Caixa Geral de Depósitos",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CaixaBank":{tags:{name:"CaixaBank",amenity:"bank"},name:"CaixaBank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caja Círculo":{tags:{name:"Caja Círculo",amenity:"bank"},name:"Caja Círculo",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caja Duero":{tags:{name:"Caja Duero",amenity:"bank"},name:"Caja Duero",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caja España":{tags:{name:"Caja España",amenity:"bank"},name:"Caja España",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caja Rural":{tags:{name:"Caja Rural",amenity:"bank"},name:"Caja Rural",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caja Rural de Jaén":{tags:{name:"Caja Rural de Jaén",amenity:"bank"},name:"Caja Rural de Jaén",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CajaSur":{tags:{name:"CajaSur",amenity:"bank"},name:"CajaSur",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Cajamar":{tags:{name:"Cajamar",amenity:"bank"},name:"Cajamar",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Cajero Automatico Bancared":{tags:{name:"Cajero Automatico Bancared",amenity:"bank"},name:"Cajero Automatico Bancared",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Canara Bank":{tags:{name:"Canara Bank",amenity:"bank"},name:"Canara Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Capital One":{tags:{name:"Capital One",amenity:"bank"},name:"Capital One",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Carige":{tags:{name:"Carige",amenity:"bank"},name:"Carige",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Cariparma":{tags:{name:"Cariparma",amenity:"bank"},name:"Cariparma",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Cassa di Risparmio del Veneto":{tags:{name:"Cassa di Risparmio del Veneto",amenity:"bank"},name:"Cassa di Risparmio del Veneto",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CatalunyaCaixa":{tags:{name:"CatalunyaCaixa",amenity:"bank"},name:"CatalunyaCaixa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Central Bank of India":{tags:{name:"Central Bank of India",amenity:"bank"},name:"Central Bank of India",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Chase":{tags:{name:"Chase",amenity:"bank"},name:"Chase",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/China Bank":{tags:{name:"China Bank",amenity:"bank"},name:"China Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/China Bank Savings":{tags:{name:"China Bank Savings",amenity:"bank"},name:"China Bank Savings",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/China Construction Bank":{tags:{name:"China Construction Bank",amenity:"bank"},name:"China Construction Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Citibank":{tags:{name:"Citibank",amenity:"bank"},name:"Citibank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Citizens Bank":{tags:{name:"Citizens Bank",amenity:"bank"},name:"Citizens Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Clydesdale Bank":{tags:{name:"Clydesdale Bank",amenity:"bank"},name:"Clydesdale Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Columbia Bank":{tags:{name:"Columbia Bank",amenity:"bank"},name:"Columbia Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Comerica Bank":{tags:{name:"Comerica Bank",amenity:"bank"},name:"Comerica Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Commerce Bank":{tags:{name:"Commerce Bank",amenity:"bank"},name:"Commerce Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Commercial Bank":{tags:{name:"Commercial Bank",amenity:"bank"},name:"Commercial Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Commercial Bank of Ceylon PLC":{tags:{name:"Commercial Bank of Ceylon PLC",amenity:"bank"},name:"Commercial Bank of Ceylon PLC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Commerzbank":{tags:{name:"Commerzbank",amenity:"bank"},name:"Commerzbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Commonwealth Bank":{tags:{name:"Commonwealth Bank",amenity:"bank"},name:"Commonwealth Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Corporation Bank":{tags:{name:"Corporation Bank",amenity:"bank"},name:"Corporation Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Credem":{tags:{name:"Credem",amenity:"bank"},name:"Credem",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Credicoop":{tags:{name:"Credicoop",amenity:"bank"},name:"Credicoop",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Credit Agricole":{tags:{name:"Credit Agricole",amenity:"bank"},name:"Credit Agricole",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Credit Suisse":{tags:{name:"Credit Suisse",amenity:"bank"},name:"Credit Suisse",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crelan":{tags:{name:"Crelan",amenity:"bank"},name:"Crelan",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crédit Agricole":{tags:{name:"Crédit Agricole",amenity:"bank"},name:"Crédit Agricole",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crédit Mutuel":{tags:{name:"Crédit Mutuel",amenity:"bank"},name:"Crédit Mutuel",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crédit Mutuel de Bretagne":{tags:{name:"Crédit Mutuel de Bretagne",amenity:"bank"},name:"Crédit Mutuel de Bretagne",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crédit du Nord":{tags:{name:"Crédit du Nord",amenity:"bank"},name:"Crédit du Nord",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crédito Agrícola":{tags:{name:"Crédito Agrícola",amenity:"bank"},name:"Crédito Agrícola",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Cбербанк":{tags:{name:"Cбербанк",amenity:"bank"},name:"Cбербанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Danske Bank":{tags:{name:"Danske Bank",amenity:"bank"},name:"Danske Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Davivienda":{tags:{name:"Davivienda",amenity:"bank"},name:"Davivienda",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/De Venezuela":{tags:{name:"De Venezuela",amenity:"bank"},name:"De Venezuela",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Denizbank":{tags:{name:"Denizbank",amenity:"bank"},name:"Denizbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Desjardins":{tags:{name:"Desjardins",amenity:"bank"},name:"Desjardins",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Deutsche Bank":{tags:{name:"Deutsche Bank",amenity:"bank"},name:"Deutsche Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Dubai Islamic Bank":{tags:{name:"Dubai Islamic Bank",amenity:"bank"},name:"Dubai Islamic Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/EastWest Bank":{tags:{name:"EastWest Bank",amenity:"bank"},name:"EastWest Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Ecobank":{tags:{name:"Ecobank",amenity:"bank"},name:"Ecobank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Erste Bank":{tags:{name:"Erste Bank",amenity:"bank"},name:"Erste Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Eurobank":{tags:{name:"Eurobank",amenity:"bank"},name:"Eurobank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Express Union":{tags:{name:"Express Union",amenity:"bank"},name:"Express Union",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/FNB":{tags:{name:"FNB",amenity:"bank"},name:"FNB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Federal Bank":{tags:{name:"Federal Bank",amenity:"bank"},name:"Federal Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Fifth Third Bank":{tags:{name:"Fifth Third Bank",amenity:"bank"},name:"Fifth Third Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Finansbank":{tags:{name:"Finansbank",amenity:"bank"},name:"Finansbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/First Bank":{tags:{name:"First Bank",amenity:"bank"},name:"First Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/First Citizens Bank":{tags:{name:"First Citizens Bank",amenity:"bank"},name:"First Citizens Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/First National Bank":{tags:{name:"First National Bank",amenity:"bank"},name:"First National Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Galicia":{tags:{name:"Galicia",amenity:"bank"},name:"Galicia",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Garanti":{tags:{name:"Garanti",amenity:"bank"},name:"Garanti",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Garanti Bankası":{tags:{name:"Garanti Bankası",amenity:"bank"},name:"Garanti Bankası",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Getin Bank":{tags:{name:"Getin Bank",amenity:"bank"},name:"Getin Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Groupama":{tags:{name:"Groupama",amenity:"bank"},name:"Groupama",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/HDFC Bank":{tags:{name:"HDFC Bank",amenity:"bank"},name:"HDFC Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/HNB":{tags:{name:"HNB",amenity:"bank"},name:"HNB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/HSBC":{tags:{name:"HSBC",amenity:"bank"},name:"HSBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Halifax":{tags:{name:"Halifax",amenity:"bank"},name:"Halifax",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Halkbank":{tags:{name:"Halkbank",amenity:"bank"},name:"Halkbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Hamburger Sparkasse":{tags:{name:"Hamburger Sparkasse",amenity:"bank"},name:"Hamburger Sparkasse",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Handelsbanken":{tags:{name:"Handelsbanken",amenity:"bank"},name:"Handelsbanken",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Hong Leong Bank":{tags:{name:"Hong Leong Bank",amenity:"bank"},name:"Hong Leong Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Hrvatska poštanska banka":{tags:{name:"Hrvatska poštanska banka",amenity:"bank"},name:"Hrvatska poštanska banka",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Huntington Bank":{tags:{name:"Huntington Bank",amenity:"bank"},name:"Huntington Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/HypoVereinsbank":{tags:{name:"HypoVereinsbank",amenity:"bank"},name:"HypoVereinsbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ICBC":{tags:{name:"ICBC",amenity:"bank"},name:"ICBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ICICI Bank":{tags:{name:"ICICI Bank",amenity:"bank"},name:"ICICI Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/IDBI Bank":{tags:{name:"IDBI Bank",amenity:"bank"},name:"IDBI Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ING":{tags:{name:"ING",amenity:"bank"},name:"ING",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ING Bank Śląski":{tags:{name:"ING Bank Śląski",amenity:"bank"},name:"ING Bank Śląski",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/IberCaja":{tags:{name:"IberCaja",amenity:"bank"},name:"IberCaja",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Indian Bank":{tags:{name:"Indian Bank",amenity:"bank"},name:"Indian Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Indian Overseas Bank":{tags:{name:"Indian Overseas Bank",amenity:"bank"},name:"Indian Overseas Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Interbank":{tags:{name:"Interbank",amenity:"bank"},name:"Interbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Intesa San Paolo":{tags:{name:"Intesa San Paolo",amenity:"bank"},name:"Intesa San Paolo",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Itaú":{tags:{name:"Itaú",amenity:"bank"},name:"Itaú",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/K&H Bank":{tags:{name:"K&H Bank",amenity:"bank"},name:"K&H Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/KBC":{tags:{name:"KBC",amenity:"bank"},name:"KBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Kasa Stefczyka":{tags:{name:"Kasa Stefczyka",amenity:"bank"},name:"Kasa Stefczyka",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Key Bank":{tags:{name:"Key Bank",amenity:"bank"},name:"Key Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Komerční banka":{tags:{name:"Komerční banka",amenity:"bank"},name:"Komerční banka",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Kreissparkasse":{tags:{name:"Kreissparkasse",amenity:"bank"},name:"Kreissparkasse",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Kreissparkasse Köln":{tags:{name:"Kreissparkasse Köln",amenity:"bank"},name:"Kreissparkasse Köln",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Kutxabank":{tags:{name:"Kutxabank",amenity:"bank"},name:"Kutxabank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/LCL":{tags:{name:"LCL",amenity:"bank"},name:"LCL",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/La Banque Postale":{tags:{name:"La Banque Postale",amenity:"bank"},name:"La Banque Postale",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/La Caixa":{tags:{name:"La Caixa",amenity:"bank"},name:"La Caixa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Laboral Kutxa":{tags:{name:"Laboral Kutxa",amenity:"bank"},name:"Laboral Kutxa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Landbank":{tags:{name:"Landbank",amenity:"bank"},name:"Landbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Liberbank":{tags:{name:"Liberbank",amenity:"bank"},name:"Liberbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Lloyds Bank":{tags:{name:"Lloyds Bank",amenity:"bank"},name:"Lloyds Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/M&T Bank":{tags:{name:"M&T Bank",amenity:"bank"},name:"M&T Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/MCB":{tags:{name:"MCB",amenity:"bank"},name:"MCB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/MCB Bank":{tags:{name:"MCB Bank",amenity:"bank"},name:"MCB Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/MONETA Money Bank":{tags:{name:"MONETA Money Bank",amenity:"bank"},name:"MONETA Money Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Macro":{tags:{name:"Macro",amenity:"bank"},name:"Macro",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Maybank":{tags:{name:"Maybank",amenity:"bank"},name:"Maybank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Meezan Bank":{tags:{name:"Meezan Bank",amenity:"bank"},name:"Meezan Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Mercantil":{tags:{name:"Mercantil",amenity:"bank"},name:"Mercantil",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Metro Bank":{tags:{name:"Metro Bank",amenity:"bank"},name:"Metro Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Metrobank":{tags:{name:"Metrobank",amenity:"bank"},name:"Metrobank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Millennium BCP":{tags:{name:"Millennium BCP",amenity:"bank"},name:"Millennium BCP",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Millennium Bank":{tags:{name:"Millennium Bank",amenity:"bank"},name:"Millennium Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Monte dei Paschi di Siena":{tags:{name:"Monte dei Paschi di Siena",amenity:"bank"},name:"Monte dei Paschi di Siena",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Montepio":{tags:{name:"Montepio",amenity:"bank"},name:"Montepio",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/NAB":{tags:{name:"NAB",amenity:"bank"},name:"NAB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/NSB":{tags:{name:"NSB",amenity:"bank"},name:"NSB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/NatWest":{tags:{name:"NatWest",amenity:"bank"},name:"NatWest",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/National Bank":{tags:{name:"National Bank",amenity:"bank"},name:"National Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Nationwide":{tags:{name:"Nationwide",amenity:"bank"},name:"Nationwide",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Nedbank":{tags:{name:"Nedbank",amenity:"bank"},name:"Nedbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Nordea":{tags:{name:"Nordea",amenity:"bank"},name:"Nordea",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Novo Banco":{tags:{name:"Novo Banco",amenity:"bank"},name:"Novo Banco",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/OLB":{tags:{name:"OLB",amenity:"bank"},name:"OLB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/OTP":{tags:{name:"OTP",amenity:"bank"},name:"OTP",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Oberbank":{tags:{name:"Oberbank",amenity:"bank"},name:"Oberbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Occidental de Descuento":{tags:{name:"Occidental de Descuento",amenity:"bank"},name:"Occidental de Descuento",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Oldenburgische Landesbank":{tags:{name:"Oldenburgische Landesbank",amenity:"bank"},name:"Oldenburgische Landesbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/One Network Bank":{tags:{name:"One Network Bank",amenity:"bank"},name:"One Network Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Osuuspankki":{tags:{name:"Osuuspankki",amenity:"bank"},name:"Osuuspankki",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PBZ":{tags:{name:"PBZ",amenity:"bank"},name:"PBZ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PKO":{tags:{name:"PKO",amenity:"bank"},name:"PKO",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PKO BP":{tags:{name:"PKO BP",amenity:"bank"},name:"PKO BP",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PNB":{tags:{name:"PNB",amenity:"bank"},name:"PNB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PNC":{tags:{name:"PNC",amenity:"bank"},name:"PNC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PNC Bank":{tags:{name:"PNC Bank",amenity:"bank"},name:"PNC Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PSBank":{tags:{name:"PSBank",amenity:"bank"},name:"PSBank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Patagonia":{tags:{name:"Patagonia",amenity:"bank"},name:"Patagonia",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Pekao SA":{tags:{name:"Pekao SA",amenity:"bank"},name:"Pekao SA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Peoples Bank":{tags:{name:"Peoples Bank",amenity:"bank"},name:"Peoples Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Philippine National Bank":{tags:{name:"Philippine National Bank",amenity:"bank"},name:"Philippine National Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Piraeus Bank":{tags:{name:"Piraeus Bank",amenity:"bank"},name:"Piraeus Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Popular":{tags:{name:"Popular",amenity:"bank"},name:"Popular",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Postbank":{tags:{name:"Postbank",amenity:"bank"},name:"Postbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Postbank Finanzcenter":{tags:{name:"Postbank Finanzcenter",amenity:"bank"},name:"Postbank Finanzcenter",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Provincial":{tags:{name:"Provincial",amenity:"bank"},name:"Provincial",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Public Bank":{tags:{name:"Public Bank",amenity:"bank"},name:"Public Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Punjab National Bank":{tags:{name:"Punjab National Bank",amenity:"bank"},name:"Punjab National Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/RBC":{tags:{name:"RBC",amenity:"bank"},name:"RBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/RBC Financial Group":{tags:{name:"RBC Financial Group",amenity:"bank"},name:"RBC Financial Group",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/RBS":{tags:{name:"RBS",amenity:"bank"},name:"RBS",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/RCBC":{tags:{name:"RCBC",amenity:"bank"},name:"RCBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/RCBC Savings Bank":{tags:{name:"RCBC Savings Bank",amenity:"bank"},name:"RCBC Savings Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Rabobank":{tags:{name:"Rabobank",amenity:"bank"},name:"Rabobank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Raiffeisen Polbank":{tags:{name:"Raiffeisen Polbank",amenity:"bank"},name:"Raiffeisen Polbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Raiffeisenbank":{tags:{name:"Raiffeisenbank",amenity:"bank"},name:"Raiffeisenbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Regions Bank":{tags:{name:"Regions Bank",amenity:"bank"},name:"Regions Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Republic Bank":{tags:{name:"Republic Bank",amenity:"bank"},name:"Republic Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Royal Bank":{tags:{name:"Royal Bank",amenity:"bank"},name:"Royal Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Royal Bank of Canada":{tags:{name:"Royal Bank of Canada",amenity:"bank"},name:"Royal Bank of Canada",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Royal Bank of Scotland":{tags:{name:"Royal Bank of Scotland",amenity:"bank"},name:"Royal Bank of Scotland",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/SEB":{tags:{name:"SEB",amenity:"bank"},name:"SEB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/SNS Bank":{tags:{name:"SNS Bank",amenity:"bank"},name:"SNS Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sabadell":{tags:{name:"Sabadell",amenity:"bank"},name:"Sabadell",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sampath Bank":{tags:{name:"Sampath Bank",amenity:"bank"},name:"Sampath Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Santander":{tags:{name:"Santander",amenity:"bank"},name:"Santander",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Santander Consumer Bank":{tags:{name:"Santander Consumer Bank",amenity:"bank"},name:"Santander Consumer Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Santander Río":{tags:{name:"Santander Río",amenity:"bank"},name:"Santander Río",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Santander Totta":{tags:{name:"Santander Totta",amenity:"bank"},name:"Santander Totta",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sberbank":{tags:{name:"Sberbank",amenity:"bank"},name:"Sberbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Scotiabank":{tags:{name:"Scotiabank",amenity:"bank"},name:"Scotiabank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Security Bank":{tags:{name:"Security Bank",amenity:"bank"},name:"Security Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sicredi":{tags:{name:"Sicredi",amenity:"bank"},name:"Sicredi",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Slovenská sporiteľňa":{tags:{name:"Slovenská sporiteľňa",amenity:"bank"},name:"Slovenská sporiteľňa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Société Générale":{tags:{name:"Société Générale",amenity:"bank"},name:"Société Générale",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sparda-Bank":{tags:{name:"Sparda-Bank",amenity:"bank"},name:"Sparda-Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sparkasse":{tags:{name:"Sparkasse",amenity:"bank"},name:"Sparkasse",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sparkasse Aachen":{tags:{name:"Sparkasse Aachen",amenity:"bank"},name:"Sparkasse Aachen",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sparkasse KölnBonn":{tags:{name:"Sparkasse KölnBonn",amenity:"bank"},name:"Sparkasse KölnBonn",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Stadtsparkasse":{tags:{name:"Stadtsparkasse",amenity:"bank"},name:"Stadtsparkasse",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Stanbic Bank":{tags:{name:"Stanbic Bank",amenity:"bank"},name:"Stanbic Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Standard Bank":{tags:{name:"Standard Bank",amenity:"bank"},name:"Standard Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Standard Chartered":{tags:{name:"Standard Chartered",amenity:"bank"},name:"Standard Chartered",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Standard Chartered Bank":{tags:{name:"Standard Chartered Bank",amenity:"bank"},name:"Standard Chartered Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/State Bank of India":{tags:{name:"State Bank of India",amenity:"bank"},name:"State Bank of India",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/SunTrust":{tags:{name:"SunTrust",amenity:"bank"},name:"SunTrust",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Supervielle":{tags:{name:"Supervielle",amenity:"bank"},name:"Supervielle",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Swedbank":{tags:{name:"Swedbank",amenity:"bank"},name:"Swedbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Syndicate Bank":{tags:{name:"Syndicate Bank",amenity:"bank"},name:"Syndicate Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/TCF Bank":{tags:{name:"TCF Bank",amenity:"bank"},name:"TCF Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/TD Bank":{tags:{name:"TD Bank",amenity:"bank"},name:"TD Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/TD Canada Trust":{tags:{name:"TD Canada Trust",amenity:"bank"},name:"TD Canada Trust",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/TEB":{tags:{name:"TEB",amenity:"bank"},name:"TEB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/TSB":{tags:{name:"TSB",amenity:"bank"},name:"TSB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Takarékszövetkezet":{tags:{name:"Takarékszövetkezet",amenity:"bank"},name:"Takarékszövetkezet",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Targobank":{tags:{name:"Targobank",amenity:"bank"},name:"Targobank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Tatra banka":{tags:{name:"Tatra banka",amenity:"bank"},name:"Tatra banka",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Türkiye İş Bankası":{tags:{name:"Türkiye İş Bankası",amenity:"bank"},name:"Türkiye İş Bankası",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/UBS":{tags:{name:"UBS",amenity:"bank"},name:"UBS",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/UCO Bank":{tags:{name:"UCO Bank",amenity:"bank"},name:"UCO Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/UCPB":{tags:{name:"UCPB",amenity:"bank"},name:"UCPB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/UOB":{tags:{name:"UOB",amenity:"bank"},name:"UOB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/US Bank":{tags:{name:"US Bank",amenity:"bank"},name:"US Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Ulster Bank":{tags:{name:"Ulster Bank",amenity:"bank"},name:"Ulster Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Umpqua Bank":{tags:{name:"Umpqua Bank",amenity:"bank"},name:"Umpqua Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/UniCredit Bank":{tags:{name:"UniCredit Bank",amenity:"bank"},name:"UniCredit Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Unicaja Banco":{tags:{name:"Unicaja Banco",amenity:"bank"},name:"Unicaja Banco",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Unicredit Banca":{tags:{name:"Unicredit Banca",amenity:"bank"},name:"Unicredit Banca",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Union Bank":{tags:{name:"Union Bank",amenity:"bank"},name:"Union Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/United Bank":{tags:{name:"United Bank",amenity:"bank"},name:"United Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/VR-Bank":{tags:{name:"VR-Bank",amenity:"bank"},name:"VR-Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Vakıfbank":{tags:{name:"Vakıfbank",amenity:"bank"},name:"Vakıfbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Veneto Banca":{tags:{name:"Veneto Banca",amenity:"bank"},name:"Veneto Banca",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Vijaya Bank":{tags:{name:"Vijaya Bank",amenity:"bank"},name:"Vijaya Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Volks- und Raiffeisenbank":{tags:{name:"Volks- und Raiffeisenbank",amenity:"bank"},name:"Volks- und Raiffeisenbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Volksbank":{tags:{name:"Volksbank",amenity:"bank"},name:"Volksbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Volksbank Mittelhessen":{tags:{name:"Volksbank Mittelhessen",amenity:"bank"},name:"Volksbank Mittelhessen",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Volksbank Raiffeisenbank":{tags:{name:"Volksbank Raiffeisenbank",amenity:"bank"},name:"Volksbank Raiffeisenbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/VÚB":{tags:{name:"VÚB",amenity:"bank"},name:"VÚB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Washington Federal":{tags:{name:"Washington Federal",amenity:"bank"},name:"Washington Federal",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Wells Fargo":{tags:{name:"Wells Fargo",amenity:"bank"},name:"Wells Fargo",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Western Union":{tags:{name:"Western Union",amenity:"bank"},name:"Western Union",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Westpac":{tags:{name:"Westpac",amenity:"bank"},name:"Westpac",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Yorkshire Bank":{tags:{name:"Yorkshire Bank",amenity:"bank"},name:"Yorkshire Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Yorkshire Building Society":{tags:{name:"Yorkshire Building Society",amenity:"bank"},name:"Yorkshire Building Society",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Zagrebačka banka":{tags:{name:"Zagrebačka banka",amenity:"bank"},name:"Zagrebačka banka",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Ziraat Bankası":{tags:{name:"Ziraat Bankası",amenity:"bank"},name:"Ziraat Bankası",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/mBank":{tags:{name:"mBank",amenity:"bank"},name:"mBank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ČSOB":{tags:{name:"ČSOB",amenity:"bank"},name:"ČSOB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Česká spořitelna":{tags:{name:"Česká spořitelna",amenity:"bank"},name:"Česká spořitelna",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/İş Bankası":{tags:{name:"İş Bankası",amenity:"bank"},name:"İş Bankası",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Εθνική Τράπεζα":{tags:{name:"Εθνική Τράπεζα",amenity:"bank"},name:"Εθνική Τράπεζα",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Πειραιώς":{tags:{name:"Πειραιώς",amenity:"bank"},name:"Πειραιώς",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Τράπεζα Πειραιώς":{tags:{name:"Τράπεζα Πειραιώς",amenity:"bank"},name:"Τράπεζα Πειραιώς",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Авангард":{tags:{name:"Авангард",amenity:"bank"},name:"Авангард",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Альфа-Банк":{tags:{name:"Альфа-Банк",amenity:"bank"},name:"Альфа-Банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Банк Москвы":{tags:{name:"Банк Москвы",amenity:"bank"},name:"Банк Москвы",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Банка ДСК":{tags:{name:"Банка ДСК",amenity:"bank"},name:"Банка ДСК",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Белагропромбанк":{tags:{name:"Белагропромбанк",amenity:"bank"},name:"Белагропромбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Беларусбанк":{tags:{name:"Беларусбанк",amenity:"bank"},name:"Беларусбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Белинвестбанк":{tags:{name:"Белинвестбанк",amenity:"bank"},name:"Белинвестбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Бинбанк":{tags:{name:"Бинбанк",amenity:"bank"},name:"Бинбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ВТБ":{tags:{name:"ВТБ",amenity:"bank"},name:"ВТБ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ВТБ24":{tags:{name:"ВТБ24",amenity:"bank"},name:"ВТБ24",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Возрождение":{tags:{name:"Возрождение",amenity:"bank"},name:"Возрождение",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Газпромбанк":{tags:{name:"Газпромбанк",amenity:"bank"},name:"Газпромбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Генбанк":{tags:{name:"Генбанк",amenity:"bank"},name:"Генбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Казкоммерцбанк":{tags:{name:"Казкоммерцбанк",amenity:"bank"},name:"Казкоммерцбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/МДМ Банк":{tags:{name:"МДМ Банк",amenity:"bank"},name:"МДМ Банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Московский индустриальный банк":{tags:{name:"Московский индустриальный банк",amenity:"bank"},name:"Московский индустриальный банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Мособлбанк":{tags:{name:"Мособлбанк",amenity:"bank"},name:"Мособлбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Народный банк":{tags:{name:"Народный банк",amenity:"bank"},name:"Народный банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ОТП Банк":{tags:{name:"ОТП Банк",amenity:"bank"},name:"ОТП Банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Открытие":{tags:{name:"Открытие",amenity:"bank"},name:"Открытие",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Ощадбанк":{tags:{name:"Ощадбанк",amenity:"bank"},name:"Ощадбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ПУМБ":{tags:{name:"ПУМБ",amenity:"bank"},name:"ПУМБ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Почта Банк":{tags:{name:"Почта Банк",amenity:"bank"},name:"Почта Банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ПриватБанк":{tags:{name:"ПриватБанк",amenity:"bank"},name:"ПриватБанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Приватбанк":{tags:{name:"Приватбанк",amenity:"bank"},name:"Приватбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Приднестровский Сбербанк":{tags:{name:"Приднестровский Сбербанк",amenity:"bank"},name:"Приднестровский Сбербанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Приорбанк":{tags:{name:"Приорбанк",amenity:"bank"},name:"Приорбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Промсвязьбанк":{tags:{name:"Промсвязьбанк",amenity:"bank"},name:"Промсвязьбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/РНКБ":{tags:{name:"РНКБ",amenity:"bank"},name:"РНКБ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Райффайзен":{tags:{name:"Райффайзен",amenity:"bank"},name:"Райффайзен",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Райффайзен Банк Аваль":{tags:{name:"Райффайзен Банк Аваль",amenity:"bank"},name:"Райффайзен Банк Аваль",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Райффайзенбанк":{tags:{name:"Райффайзенбанк",amenity:"bank"},name:"Райффайзенбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Росбанк":{tags:{name:"Росбанк",amenity:"bank"},name:"Росбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Россельхозбанк":{tags:{name:"Россельхозбанк",amenity:"bank"},name:"Россельхозбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Русский стандарт":{tags:{name:"Русский стандарт",amenity:"bank"},name:"Русский стандарт",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Сбербанк":{tags:{name:"Сбербанк",amenity:"bank"},name:"Сбербанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Совкомбанк":{tags:{name:"Совкомбанк",amenity:"bank"},name:"Совкомбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/УкрСиббанк":{tags:{name:"УкрСиббанк",amenity:"bank"},name:"УкрСиббанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Укрсоцбанк":{tags:{name:"Укрсоцбанк",amenity:"bank"},name:"Укрсоцбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Уралсиб":{tags:{name:"Уралсиб",amenity:"bank"},name:"Уралсиб",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Хоум Кредит":{tags:{name:"Хоум Кредит",amenity:"bank"},name:"Хоум Кредит",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/בנק הפועלים":{tags:{name:"בנק הפועלים",amenity:"bank"},name:"בנק הפועלים",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/בנק לאומי":{tags:{name:"בנק לאומי",amenity:"bank"},name:"בנק לאומי",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک":{tags:{name:"بانک",amenity:"bank"},name:"بانک",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک آینده":{tags:{name:"بانک آینده",amenity:"bank"},name:"بانک آینده",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک اقتصاد نوین":{tags:{name:"بانک اقتصاد نوین",amenity:"bank"},name:"بانک اقتصاد نوین",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک انصار":{tags:{name:"بانک انصار",amenity:"bank"},name:"بانک انصار",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک تجارت":{tags:{name:"بانک تجارت",amenity:"bank"},name:"بانک تجارت",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک رفاه":{tags:{name:"بانک رفاه",amenity:"bank"},name:"بانک رفاه",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک رفاه کارگران":{tags:{name:"بانک رفاه کارگران",amenity:"bank"},name:"بانک رفاه کارگران",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک سپه":{tags:{name:"بانک سپه",amenity:"bank"},name:"بانک سپه",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک شهر":{tags:{name:"بانک شهر",amenity:"bank"},name:"بانک شهر",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک صادرات":{tags:{name:"بانک صادرات",amenity:"bank"},name:"بانک صادرات",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک قوامین":{tags:{name:"بانک قوامین",amenity:"bank"},name:"بانک قوامین",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک مسکن":{tags:{name:"بانک مسکن",amenity:"bank"},name:"بانک مسکن",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک ملت":{tags:{name:"بانک ملت",amenity:"bank"},name:"بانک ملت",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک ملی":{tags:{name:"بانک ملی",amenity:"bank"},name:"بانک ملی",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک ملی ایران":{tags:{name:"بانک ملی ایران",amenity:"bank"},name:"بانک ملی ایران",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک مهر اقتصاد":{tags:{name:"بانک مهر اقتصاد",amenity:"bank"},name:"بانک مهر اقتصاد",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک پارسیان":{tags:{name:"بانک پارسیان",amenity:"bank"},name:"بانک پارسیان",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک پاسارگاد":{tags:{name:"بانک پاسارگاد",amenity:"bank"},name:"بانک پاسارگاد",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک کشاورزی":{tags:{name:"بانک کشاورزی",amenity:"bank"},name:"بانک کشاورزی",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/صادرات":{tags:{name:"صادرات",amenity:"bank"},name:"صادرات",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ملی":{tags:{name:"ملی",amenity:"bank"},name:"ملی",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/پست بانک":{tags:{name:"پست بانک",amenity:"bank"},name:"پست بانک",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ธนาคารกรุงเทพ":{tags:{name:"ธนาคารกรุงเทพ",amenity:"bank"},name:"ธนาคารกรุงเทพ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ธนาคารกรุงไทย":{tags:{name:"ธนาคารกรุงไทย",amenity:"bank"},name:"ธนาคารกรุงไทย",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ธนาคารกสิกรไทย":{tags:{name:"ธนาคารกสิกรไทย",amenity:"bank"},name:"ธนาคารกสิกรไทย",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ธนาคารออมสิน":{tags:{name:"ธนาคารออมสิน",amenity:"bank"},name:"ธนาคารออมสิน",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ธนาคารไทยพาณิชย์":{tags:{name:"ธนาคารไทยพาณิชย์",amenity:"bank"},name:"ธนาคารไทยพาณิชย์",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/みずほ銀行":{tags:{name:"みずほ銀行",amenity:"bank"},name:"みずほ銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/りそな銀行":{tags:{name:"りそな銀行",amenity:"bank"},name:"りそな銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/三井住友銀行":{tags:{name:"三井住友銀行",amenity:"bank"},name:"三井住友銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/三菱東京UFJ銀行":{tags:{name:"三菱東京UFJ銀行",amenity:"bank"},name:"三菱東京UFJ銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/中国农业银行":{tags:{name:"中国农业银行",amenity:"bank"},name:"中国农业银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/中国工商银行":{tags:{name:"中国工商银行",amenity:"bank"},name:"中国工商银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/中国建设银行":{tags:{name:"中国建设银行",amenity:"bank"},name:"中国建设银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/中国邮政储蓄银行":{tags:{name:"中国邮政储蓄银行",amenity:"bank"},name:"中国邮政储蓄银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/中国银行":{tags:{name:"中国银行",amenity:"bank"},name:"中国银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/交通银行":{tags:{name:"交通银行",amenity:"bank"},name:"交通银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/京都中央信用金庫":{tags:{name:"京都中央信用金庫",amenity:"bank"},name:"京都中央信用金庫",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/京都銀行":{tags:{name:"京都銀行",amenity:"bank"},name:"京都銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/农业银行":{tags:{name:"农业银行",amenity:"bank"},name:"农业银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/北海道銀行":{tags:{name:"北海道銀行",amenity:"bank"},name:"北海道銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/合作金庫銀行":{tags:{name:"合作金庫銀行",amenity:"bank"},name:"合作金庫銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/土地銀行":{tags:{name:"土地銀行",amenity:"bank"},name:"土地銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/工商银行":{tags:{name:"工商银行",amenity:"bank"},name:"工商银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/建设银行":{tags:{name:"建设银行",amenity:"bank"},name:"建设银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/彰化銀行":{tags:{name:"彰化銀行",amenity:"bank"},name:"彰化銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/招商银行":{tags:{name:"招商银行",amenity:"bank"},name:"招商银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/横浜銀行":{tags:{name:"横浜銀行",amenity:"bank"},name:"横浜銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/第一銀行":{tags:{name:"第一銀行",amenity:"bank"},name:"第一銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/華南銀行":{tags:{name:"華南銀行",amenity:"bank"},name:"華南銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/국민은행":{tags:{name:"국민은행","name:en":"Gungmin Bank",amenity:"bank"},name:"국민은행",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/기업은행":{tags:{name:"기업은행",amenity:"bank"},name:"기업은행",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/농협":{tags:{name:"농협",amenity:"bank"},name:"농협",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/새마을금고":{tags:{name:"새마을금고",amenity:"bank"},name:"새마을금고",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/신한은행":{tags:{name:"신한은행","name:en":"Sinhan Bank",amenity:"bank"},name:"신한은행",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/우리은행":{tags:{name:"우리은행","name:en":"Uri Bank",amenity:"bank"},name:"우리은행",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/하나은행":{tags:{name:"하나은행",amenity:"bank"},name:"하나은행",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bar/Bar Centrale":{tags:{name:"Bar Centrale",amenity:"bar"},name:"Bar Centrale",icon:"maki-bar",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/bar/Bar Sport":{tags:{name:"Bar Sport",amenity:"bar"},name:"Bar Sport",icon:"maki-bar",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/bar/Beach Bar":{tags:{name:"Beach Bar",amenity:"bar"},name:"Beach Bar",icon:"maki-bar",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/bar/Pool Bar":{tags:{name:"Pool Bar",amenity:"bar"},name:"Pool Bar",icon:"maki-bar",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/bicycle_rental/Bicing":{tags:{name:"Bicing",amenity:"bicycle_rental"},name:"Bicing",icon:"maki-bicycle",geometry:["point","vertex","area"],fields:["capacity","network","operator","payment_multi"],suggestion:true},"amenity/bicycle_rental/Call a Bike":{tags:{name:"Call a Bike",amenity:"bicycle_rental"},name:"Call a Bike",icon:"maki-bicycle",geometry:["point","vertex","area"],fields:["capacity","network","operator","payment_multi"],suggestion:true},"amenity/bicycle_rental/Grid":{tags:{name:"Grid",amenity:"bicycle_rental"},name:"Grid",icon:"maki-bicycle",geometry:["point","vertex","area"],fields:["capacity","network","operator","payment_multi"],suggestion:true},"amenity/bicycle_rental/Mibici":{tags:{name:"Mibici",amenity:"bicycle_rental"},name:"Mibici",icon:"maki-bicycle",geometry:["point","vertex","area"],fields:["capacity","network","operator","payment_multi"],suggestion:true},"amenity/bicycle_rental/metropolradruhr":{tags:{name:"metropolradruhr",amenity:"bicycle_rental"},name:"metropolradruhr",icon:"maki-bicycle",geometry:["point","vertex","area"],fields:["capacity","network","operator","payment_multi"],suggestion:true},"amenity/bureau_de_change/Abitab":{tags:{name:"Abitab",amenity:"bureau_de_change"},name:"Abitab",icon:"maki-bank",geometry:["point","area"],fields:["name","currency_multi","operator","address","building_area","opening_hours"],suggestion:true},"amenity/bureau_de_change/Change":{tags:{name:"Change",amenity:"bureau_de_change"},name:"Change",icon:"maki-bank",geometry:["point","area"],fields:["name","currency_multi","operator","address","building_area","opening_hours"],suggestion:true},"amenity/bureau_de_change/Travelex":{tags:{name:"Travelex",amenity:"bureau_de_change"},name:"Travelex",icon:"maki-bank",geometry:["point","area"],fields:["name","currency_multi","operator","address","building_area","opening_hours"],suggestion:true},"amenity/cafe/85度C":{tags:{name:"85度C",amenity:"cafe"},name:"85度C",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Bar Kafe":{tags:{name:"Bar Kafe",amenity:"cafe"},name:"Bar Kafe",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Barista":{tags:{name:"Barista",amenity:"cafe"},name:"Barista",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Bonafide":{tags:{name:"Bonafide",amenity:"cafe"},name:"Bonafide",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Cafe Coffee Day":{tags:{name:"Cafe Coffee Day",amenity:"cafe"},name:"Cafe Coffee Day",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Cafe Nero":{tags:{name:"Cafe Nero",amenity:"cafe"},name:"Cafe Nero",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Cafeteria":{tags:{name:"Cafeteria",amenity:"cafe"},name:"Cafeteria",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Cafetería":{tags:{name:"Cafetería",amenity:"cafe"},name:"Cafetería",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Caffè Nero":{tags:{name:"Caffè Nero",amenity:"cafe"},name:"Caffè Nero",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Café Amazon":{tags:{name:"Café Amazon",amenity:"cafe"},name:"Café Amazon",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Café Central":{tags:{name:"Café Central",amenity:"cafe"},name:"Café Central",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Café de la Place":{tags:{name:"Café de la Place",amenity:"cafe"},name:"Café de la Place",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Café des Sports":{tags:{name:"Café des Sports",amenity:"cafe"},name:"Café des Sports",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Caribou Coffee":{tags:{name:"Caribou Coffee",amenity:"cafe"},name:"Caribou Coffee",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Coffee Fellows":{tags:{name:"Coffee Fellows",amenity:"cafe"},name:"Coffee Fellows",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Coffee House":{tags:{name:"Coffee House",amenity:"cafe"},name:"Coffee House",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Coffee Island":{tags:{name:"Coffee Island",amenity:"cafe"},name:"Coffee Island",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Coffee Time":{tags:{name:"Coffee Time",amenity:"cafe"},name:"Coffee Time",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Costa":{tags:{name:"Costa",amenity:"cafe"},name:"Costa",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Country Style":{tags:{name:"Country Style",amenity:"cafe"},name:"Country Style",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Dunkin' Donuts":{tags:{name:"Dunkin' Donuts",cuisine:"donut",amenity:"cafe"},name:"Dunkin' Donuts",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Eiscafe Dolomiti":{tags:{name:"Eiscafe Dolomiti",amenity:"cafe"},name:"Eiscafe Dolomiti",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Eiscafe Venezia":{tags:{name:"Eiscafe Venezia",amenity:"cafe"},name:"Eiscafe Venezia",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Espresso House":{tags:{name:"Espresso House",amenity:"cafe"},name:"Espresso House",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Havanna":{tags:{name:"Havanna",amenity:"cafe"},name:"Havanna",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Internet Cafe":{tags:{name:"Internet Cafe",amenity:"cafe"},name:"Internet Cafe",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Kafe":{tags:{name:"Kafe",amenity:"cafe"},name:"Kafe",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Krispy Kreme":{tags:{name:"Krispy Kreme",amenity:"cafe"},name:"Krispy Kreme",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Le Pain Quotidien":{tags:{name:"Le Pain Quotidien",amenity:"cafe"},name:"Le Pain Quotidien",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/McCafé":{tags:{name:"McCafé",amenity:"cafe",cuisine:"coffee_shop"},name:"McCafé",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Peet's Coffee & Tea":{tags:{name:"Peet's Coffee & Tea",amenity:"cafe"},name:"Peet's Coffee & Tea",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Pret A Manger":{tags:{name:"Pret A Manger",amenity:"cafe"},name:"Pret A Manger",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Prime":{tags:{name:"Prime",amenity:"cafe"},name:"Prime",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Second Cup":{tags:{name:"Second Cup",amenity:"cafe"},name:"Second Cup",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Segafredo":{tags:{name:"Segafredo",amenity:"cafe"},name:"Segafredo",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Starbucks":{tags:{name:"Starbucks",cuisine:"coffee_shop",amenity:"cafe"},name:"Starbucks",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/The Coffee Bean & Tea Leaf":{tags:{name:"The Coffee Bean & Tea Leaf",amenity:"cafe"},name:"The Coffee Bean & Tea Leaf",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/The Coffee Club":{tags:{name:"The Coffee Club",amenity:"cafe"},name:"The Coffee Club",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Tim Hortons":{tags:{name:"Tim Hortons",amenity:"cafe"},name:"Tim Hortons",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Traveler's Coffee":{tags:{name:"Traveler's Coffee",amenity:"cafe"},name:"Traveler's Coffee",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Wayne's Coffee":{tags:{name:"Wayne's Coffee",amenity:"cafe"},name:"Wayne's Coffee",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Бистро":{tags:{name:"Бистро",amenity:"cafe"},name:"Бистро",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Буфет":{tags:{name:"Буфет",amenity:"cafe"},name:"Буфет",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Встреча":{tags:{name:"Встреча",amenity:"cafe"},name:"Встреча",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Даблби":{tags:{name:"Даблби",amenity:"cafe"},name:"Даблби",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Закусочная":{tags:{name:"Закусочная",amenity:"cafe"},name:"Закусочная",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Кофе Хауз":{tags:{name:"Кофе Хауз",amenity:"cafe"},name:"Кофе Хауз",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Кофейня":{tags:{name:"Кофейня",amenity:"cafe"},name:"Кофейня",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Лакомка":{tags:{name:"Лакомка",amenity:"cafe"},name:"Лакомка",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Летнее кафе":{tags:{name:"Летнее кафе",amenity:"cafe"},name:"Летнее кафе",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Пельменная":{tags:{name:"Пельменная",amenity:"cafe"},name:"Пельменная",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Пиццерия":{tags:{name:"Пиццерия",amenity:"cafe"},name:"Пиццерия",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Рандеву":{tags:{name:"Рандеву",amenity:"cafe"},name:"Рандеву",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Сказка":{tags:{name:"Сказка",amenity:"cafe"},name:"Сказка",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Старбакс":{tags:{name:"Старбакс",amenity:"cafe"},name:"Старбакс",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Столовая":{tags:{name:"Столовая",amenity:"cafe"},name:"Столовая",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Уют":{tags:{name:"Уют",amenity:"cafe"},name:"Уют",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Хуторок":{tags:{name:"Хуторок",amenity:"cafe"},name:"Хуторок",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Шашлычная":{tags:{name:"Шашлычная",amenity:"cafe"},name:"Шашлычная",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Шоколад":{tags:{name:"Шоколад",amenity:"cafe"},name:"Шоколад",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Шоколадница":{tags:{name:"Шоколадница",amenity:"cafe"},name:"Шоколадница",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/ארומה":{tags:{name:"ארומה",amenity:"cafe"},name:"ארומה",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/مقهى":{tags:{name:"مقهى",amenity:"cafe"},name:"مقهى",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/คาเฟ่ อเมซอน":{tags:{name:"คาเฟ่ อเมซอน",amenity:"cafe"},name:"คาเฟ่ อเมซอน",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/エクセルシオール カフェ":{tags:{name:"エクセルシオール カフェ",amenity:"cafe"},name:"エクセルシオール カフェ",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/カフェ・ド・クリエ":{tags:{name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE",amenity:"cafe"},name:"カフェ・ド・クリエ",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/カフェ・ベローチェ":{tags:{name:"カフェ・ベローチェ",amenity:"cafe"},name:"カフェ・ベローチェ",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/コメダ珈琲店":{tags:{name:"コメダ珈琲店",amenity:"cafe"},name:"コメダ珈琲店",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/サンマルクカフェ":{tags:{name:"サンマルクカフェ",amenity:"cafe"},name:"サンマルクカフェ",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/スターバックス":{tags:{name:"スターバックス","name:en":"Starbucks",amenity:"cafe"},name:"スターバックス",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/タリーズコーヒー":{tags:{name:"タリーズコーヒー",amenity:"cafe"},name:"タリーズコーヒー",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/ドトールコーヒーショップ":{tags:{name:"ドトールコーヒーショップ","name:en":"Doutor",amenity:"cafe"},name:"ドトールコーヒーショップ",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/星巴克":{tags:{name:"星巴克",amenity:"cafe"},name:"星巴克",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/스타벅스":{tags:{name:"스타벅스",amenity:"cafe"},name:"스타벅스",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/car_rental/Alamo":{tags:{name:"Alamo",amenity:"car_rental"},name:"Alamo",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Avis":{tags:{name:"Avis",amenity:"car_rental"},name:"Avis",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Budget":{tags:{name:"Budget",amenity:"car_rental"},name:"Budget",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Enterprise":{tags:{name:"Enterprise",amenity:"car_rental"},name:"Enterprise",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Enterprise Rent-a-Car":{tags:{name:"Enterprise Rent-a-Car",amenity:"car_rental"},name:"Enterprise Rent-a-Car",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Europcar":{tags:{name:"Europcar",amenity:"car_rental"},name:"Europcar",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Hertz":{tags:{name:"Hertz",amenity:"car_rental"},name:"Hertz",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Localiza":{tags:{name:"Localiza",amenity:"car_rental"},name:"Localiza",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Sixt":{tags:{name:"Sixt",amenity:"car_rental"},name:"Sixt",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Thrifty":{tags:{name:"Thrifty",amenity:"car_rental"},name:"Thrifty",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/U-Haul":{tags:{name:"U-Haul",amenity:"car_rental"},name:"U-Haul",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/オリックスレンタカー":{tags:{name:"オリックスレンタカー",amenity:"car_rental"},name:"オリックスレンタカー",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/トヨタレンタカー":{tags:{name:"トヨタレンタカー",amenity:"car_rental"},name:"トヨタレンタカー",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/トヨタレンタリース":{tags:{name:"トヨタレンタリース",amenity:"car_rental"},name:"トヨタレンタリース",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/ニッポンレンタカー":{tags:{name:"ニッポンレンタカー",amenity:"car_rental"},name:"ニッポンレンタカー",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_wash/Autolavaggio":{tags:{name:"Autolavaggio",amenity:"car_wash"},name:"Autolavaggio",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/H-E-B Car Wash":{tags:{name:"H-E-B Car Wash",amenity:"car_wash"},name:"H-E-B Car Wash",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Lavage Auto":{tags:{name:"Lavage Auto",amenity:"car_wash"},name:"Lavage Auto",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Lavazh":{tags:{name:"Lavazh",amenity:"car_wash"},name:"Lavazh",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Myjnia":{tags:{name:"Myjnia",amenity:"car_wash"},name:"Myjnia",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Myjnia bezdotykowa":{tags:{name:"Myjnia bezdotykowa",amenity:"car_wash"},name:"Myjnia bezdotykowa",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Myjnia samochodowa":{tags:{name:"Myjnia samochodowa",amenity:"car_wash"},name:"Myjnia samochodowa",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Spălătorie Auto":{tags:{name:"Spălătorie Auto",amenity:"car_wash"},name:"Spălătorie Auto",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Spălătorie auto":{tags:{name:"Spălătorie auto",amenity:"car_wash"},name:"Spălătorie auto",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Автомийка":{tags:{name:"Автомийка",amenity:"car_wash"},name:"Автомийка",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Cinema City":{tags:{name:"Cinema City",amenity:"cinema"},name:"Cinema City",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Cinemark":{tags:{name:"Cinemark",amenity:"cinema"},name:"Cinemark",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Cinemex":{tags:{name:"Cinemex",amenity:"cinema"},name:"Cinemex",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Cinepolis":{tags:{name:"Cinepolis",amenity:"cinema"},name:"Cinepolis",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Cineworld":{tags:{name:"Cineworld",amenity:"cinema"},name:"Cineworld",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Odeon":{tags:{name:"Odeon",amenity:"cinema"},name:"Odeon",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/clinic/ФАП":{tags:{name:"ФАП",healthcare:"clinic",amenity:"clinic"},name:"ФАП",icon:"maki-doctor",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/dentist/Aspen Dental":{tags:{name:"Aspen Dental",healthcare:"dentist",amenity:"dentist"},name:"Aspen Dental",icon:"maki-dentist",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/dentist/Family Dentistry":{tags:{name:"Family Dentistry",healthcare:"dentist",amenity:"dentist"},name:"Family Dentistry",icon:"maki-dentist",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/dentist/Vitaldent":{tags:{name:"Vitaldent",healthcare:"dentist",amenity:"dentist"},name:"Vitaldent",icon:"maki-dentist",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/dentist/Стоматолог":{tags:{name:"Стоматолог",healthcare:"dentist",amenity:"dentist"},name:"Стоматолог",icon:"maki-dentist",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/dentist/Стоматологія":{tags:{name:"Стоматологія",healthcare:"dentist",amenity:"dentist"},name:"Стоматологія",icon:"maki-dentist",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/doctors/Háziorvosi rendelő":{tags:{name:"Háziorvosi rendelő",healthcare:"doctor",amenity:"doctors"},name:"Háziorvosi rendelő",icon:"maki-doctor",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/doctors/Инвитро":{tags:{name:"Инвитро",healthcare:"doctor",amenity:"doctors"},name:"Инвитро",icon:"maki-doctor",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/driving_school/Автодром":{tags:{name:"Автодром",amenity:"driving_school"},name:"Автодром",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/fast_food/A&W":{tags:{name:"A&W",amenity:"fast_food"},name:"A&W",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Ali Baba":{tags:{name:"Ali Baba",amenity:"fast_food"},name:"Ali Baba",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Angel's Burger":{tags:{name:"Angel's Burger",amenity:"fast_food"},name:"Angel's Burger",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Antalya":{tags:{name:"Antalya",amenity:"fast_food"},name:"Antalya",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Arby's":{tags:{name:"Arby's",amenity:"fast_food"},name:"Arby's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Asia Bistro":{tags:{name:"Asia Bistro",amenity:"fast_food"},name:"Asia Bistro",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Asia Wok":{tags:{name:"Asia Wok",amenity:"fast_food"},name:"Asia Wok",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Baskin-Robbins":{tags:{name:"Baskin-Robbins",amenity:"fast_food"},name:"Baskin-Robbins",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Bistro":{tags:{name:"Bistro",amenity:"fast_food"},name:"Bistro",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Bob's":{tags:{name:"Bob's",amenity:"fast_food"},name:"Bob's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Bojangles":{tags:{name:"Bojangles",amenity:"fast_food"},name:"Bojangles",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Booster Juice":{tags:{name:"Booster Juice",amenity:"fast_food"},name:"Booster Juice",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Boston Market":{tags:{name:"Boston Market",amenity:"fast_food"},name:"Boston Market",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Braum's":{tags:{name:"Braum's",amenity:"fast_food"},name:"Braum's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Burger King":{tags:{name:"Burger King",cuisine:"burger",amenity:"fast_food"},name:"Burger King",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Burger Machine":{tags:{name:"Burger Machine",amenity:"fast_food"},name:"Burger Machine",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Büfé":{tags:{name:"Büfé",amenity:"fast_food"},name:"Büfé",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Captain D's":{tags:{name:"Captain D's",amenity:"fast_food"},name:"Captain D's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Carl's Jr.":{tags:{name:"Carl's Jr.",cuisine:"burger",amenity:"fast_food"},name:"Carl's Jr.",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Chick-fil-A":{tags:{name:"Chick-fil-A",cuisine:"chicken",amenity:"fast_food"},name:"Chick-fil-A",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Chicken Express":{tags:{name:"Chicken Express",amenity:"fast_food"},name:"Chicken Express",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Chipotle":{tags:{name:"Chipotle",cuisine:"mexican",amenity:"fast_food"},name:"Chipotle",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Chowking":{tags:{name:"Chowking",amenity:"fast_food"},name:"Chowking",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Church's Chicken":{tags:{name:"Church's Chicken",amenity:"fast_food"},name:"Church's Chicken",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/CoCo壱番屋":{tags:{name:"CoCo壱番屋",amenity:"fast_food"},name:"CoCo壱番屋",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Cold Stone Creamery":{tags:{name:"Cold Stone Creamery",amenity:"fast_food"},name:"Cold Stone Creamery",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Cook Out":{tags:{name:"Cook Out",amenity:"fast_food"},name:"Cook Out",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Culver's":{tags:{name:"Culver's",amenity:"fast_food"},name:"Culver's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/DQ":{tags:{name:"DQ",amenity:"fast_food"},name:"DQ",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Dairy Queen":{tags:{name:"Dairy Queen",amenity:"fast_food"},name:"Dairy Queen",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Del Taco":{tags:{name:"Del Taco",amenity:"fast_food"},name:"Del Taco",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Domino's Pizza":{tags:{name:"Domino's Pizza",cuisine:"pizza",amenity:"fast_food"},name:"Domino's Pizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/El Pollo Loco":{tags:{name:"El Pollo Loco",amenity:"fast_food"},name:"El Pollo Loco",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Everest":{tags:{name:"Everest",amenity:"fast_food"},name:"Everest",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Extreme Pita":{tags:{name:"Extreme Pita",amenity:"fast_food"},name:"Extreme Pita",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Fazoli's":{tags:{name:"Fazoli's",amenity:"fast_food"},name:"Fazoli's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Firehouse Subs":{tags:{name:"Firehouse Subs",amenity:"fast_food"},name:"Firehouse Subs",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Fish & Chips":{tags:{name:"Fish & Chips",amenity:"fast_food"},name:"Fish & Chips",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Fish and Chips":{tags:{name:"Fish and Chips",amenity:"fast_food"},name:"Fish and Chips",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Five Guys":{tags:{name:"Five Guys",amenity:"fast_food"},name:"Five Guys",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Greenwich":{tags:{name:"Greenwich",amenity:"fast_food"},name:"Greenwich",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Habib's":{tags:{name:"Habib's",amenity:"fast_food"},name:"Habib's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Hallo Pizza":{tags:{name:"Hallo Pizza",amenity:"fast_food"},name:"Hallo Pizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Hardee's":{tags:{name:"Hardee's",cuisine:"burger",amenity:"fast_food"},name:"Hardee's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Harvey's":{tags:{name:"Harvey's",amenity:"fast_food"},name:"Harvey's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Hesburger":{tags:{name:"Hesburger",amenity:"fast_food"},name:"Hesburger",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Hungry Jacks":{tags:{name:"Hungry Jacks",cuisine:"burger",amenity:"fast_food"},name:"Hungry Jacks",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/In-N-Out Burger":{tags:{name:"In-N-Out Burger",amenity:"fast_food"},name:"In-N-Out Burger",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Istanbul":{tags:{name:"Istanbul",amenity:"fast_food"},name:"Istanbul",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Istanbul Kebab":{tags:{name:"Istanbul Kebab",amenity:"fast_food"},name:"Istanbul Kebab",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Jack in the Box":{tags:{name:"Jack in the Box",cuisine:"burger",amenity:"fast_food"},name:"Jack in the Box",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Jamba Juice":{tags:{name:"Jamba Juice",amenity:"fast_food"},name:"Jamba Juice",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Jersey Mike's Subs":{tags:{name:"Jersey Mike's Subs",amenity:"fast_food"},name:"Jersey Mike's Subs",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Jimmy John's":{tags:{name:"Jimmy John's",cuisine:"sandwich",amenity:"fast_food"},name:"Jimmy John's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Jollibee":{tags:{name:"Jollibee",amenity:"fast_food"},name:"Jollibee",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/KFC":{tags:{name:"KFC",cuisine:"chicken",amenity:"fast_food"},name:"KFC",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/KFC/Taco Bell":{tags:{name:"KFC/Taco Bell",amenity:"fast_food"},name:"KFC/Taco Bell",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Kebab House":{tags:{name:"Kebab House",amenity:"fast_food"},name:"Kebab House",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Kebabai":{tags:{name:"Kebabai",amenity:"fast_food"},name:"Kebabai",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Kochlöffel":{tags:{name:"Kochlöffel",amenity:"fast_food"},name:"Kochlöffel",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Kotipizza":{tags:{name:"Kotipizza",amenity:"fast_food"},name:"Kotipizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Krystal":{tags:{name:"Krystal",amenity:"fast_food"},name:"Krystal",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Little Caesars":{tags:{name:"Little Caesars",amenity:"fast_food"},name:"Little Caesars",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Little Caesars Pizza":{tags:{name:"Little Caesars Pizza",amenity:"fast_food"},name:"Little Caesars Pizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Long John Silver's":{tags:{name:"Long John Silver's",amenity:"fast_food"},name:"Long John Silver's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Lotteria":{tags:{name:"Lotteria",amenity:"fast_food"},name:"Lotteria",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Max":{tags:{name:"Max",amenity:"fast_food"},name:"Max",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/McDonald's":{tags:{name:"McDonald's",cuisine:"burger",amenity:"fast_food"},name:"McDonald's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Minute Burger":{tags:{name:"Minute Burger",amenity:"fast_food"},name:"Minute Burger",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Mr. Sub":{tags:{name:"Mr. Sub",amenity:"fast_food"},name:"Mr. Sub",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/New York Pizza":{tags:{name:"New York Pizza",amenity:"fast_food"},name:"New York Pizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Nordsee":{tags:{name:"Nordsee",amenity:"fast_food"},name:"Nordsee",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Panda Express":{tags:{name:"Panda Express",cuisine:"chinese",amenity:"fast_food"},name:"Panda Express",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Papa John's":{tags:{name:"Papa John's",cuisine:"pizza",amenity:"fast_food"},name:"Papa John's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Papa Murphy's":{tags:{name:"Papa Murphy's",amenity:"fast_food"},name:"Papa Murphy's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pinulito":{tags:{name:"Pinulito",amenity:"fast_food"},name:"Pinulito",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pita Pit":{tags:{name:"Pita Pit",amenity:"fast_food"},name:"Pita Pit",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pizza Hut Delivery":{tags:{name:"Pizza Hut Delivery",amenity:"fast_food"},name:"Pizza Hut Delivery",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pizza King":{tags:{name:"Pizza King",amenity:"fast_food"},name:"Pizza King",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pizza Nova":{tags:{name:"Pizza Nova",amenity:"fast_food"},name:"Pizza Nova",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pizza Pizza":{tags:{name:"Pizza Pizza",amenity:"fast_food"},name:"Pizza Pizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pollo Campero":{tags:{name:"Pollo Campero",amenity:"fast_food"},name:"Pollo Campero",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pollo Granjero":{tags:{name:"Pollo Granjero",amenity:"fast_food"},name:"Pollo Granjero",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Popeye's":{tags:{name:"Popeye's",cuisine:"chicken",amenity:"fast_food"},name:"Popeye's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Popeyes Louisiana Kitchen":{tags:{name:"Popeyes Louisiana Kitchen",amenity:"fast_food"},name:"Popeyes Louisiana Kitchen",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Qdoba":{tags:{name:"Qdoba",amenity:"fast_food"},name:"Qdoba",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Quick":{tags:{name:"Quick",amenity:"fast_food"},name:"Quick",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Quiznos":{tags:{name:"Quiznos",amenity:"fast_food"},name:"Quiznos",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Rally's":{tags:{name:"Rally's",amenity:"fast_food"},name:"Rally's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Red Rooster":{tags:{name:"Red Rooster",amenity:"fast_food"},name:"Red Rooster",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Sbarro":{tags:{name:"Sbarro",amenity:"fast_food"},name:"Sbarro",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Schlotzsky's Deli":{tags:{name:"Schlotzsky's Deli",amenity:"fast_food"},name:"Schlotzsky's Deli",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Sibylla":{tags:{name:"Sibylla",amenity:"fast_food"},name:"Sibylla",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Sonic":{tags:{name:"Sonic",cuisine:"burger",amenity:"fast_food"},name:"Sonic",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Steers":{tags:{name:"Steers",amenity:"fast_food"},name:"Steers",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Subway":{tags:{name:"Subway",amenity:"fast_food"},name:"Subway",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco Bell":{tags:{name:"Taco Bell",cuisine:"mexican",amenity:"fast_food"},name:"Taco Bell",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco Bueno":{tags:{name:"Taco Bueno",amenity:"fast_food"},name:"Taco Bueno",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco Cabana":{tags:{name:"Taco Cabana",amenity:"fast_food"},name:"Taco Cabana",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco Del Mar":{tags:{name:"Taco Del Mar",amenity:"fast_food"},name:"Taco Del Mar",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco John's":{tags:{name:"Taco John's",amenity:"fast_food"},name:"Taco John's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco Time":{tags:{name:"Taco Time",amenity:"fast_food"},name:"Taco Time",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Telepizza":{tags:{name:"Telepizza",amenity:"fast_food"},name:"Telepizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Thai Express":{tags:{name:"Thai Express",amenity:"fast_food"},name:"Thai Express",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/The Pizza Company":{tags:{name:"The Pizza Company",amenity:"fast_food"},name:"The Pizza Company",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Wendy's":{tags:{name:"Wendy's",cuisine:"burger",amenity:"fast_food"},name:"Wendy's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Whataburger":{tags:{name:"Whataburger",amenity:"fast_food"},name:"Whataburger",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/White Castle":{tags:{name:"White Castle",amenity:"fast_food"},name:"White Castle",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Wienerschnitzel":{tags:{name:"Wienerschnitzel",amenity:"fast_food"},name:"Wienerschnitzel",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Wimpy":{tags:{name:"Wimpy",amenity:"fast_food"},name:"Wimpy",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Zaxby's":{tags:{name:"Zaxby's",amenity:"fast_food"},name:"Zaxby's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Γρηγόρης":{tags:{name:"Γρηγόρης",amenity:"fast_food"},name:"Γρηγόρης",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Бургер Кинг":{tags:{name:"Бургер Кинг",amenity:"fast_food"},name:"Бургер Кинг",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Крошка Картошка":{tags:{name:"Крошка Картошка",amenity:"fast_food"},name:"Крошка Картошка",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Макдоналдс":{tags:{name:"Макдоналдс","name:en":"McDonald's",amenity:"fast_food"},name:"Макдоналдс",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Робин Сдобин":{tags:{name:"Робин Сдобин",amenity:"fast_food"},name:"Робин Сдобин",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Русский Аппетит":{tags:{name:"Русский Аппетит",amenity:"fast_food"},name:"Русский Аппетит",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Сабвэй":{tags:{name:"Сабвэй",amenity:"fast_food"},name:"Сабвэй",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Стардог!s":{tags:{name:"Стардог!s",amenity:"fast_food"},name:"Стардог!s",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Теремок":{tags:{name:"Теремок",amenity:"fast_food"},name:"Теремок",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Шаверма":{tags:{name:"Шаверма",amenity:"fast_food"},name:"Шаверма",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Шаурма":{tags:{name:"Шаурма",amenity:"fast_food"},name:"Шаурма",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/かっぱ寿司":{tags:{name:"かっぱ寿司",amenity:"fast_food"},name:"かっぱ寿司",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/かつや":{tags:{name:"かつや",amenity:"fast_food"},name:"かつや",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/くら寿司":{tags:{name:"くら寿司",amenity:"fast_food"},name:"くら寿司",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/すき家":{tags:{name:"すき家","name:en":"Sukiya",amenity:"fast_food"},name:"すき家",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/なか卯":{tags:{name:"なか卯",amenity:"fast_food"},name:"なか卯",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/ほっかほっか亭":{tags:{name:"ほっかほっか亭",amenity:"fast_food"},name:"ほっかほっか亭",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/ほっともっと":{tags:{name:"ほっともっと",amenity:"fast_food"},name:"ほっともっと",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/オリジン弁当":{tags:{name:"オリジン弁当",amenity:"fast_food"},name:"オリジン弁当",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/ケンタッキーフライドチキン":{tags:{name:"ケンタッキーフライドチキン",cuisine:"chicken","name:en":"KFC",amenity:"fast_food"},name:"ケンタッキーフライドチキン",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/サブウェイ":{tags:{name:"サブウェイ",amenity:"fast_food"},name:"サブウェイ",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/スシロー":{tags:{name:"スシロー",amenity:"fast_food"},name:"スシロー",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/マクドナルド":{tags:{name:"マクドナルド",cuisine:"burger","name:en":"McDonald's",amenity:"fast_food"},name:"マクドナルド",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/ミスタードーナツ":{tags:{name:"ミスタードーナツ",amenity:"fast_food"},name:"ミスタードーナツ",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/モスバーガー":{tags:{name:"モスバーガー","name:en":"Mos Burger",amenity:"fast_food"},name:"モスバーガー",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/ロッテリア":{tags:{name:"ロッテリア",amenity:"fast_food"},name:"ロッテリア",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/吉野家":{tags:{name:"吉野家",amenity:"fast_food"},name:"吉野家",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/幸楽苑":{tags:{name:"幸楽苑",amenity:"fast_food"},name:"幸楽苑",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/摩斯漢堡":{tags:{name:"摩斯漢堡",amenity:"fast_food"},name:"摩斯漢堡",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/松屋":{tags:{name:"松屋","name:en":"Matsuya",amenity:"fast_food"},name:"松屋",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/肯德基":{tags:{name:"肯德基",amenity:"fast_food"},name:"肯德基",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/麥當勞":{tags:{name:"麥當勞",amenity:"fast_food"},name:"麥當勞",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/麦当劳":{tags:{name:"麦当劳",amenity:"fast_food"},name:"麦当劳",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/롯데리아":{tags:{name:"롯데리아",amenity:"fast_food"},name:"롯데리아",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fuel/76":{tags:{name:"76",amenity:"fuel"},name:"76",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/1-2-3":{tags:{name:"1-2-3",amenity:"fuel"},name:"1-2-3",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ADNOC":{tags:{name:"ADNOC",amenity:"fuel"},name:"ADNOC",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ANP":{tags:{name:"ANP",amenity:"fuel"},name:"ANP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ARAL":{tags:{name:"ARAL",amenity:"fuel"},name:"ARAL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Aegean":{tags:{name:"Aegean",amenity:"fuel"},name:"Aegean",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Afriquia":{tags:{name:"Afriquia",amenity:"fuel"},name:"Afriquia",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Agip":{tags:{name:"Agip",amenity:"fuel"},name:"Agip",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Agrola":{tags:{name:"Agrola",amenity:"fuel"},name:"Agrola",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Alon":{tags:{name:"Alon",amenity:"fuel"},name:"Alon",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Alpet":{tags:{name:"Alpet",amenity:"fuel"},name:"Alpet",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Api":{tags:{name:"Api",amenity:"fuel"},name:"Api",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Aral":{tags:{name:"Aral",amenity:"fuel"},name:"Aral",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Arco":{tags:{name:"Arco",amenity:"fuel"},name:"Arco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Avanti":{tags:{name:"Avanti",amenity:"fuel"},name:"Avanti",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Avia":{tags:{name:"Avia",amenity:"fuel"},name:"Avia",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BEBECO":{tags:{name:"BEBECO",amenity:"fuel"},name:"BEBECO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BFT":{tags:{name:"BFT",amenity:"fuel"},name:"BFT",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BHPetrol":{tags:{name:"BHPetrol",amenity:"fuel"},name:"BHPetrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BP":{tags:{name:"BP",amenity:"fuel"},name:"BP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BR":{tags:{name:"BR",amenity:"fuel"},name:"BR",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Bangchak":{tags:{name:"Bangchak",amenity:"fuel"},name:"Bangchak",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Benzina":{tags:{name:"Benzina",amenity:"fuel"},name:"Benzina",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Bharat Petroleum":{tags:{name:"Bharat Petroleum",amenity:"fuel"},name:"Bharat Petroleum",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Bliska":{tags:{name:"Bliska",amenity:"fuel"},name:"Bliska",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CAMPSA":{tags:{name:"CAMPSA",amenity:"fuel"},name:"CAMPSA",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CARREFOUR":{tags:{name:"CARREFOUR",amenity:"fuel"},name:"CARREFOUR",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CEPSA":{tags:{name:"CEPSA",amenity:"fuel"},name:"CEPSA",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CNG":{tags:{name:"CNG",amenity:"fuel"},name:"CNG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Caltex":{tags:{name:"Caltex",amenity:"fuel"},name:"Caltex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Campsa":{tags:{name:"Campsa",amenity:"fuel"},name:"Campsa",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Casey's General Store":{tags:{name:"Casey's General Store",amenity:"fuel"},name:"Casey's General Store",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Cenex":{tags:{name:"Cenex",amenity:"fuel"},name:"Cenex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Cepsa":{tags:{name:"Cepsa",amenity:"fuel"},name:"Cepsa",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ceypetco":{tags:{name:"Ceypetco",amenity:"fuel"},name:"Ceypetco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Chevron":{tags:{name:"Chevron",amenity:"fuel"},name:"Chevron",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Citgo":{tags:{name:"Citgo",amenity:"fuel"},name:"Citgo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Clark":{tags:{name:"Clark",amenity:"fuel"},name:"Clark",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Coles Express":{tags:{name:"Coles Express",amenity:"fuel"},name:"Coles Express",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Conoco":{tags:{name:"Conoco",amenity:"fuel"},name:"Conoco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Copec":{tags:{name:"Copec",amenity:"fuel"},name:"Copec",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Copetrol":{tags:{name:"Copetrol",amenity:"fuel"},name:"Copetrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Cosmo":{tags:{name:"Cosmo",amenity:"fuel"},name:"Cosmo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Crodux":{tags:{name:"Crodux",amenity:"fuel"},name:"Crodux",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Delta":{tags:{name:"Delta",amenity:"fuel"},name:"Delta",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Diamond Shamrock":{tags:{name:"Diamond Shamrock",amenity:"fuel"},name:"Diamond Shamrock",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Drummed Fuel":{tags:{name:"Drummed Fuel",amenity:"fuel"},name:"Drummed Fuel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/EKO":{tags:{name:"EKO",amenity:"fuel"},name:"EKO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ENEOS":{tags:{name:"ENEOS",amenity:"fuel"},name:"ENEOS",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ENI":{tags:{name:"ENI",amenity:"fuel"},name:"ENI",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ERG":{tags:{name:"ERG",amenity:"fuel"},name:"ERG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Elan":{tags:{name:"Elan",amenity:"fuel"},name:"Elan",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Eneos":{tags:{name:"Eneos",amenity:"fuel"},name:"Eneos",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Engen":{tags:{name:"Engen",amenity:"fuel"},name:"Engen",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Eni":{tags:{name:"Eni",amenity:"fuel"},name:"Eni",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Erg":{tags:{name:"Erg",amenity:"fuel"},name:"Erg",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Esso":{tags:{name:"Esso",amenity:"fuel"},name:"Esso",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Esso Express":{tags:{name:"Esso Express",amenity:"fuel"},name:"Esso Express",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/EuroOil":{tags:{name:"EuroOil",amenity:"fuel"},name:"EuroOil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Exxon":{tags:{name:"Exxon",amenity:"fuel"},name:"Exxon",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/F24":{tags:{name:"F24",amenity:"fuel"},name:"F24",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Firezone":{tags:{name:"Firezone",amenity:"fuel"},name:"Firezone",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Flying V":{tags:{name:"Flying V",amenity:"fuel"},name:"Flying V",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/GALP":{tags:{name:"GALP",amenity:"fuel"},name:"GALP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Gazprom":{tags:{name:"Gazprom",amenity:"fuel"},name:"Gazprom",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/GetGo":{tags:{name:"GetGo",amenity:"fuel"},name:"GetGo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Goil":{tags:{name:"Goil",amenity:"fuel"},name:"Goil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Gulf":{tags:{name:"Gulf",amenity:"fuel"},name:"Gulf",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/H-E-B Fuel":{tags:{name:"H-E-B Fuel",amenity:"fuel"},name:"H-E-B Fuel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/H-E-B Gas":{tags:{name:"H-E-B Gas",amenity:"fuel"},name:"H-E-B Gas",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/HEM":{tags:{name:"HEM",amenity:"fuel"},name:"HEM",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/HP":{tags:{name:"HP",amenity:"fuel"},name:"HP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/HP Petrol Pump":{tags:{name:"HP Petrol Pump",amenity:"fuel"},name:"HP Petrol Pump",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Helios":{tags:{name:"Helios",amenity:"fuel"},name:"Helios",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Hess":{tags:{name:"Hess",amenity:"fuel"},name:"Hess",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Hindustan Petroleum":{tags:{name:"Hindustan Petroleum",amenity:"fuel"},name:"Hindustan Petroleum",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Holiday":{tags:{name:"Holiday",amenity:"fuel"},name:"Holiday",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Husky":{tags:{name:"Husky",amenity:"fuel"},name:"Husky",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/IES":{tags:{name:"IES",amenity:"fuel"},name:"IES",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/IP":{tags:{name:"IP",amenity:"fuel"},name:"IP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Independent Fuel Station":{tags:{name:"Independent Fuel Station",amenity:"fuel"},name:"Independent Fuel Station",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Indian Oil":{tags:{name:"Indian Oil",amenity:"fuel"},name:"Indian Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Indipend.":{tags:{name:"Indipend.",amenity:"fuel"},name:"Indipend.",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ingo":{tags:{name:"Ingo",amenity:"fuel"},name:"Ingo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ipiranga":{tags:{name:"Ipiranga",amenity:"fuel"},name:"Ipiranga",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Irving":{tags:{name:"Irving",amenity:"fuel"},name:"Irving",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/JA-SS":{tags:{name:"JA-SS",amenity:"fuel"},name:"JA-SS",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/JOMO":{tags:{name:"JOMO",amenity:"fuel"},name:"JOMO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Jet":{tags:{name:"Jet",amenity:"fuel"},name:"Jet",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Jetti":{tags:{name:"Jetti",amenity:"fuel"},name:"Jetti",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kangaroo":{tags:{name:"Kangaroo",amenity:"fuel"},name:"Kangaroo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kobil":{tags:{name:"Kobil",amenity:"fuel"},name:"Kobil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kroger Fuel":{tags:{name:"Kroger Fuel",amenity:"fuel"},name:"Kroger Fuel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kum & Go":{tags:{name:"Kum & Go",amenity:"fuel"},name:"Kum & Go",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kwik Trip":{tags:{name:"Kwik Trip",amenity:"fuel"},name:"Kwik Trip",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/LPG":{tags:{name:"LPG",amenity:"fuel"},name:"LPG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/LPG Station":{tags:{name:"LPG Station",amenity:"fuel"},name:"LPG Station",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/LUKOIL":{tags:{name:"LUKOIL",amenity:"fuel"},name:"LUKOIL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Liberty":{tags:{name:"Liberty",amenity:"fuel"},name:"Liberty",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Lotos":{tags:{name:"Lotos",amenity:"fuel"},name:"Lotos",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Lotos Optima":{tags:{name:"Lotos Optima",amenity:"fuel"},name:"Lotos Optima",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Love's":{tags:{name:"Love's",amenity:"fuel"},name:"Love's",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Lukoil":{tags:{name:"Lukoil",amenity:"fuel"},name:"Lukoil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/MEROIL":{tags:{name:"MEROIL",amenity:"fuel"},name:"MEROIL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/MOL":{tags:{name:"MOL",amenity:"fuel"},name:"MOL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/MRS":{tags:{name:"MRS",amenity:"fuel"},name:"MRS",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Marathon":{tags:{name:"Marathon",amenity:"fuel"},name:"Marathon",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Maverik":{tags:{name:"Maverik",amenity:"fuel"},name:"Maverik",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Maxol":{tags:{name:"Maxol",amenity:"fuel"},name:"Maxol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Metano":{tags:{name:"Metano",amenity:"fuel"},name:"Metano",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Migrol":{tags:{name:"Migrol",amenity:"fuel"},name:"Migrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Minipump":{tags:{name:"Minipump",amenity:"fuel"},name:"Minipump",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Mobil":{tags:{name:"Mobil",amenity:"fuel"},name:"Mobil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Mobile":{tags:{name:"Mobile",amenity:"fuel"},name:"Mobile",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Mol":{tags:{name:"Mol",amenity:"fuel"},name:"Mol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Moya":{tags:{name:"Moya",amenity:"fuel"},name:"Moya",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Murphy USA":{tags:{name:"Murphy USA",amenity:"fuel"},name:"Murphy USA",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Neste":{tags:{name:"Neste",amenity:"fuel"},name:"Neste",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OIL!":{tags:{name:"OIL!",amenity:"fuel"},name:"OIL!",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OK":{tags:{name:"OK",amenity:"fuel"},name:"OK",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OKQ8":{tags:{name:"OKQ8",amenity:"fuel"},name:"OKQ8",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OMV":{tags:{name:"OMV",amenity:"fuel"},name:"OMV",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Oilibya":{tags:{name:"Oilibya",brand:"Oilibya","name:ar":"أويليبيا",amenity:"fuel"},name:"Oilibya",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Opet":{tags:{name:"Opet",amenity:"fuel"},name:"Opet",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Orlen":{tags:{name:"Orlen",amenity:"fuel"},name:"Orlen",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PETRONOR":{tags:{name:"PETRONOR",amenity:"fuel"},name:"PETRONOR",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PSO":{tags:{name:"PSO",amenity:"fuel"},name:"PSO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PSO Petrol Pump":{tags:{name:"PSO Petrol Pump",amenity:"fuel"},name:"PSO Petrol Pump",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PT":{tags:{name:"PT",amenity:"fuel"},name:"PT",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PTT":{tags:{name:"PTT",amenity:"fuel"},name:"PTT",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PV Oil":{tags:{name:"PV Oil",amenity:"fuel"},name:"PV Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pacific Pride":{tags:{name:"Pacific Pride",amenity:"fuel"},name:"Pacific Pride",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pecsa":{tags:{name:"Pecsa",amenity:"fuel"},name:"Pecsa",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pemex":{tags:{name:"Pemex",amenity:"fuel"},name:"Pemex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pertamina":{tags:{name:"Pertamina",amenity:"fuel"},name:"Pertamina",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petro":{tags:{name:"Petro",amenity:"fuel"},name:"Petro",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petro-Canada":{tags:{name:"Petro-Canada",amenity:"fuel"},name:"Petro-Canada",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrochina":{tags:{name:"Petrochina",amenity:"fuel"},name:"Petrochina",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petroecuador":{tags:{name:"Petroecuador",amenity:"fuel"},name:"Petroecuador",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrol Ofisi":{tags:{name:"Petrol Ofisi",amenity:"fuel"},name:"Petrol Ofisi",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrolimex":{tags:{name:"Petrolimex",amenity:"fuel"},name:"Petrolimex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrom":{tags:{name:"Petrom",amenity:"fuel"},name:"Petrom",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petron":{tags:{name:"Petron",amenity:"fuel"},name:"Petron",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petronas":{tags:{name:"Petronas",amenity:"fuel"},name:"Petronas",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petroperu":{tags:{name:"Petroperu",amenity:"fuel"},name:"Petroperu",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Phillips 66":{tags:{name:"Phillips 66",amenity:"fuel"},name:"Phillips 66",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Phoenix":{tags:{name:"Phoenix",amenity:"fuel"},name:"Phoenix",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pilot":{tags:{name:"Pilot",amenity:"fuel"},name:"Pilot",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pioneer":{tags:{name:"Pioneer",amenity:"fuel"},name:"Pioneer",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto":{tags:{name:"Posto",amenity:"fuel"},name:"Posto",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto Atem":{tags:{name:"Posto Atem",amenity:"fuel"},name:"Posto Atem",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto Ipiranga":{tags:{name:"Posto Ipiranga",amenity:"fuel"},name:"Posto Ipiranga",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto Shell":{tags:{name:"Posto Shell",amenity:"fuel"},name:"Posto Shell",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Primax":{tags:{name:"Primax",amenity:"fuel"},name:"Primax",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Prio":{tags:{name:"Prio",amenity:"fuel"},name:"Prio",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Puma":{tags:{name:"Puma",amenity:"fuel"},name:"Puma",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Q1":{tags:{name:"Q1",amenity:"fuel"},name:"Q1",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Q8":{tags:{name:"Q8",amenity:"fuel"},name:"Q8",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Q8 Easy":{tags:{name:"Q8 Easy",amenity:"fuel"},name:"Q8 Easy",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/QuikTrip":{tags:{name:"QuikTrip",amenity:"fuel"},name:"QuikTrip",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/REPSOL":{tags:{name:"REPSOL",amenity:"fuel"},name:"REPSOL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/RaceTrac":{tags:{name:"RaceTrac",amenity:"fuel"},name:"RaceTrac",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Repsol":{tags:{name:"Repsol",amenity:"fuel"},name:"Repsol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Rompetrol":{tags:{name:"Rompetrol",amenity:"fuel"},name:"Rompetrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Rubis":{tags:{name:"Rubis",amenity:"fuel"},name:"Rubis",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/SB Tank":{tags:{name:"SB Tank",amenity:"fuel"},name:"SB Tank",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/SPBU":{tags:{name:"SPBU",amenity:"fuel"},name:"SPBU",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sasol":{tags:{name:"Sasol",amenity:"fuel"},name:"Sasol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sea Oil":{tags:{name:"Sea Oil",amenity:"fuel"},name:"Sea Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sheetz":{tags:{name:"Sheetz",amenity:"fuel"},name:"Sheetz",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Shell":{tags:{name:"Shell",amenity:"fuel"},name:"Shell",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Shell Express":{tags:{name:"Shell Express",amenity:"fuel"},name:"Shell Express",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sinclair":{tags:{name:"Sinclair",amenity:"fuel"},name:"Sinclair",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sinopec":{tags:{name:"Sinopec",amenity:"fuel"},name:"Sinopec",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sinopec Fuel":{tags:{name:"Sinopec Fuel",amenity:"fuel"},name:"Sinopec Fuel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Slovnaft":{tags:{name:"Slovnaft",amenity:"fuel"},name:"Slovnaft",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Socar":{tags:{name:"Socar",amenity:"fuel"},name:"Socar",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sokimex":{tags:{name:"Sokimex",amenity:"fuel"},name:"Sokimex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Speedway":{tags:{name:"Speedway",amenity:"fuel"},name:"Speedway",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/St1":{tags:{name:"St1",amenity:"fuel"},name:"St1",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Star":{tags:{name:"Star",amenity:"fuel"},name:"Star",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Star Oil":{tags:{name:"Star Oil",amenity:"fuel"},name:"Star Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Station Service E. Leclerc":{tags:{name:"Station Service E. Leclerc",amenity:"fuel"},name:"Station Service E. Leclerc",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Statoil":{tags:{name:"Statoil",amenity:"fuel"},name:"Statoil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sunoco":{tags:{name:"Sunoco",amenity:"fuel"},name:"Sunoco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tamoil":{tags:{name:"Tamoil",amenity:"fuel"},name:"Tamoil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tango":{tags:{name:"Tango",amenity:"fuel"},name:"Tango",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Teboil":{tags:{name:"Teboil",amenity:"fuel"},name:"Teboil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tela":{tags:{name:"Tela",amenity:"fuel"},name:"Tela",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Terpel":{tags:{name:"Terpel",amenity:"fuel"},name:"Terpel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Texaco":{tags:{name:"Texaco",amenity:"fuel"},name:"Texaco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tinq":{tags:{name:"Tinq",amenity:"fuel"},name:"Tinq",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Topaz":{tags:{name:"Topaz",amenity:"fuel"},name:"Topaz",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Total":{tags:{name:"Total",amenity:"fuel"},name:"Total",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Total Access":{tags:{name:"Total Access",amenity:"fuel"},name:"Total Access",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Total Erg":{tags:{name:"Total Erg",amenity:"fuel"},name:"Total Erg",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/TotalErg":{tags:{name:"TotalErg",amenity:"fuel"},name:"TotalErg",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Turkey Hill":{tags:{name:"Turkey Hill",amenity:"fuel"},name:"Turkey Hill",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Turmöl":{tags:{name:"Turmöl",amenity:"fuel"},name:"Turmöl",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ultramar":{tags:{name:"Ultramar",amenity:"fuel"},name:"Ultramar",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/United":{tags:{name:"United",amenity:"fuel"},name:"United",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Uno":{tags:{name:"Uno",amenity:"fuel"},name:"Uno",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Uno-X":{tags:{name:"Uno-X",amenity:"fuel"},name:"Uno-X",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Valero":{tags:{name:"Valero",amenity:"fuel"},name:"Valero",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Vito":{tags:{name:"Vito",amenity:"fuel"},name:"Vito",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/WOG":{tags:{name:"WOG",amenity:"fuel"},name:"WOG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Westfalen":{tags:{name:"Westfalen",amenity:"fuel"},name:"Westfalen",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Woolworths Petrol":{tags:{name:"Woolworths Petrol",amenity:"fuel"},name:"Woolworths Petrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Z":{tags:{name:"Z",amenity:"fuel"},name:"Z",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/bft":{tags:{name:"bft",amenity:"fuel"},name:"bft",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/eni":{tags:{name:"eni",amenity:"fuel"},name:"eni",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ΕΚΟ":{tags:{name:"ΕΚΟ",amenity:"fuel"},name:"ΕΚΟ",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/АГЗС":{tags:{name:"АГЗС",amenity:"fuel"},name:"АГЗС",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/АЗС":{tags:{name:"АЗС",amenity:"fuel"},name:"АЗС",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Авіас":{tags:{name:"Авіас",amenity:"fuel"},name:"Авіас",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/БРСМ-Нафта":{tags:{name:"БРСМ-Нафта",amenity:"fuel"},name:"БРСМ-Нафта",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Башнефть":{tags:{name:"Башнефть",amenity:"fuel"},name:"Башнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Белоруснефть":{tags:{name:"Белоруснефть",amenity:"fuel"},name:"Белоруснефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Газовая заправка":{tags:{name:"Газовая заправка",amenity:"fuel"},name:"Газовая заправка",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Газпромнефть":{tags:{name:"Газпромнефть",amenity:"fuel"},name:"Газпромнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Гелиос":{tags:{name:"Гелиос",amenity:"fuel"},name:"Гелиос",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ЕКА":{tags:{name:"ЕКА",amenity:"fuel"},name:"ЕКА",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Заправка":{tags:{name:"Заправка",amenity:"fuel"},name:"Заправка",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/КазМунайГаз":{tags:{name:"КазМунайГаз",amenity:"fuel"},name:"КазМунайГаз",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Лукойл":{tags:{name:"Лукойл",amenity:"fuel"},name:"Лукойл",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Макпетрол":{tags:{name:"Макпетрол",amenity:"fuel"},name:"Макпетрол",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/НК Альянс":{tags:{name:"НК Альянс",amenity:"fuel"},name:"НК Альянс",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Нефтьмагистраль":{tags:{name:"Нефтьмагистраль",amenity:"fuel"},name:"Нефтьмагистраль",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ОККО":{tags:{name:"ОККО",amenity:"fuel"},name:"ОККО",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ОМВ":{tags:{name:"ОМВ",amenity:"fuel"},name:"ОМВ",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Октан":{tags:{name:"Октан",amenity:"fuel"},name:"Октан",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ПТК":{tags:{name:"ПТК",amenity:"fuel"},name:"ПТК",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Петрол":{tags:{name:"Петрол",amenity:"fuel"},name:"Петрол",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Пропан":{tags:{name:"Пропан",amenity:"fuel"},name:"Пропан",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Роснефть":{tags:{name:"Роснефть",amenity:"fuel"},name:"Роснефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Сибнефть":{tags:{name:"Сибнефть",amenity:"fuel"},name:"Сибнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Сургутнефтегаз":{tags:{name:"Сургутнефтегаз",amenity:"fuel"},name:"Сургутнефтегаз",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ТНК":{tags:{name:"ТНК",amenity:"fuel"},name:"ТНК",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Татнефтепродукт":{tags:{name:"Татнефтепродукт",amenity:"fuel"},name:"Татнефтепродукт",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Татнефть":{tags:{name:"Татнефть",amenity:"fuel"},name:"Татнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Укрнафта":{tags:{name:"Укрнафта",amenity:"fuel"},name:"Укрнафта",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/דור אלון":{tags:{name:"דור אלון",amenity:"fuel"},name:"דור אלון",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/דלק":{tags:{name:"דלק",amenity:"fuel"},name:"דלק",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/סונול":{tags:{name:"סונול",amenity:"fuel"},name:"סונול",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/פז":{tags:{name:"פז",amenity:"fuel"},name:"פז",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/محطة وقود":{tags:{name:"محطة وقود",amenity:"fuel"},name:"محطة وقود",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/محطه وقود":{tags:{name:"محطه وقود",amenity:"fuel"},name:"محطه وقود",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/پمپ بنزین":{tags:{name:"پمپ بنزین",amenity:"fuel"},name:"پمپ بنزین",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/پمپ گاز":{tags:{name:"پمپ گاز",amenity:"fuel"},name:"پمپ گاز",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/บางจาก":{tags:{name:"บางจาก",amenity:"fuel"},name:"บางจาก",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ป.ต.ท.":{tags:{name:"ป.ต.ท.",amenity:"fuel"},name:"ป.ต.ท.",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/เชลล์":{tags:{name:"เชลล์",amenity:"fuel"},name:"เชลล์",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/เอสโซ่":{tags:{name:"เอสโซ่",amenity:"fuel"},name:"เอสโซ่",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/エッソ":{tags:{name:"エッソ",amenity:"fuel"},name:"エッソ",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/エネオス":{tags:{name:"エネオス",amenity:"fuel"},name:"エネオス",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/コスモ石油":{tags:{name:"コスモ石油",amenity:"fuel"},name:"コスモ石油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ゼネラル":{tags:{name:"ゼネラル",amenity:"fuel"},name:"ゼネラル",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中国石化":{tags:{name:"中国石化",amenity:"fuel"},name:"中国石化",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中国石化 Sinopec":{tags:{name:"中国石化 Sinopec",amenity:"fuel"},name:"中国石化 Sinopec",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中国石油":{tags:{name:"中国石油",amenity:"fuel"},name:"中国石油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中油":{tags:{name:"中油",amenity:"fuel"},name:"中油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/出光":{tags:{name:"出光","name:en":"Idemitsu",amenity:"fuel"},name:"出光",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/加油站":{tags:{name:"加油站",amenity:"fuel"},name:"加油站",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/台灣中油":{tags:{name:"台灣中油",amenity:"fuel"},name:"台灣中油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/昭和シェル":{tags:{name:"昭和シェル",amenity:"fuel"},name:"昭和シェル",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/hospital/Cruz Roja":{tags:{name:"Cruz Roja",healthcare:"hospital",amenity:"hospital"},name:"Cruz Roja",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/IMSS":{tags:{name:"IMSS",healthcare:"hospital",amenity:"hospital"},name:"IMSS",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Инфекционное отделение":{tags:{name:"Инфекционное отделение",healthcare:"hospital",amenity:"hospital"},name:"Инфекционное отделение",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Кожно-венерологический диспансер":{tags:{name:"Кожно-венерологический диспансер",healthcare:"hospital",amenity:"hospital"},name:"Кожно-венерологический диспансер",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Районная больница":{tags:{name:"Районная больница",healthcare:"hospital",amenity:"hospital"},name:"Районная больница",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Роддом":{tags:{name:"Роддом",healthcare:"hospital",amenity:"hospital"},name:"Роддом",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Родильный дом":{tags:{name:"Родильный дом",healthcare:"hospital",amenity:"hospital"},name:"Родильный дом",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Скорая помощь":{tags:{name:"Скорая помощь",healthcare:"hospital",amenity:"hospital"},name:"Скорая помощь",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/ЦРБ":{tags:{name:"ЦРБ",healthcare:"hospital",amenity:"hospital"},name:"ЦРБ",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Центральная районная больница":{tags:{name:"Центральная районная больница",healthcare:"hospital",amenity:"hospital"},name:"Центральная районная больница",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/โรงพยาบาลส่งเสริมสุขภาพตำบล":{tags:{name:"โรงพยาบาลส่งเสริมสุขภาพตำบล",healthcare:"hospital",amenity:"hospital"},name:"โรงพยาบาลส่งเสริมสุขภาพตำบล",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/ice_cream/Grido":{tags:{name:"Grido",amenity:"ice_cream"},name:"Grido",icon:"maki-ice-cream",geometry:["point","area"],fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],suggestion:true},"amenity/kindergarten/Anganwadi":{tags:{name:"Anganwadi",amenity:"kindergarten"},name:"Anganwadi",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Arche Noah":{tags:{name:"Arche Noah",amenity:"kindergarten"},name:"Arche Noah",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/CONAFE Preescolar":{tags:{name:"CONAFE Preescolar",amenity:"kindergarten"},name:"CONAFE Preescolar",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Educacion Inicial de CONAFE No Escolarizado":{tags:{name:"Educacion Inicial de CONAFE No Escolarizado",amenity:"kindergarten"},name:"Educacion Inicial de CONAFE No Escolarizado",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Estefania Casta�eda":{tags:{name:"Estefania Casta�eda",amenity:"kindergarten"},name:"Estefania Casta�eda",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Evangelischer Kindergarten":{tags:{name:"Evangelischer Kindergarten",amenity:"kindergarten"},name:"Evangelischer Kindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Federico Froebel":{tags:{name:"Federico Froebel",amenity:"kindergarten"},name:"Federico Froebel",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Gabriela Mistral":{tags:{name:"Gabriela Mistral",amenity:"kindergarten"},name:"Gabriela Mistral",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Jean Piaget":{tags:{name:"Jean Piaget",amenity:"kindergarten"},name:"Jean Piaget",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Katholischer Kindergarten":{tags:{name:"Katholischer Kindergarten",amenity:"kindergarten"},name:"Katholischer Kindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Kindergarten Regenbogen":{tags:{name:"Kindergarten Regenbogen",amenity:"kindergarten"},name:"Kindergarten Regenbogen",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Kindergarten St. Josef":{tags:{name:"Kindergarten St. Josef",amenity:"kindergarten"},name:"Kindergarten St. Josef",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Kindergarten St. Martin":{tags:{name:"Kindergarten St. Martin",amenity:"kindergarten"},name:"Kindergarten St. Martin",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Maria Montessori":{tags:{name:"Maria Montessori",amenity:"kindergarten"},name:"Maria Montessori",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/PAUD":{tags:{name:"PAUD",amenity:"kindergarten"},name:"PAUD",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Pusteblume":{tags:{name:"Pusteblume",amenity:"kindergarten"},name:"Pusteblume",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Rosaura Zapata":{tags:{name:"Rosaura Zapata",amenity:"kindergarten"},name:"Rosaura Zapata",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Sor Juana Ines De La Cruz":{tags:{name:"Sor Juana Ines De La Cruz",amenity:"kindergarten"},name:"Sor Juana Ines De La Cruz",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Spatzennest":{tags:{name:"Spatzennest",amenity:"kindergarten"},name:"Spatzennest",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Städtischer Kindergarten":{tags:{name:"Städtischer Kindergarten",amenity:"kindergarten"},name:"Städtischer Kindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Villa Kunterbunt":{tags:{name:"Villa Kunterbunt",amenity:"kindergarten"},name:"Villa Kunterbunt",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Waldkindergarten":{tags:{name:"Waldkindergarten",amenity:"kindergarten"},name:"Waldkindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Waldorfkindergarten":{tags:{name:"Waldorfkindergarten",amenity:"kindergarten"},name:"Waldorfkindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Óvoda":{tags:{name:"Óvoda",amenity:"kindergarten"},name:"Óvoda",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детсад":{tags:{name:"Детсад",amenity:"kindergarten"},name:"Детсад",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад Солнышко":{tags:{name:"Детский сад Солнышко",amenity:"kindergarten"},name:"Детский сад Солнышко",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад № 1":{tags:{name:"Детский сад № 1",amenity:"kindergarten"},name:"Детский сад № 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №1":{tags:{name:"Детский сад №1",amenity:"kindergarten"},name:"Детский сад №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №10":{tags:{name:"Детский сад №10",amenity:"kindergarten"},name:"Детский сад №10",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №11":{tags:{name:"Детский сад №11",amenity:"kindergarten"},name:"Детский сад №11",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №12":{tags:{name:"Детский сад №12",amenity:"kindergarten"},name:"Детский сад №12",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №13":{tags:{name:"Детский сад №13",amenity:"kindergarten"},name:"Детский сад №13",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №14":{tags:{name:"Детский сад №14",amenity:"kindergarten"},name:"Детский сад №14",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №15":{tags:{name:"Детский сад №15",amenity:"kindergarten"},name:"Детский сад №15",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №16":{tags:{name:"Детский сад №16",amenity:"kindergarten"},name:"Детский сад №16",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №17":{tags:{name:"Детский сад №17",amenity:"kindergarten"},name:"Детский сад №17",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №18":{tags:{name:"Детский сад №18",amenity:"kindergarten"},name:"Детский сад №18",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №19":{tags:{name:"Детский сад №19",amenity:"kindergarten"},name:"Детский сад №19",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №2":{tags:{name:"Детский сад №2",amenity:"kindergarten"},name:"Детский сад №2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №22":{tags:{name:"Детский сад №22",amenity:"kindergarten"},name:"Детский сад №22",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №24":{tags:{name:"Детский сад №24",amenity:"kindergarten"},name:"Детский сад №24",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №25":{tags:{name:"Детский сад №25",amenity:"kindergarten"},name:"Детский сад №25",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №27":{tags:{name:"Детский сад №27",amenity:"kindergarten"},name:"Детский сад №27",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №29":{tags:{name:"Детский сад №29",amenity:"kindergarten"},name:"Детский сад №29",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №3":{tags:{name:"Детский сад №3",amenity:"kindergarten"},name:"Детский сад №3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №33":{tags:{name:"Детский сад №33",amenity:"kindergarten"},name:"Детский сад №33",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №4":{tags:{name:"Детский сад №4",amenity:"kindergarten"},name:"Детский сад №4",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №5":{tags:{name:"Детский сад №5",amenity:"kindergarten"},name:"Детский сад №5",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №6":{tags:{name:"Детский сад №6",amenity:"kindergarten"},name:"Детский сад №6",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №7":{tags:{name:"Детский сад №7",amenity:"kindergarten"},name:"Детский сад №7",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №8":{tags:{name:"Детский сад №8",amenity:"kindergarten"},name:"Детский сад №8",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №9":{tags:{name:"Детский сад №9",amenity:"kindergarten"},name:"Детский сад №9",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Дитячий садок":{tags:{name:"Дитячий садок",amenity:"kindergarten"},name:"Дитячий садок",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Солнышко":{tags:{name:"Солнышко",amenity:"kindergarten"},name:"Солнышко",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/საბავშვო ბაღი":{tags:{name:"საბავშვო ბაღი",amenity:"kindergarten"},name:"საბავშვო ბაღი",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/中央保育所":{tags:{name:"中央保育所",amenity:"kindergarten"},name:"中央保育所",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/library/Biblioteca Comunale":{tags:{name:"Biblioteca Comunale",amenity:"library"},name:"Biblioteca Comunale",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Biblioteca comunale":{tags:{name:"Biblioteca comunale",amenity:"library"},name:"Biblioteca comunale",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Biblioteka Publiczna":{tags:{name:"Biblioteka Publiczna",amenity:"library"},name:"Biblioteka Publiczna",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Bibliothèque Municipale":{tags:{name:"Bibliothèque Municipale",amenity:"library"},name:"Bibliothèque Municipale",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Bibliothèque municipale":{tags:{name:"Bibliothèque municipale",amenity:"library"},name:"Bibliothèque municipale",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Bücherei":{tags:{name:"Bücherei",amenity:"library"},name:"Bücherei",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Central Library":{tags:{name:"Central Library",amenity:"library"},name:"Central Library",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Gemeindebücherei":{tags:{name:"Gemeindebücherei",amenity:"library"},name:"Gemeindebücherei",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Gminna Biblioteka Publiczna":{tags:{name:"Gminna Biblioteka Publiczna",amenity:"library"},name:"Gminna Biblioteka Publiczna",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Miejska Biblioteka Publiczna":{tags:{name:"Miejska Biblioteka Publiczna",amenity:"library"},name:"Miejska Biblioteka Publiczna",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Médiathèque":{tags:{name:"Médiathèque",amenity:"library"},name:"Médiathèque",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Městská knihovna":{tags:{name:"Městská knihovna",amenity:"library"},name:"Městská knihovna",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Public Library":{tags:{name:"Public Library",amenity:"library"},name:"Public Library",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Stadtbibliothek":{tags:{name:"Stadtbibliothek",amenity:"library"},name:"Stadtbibliothek",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Stadtbücherei":{tags:{name:"Stadtbücherei",amenity:"library"},name:"Stadtbücherei",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Городская библиотека":{tags:{name:"Городская библиотека",amenity:"library"},name:"Городская библиотека",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Детская библиотека":{tags:{name:"Детская библиотека",amenity:"library"},name:"Детская библиотека",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Центральная библиотека":{tags:{name:"Центральная библиотека",amenity:"library"},name:"Центральная библиотека",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Центральная городская библиотека":{tags:{name:"Центральная городская библиотека",amenity:"library"},name:"Центральная городская библиотека",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/图书馆":{tags:{name:"图书馆",amenity:"library"},name:"图书馆",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/pharmacy/36.6":{tags:{name:"36.6",healthcare:"pharmacy",amenity:"pharmacy"},name:"36.6",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Adler-Apotheke":{tags:{name:"Adler-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Adler-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Alte Apotheke":{tags:{name:"Alte Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Alte Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Apollo Pharmacy":{tags:{name:"Apollo Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Apollo Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Apotek":{tags:{name:"Apotek",healthcare:"pharmacy",amenity:"pharmacy"},name:"Apotek",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Apotek Hjärtat":{tags:{name:"Apotek Hjärtat",healthcare:"pharmacy",amenity:"pharmacy"},name:"Apotek Hjärtat",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Apotheke am Markt":{tags:{name:"Apotheke am Markt",healthcare:"pharmacy",amenity:"pharmacy"},name:"Apotheke am Markt",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Bahnhof Apotheke":{tags:{name:"Bahnhof Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Bahnhof Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Bahnhof-Apotheke":{tags:{name:"Bahnhof-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Bahnhof-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Bartell Drugs":{tags:{name:"Bartell Drugs",healthcare:"pharmacy",amenity:"pharmacy"},name:"Bartell Drugs",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Benavides":{tags:{name:"Benavides",healthcare:"pharmacy",amenity:"pharmacy"},name:"Benavides",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Benu":{tags:{name:"Benu",healthcare:"pharmacy",amenity:"pharmacy"},name:"Benu",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Boots":{tags:{name:"Boots",healthcare:"pharmacy",amenity:"pharmacy"},name:"Boots",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Botica":{tags:{name:"Botica",healthcare:"pharmacy",amenity:"pharmacy"},name:"Botica",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Brunnen-Apotheke":{tags:{name:"Brunnen-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Brunnen-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Burg-Apotheke":{tags:{name:"Burg-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Burg-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Bären-Apotheke":{tags:{name:"Bären-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Bären-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/CVS":{tags:{name:"CVS",healthcare:"pharmacy",amenity:"pharmacy"},name:"CVS",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Camelia":{tags:{name:"Camelia",healthcare:"pharmacy",amenity:"pharmacy"},name:"Camelia",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Catena":{tags:{name:"Catena",healthcare:"pharmacy",amenity:"pharmacy"},name:"Catena",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Chemist Warehouse":{tags:{name:"Chemist Warehouse",healthcare:"pharmacy",amenity:"pharmacy"},name:"Chemist Warehouse",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Clicks":{tags:{name:"Clicks",healthcare:"pharmacy",amenity:"pharmacy"},name:"Clicks",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Cruz Azul":{tags:{name:"Cruz Azul",healthcare:"pharmacy",amenity:"pharmacy"},name:"Cruz Azul",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Cruz Verde":{tags:{name:"Cruz Verde",healthcare:"pharmacy",amenity:"pharmacy"},name:"Cruz Verde",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Dbam o Zdrowie":{tags:{name:"Dbam o Zdrowie",healthcare:"pharmacy",amenity:"pharmacy"},name:"Dbam o Zdrowie",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Dr. Max":{tags:{name:"Dr. Max",healthcare:"pharmacy",amenity:"pharmacy"},name:"Dr. Max",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Droga Raia":{tags:{name:"Droga Raia",healthcare:"pharmacy",amenity:"pharmacy"},name:"Droga Raia",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Drogaria São Paulo":{tags:{name:"Drogaria São Paulo",healthcare:"pharmacy",amenity:"pharmacy"},name:"Drogaria São Paulo",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Drogasil":{tags:{name:"Drogasil",healthcare:"pharmacy",amenity:"pharmacy"},name:"Drogasil",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Duane Reade":{tags:{name:"Duane Reade",healthcare:"pharmacy",amenity:"pharmacy"},name:"Duane Reade",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Eczane":{tags:{name:"Eczane",healthcare:"pharmacy",amenity:"pharmacy"},name:"Eczane",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Engel-Apotheke":{tags:{name:"Engel-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Engel-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Eurovaistinė":{tags:{name:"Eurovaistinė",healthcare:"pharmacy",amenity:"pharmacy"},name:"Eurovaistinė",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Familiprix":{tags:{name:"Familiprix",healthcare:"pharmacy",amenity:"pharmacy"},name:"Familiprix",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacenter":{tags:{name:"Farmacenter",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacenter",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacia Centrale":{tags:{name:"Farmacia Centrale",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacia Centrale",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacia Comunale":{tags:{name:"Farmacia Comunale",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacia Comunale",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacia Guadalajara":{tags:{name:"Farmacia Guadalajara",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacia Guadalajara",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacia del Ahorro":{tags:{name:"Farmacia del Ahorro",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacia del Ahorro",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Ahumada":{tags:{name:"Farmacias Ahumada",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Ahumada",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Cruz Azul":{tags:{name:"Farmacias Cruz Azul",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Cruz Azul",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Cruz Verde":{tags:{name:"Farmacias Cruz Verde",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Cruz Verde",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Económicas":{tags:{name:"Farmacias Económicas",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Económicas",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Guadalajara":{tags:{name:"Farmacias Guadalajara",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Guadalajara",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias SalcoBrand":{tags:{name:"Farmacias SalcoBrand",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Sana Sana":{tags:{name:"Farmacias Sana Sana",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Sana Sana",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Similares":{tags:{name:"Farmacias Similares",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Similares",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias del Ahorro":{tags:{name:"Farmacias del Ahorro",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias del Ahorro",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacity":{tags:{name:"Farmacity",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacity",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmahorro":{tags:{name:"Farmahorro",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmahorro",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmatodo":{tags:{name:"Farmatodo",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmatodo",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Felicia":{tags:{name:"Felicia",healthcare:"pharmacy",amenity:"pharmacy"},name:"Felicia",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Fybeca":{tags:{name:"Fybeca",healthcare:"pharmacy",amenity:"pharmacy"},name:"Fybeca",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Generika Drugstore":{tags:{name:"Generika Drugstore",healthcare:"pharmacy",amenity:"pharmacy"},name:"Generika Drugstore",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Gintarinė vaistinė":{tags:{name:"Gintarinė vaistinė",healthcare:"pharmacy",amenity:"pharmacy"},name:"Gintarinė vaistinė",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Guardian":{tags:{name:"Guardian",healthcare:"pharmacy",amenity:"pharmacy"},name:"Guardian",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Gyógyszertár":{tags:{name:"Gyógyszertár",healthcare:"pharmacy",amenity:"pharmacy"},name:"Gyógyszertár",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/H-E-B Pharmacy":{tags:{name:"H-E-B Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"H-E-B Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Hirsch-Apotheke":{tags:{name:"Hirsch-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Hirsch-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Hubertus Apotheke":{tags:{name:"Hubertus Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Hubertus Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Inkafarma":{tags:{name:"Inkafarma",healthcare:"pharmacy",amenity:"pharmacy"},name:"Inkafarma",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Jean Coutu":{tags:{name:"Jean Coutu",healthcare:"pharmacy",amenity:"pharmacy"},name:"Jean Coutu",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Kinney Drugs":{tags:{name:"Kinney Drugs",healthcare:"pharmacy",amenity:"pharmacy"},name:"Kinney Drugs",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Kur-Apotheke":{tags:{name:"Kur-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Kur-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Linden-Apotheke":{tags:{name:"Linden-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Linden-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Ljekarna":{tags:{name:"Ljekarna",healthcare:"pharmacy",amenity:"pharmacy"},name:"Ljekarna",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Lloyds Pharmacy":{tags:{name:"Lloyds Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Lloyds Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Lékárna":{tags:{name:"Lékárna",healthcare:"pharmacy",amenity:"pharmacy"},name:"Lékárna",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Löwen-Apotheke":{tags:{name:"Löwen-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Löwen-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Marien-Apotheke":{tags:{name:"Marien-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Marien-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Markt-Apotheke":{tags:{name:"Markt-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Markt-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Mercury Drug":{tags:{name:"Mercury Drug",healthcare:"pharmacy",amenity:"pharmacy"},name:"Mercury Drug",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Mifarma":{tags:{name:"Mifarma",healthcare:"pharmacy",amenity:"pharmacy"},name:"Mifarma",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Mēness aptieka":{tags:{name:"Mēness aptieka",healthcare:"pharmacy",amenity:"pharmacy"},name:"Mēness aptieka",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Neue Apotheke":{tags:{name:"Neue Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Neue Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pague Menos":{tags:{name:"Pague Menos",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pague Menos",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Panvel":{tags:{name:"Panvel",healthcare:"pharmacy",amenity:"pharmacy"},name:"Panvel",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Park-Apotheke":{tags:{name:"Park-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Park-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie Centrale":{tags:{name:"Pharmacie Centrale",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie Centrale",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie Principale":{tags:{name:"Pharmacie Principale",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie Principale",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie de l'Hôtel de Ville":{tags:{name:"Pharmacie de l'Hôtel de Ville",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie de l'Hôtel de Ville",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie de la Gare":{tags:{name:"Pharmacie de la Gare",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie de la Gare",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie de la Mairie":{tags:{name:"Pharmacie de la Mairie",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie de la Mairie",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie de la Poste":{tags:{name:"Pharmacie de la Poste",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie de la Poste",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie du Centre":{tags:{name:"Pharmacie du Centre",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie du Centre",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie du Marché":{tags:{name:"Pharmacie du Marché",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie du Marché",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie du Parc":{tags:{name:"Pharmacie du Parc",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie du Parc",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmaprix":{tags:{name:"Pharmaprix",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmaprix",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmasave":{tags:{name:"Pharmasave",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmasave",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Punkt Apteczny":{tags:{name:"Punkt Apteczny",healthcare:"pharmacy",amenity:"pharmacy"},name:"Punkt Apteczny",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rathaus-Apotheke":{tags:{name:"Rathaus-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rathaus-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rats-Apotheke":{tags:{name:"Rats-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rats-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rexall":{tags:{name:"Rexall",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rexall",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rite Aid":{tags:{name:"Rite Aid",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rite Aid",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rose Pharmacy":{tags:{name:"Rose Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rose Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rosen-Apotheke":{tags:{name:"Rosen-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rosen-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rowlands Pharmacy":{tags:{name:"Rowlands Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rowlands Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/SalcoBrand":{tags:{name:"SalcoBrand",healthcare:"pharmacy",amenity:"pharmacy"},name:"SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Sana Sana":{tags:{name:"Sana Sana",healthcare:"pharmacy",amenity:"pharmacy"},name:"Sana Sana",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Schloss-Apotheke":{tags:{name:"Schloss-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Schloss-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Sensiblu":{tags:{name:"Sensiblu",healthcare:"pharmacy",amenity:"pharmacy"},name:"Sensiblu",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Shoppers Drug Mart":{tags:{name:"Shoppers Drug Mart",healthcare:"pharmacy",amenity:"pharmacy"},name:"Shoppers Drug Mart",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Sonnen-Apotheke":{tags:{name:"Sonnen-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Sonnen-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/South Star Drug":{tags:{name:"South Star Drug",healthcare:"pharmacy",amenity:"pharmacy"},name:"South Star Drug",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Stadt-Apotheke":{tags:{name:"Stadt-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Stadt-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Stern-Apotheke":{tags:{name:"Stern-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Stern-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Superdrug":{tags:{name:"Superdrug",healthcare:"pharmacy",amenity:"pharmacy"},name:"Superdrug",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/São João":{tags:{name:"São João",healthcare:"pharmacy",amenity:"pharmacy"},name:"São João",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/The Generics Pharmacy":{tags:{name:"The Generics Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"The Generics Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Uniprix":{tags:{name:"Uniprix",healthcare:"pharmacy",amenity:"pharmacy"},name:"Uniprix",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Walgreens":{tags:{name:"Walgreens",healthcare:"pharmacy",amenity:"pharmacy"},name:"Walgreens",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Walgreens Pharmacy":{tags:{name:"Walgreens Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Walgreens Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Walmart Pharmacy":{tags:{name:"Walmart Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Walmart Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Well Pharmacy":{tags:{name:"Well Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Well Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/centro naturista":{tags:{name:"centro naturista",healthcare:"pharmacy",amenity:"pharmacy"},name:"centro naturista",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/А5":{tags:{name:"А5",healthcare:"pharmacy",amenity:"pharmacy"},name:"А5",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Айболит":{tags:{name:"Айболит",healthcare:"pharmacy",amenity:"pharmacy"},name:"Айболит",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптека 36,6":{tags:{name:"Аптека 36,6",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптека 36,6",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптека низких цен":{tags:{name:"Аптека низких цен",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптека низких цен",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптека низьких цін":{tags:{name:"Аптека низьких цін",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптека низьких цін",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптека от склада":{tags:{name:"Аптека от склада",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптека от склада",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптека №1":{tags:{name:"Аптека №1",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптека №1",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптечный пункт":{tags:{name:"Аптечный пункт",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптечный пункт",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Арніка":{tags:{name:"Арніка",healthcare:"pharmacy",amenity:"pharmacy"},name:"Арніка",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Бережная аптека":{tags:{name:"Бережная аптека",healthcare:"pharmacy",amenity:"pharmacy"},name:"Бережная аптека",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Будь здоров":{tags:{name:"Будь здоров",healthcare:"pharmacy",amenity:"pharmacy"},name:"Будь здоров",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Вита":{tags:{name:"Вита",healthcare:"pharmacy",amenity:"pharmacy"},name:"Вита",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Горздрав":{tags:{name:"Горздрав",healthcare:"pharmacy",amenity:"pharmacy"},name:"Горздрав",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Живика":{tags:{name:"Живика",healthcare:"pharmacy",amenity:"pharmacy"},name:"Живика",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Здоровье":{tags:{name:"Здоровье",healthcare:"pharmacy",amenity:"pharmacy"},name:"Здоровье",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Имплозия":{tags:{name:"Имплозия",healthcare:"pharmacy",amenity:"pharmacy"},name:"Имплозия",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Классика":{tags:{name:"Классика",healthcare:"pharmacy",amenity:"pharmacy"},name:"Классика",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Ладушка":{tags:{name:"Ладушка",healthcare:"pharmacy",amenity:"pharmacy"},name:"Ладушка",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Мед-сервіс":{tags:{name:"Мед-сервіс",healthcare:"pharmacy",amenity:"pharmacy"},name:"Мед-сервіс",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Мелодия здоровья":{tags:{name:"Мелодия здоровья",healthcare:"pharmacy",amenity:"pharmacy"},name:"Мелодия здоровья",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Невис":{tags:{name:"Невис",healthcare:"pharmacy",amenity:"pharmacy"},name:"Невис",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Норма":{tags:{name:"Норма",healthcare:"pharmacy",amenity:"pharmacy"},name:"Норма",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Озерки":{tags:{name:"Озерки",healthcare:"pharmacy",amenity:"pharmacy"},name:"Озерки",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Панацея":{tags:{name:"Панацея",healthcare:"pharmacy",amenity:"pharmacy"},name:"Панацея",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Первая помощь":{tags:{name:"Первая помощь",healthcare:"pharmacy",amenity:"pharmacy"},name:"Первая помощь",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Планета здоровья":{tags:{name:"Планета здоровья",healthcare:"pharmacy",amenity:"pharmacy"},name:"Планета здоровья",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Ригла":{tags:{name:"Ригла",healthcare:"pharmacy",amenity:"pharmacy"},name:"Ригла",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Семейная":{tags:{name:"Семейная",healthcare:"pharmacy",amenity:"pharmacy"},name:"Семейная",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Социальная аптека":{tags:{name:"Социальная аптека",healthcare:"pharmacy",amenity:"pharmacy"},name:"Социальная аптека",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Столички":{tags:{name:"Столички",healthcare:"pharmacy",amenity:"pharmacy"},name:"Столички",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Фармакопейка":{tags:{name:"Фармакопейка",healthcare:"pharmacy",amenity:"pharmacy"},name:"Фармакопейка",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Фармакор":{tags:{name:"Фармакор",healthcare:"pharmacy",amenity:"pharmacy"},name:"Фармакор",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Фармация":{tags:{name:"Фармация",healthcare:"pharmacy",amenity:"pharmacy"},name:"Фармация",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Фармленд":{tags:{name:"Фармленд",healthcare:"pharmacy",amenity:"pharmacy"},name:"Фармленд",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Центральная аптека":{tags:{name:"Центральная аптека",healthcare:"pharmacy",amenity:"pharmacy"},name:"Центральная аптека",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/סופר-פארם":{tags:{name:"סופר-פארם",healthcare:"pharmacy",amenity:"pharmacy"},name:"סופר-פארם",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/داروخانه":{tags:{name:"داروخانه",healthcare:"pharmacy",amenity:"pharmacy"},name:"داروخانه",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/داروخانه شبانه روزی":{tags:{name:"داروخانه شبانه روزی",healthcare:"pharmacy",amenity:"pharmacy"},name:"داروخانه شبانه روزی",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/صيدلية":{tags:{name:"صيدلية",healthcare:"pharmacy",amenity:"pharmacy"},name:"صيدلية",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/くすりの福太郎":{tags:{name:"くすりの福太郎",healthcare:"pharmacy",amenity:"pharmacy"},name:"くすりの福太郎",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/さくら薬局":{tags:{name:"さくら薬局",healthcare:"pharmacy",amenity:"pharmacy"},name:"さくら薬局",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/ウエルシア":{tags:{name:"ウエルシア",healthcare:"pharmacy",amenity:"pharmacy"},name:"ウエルシア",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/カワチ薬品":{tags:{name:"カワチ薬品",healthcare:"pharmacy",amenity:"pharmacy"},name:"カワチ薬品",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/クリエイト":{tags:{name:"クリエイト",healthcare:"pharmacy",amenity:"pharmacy"},name:"クリエイト",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/サンドラッグ":{tags:{name:"サンドラッグ",healthcare:"pharmacy",amenity:"pharmacy"},name:"サンドラッグ",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/スギ薬局":{tags:{name:"スギ薬局",healthcare:"pharmacy",amenity:"pharmacy"},name:"スギ薬局",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/セイジョー":{tags:{name:"セイジョー",healthcare:"pharmacy",amenity:"pharmacy"},name:"セイジョー",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/ツルハドラッグ":{tags:{name:"ツルハドラッグ",healthcare:"pharmacy",amenity:"pharmacy"},name:"ツルハドラッグ",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/ドラッグてらしま (Drug Terashima)":{tags:{name:"ドラッグてらしま (Drug Terashima)",healthcare:"pharmacy",amenity:"pharmacy"},name:"ドラッグてらしま (Drug Terashima)",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/マツモトキヨシ":{tags:{name:"マツモトキヨシ",healthcare:"pharmacy",amenity:"pharmacy"},name:"マツモトキヨシ",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/丁丁藥局":{tags:{name:"丁丁藥局",healthcare:"pharmacy",amenity:"pharmacy"},name:"丁丁藥局",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pub/Black Bull":{tags:{name:"Black Bull",amenity:"pub"},name:"Black Bull",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Commercial Hotel":{tags:{name:"Commercial Hotel",amenity:"pub"},name:"Commercial Hotel",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Cross Keys":{tags:{name:"Cross Keys",amenity:"pub"},name:"Cross Keys",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Irish Pub":{tags:{name:"Irish Pub",amenity:"pub"},name:"Irish Pub",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Kings Arms":{tags:{name:"Kings Arms",amenity:"pub"},name:"Kings Arms",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Kings Head":{tags:{name:"Kings Head",amenity:"pub"},name:"Kings Head",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/New Inn":{tags:{name:"New Inn",amenity:"pub"},name:"New Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Prince of Wales":{tags:{name:"Prince of Wales",amenity:"pub"},name:"Prince of Wales",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Queens Head":{tags:{name:"Queens Head",amenity:"pub"},name:"Queens Head",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Red Lion":{tags:{name:"Red Lion",amenity:"pub"},name:"Red Lion",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Rose & Crown":{tags:{name:"Rose & Crown",amenity:"pub"},name:"Rose & Crown",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Rose and Crown":{tags:{name:"Rose and Crown",amenity:"pub"},name:"Rose and Crown",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Royal Oak":{tags:{name:"Royal Oak",amenity:"pub"},name:"Royal Oak",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Albion":{tags:{name:"The Albion",amenity:"pub"},name:"The Albion",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Anchor":{tags:{name:"The Anchor",amenity:"pub"},name:"The Anchor",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Angel":{tags:{name:"The Angel",amenity:"pub"},name:"The Angel",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Beehive":{tags:{name:"The Beehive",amenity:"pub"},name:"The Beehive",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Bell":{tags:{name:"The Bell",amenity:"pub"},name:"The Bell",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Bell Inn":{tags:{name:"The Bell Inn",amenity:"pub"},name:"The Bell Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Black Horse":{tags:{name:"The Black Horse",amenity:"pub"},name:"The Black Horse",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Bull":{tags:{name:"The Bull",amenity:"pub"},name:"The Bull",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Castle":{tags:{name:"The Castle",amenity:"pub"},name:"The Castle",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Chequers":{tags:{name:"The Chequers",amenity:"pub"},name:"The Chequers",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Cricketers":{tags:{name:"The Cricketers",amenity:"pub"},name:"The Cricketers",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Cross Keys":{tags:{name:"The Cross Keys",amenity:"pub"},name:"The Cross Keys",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Crown":{tags:{name:"The Crown",amenity:"pub"},name:"The Crown",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Crown Inn":{tags:{name:"The Crown Inn",amenity:"pub"},name:"The Crown Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Fox":{tags:{name:"The Fox",amenity:"pub"},name:"The Fox",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The George":{tags:{name:"The George",amenity:"pub"},name:"The George",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Green Man":{tags:{name:"The Green Man",amenity:"pub"},name:"The Green Man",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Greyhound":{tags:{name:"The Greyhound",amenity:"pub"},name:"The Greyhound",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Kings Arms":{tags:{name:"The Kings Arms",amenity:"pub"},name:"The Kings Arms",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Kings Head":{tags:{name:"The Kings Head",amenity:"pub"},name:"The Kings Head",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The New Inn":{tags:{name:"The New Inn",amenity:"pub"},name:"The New Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Plough":{tags:{name:"The Plough",amenity:"pub"},name:"The Plough",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Plough Inn":{tags:{name:"The Plough Inn",amenity:"pub"},name:"The Plough Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Queens Head":{tags:{name:"The Queens Head",amenity:"pub"},name:"The Queens Head",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Railway":{tags:{name:"The Railway",amenity:"pub"},name:"The Railway",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Red Lion":{tags:{name:"The Red Lion",amenity:"pub"},name:"The Red Lion",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Rising Sun":{tags:{name:"The Rising Sun",amenity:"pub"},name:"The Rising Sun",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Royal Oak":{tags:{name:"The Royal Oak",amenity:"pub"},name:"The Royal Oak",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Ship":{tags:{name:"The Ship",amenity:"pub"},name:"The Ship",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Ship Inn":{tags:{name:"The Ship Inn",amenity:"pub"},name:"The Ship Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Star":{tags:{name:"The Star",amenity:"pub"},name:"The Star",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Star Inn":{tags:{name:"The Star Inn",amenity:"pub"},name:"The Star Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Sun Inn":{tags:{name:"The Sun Inn",amenity:"pub"},name:"The Sun Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Swan":{tags:{name:"The Swan",amenity:"pub"},name:"The Swan",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Swan Inn":{tags:{name:"The Swan Inn",amenity:"pub"},name:"The Swan Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Victoria":{tags:{name:"The Victoria",amenity:"pub"},name:"The Victoria",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Wheatsheaf":{tags:{name:"The Wheatsheaf",amenity:"pub"},name:"The Wheatsheaf",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The White Hart":{tags:{name:"The White Hart",amenity:"pub"},name:"The White Hart",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The White Horse":{tags:{name:"The White Horse",amenity:"pub"},name:"The White Horse",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The White Lion":{tags:{name:"The White Lion",amenity:"pub"},name:"The White Lion",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The White Swan":{tags:{name:"The White Swan",amenity:"pub"},name:"The White Swan",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/魚民":{tags:{name:"魚民",amenity:"pub"},name:"魚民",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/鳥貴族":{tags:{name:"鳥貴族",amenity:"pub"},name:"鳥貴族",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/restaurant/Adler":{tags:{name:"Adler",amenity:"restaurant"},name:"Adler",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Adria":{tags:{name:"Adria",amenity:"restaurant"},name:"Adria",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Adyar Ananda Bhavan":{tags:{name:"Adyar Ananda Bhavan",amenity:"restaurant"},name:"Adyar Ananda Bhavan",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Akropolis":{tags:{name:"Akropolis",amenity:"restaurant"},name:"Akropolis",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Alte Post":{tags:{name:"Alte Post",amenity:"restaurant"},name:"Alte Post",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Applebee's":{tags:{name:"Applebee's",amenity:"restaurant"},name:"Applebee's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Asia":{tags:{name:"Asia",amenity:"restaurant"},name:"Asia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Athen":{tags:{name:"Athen",amenity:"restaurant"},name:"Athen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Athos":{tags:{name:"Athos",amenity:"restaurant"},name:"Athos",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Autogrill":{tags:{name:"Autogrill",amenity:"restaurant"},name:"Autogrill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bahnhof":{tags:{name:"Bahnhof",amenity:"restaurant"},name:"Bahnhof",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bella Italia":{tags:{name:"Bella Italia",amenity:"restaurant"},name:"Bella Italia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bella Napoli":{tags:{name:"Bella Napoli",amenity:"restaurant"},name:"Bella Napoli",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Big Boy":{tags:{name:"Big Boy",amenity:"restaurant"},name:"Big Boy",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bob Evans":{tags:{name:"Bob Evans",amenity:"restaurant"},name:"Bob Evans",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bonefish Grill":{tags:{name:"Bonefish Grill",amenity:"restaurant"},name:"Bonefish Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Boston Pizza":{tags:{name:"Boston Pizza",amenity:"restaurant"},name:"Boston Pizza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Buffalo Grill":{tags:{name:"Buffalo Grill",amenity:"restaurant"},name:"Buffalo Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Buffalo Wild Wings":{tags:{name:"Buffalo Wild Wings",amenity:"restaurant"},name:"Buffalo Wild Wings",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bären":{tags:{name:"Bären",amenity:"restaurant"},name:"Bären",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/California Pizza Kitchen":{tags:{name:"California Pizza Kitchen",amenity:"restaurant"},name:"California Pizza Kitchen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Canteen":{tags:{name:"Canteen",amenity:"restaurant"},name:"Canteen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Capri":{tags:{name:"Capri",amenity:"restaurant"},name:"Capri",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Carluccio's":{tags:{name:"Carluccio's",amenity:"restaurant"},name:"Carluccio's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Carpe Diem":{tags:{name:"Carpe Diem",amenity:"restaurant"},name:"Carpe Diem",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Carrabba's Italian Grill":{tags:{name:"Carrabba's Italian Grill",amenity:"restaurant"},name:"Carrabba's Italian Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Casa Mia":{tags:{name:"Casa Mia",amenity:"restaurant"},name:"Casa Mia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Casablanca":{tags:{name:"Casablanca",amenity:"restaurant"},name:"Casablanca",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Cheesecake Factory":{tags:{name:"Cheesecake Factory",amenity:"restaurant"},name:"Cheesecake Factory",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Chifa":{tags:{name:"Chifa",amenity:"restaurant"},name:"Chifa",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Chili's":{tags:{name:"Chili's",amenity:"restaurant"},name:"Chili's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/China Buffet":{tags:{name:"China Buffet",amenity:"restaurant"},name:"China Buffet",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/China Garden":{tags:{name:"China Garden",amenity:"restaurant"},name:"China Garden",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/China House":{tags:{name:"China House",amenity:"restaurant"},name:"China House",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/China Town":{tags:{name:"China Town",amenity:"restaurant"},name:"China Town",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/China Wok":{tags:{name:"China Wok",amenity:"restaurant"},name:"China Wok",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Chiquito":{tags:{name:"Chiquito",amenity:"restaurant"},name:"Chiquito",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Chuck E. Cheese's":{tags:{name:"Chuck E. Cheese's",amenity:"restaurant"},name:"Chuck E. Cheese's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Cici's Pizza":{tags:{name:"Cici's Pizza",amenity:"restaurant"},name:"Cici's Pizza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Comedor":{tags:{name:"Comedor",amenity:"restaurant"},name:"Comedor",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Comida China":{tags:{name:"Comida China",amenity:"restaurant"},name:"Comida China",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Courtepaille":{tags:{name:"Courtepaille",amenity:"restaurant"},name:"Courtepaille",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Cracker Barrel":{tags:{name:"Cracker Barrel",amenity:"restaurant"},name:"Cracker Barrel",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Da Grasso":{tags:{name:"Da Grasso",amenity:"restaurant"},name:"Da Grasso",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Da Vinci":{tags:{name:"Da Vinci",amenity:"restaurant"},name:"Da Vinci",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Delphi":{tags:{name:"Delphi",amenity:"restaurant"},name:"Delphi",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Denny's":{tags:{name:"Denny's",amenity:"restaurant"},name:"Denny's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Deutsches Haus":{tags:{name:"Deutsches Haus",amenity:"restaurant"},name:"Deutsches Haus",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Dionysos":{tags:{name:"Dionysos",amenity:"restaurant"},name:"Dionysos",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Dolce Vita":{tags:{name:"Dolce Vita",amenity:"restaurant"},name:"Dolce Vita",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Dorfkrug":{tags:{name:"Dorfkrug",amenity:"restaurant"},name:"Dorfkrug",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/East Side Mario's":{tags:{name:"East Side Mario's",amenity:"restaurant"},name:"East Side Mario's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/El Greco":{tags:{name:"El Greco",amenity:"restaurant"},name:"El Greco",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/El Paso":{tags:{name:"El Paso",amenity:"restaurant"},name:"El Paso",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/El Rancho":{tags:{name:"El Rancho",amenity:"restaurant"},name:"El Rancho",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Europa":{tags:{name:"Europa",amenity:"restaurant"},name:"Europa",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Famous Dave's":{tags:{name:"Famous Dave's",amenity:"restaurant"},name:"Famous Dave's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Flunch":{tags:{name:"Flunch",amenity:"restaurant"},name:"Flunch",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Frankie & Benny's":{tags:{name:"Frankie & Benny's",amenity:"restaurant"},name:"Frankie & Benny's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Friendly's":{tags:{name:"Friendly's",amenity:"restaurant"},name:"Friendly's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Gasthaus Krone":{tags:{name:"Gasthaus Krone",amenity:"restaurant"},name:"Gasthaus Krone",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Gasthaus zur Linde":{tags:{name:"Gasthaus zur Linde",amenity:"restaurant"},name:"Gasthaus zur Linde",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Gasthof zur Post":{tags:{name:"Gasthof zur Post",amenity:"restaurant"},name:"Gasthof zur Post",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Golden Corral":{tags:{name:"Golden Corral",amenity:"restaurant"},name:"Golden Corral",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Golden Dragon":{tags:{name:"Golden Dragon",amenity:"restaurant"},name:"Golden Dragon",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Great Wall":{tags:{name:"Great Wall",amenity:"restaurant"},name:"Great Wall",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Grüner Baum":{tags:{name:"Grüner Baum",amenity:"restaurant"},name:"Grüner Baum",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Gusto":{tags:{name:"Gusto",amenity:"restaurant"},name:"Gusto",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hard Rock Cafe":{tags:{name:"Hard Rock Cafe",amenity:"restaurant"},name:"Hard Rock Cafe",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Harvester":{tags:{name:"Harvester",amenity:"restaurant"},name:"Harvester",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hellas":{tags:{name:"Hellas",amenity:"restaurant"},name:"Hellas",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hippopotamus":{tags:{name:"Hippopotamus",amenity:"restaurant"},name:"Hippopotamus",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hirsch":{tags:{name:"Hirsch",amenity:"restaurant"},name:"Hirsch",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hirschen":{tags:{name:"Hirschen",amenity:"restaurant"},name:"Hirschen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hong Kong":{tags:{name:"Hong Kong",amenity:"restaurant"},name:"Hong Kong",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hooters":{tags:{name:"Hooters",amenity:"restaurant"},name:"Hooters",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/IHOP":{tags:{name:"IHOP",amenity:"restaurant"},name:"IHOP",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/IL Патио":{tags:{name:"IL Патио",amenity:"restaurant"},name:"IL Патио",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Jason's Deli":{tags:{name:"Jason's Deli",amenity:"restaurant"},name:"Jason's Deli",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Joe's Crab Shack":{tags:{name:"Joe's Crab Shack",amenity:"restaurant"},name:"Joe's Crab Shack",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Jägerhof":{tags:{name:"Jägerhof",amenity:"restaurant"},name:"Jägerhof",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kantine":{tags:{name:"Kantine",amenity:"restaurant"},name:"Kantine",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kelsey's":{tags:{name:"Kelsey's",amenity:"restaurant"},name:"Kelsey's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kirchenwirt":{tags:{name:"Kirchenwirt",amenity:"restaurant"},name:"Kirchenwirt",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kreta":{tags:{name:"Kreta",amenity:"restaurant"},name:"Kreta",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kreuz":{tags:{name:"Kreuz",amenity:"restaurant"},name:"Kreuz",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Krone":{tags:{name:"Krone",amenity:"restaurant"},name:"Krone",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kudu":{tags:{name:"Kudu",amenity:"restaurant"},name:"Kudu",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/L'Escale":{tags:{name:"L'Escale",amenity:"restaurant"},name:"L'Escale",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/L'Osteria":{tags:{name:"L'Osteria",amenity:"restaurant"},name:"L'Osteria",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Bodega":{tags:{name:"La Bodega",amenity:"restaurant"},name:"La Bodega",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Boucherie":{tags:{name:"La Boucherie",amenity:"restaurant"},name:"La Boucherie",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Cantina":{tags:{name:"La Cantina",amenity:"restaurant"},name:"La Cantina",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Casa":{tags:{name:"La Casa",amenity:"restaurant"},name:"La Casa",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Casona":{tags:{name:"La Casona",amenity:"restaurant"},name:"La Casona",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Dolce Vita":{tags:{name:"La Dolce Vita",amenity:"restaurant"},name:"La Dolce Vita",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Fontana":{tags:{name:"La Fontana",amenity:"restaurant"},name:"La Fontana",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Gondola":{tags:{name:"La Gondola",amenity:"restaurant"},name:"La Gondola",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Hacienda":{tags:{name:"La Hacienda",amenity:"restaurant"},name:"La Hacienda",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Pataterie":{tags:{name:"La Pataterie",amenity:"restaurant"},name:"La Pataterie",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Pergola":{tags:{name:"La Pergola",amenity:"restaurant"},name:"La Pergola",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Perla":{tags:{name:"La Perla",amenity:"restaurant"},name:"La Perla",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Piazza":{tags:{name:"La Piazza",amenity:"restaurant"},name:"La Piazza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Piazzetta":{tags:{name:"La Piazzetta",amenity:"restaurant"},name:"La Piazzetta",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Place":{tags:{name:"La Place",amenity:"restaurant"},name:"La Place",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Scala":{tags:{name:"La Scala",amenity:"restaurant"},name:"La Scala",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Strada":{tags:{name:"La Strada",amenity:"restaurant"},name:"La Strada",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Tagliatella":{tags:{name:"La Tagliatella",amenity:"restaurant"},name:"La Tagliatella",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Tasca":{tags:{name:"La Tasca",amenity:"restaurant"},name:"La Tasca",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Taverna":{tags:{name:"La Taverna",amenity:"restaurant"},name:"La Taverna",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Terrasse":{tags:{name:"La Terrasse",amenity:"restaurant"},name:"La Terrasse",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Terraza":{tags:{name:"La Terraza",amenity:"restaurant"},name:"La Terraza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Terrazza":{tags:{name:"La Terrazza",amenity:"restaurant"},name:"La Terrazza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Trattoria":{tags:{name:"La Trattoria",amenity:"restaurant"},name:"La Trattoria",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Lamm":{tags:{name:"Lamm",amenity:"restaurant"},name:"Lamm",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Linde":{tags:{name:"Linde",amenity:"restaurant"},name:"Linde",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Lindenhof":{tags:{name:"Lindenhof",amenity:"restaurant"},name:"Lindenhof",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Little Chef":{tags:{name:"Little Chef",amenity:"restaurant"},name:"Little Chef",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Little Italy":{tags:{name:"Little Italy",amenity:"restaurant"},name:"Little Italy",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Logan's Roadhouse":{tags:{name:"Logan's Roadhouse",amenity:"restaurant"},name:"Logan's Roadhouse",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/LongHorn Steakhouse":{tags:{name:"LongHorn Steakhouse",amenity:"restaurant"},name:"LongHorn Steakhouse",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Lotus":{tags:{name:"Lotus",amenity:"restaurant"},name:"Lotus",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Léon de Bruxelles":{tags:{name:"Léon de Bruxelles",amenity:"restaurant"},name:"Léon de Bruxelles",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Löwen":{tags:{name:"Löwen",amenity:"restaurant"},name:"Löwen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/MK Restaurants":{tags:{name:"MK Restaurants",amenity:"restaurant"},name:"MK Restaurants",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Maharaja":{tags:{name:"Maharaja",amenity:"restaurant"},name:"Maharaja",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mamma Mia":{tags:{name:"Mamma Mia",amenity:"restaurant"},name:"Mamma Mia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mandarin":{tags:{name:"Mandarin",amenity:"restaurant"},name:"Mandarin",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mang Inasal":{tags:{name:"Mang Inasal",amenity:"restaurant"},name:"Mang Inasal",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Marco Polo":{tags:{name:"Marco Polo",amenity:"restaurant"},name:"Marco Polo",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Marco's Pizza":{tags:{name:"Marco's Pizza",amenity:"restaurant"},name:"Marco's Pizza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/McAlister's Deli":{tags:{name:"McAlister's Deli",amenity:"restaurant"},name:"McAlister's Deli",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mediterraneo":{tags:{name:"Mediterraneo",amenity:"restaurant"},name:"Mediterraneo",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mellow Mushroom":{tags:{name:"Mellow Mushroom",amenity:"restaurant"},name:"Mellow Mushroom",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mensa":{tags:{name:"Mensa",amenity:"restaurant"},name:"Mensa",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Milano":{tags:{name:"Milano",amenity:"restaurant"},name:"Milano",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mimi's Cafe":{tags:{name:"Mimi's Cafe",amenity:"restaurant"},name:"Mimi's Cafe",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Moe's Southwest Grill":{tags:{name:"Moe's Southwest Grill",amenity:"restaurant"},name:"Moe's Southwest Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mykonos":{tags:{name:"Mykonos",amenity:"restaurant"},name:"Mykonos",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mythos":{tags:{name:"Mythos",amenity:"restaurant"},name:"Mythos",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Nando's":{tags:{name:"Nando's",amenity:"restaurant"},name:"Nando's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Noodles & Company":{tags:{name:"Noodles & Company",amenity:"restaurant"},name:"Noodles & Company",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/O'Charley's":{tags:{name:"O'Charley's",amenity:"restaurant"},name:"O'Charley's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Oasis":{tags:{name:"Oasis",amenity:"restaurant"},name:"Oasis",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ocean Basket":{tags:{name:"Ocean Basket",amenity:"restaurant"},name:"Ocean Basket",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ochsen":{tags:{name:"Ochsen",amenity:"restaurant"},name:"Ochsen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Old Chicago":{tags:{name:"Old Chicago",amenity:"restaurant"},name:"Old Chicago",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Olive Garden":{tags:{name:"Olive Garden",amenity:"restaurant"},name:"Olive Garden",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Olympia":{tags:{name:"Olympia",amenity:"restaurant"},name:"Olympia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Osaka":{tags:{name:"Osaka",amenity:"restaurant"},name:"Osaka",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Outback Steakhouse":{tags:{name:"Outback Steakhouse",amenity:"restaurant"},name:"Outback Steakhouse",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/P.F. Chang's":{tags:{name:"P.F. Chang's",amenity:"restaurant"},name:"P.F. Chang's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pancake House":{tags:{name:"Pancake House",amenity:"restaurant"},name:"Pancake House",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Panda":{tags:{name:"Panda",amenity:"restaurant"},name:"Panda",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Panera Bread":{tags:{name:"Panera Bread",amenity:"restaurant"},name:"Panera Bread",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Panorama":{tags:{name:"Panorama",amenity:"restaurant"},name:"Panorama",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Parrilla":{tags:{name:"Parrilla",amenity:"restaurant"},name:"Parrilla",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Peking":{tags:{name:"Peking",amenity:"restaurant"},name:"Peking",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Perkins":{tags:{name:"Perkins",amenity:"restaurant"},name:"Perkins",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pinocchio":{tags:{name:"Pinocchio",amenity:"restaurant"},name:"Pinocchio",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizza Express":{tags:{name:"Pizza Express",amenity:"restaurant"},name:"Pizza Express",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizza Factory":{tags:{name:"Pizza Factory",amenity:"restaurant"},name:"Pizza Factory",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizza House":{tags:{name:"Pizza House",amenity:"restaurant"},name:"Pizza House",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizza Hut":{tags:{name:"Pizza Hut",cuisine:"pizza",amenity:"restaurant"},name:"Pizza Hut",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizza Ranch":{tags:{name:"Pizza Ranch",amenity:"restaurant"},name:"Pizza Ranch",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizzeria Italia":{tags:{name:"Pizzeria Italia",amenity:"restaurant"},name:"Pizzeria Italia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizzeria Milano":{tags:{name:"Pizzeria Milano",amenity:"restaurant"},name:"Pizzeria Milano",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizzeria Napoli":{tags:{name:"Pizzeria Napoli",amenity:"restaurant"},name:"Pizzeria Napoli",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizzeria Roma":{tags:{name:"Pizzeria Roma",amenity:"restaurant"},name:"Pizzeria Roma",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizzeria Venezia":{tags:{name:"Pizzeria Venezia",amenity:"restaurant"},name:"Pizzeria Venezia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Poivre Rouge":{tags:{name:"Poivre Rouge",amenity:"restaurant"},name:"Poivre Rouge",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pomodoro":{tags:{name:"Pomodoro",amenity:"restaurant"},name:"Pomodoro",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Portofino":{tags:{name:"Portofino",amenity:"restaurant"},name:"Portofino",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Poseidon":{tags:{name:"Poseidon",amenity:"restaurant"},name:"Poseidon",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Prezzo":{tags:{name:"Prezzo",amenity:"restaurant"},name:"Prezzo",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Qdoba Mexican Grill":{tags:{name:"Qdoba Mexican Grill",amenity:"restaurant"},name:"Qdoba Mexican Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ratskeller":{tags:{name:"Ratskeller",amenity:"restaurant"},name:"Ratskeller",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Red Lobster":{tags:{name:"Red Lobster",amenity:"restaurant"},name:"Red Lobster",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Red Robin":{tags:{name:"Red Robin",amenity:"restaurant"},name:"Red Robin",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Restaurante Universitário":{tags:{name:"Restaurante Universitário",amenity:"restaurant"},name:"Restaurante Universitário",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Rhodos":{tags:{name:"Rhodos",amenity:"restaurant"},name:"Rhodos",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ristorante Del Arte":{tags:{name:"Ristorante Del Arte",amenity:"restaurant"},name:"Ristorante Del Arte",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Roma":{tags:{name:"Roma",amenity:"restaurant"},name:"Roma",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Rose":{tags:{name:"Rose",amenity:"restaurant"},name:"Rose",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Round Table Pizza":{tags:{name:"Round Table Pizza",amenity:"restaurant"},name:"Round Table Pizza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ruby Tuesday":{tags:{name:"Ruby Tuesday",amenity:"restaurant"},name:"Ruby Tuesday",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Rössle":{tags:{name:"Rössle",amenity:"restaurant"},name:"Rössle",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Rössli":{tags:{name:"Rössli",amenity:"restaurant"},name:"Rössli",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Saigon":{tags:{name:"Saigon",amenity:"restaurant"},name:"Saigon",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sakura":{tags:{name:"Sakura",amenity:"restaurant"},name:"Sakura",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/San Marco":{tags:{name:"San Marco",amenity:"restaurant"},name:"San Marco",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Santorini":{tags:{name:"Santorini",amenity:"restaurant"},name:"Santorini",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Schwarzer Adler":{tags:{name:"Schwarzer Adler",amenity:"restaurant"},name:"Schwarzer Adler",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Schützenhaus":{tags:{name:"Schützenhaus",amenity:"restaurant"},name:"Schützenhaus",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Shakey's":{tags:{name:"Shakey's",amenity:"restaurant"},name:"Shakey's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Shalimar":{tags:{name:"Shalimar",amenity:"restaurant"},name:"Shalimar",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Shanghai":{tags:{name:"Shanghai",amenity:"restaurant"},name:"Shanghai",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Shari's":{tags:{name:"Shari's",amenity:"restaurant"},name:"Shari's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Shoney's":{tags:{name:"Shoney's",amenity:"restaurant"},name:"Shoney's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sizzler":{tags:{name:"Sizzler",amenity:"restaurant"},name:"Sizzler",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sonne":{tags:{name:"Sonne",amenity:"restaurant"},name:"Sonne",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sphinx":{tags:{name:"Sphinx",amenity:"restaurant"},name:"Sphinx",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sportheim":{tags:{name:"Sportheim",amenity:"restaurant"},name:"Sportheim",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Spur":{tags:{name:"Spur",amenity:"restaurant"},name:"Spur",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Steak 'n Shake":{tags:{name:"Steak 'n Shake",cuisine:"burger",amenity:"restaurant"},name:"Steak 'n Shake",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sternen":{tags:{name:"Sternen",amenity:"restaurant"},name:"Sternen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sunset Grill":{tags:{name:"Sunset Grill",amenity:"restaurant"},name:"Sunset Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sushi":{tags:{name:"Sushi",amenity:"restaurant"},name:"Sushi",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sushi Bar":{tags:{name:"Sushi Bar",amenity:"restaurant"},name:"Sushi Bar",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Swiss Chalet":{tags:{name:"Swiss Chalet",amenity:"restaurant"},name:"Swiss Chalet",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Syrtaki":{tags:{name:"Syrtaki",amenity:"restaurant"},name:"Syrtaki",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/TGI Friday's":{tags:{name:"TGI Friday's",amenity:"restaurant"},name:"TGI Friday's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Taj Mahal":{tags:{name:"Taj Mahal",amenity:"restaurant"},name:"Taj Mahal",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Taste of India":{tags:{name:"Taste of India",amenity:"restaurant"},name:"Taste of India",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Taverna":{tags:{name:"Taverna",amenity:"restaurant"},name:"Taverna",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Texas Roadhouse":{tags:{name:"Texas Roadhouse",amenity:"restaurant"},name:"Texas Roadhouse",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/The Cheesecake Factory":{tags:{name:"The Cheesecake Factory",amenity:"restaurant"},name:"The Cheesecake Factory",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Toby Carvery":{tags:{name:"Toby Carvery",amenity:"restaurant"},name:"Toby Carvery",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Tony Roma's":{tags:{name:"Tony Roma's",amenity:"restaurant"},name:"Tony Roma's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Toscana":{tags:{name:"Toscana",amenity:"restaurant"},name:"Toscana",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Trattoria":{tags:{name:"Trattoria",amenity:"restaurant"},name:"Trattoria",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Traube":{tags:{name:"Traube",amenity:"restaurant"},name:"Traube",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Vapiano":{tags:{name:"Vapiano",amenity:"restaurant"},name:"Vapiano",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Venezia":{tags:{name:"Venezia",amenity:"restaurant"},name:"Venezia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Village Inn":{tags:{name:"Village Inn",amenity:"restaurant"},name:"Village Inn",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Vips":{tags:{name:"Vips",amenity:"restaurant"},name:"Vips",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Waffle House":{tags:{name:"Waffle House",amenity:"restaurant"},name:"Waffle House",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Wagamama":{tags:{name:"Wagamama",amenity:"restaurant"},name:"Wagamama",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Waldschänke":{tags:{name:"Waldschänke",amenity:"restaurant"},name:"Waldschänke",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Warung":{tags:{name:"Warung",amenity:"restaurant"},name:"Warung",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Wasabi":{tags:{name:"Wasabi",amenity:"restaurant"},name:"Wasabi",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zizzi":{tags:{name:"Zizzi",amenity:"restaurant"},name:"Zizzi",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zorbas":{tags:{name:"Zorbas",amenity:"restaurant"},name:"Zorbas",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zum Hirschen":{tags:{name:"Zum Hirschen",amenity:"restaurant"},name:"Zum Hirschen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zum Löwen":{tags:{name:"Zum Löwen",amenity:"restaurant"},name:"Zum Löwen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zur Krone":{tags:{name:"Zur Krone",amenity:"restaurant"},name:"Zur Krone",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zur Linde":{tags:{name:"Zur Linde",amenity:"restaurant"},name:"Zur Linde",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zur Post":{tags:{name:"Zur Post",amenity:"restaurant"},name:"Zur Post",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zur Sonne":{tags:{name:"Zur Sonne",amenity:"restaurant"},name:"Zur Sonne",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Евразия":{tags:{name:"Евразия",amenity:"restaurant"},name:"Евразия",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ресторан":{tags:{name:"Ресторан",amenity:"restaurant"},name:"Ресторан",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Тануки":{tags:{name:"Тануки",amenity:"restaurant"},name:"Тануки",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Якитория":{tags:{name:"Якитория",amenity:"restaurant"},name:"Якитория",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/رستوران":{tags:{name:"رستوران",amenity:"restaurant"},name:"رستوران",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/مطعم":{tags:{name:"مطعم",amenity:"restaurant"},name:"مطعم",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/はま寿司":{tags:{name:"はま寿司",amenity:"restaurant"},name:"はま寿司",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/びっくりドンキー":{tags:{name:"びっくりドンキー",amenity:"restaurant"},name:"びっくりドンキー",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/やよい軒":{tags:{name:"やよい軒",amenity:"restaurant"},name:"やよい軒",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ガスト":{tags:{name:"ガスト","name:en":"Gusto",amenity:"restaurant"},name:"ガスト",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ココス":{tags:{name:"ココス",amenity:"restaurant"},name:"ココス",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/サイゼリア":{tags:{name:"サイゼリア",amenity:"restaurant"},name:"サイゼリア",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/サイゼリヤ":{tags:{name:"サイゼリヤ",amenity:"restaurant"},name:"サイゼリヤ",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ジョイフル":{tags:{name:"ジョイフル",amenity:"restaurant"},name:"ジョイフル",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ジョナサン":{tags:{name:"ジョナサン",amenity:"restaurant"},name:"ジョナサン",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ジョリーパスタ":{tags:{name:"ジョリーパスタ",amenity:"restaurant"},name:"ジョリーパスタ",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/デニーズ":{tags:{name:"デニーズ",amenity:"restaurant"},name:"デニーズ",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/バーミヤン":{tags:{name:"バーミヤン",amenity:"restaurant"},name:"バーミヤン",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ロイヤルホスト":{tags:{name:"ロイヤルホスト",amenity:"restaurant"},name:"ロイヤルホスト",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/丸亀製麺":{tags:{name:"丸亀製麺",amenity:"restaurant"},name:"丸亀製麺",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/八方雲集":{tags:{name:"八方雲集",amenity:"restaurant"},name:"八方雲集",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/夢庵":{tags:{name:"夢庵",amenity:"restaurant"},name:"夢庵",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/大戸屋":{tags:{name:"大戸屋",amenity:"restaurant"},name:"大戸屋",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/大阪王将":{tags:{name:"大阪王将",amenity:"restaurant"},name:"大阪王将",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/天下一品":{tags:{name:"天下一品",amenity:"restaurant"},name:"天下一品",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/安楽亭":{tags:{name:"安楽亭",amenity:"restaurant"},name:"安楽亭",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/牛角":{tags:{name:"牛角",amenity:"restaurant"},name:"牛角",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/食堂":{tags:{name:"食堂",amenity:"restaurant"},name:"食堂",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/餃子の王将":{tags:{name:"餃子の王将",amenity:"restaurant"},name:"餃子の王将",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/바다횟집 (Bada Fish Restaurant)":{tags:{name:"바다횟집 (Bada Fish Restaurant)",amenity:"restaurant"},name:"바다횟집 (Bada Fish Restaurant)",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/school/Adolfo Lopez Mateos":{tags:{name:"Adolfo Lopez Mateos",amenity:"school"},name:"Adolfo Lopez Mateos",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Agustin Ya�ez":{tags:{name:"Agustin Ya�ez",amenity:"school"},name:"Agustin Ya�ez",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Albert-Schweitzer-Schule":{tags:{name:"Albert-Schweitzer-Schule",amenity:"school"},name:"Albert-Schweitzer-Schule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Amado Nervo":{tags:{name:"Amado Nervo",amenity:"school"},name:"Amado Nervo",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Astrid-Lindgren-Schule":{tags:{name:"Astrid-Lindgren-Schule",amenity:"school"},name:"Astrid-Lindgren-Schule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Benito Juarez":{tags:{name:"Benito Juarez",amenity:"school"},name:"Benito Juarez",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Brown School":{tags:{name:"Brown School",amenity:"school"},name:"Brown School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/CEM":{tags:{name:"CEM",amenity:"school"},name:"CEM",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Center School":{tags:{name:"Center School",amenity:"school"},name:"Center School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Central Elementary School":{tags:{name:"Central Elementary School",amenity:"school"},name:"Central Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Central High School":{tags:{name:"Central High School",amenity:"school"},name:"Central High School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Central School":{tags:{name:"Central School",amenity:"school"},name:"Central School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Colegio San José":{tags:{name:"Colegio San José",amenity:"school"},name:"Colegio San José",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Collège Jean Moulin":{tags:{name:"Collège Jean Moulin",amenity:"school"},name:"Collège Jean Moulin",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Collège privé Saint-Joseph":{tags:{name:"Collège privé Saint-Joseph",amenity:"school"},name:"Collège privé Saint-Joseph",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Cuauhtemoc":{tags:{name:"Cuauhtemoc",amenity:"school"},name:"Cuauhtemoc",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Curso Comunitario":{tags:{name:"Curso Comunitario",amenity:"school"},name:"Curso Comunitario",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Cursos Comunitarios":{tags:{name:"Cursos Comunitarios",amenity:"school"},name:"Cursos Comunitarios",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/EPP":{tags:{name:"EPP",amenity:"school"},name:"EPP",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Emiliano Zapata":{tags:{name:"Emiliano Zapata",amenity:"school"},name:"Emiliano Zapata",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Fairview Elementary School":{tags:{name:"Fairview Elementary School",amenity:"school"},name:"Fairview Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Fairview School":{tags:{name:"Fairview School",amenity:"school"},name:"Fairview School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Francisco I Madero":{tags:{name:"Francisco I Madero",amenity:"school"},name:"Francisco I Madero",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Francisco I. Madero":{tags:{name:"Francisco I. Madero",amenity:"school"},name:"Francisco I. Madero",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Francisco Villa":{tags:{name:"Francisco Villa",amenity:"school"},name:"Francisco Villa",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Franklin Elementary School":{tags:{name:"Franklin Elementary School",amenity:"school"},name:"Franklin Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Franklin School":{tags:{name:"Franklin School",amenity:"school"},name:"Franklin School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Garfield Elementary School":{tags:{name:"Garfield Elementary School",amenity:"school"},name:"Garfield Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Garfield School":{tags:{name:"Garfield School",amenity:"school"},name:"Garfield School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Gimnazjum nr 1":{tags:{name:"Gimnazjum nr 1",amenity:"school"},name:"Gimnazjum nr 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Government School":{tags:{name:"Government School",amenity:"school"},name:"Government School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Gregorio Torres Quintero":{tags:{name:"Gregorio Torres Quintero",amenity:"school"},name:"Gregorio Torres Quintero",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Groupe Scolaire":{tags:{name:"Groupe Scolaire",amenity:"school"},name:"Groupe Scolaire",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Guadalupe Victoria":{tags:{name:"Guadalupe Victoria",amenity:"school"},name:"Guadalupe Victoria",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Highland School":{tags:{name:"Highland School",amenity:"school"},name:"Highland School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Hillcrest Elementary School":{tags:{name:"Hillcrest Elementary School",amenity:"school"},name:"Hillcrest Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Holy Cross School":{tags:{name:"Holy Cross School",amenity:"school"},name:"Holy Cross School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Holy Family School":{tags:{name:"Holy Family School",amenity:"school"},name:"Holy Family School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Holy Trinity School":{tags:{name:"Holy Trinity School",amenity:"school"},name:"Holy Trinity School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Ignacio Allende":{tags:{name:"Ignacio Allende",amenity:"school"},name:"Ignacio Allende",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Ignacio Zaragoza":{tags:{name:"Ignacio Zaragoza",amenity:"school"},name:"Ignacio Zaragoza",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Immaculate Conception School":{tags:{name:"Immaculate Conception School",amenity:"school"},name:"Immaculate Conception School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jackson Elementary School":{tags:{name:"Jackson Elementary School",amenity:"school"},name:"Jackson Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jackson School":{tags:{name:"Jackson School",amenity:"school"},name:"Jackson School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jefferson Elementary School":{tags:{name:"Jefferson Elementary School",amenity:"school"},name:"Jefferson Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jefferson School":{tags:{name:"Jefferson School",amenity:"school"},name:"Jefferson School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jose Clemente Orozco":{tags:{name:"Jose Clemente Orozco",amenity:"school"},name:"Jose Clemente Orozco",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jose Ma Morelos Y Pavon":{tags:{name:"Jose Ma Morelos Y Pavon",amenity:"school"},name:"Jose Ma Morelos Y Pavon",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jose Vasconcelos":{tags:{name:"Jose Vasconcelos",amenity:"school"},name:"Jose Vasconcelos",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Josefa Ortiz De Dominguez":{tags:{name:"Josefa Ortiz De Dominguez",amenity:"school"},name:"Josefa Ortiz De Dominguez",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Juan Escutia":{tags:{name:"Juan Escutia",amenity:"school"},name:"Juan Escutia",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Justo Sierra":{tags:{name:"Justo Sierra",amenity:"school"},name:"Justo Sierra",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Kumon":{tags:{name:"Kumon",amenity:"school"},name:"Kumon",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Lazaro Cardenas":{tags:{name:"Lazaro Cardenas",amenity:"school"},name:"Lazaro Cardenas",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Lazaro Cardenas Del Rio":{tags:{name:"Lazaro Cardenas Del Rio",amenity:"school"},name:"Lazaro Cardenas Del Rio",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Leona Vicario":{tags:{name:"Leona Vicario",amenity:"school"},name:"Leona Vicario",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Liberty Elementary School":{tags:{name:"Liberty Elementary School",amenity:"school"},name:"Liberty Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Liberty School":{tags:{name:"Liberty School",amenity:"school"},name:"Liberty School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Lincoln Elementary School":{tags:{name:"Lincoln Elementary School",amenity:"school"},name:"Lincoln Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Lincoln School":{tags:{name:"Lincoln School",amenity:"school"},name:"Lincoln School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Longfellow Elementary School":{tags:{name:"Longfellow Elementary School",amenity:"school"},name:"Longfellow Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Longfellow School":{tags:{name:"Longfellow School",amenity:"school"},name:"Longfellow School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Madison Elementary School":{tags:{name:"Madison Elementary School",amenity:"school"},name:"Madison Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Manuel Lopez Cotilla":{tags:{name:"Manuel Lopez Cotilla",amenity:"school"},name:"Manuel Lopez Cotilla",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Maple Grove School":{tags:{name:"Maple Grove School",amenity:"school"},name:"Maple Grove School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/McKinley Elementary School":{tags:{name:"McKinley Elementary School",amenity:"school"},name:"McKinley Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/McKinley School":{tags:{name:"McKinley School",amenity:"school"},name:"McKinley School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Miguel Hidalgo":{tags:{name:"Miguel Hidalgo",amenity:"school"},name:"Miguel Hidalgo",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Miguel Hidalgo Y Costilla":{tags:{name:"Miguel Hidalgo Y Costilla",amenity:"school"},name:"Miguel Hidalgo Y Costilla",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Miller School":{tags:{name:"Miller School",amenity:"school"},name:"Miller School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Mount Pleasant School":{tags:{name:"Mount Pleasant School",amenity:"school"},name:"Mount Pleasant School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Mount Zion School":{tags:{name:"Mount Zion School",amenity:"school"},name:"Mount Zion School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Mountain View Elementary School":{tags:{name:"Mountain View Elementary School",amenity:"school"},name:"Mountain View Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/New Hope School":{tags:{name:"New Hope School",amenity:"school"},name:"New Hope School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Nicolas Bravo":{tags:{name:"Nicolas Bravo",amenity:"school"},name:"Nicolas Bravo",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Ni�os Heroes":{tags:{name:"Ni�os Heroes",amenity:"school"},name:"Ni�os Heroes",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Nombre En Tramite":{tags:{name:"Nombre En Tramite",amenity:"school"},name:"Nombre En Tramite",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/North Elementary School":{tags:{name:"North Elementary School",amenity:"school"},name:"North Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Oak Grove School":{tags:{name:"Oak Grove School",amenity:"school"},name:"Oak Grove School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pedro Moreno":{tags:{name:"Pedro Moreno",amenity:"school"},name:"Pedro Moreno",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pestalozzischule":{tags:{name:"Pestalozzischule",amenity:"school"},name:"Pestalozzischule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pine Grove School":{tags:{name:"Pine Grove School",amenity:"school"},name:"Pine Grove School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pleasant Hill School":{tags:{name:"Pleasant Hill School",amenity:"school"},name:"Pleasant Hill School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pleasant Valley School":{tags:{name:"Pleasant Valley School",amenity:"school"},name:"Pleasant Valley School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pleasant View School":{tags:{name:"Pleasant View School",amenity:"school"},name:"Pleasant View School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Primaria Comunitaria":{tags:{name:"Primaria Comunitaria",amenity:"school"},name:"Primaria Comunitaria",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Ramon Corona":{tags:{name:"Ramon Corona",amenity:"school"},name:"Ramon Corona",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Ricardo Flores Magon":{tags:{name:"Ricardo Flores Magon",amenity:"school"},name:"Ricardo Flores Magon",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Riverside School":{tags:{name:"Riverside School",amenity:"school"},name:"Riverside School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Roosevelt Elementary School":{tags:{name:"Roosevelt Elementary School",amenity:"school"},name:"Roosevelt Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Roosevelt School":{tags:{name:"Roosevelt School",amenity:"school"},name:"Roosevelt School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/SD":{tags:{name:"SD",amenity:"school"},name:"SD",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/SDN":{tags:{name:"SDN",amenity:"school"},name:"SDN",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Sacred Heart School":{tags:{name:"Sacred Heart School",amenity:"school"},name:"Sacred Heart School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Francis School":{tags:{name:"Saint Francis School",amenity:"school"},name:"Saint Francis School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint James School":{tags:{name:"Saint James School",amenity:"school"},name:"Saint James School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Johns School":{tags:{name:"Saint Johns School",amenity:"school"},name:"Saint Johns School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Joseph School":{tags:{name:"Saint Joseph School",amenity:"school"},name:"Saint Joseph School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Josephs School":{tags:{name:"Saint Josephs School",amenity:"school"},name:"Saint Josephs School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Kizito Primary School":{tags:{name:"Saint Kizito Primary School",amenity:"school"},name:"Saint Kizito Primary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Mary School":{tags:{name:"Saint Mary School",amenity:"school"},name:"Saint Mary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Marys School":{tags:{name:"Saint Marys School",amenity:"school"},name:"Saint Marys School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Patricks School":{tags:{name:"Saint Patricks School",amenity:"school"},name:"Saint Patricks School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Paul School":{tags:{name:"Saint Paul School",amenity:"school"},name:"Saint Paul School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Pauls School":{tags:{name:"Saint Pauls School",amenity:"school"},name:"Saint Pauls School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Peters School":{tags:{name:"Saint Peters School",amenity:"school"},name:"Saint Peters School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Schillerschule":{tags:{name:"Schillerschule",amenity:"school"},name:"Schillerschule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/School Number 1":{tags:{name:"School Number 1",amenity:"school"},name:"School Number 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/School Number 2":{tags:{name:"School Number 2",amenity:"school"},name:"School Number 2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/School Number 3":{tags:{name:"School Number 3",amenity:"school"},name:"School Number 3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/School Number 4":{tags:{name:"School Number 4",amenity:"school"},name:"School Number 4",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Smith School":{tags:{name:"Smith School",amenity:"school"},name:"Smith School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/South Elementary School":{tags:{name:"South Elementary School",amenity:"school"},name:"South Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Sunnyside School":{tags:{name:"Sunnyside School",amenity:"school"},name:"Sunnyside School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Szkoła Podstawowa nr 1":{tags:{name:"Szkoła Podstawowa nr 1",amenity:"school"},name:"Szkoła Podstawowa nr 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Szkoła Podstawowa nr 2":{tags:{name:"Szkoła Podstawowa nr 2",amenity:"school"},name:"Szkoła Podstawowa nr 2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Szkoła Podstawowa nr 3":{tags:{name:"Szkoła Podstawowa nr 3",amenity:"school"},name:"Szkoła Podstawowa nr 3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Trinity School":{tags:{name:"Trinity School",amenity:"school"},name:"Trinity School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/UNIDAD EDUCATIVA":{tags:{name:"UNIDAD EDUCATIVA",amenity:"school"},name:"UNIDAD EDUCATIVA",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Union School":{tags:{name:"Union School",amenity:"school"},name:"Union School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Valentin Gomez Farias":{tags:{name:"Valentin Gomez Farias",amenity:"school"},name:"Valentin Gomez Farias",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Venustiano Carranza":{tags:{name:"Venustiano Carranza",amenity:"school"},name:"Venustiano Carranza",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Vicente Guerrero":{tags:{name:"Vicente Guerrero",amenity:"school"},name:"Vicente Guerrero",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Volkshochschule":{tags:{name:"Volkshochschule",amenity:"school"},name:"Volkshochschule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Volksschule":{tags:{name:"Volksschule",amenity:"school"},name:"Volksschule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Washington Elementary School":{tags:{name:"Washington Elementary School",amenity:"school"},name:"Washington Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Washington School":{tags:{name:"Washington School",amenity:"school"},name:"Washington School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/West Elementary School":{tags:{name:"West Elementary School",amenity:"school"},name:"West Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/White School":{tags:{name:"White School",amenity:"school"},name:"White School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Wilson Elementary School":{tags:{name:"Wilson Elementary School",amenity:"school"},name:"Wilson Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Wilson School":{tags:{name:"Wilson School",amenity:"school"},name:"Wilson School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Általános iskola":{tags:{name:"Általános iskola",amenity:"school"},name:"Általános iskola",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École Jules Ferry":{tags:{name:"École Jules Ferry",amenity:"school"},name:"École Jules Ferry",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École Notre-Dame":{tags:{name:"École Notre-Dame",amenity:"school"},name:"École Notre-Dame",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École Saint-Joseph":{tags:{name:"École Saint-Joseph",amenity:"school"},name:"École Saint-Joseph",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École primaire Jean Jaurès":{tags:{name:"École primaire Jean Jaurès",amenity:"school"},name:"École primaire Jean Jaurès",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École primaire Jules Ferry":{tags:{name:"École primaire Jules Ferry",amenity:"school"},name:"École primaire Jules Ferry",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École primaire privée Notre-Dame":{tags:{name:"École primaire privée Notre-Dame",amenity:"school"},name:"École primaire privée Notre-Dame",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École primaire privée Saint-Joseph":{tags:{name:"École primaire privée Saint-Joseph",amenity:"school"},name:"École primaire privée Saint-Joseph",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École primaire privée Sainte-Marie":{tags:{name:"École primaire privée Sainte-Marie",amenity:"school"},name:"École primaire privée Sainte-Marie",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École élémentaire Jules Ferry":{tags:{name:"École élémentaire Jules Ferry",amenity:"school"},name:"École élémentaire Jules Ferry",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Școala Generală":{tags:{name:"Școala Generală",amenity:"school"},name:"Școala Generală",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Școală":{tags:{name:"Școală",amenity:"school"},name:"Școală",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Вечерняя школа":{tags:{name:"Вечерняя школа",amenity:"school"},name:"Вечерняя школа",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Гимназия №1":{tags:{name:"Гимназия №1",amenity:"school"},name:"Гимназия №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Средняя школа №1":{tags:{name:"Средняя школа №1",amenity:"school"},name:"Средняя школа №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Средняя школа №2":{tags:{name:"Средняя школа №2",amenity:"school"},name:"Средняя школа №2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Средняя школа №3":{tags:{name:"Средняя школа №3",amenity:"school"},name:"Средняя школа №3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 1":{tags:{name:"Школа № 1",amenity:"school"},name:"Школа № 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 2":{tags:{name:"Школа № 2",amenity:"school"},name:"Школа № 2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 3":{tags:{name:"Школа № 3",amenity:"school"},name:"Школа № 3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 4":{tags:{name:"Школа № 4",amenity:"school"},name:"Школа № 4",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 5":{tags:{name:"Школа № 5",amenity:"school"},name:"Школа № 5",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №1":{tags:{name:"Школа №1",amenity:"school"},name:"Школа №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №10":{tags:{name:"Школа №10",amenity:"school"},name:"Школа №10",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №11":{tags:{name:"Школа №11",amenity:"school"},name:"Школа №11",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №12":{tags:{name:"Школа №12",amenity:"school"},name:"Школа №12",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №13":{tags:{name:"Школа №13",amenity:"school"},name:"Школа №13",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №14":{tags:{name:"Школа №14",amenity:"school"},name:"Школа №14",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №15":{tags:{name:"Школа №15",amenity:"school"},name:"Школа №15",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №16":{tags:{name:"Школа №16",amenity:"school"},name:"Школа №16",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №17":{tags:{name:"Школа №17",amenity:"school"},name:"Школа №17",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №18":{tags:{name:"Школа №18",amenity:"school"},name:"Школа №18",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №19":{tags:{name:"Школа №19",amenity:"school"},name:"Школа №19",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №2":{tags:{name:"Школа №2",amenity:"school"},name:"Школа №2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №20":{tags:{name:"Школа №20",amenity:"school"},name:"Школа №20",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №21":{tags:{name:"Школа №21",amenity:"school"},name:"Школа №21",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №22":{tags:{name:"Школа №22",amenity:"school"},name:"Школа №22",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №23":{tags:{name:"Школа №23",amenity:"school"},name:"Школа №23",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №24":{tags:{name:"Школа №24",amenity:"school"},name:"Школа №24",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №25":{tags:{name:"Школа №25",amenity:"school"},name:"Школа №25",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №26":{tags:{name:"Школа №26",amenity:"school"},name:"Школа №26",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №27":{tags:{name:"Школа №27",amenity:"school"},name:"Школа №27",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №28":{tags:{name:"Школа №28",amenity:"school"},name:"Школа №28",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №3":{tags:{name:"Школа №3",amenity:"school"},name:"Школа №3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №31":{tags:{name:"Школа №31",amenity:"school"},name:"Школа №31",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №35":{tags:{name:"Школа №35",amenity:"school"},name:"Школа №35",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №4":{tags:{name:"Школа №4",amenity:"school"},name:"Школа №4",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №5":{tags:{name:"Школа №5",amenity:"school"},name:"Школа №5",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №6":{tags:{name:"Школа №6",amenity:"school"},name:"Школа №6",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №7":{tags:{name:"Школа №7",amenity:"school"},name:"Школа №7",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №8":{tags:{name:"Школа №8",amenity:"school"},name:"Школа №8",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №9":{tags:{name:"Школа №9",amenity:"school"},name:"Школа №9",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/مدرسة":{tags:{name:"مدرسة",amenity:"school"},name:"مدرسة",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/مدرسه":{tags:{name:"مدرسه",amenity:"school"},name:"مدرسه",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/市立南中学校":{tags:{name:"市立南中学校",amenity:"school"},name:"市立南中学校",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/市立南小学校":{tags:{name:"市立南小学校",amenity:"school"},name:"市立南小学校",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/市立東中学校":{tags:{name:"市立東中学校",amenity:"school"},name:"市立東中学校",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/social_facility/Safe Haven":{tags:{name:"Safe Haven",amenity:"social_facility"},name:"Safe Haven",icon:"temaki-social_facility",geometry:["point","area"],fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],suggestion:true},"amenity/social_facility/Детский дом":{tags:{name:"Детский дом",amenity:"social_facility"},name:"Детский дом",icon:"temaki-social_facility",geometry:["point","area"],fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],suggestion:true},"amenity/social_facility/Социальный участковый":{tags:{name:"Социальный участковый",amenity:"social_facility"},name:"Социальный участковый",icon:"temaki-social_facility",geometry:["point","area"],fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],suggestion:true},"amenity/theatre/Amfiteatr":{tags:{name:"Amfiteatr",amenity:"theatre"},name:"Amfiteatr",icon:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"amenity/theatre/Amphitheater":{tags:{name:"Amphitheater",amenity:"theatre"},name:"Amphitheater",icon:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"amenity/theatre/Amphitheatre":{tags:{name:"Amphitheatre",amenity:"theatre"},name:"Amphitheatre",icon:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"amenity/theatre/Freilichtbühne":{tags:{name:"Freilichtbühne",amenity:"theatre"},name:"Freilichtbühne",icon:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"amenity/theatre/Teatro Comunale":{tags:{name:"Teatro Comunale",amenity:"theatre"},name:"Teatro Comunale",icon:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"leisure/fitness_centre/LA Fitness":{tags:{name:"LA Fitness",leisure:"fitness_centre"},name:"LA Fitness",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","address","building_area","opening_hours"],suggestion:true},"leisure/fitness_centre/Planet Fitness":{tags:{name:"Planet Fitness",leisure:"fitness_centre"},name:"Planet Fitness",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","address","building_area","opening_hours"],suggestion:true},"leisure/fitness_centre/Snap Fitness":{tags:{name:"Snap Fitness",leisure:"fitness_centre"},name:"Snap Fitness",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","address","building_area","opening_hours"],suggestion:true},"leisure/playground/Çocuk Parkı":{tags:{name:"Çocuk Parkı",leisure:"playground"},name:"Çocuk Parkı",icon:"maki-playground",geometry:["point","area"],fields:["name","operator","surface","playground/max_age","playground/min_age","access_simple"],suggestion:true},"leisure/playground/놀이터":{tags:{name:"놀이터",leisure:"playground"},name:"놀이터",icon:"maki-playground",geometry:["point","area"],fields:["name","operator","surface","playground/max_age","playground/min_age","access_simple"],suggestion:true},"leisure/sports_centre/Anytime Fitness":{tags:{name:"Anytime Fitness",leisure:"sports_centre"},name:"Anytime Fitness",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Complejo Municipal de Deportes":{tags:{name:"Complejo Municipal de Deportes",leisure:"sports_centre"},name:"Complejo Municipal de Deportes",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Complexe Sportif":{tags:{name:"Complexe Sportif",leisure:"sports_centre"},name:"Complexe Sportif",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Curves":{tags:{name:"Curves",leisure:"sports_centre"},name:"Curves",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Fitness First":{tags:{name:"Fitness First",leisure:"sports_centre"},name:"Fitness First",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Gold's Gym":{tags:{name:"Gold's Gym",leisure:"sports_centre"},name:"Gold's Gym",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Kieser Training":{tags:{name:"Kieser Training",leisure:"sports_centre"},name:"Kieser Training",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Life Time Fitness":{tags:{name:"Life Time Fitness",leisure:"sports_centre"},name:"Life Time Fitness",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/McFit":{tags:{name:"McFit",leisure:"sports_centre"},name:"McFit",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Mrs. Sporty":{tags:{name:"Mrs. Sporty",leisure:"sports_centre"},name:"Mrs. Sporty",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Orlik":{tags:{name:"Orlik",leisure:"sports_centre"},name:"Orlik",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Pabellón Municipal de Deportes":{tags:{name:"Pabellón Municipal de Deportes",leisure:"sports_centre"},name:"Pabellón Municipal de Deportes",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Palestra Comunale":{tags:{name:"Palestra Comunale",leisure:"sports_centre"},name:"Palestra Comunale",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Salle Omnisport":{tags:{name:"Salle Omnisport",leisure:"sports_centre"},name:"Salle Omnisport",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Virgin Active":{tags:{name:"Virgin Active",leisure:"sports_centre"},name:"Virgin Active",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/YMCA":{tags:{name:"YMCA",leisure:"sports_centre"},name:"YMCA",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/ДЮСШ":{tags:{name:"ДЮСШ",leisure:"sports_centre"},name:"ДЮСШ",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Ледовый дворец":{tags:{name:"Ледовый дворец",leisure:"sports_centre"},name:"Ледовый дворец",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/体育館":{tags:{name:"体育館",leisure:"sports_centre"},name:"体育館",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/swimming_pool/Schwimmerbecken":{tags:{name:"Schwimmerbecken",leisure:"swimming_pool"},name:"Schwimmerbecken",icon:"maki-swimming",geometry:["point","area"],fields:["name","access_simple","operator","address"],suggestion:true},"leisure/swimming_pool/Yüzme Havuzu":{tags:{name:"Yüzme Havuzu",leisure:"swimming_pool"},name:"Yüzme Havuzu",icon:"maki-swimming",geometry:["point","area"],fields:["name","access_simple","operator","address"],suggestion:true},"leisure/swimming_pool/プール":{tags:{name:"プール",leisure:"swimming_pool"},name:"プール",icon:"maki-swimming",geometry:["point","area"],fields:["name","access_simple","operator","address"],suggestion:true},"leisure/swimming_pool/游泳池":{tags:{name:"游泳池",leisure:"swimming_pool"},name:"游泳池",icon:"maki-swimming",geometry:["point","area"],fields:["name","access_simple","operator","address"],suggestion:true},"man_made/windmill/De Hoop":{tags:{name:"De Hoop",man_made:"windmill"},name:"De Hoop",icon:"temaki-windmill",geometry:["point","area"],fields:["building_area"],suggestion:true},"shop/alcohol/Alko":{tags:{name:"Alko",shop:"alcohol"},name:"Alko",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/BC Liquor Store":{tags:{name:"BC Liquor Store",shop:"alcohol"},name:"BC Liquor Store",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/BWS":{tags:{name:"BWS",shop:"alcohol"},name:"BWS",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Bargain Booze":{tags:{name:"Bargain Booze",shop:"alcohol"},name:"Bargain Booze",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Beer Store":{tags:{name:"Beer Store",shop:"alcohol"},name:"Beer Store",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Botilleria":{tags:{name:"Botilleria",shop:"alcohol"},name:"Botilleria",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Dan Murphy's":{tags:{name:"Dan Murphy's",shop:"alcohol"},name:"Dan Murphy's",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Gall & Gall":{tags:{name:"Gall & Gall",shop:"alcohol"},name:"Gall & Gall",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/LCBO":{tags:{name:"LCBO",shop:"alcohol"},name:"LCBO",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Liquor Depot":{tags:{name:"Liquor Depot",shop:"alcohol"},name:"Liquor Depot",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Liquor Store":{tags:{name:"Liquor Store",shop:"alcohol"},name:"Liquor Store",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Liquorland":{tags:{name:"Liquorland",shop:"alcohol"},name:"Liquorland",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Mitra":{tags:{name:"Mitra",shop:"alcohol"},name:"Mitra",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Nicolas":{tags:{name:"Nicolas",shop:"alcohol"},name:"Nicolas",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/SAQ":{tags:{name:"SAQ",shop:"alcohol"},name:"SAQ",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Systembolaget":{tags:{name:"Systembolaget",shop:"alcohol"},name:"Systembolaget",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/The Beer Store":{tags:{name:"The Beer Store",shop:"alcohol"},name:"The Beer Store",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Vinmonopolet":{tags:{name:"Vinmonopolet",shop:"alcohol"},name:"Vinmonopolet",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Алкомаркет":{tags:{name:"Алкомаркет",shop:"alcohol"},name:"Алкомаркет",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Ароматный мир":{tags:{name:"Ароматный мир",shop:"alcohol"},name:"Ароматный мир",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Бристоль":{tags:{name:"Бристоль",shop:"alcohol"},name:"Бристоль",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Градус":{tags:{name:"Градус",shop:"alcohol"},name:"Градус",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Живое пиво":{tags:{name:"Живое пиво",shop:"alcohol"},name:"Живое пиво",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Красное & Белое":{tags:{name:"Красное & Белое",shop:"alcohol"},name:"Красное & Белое",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Норман":{tags:{name:"Норман",shop:"alcohol"},name:"Норман",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Отдохни":{tags:{name:"Отдохни",shop:"alcohol"},name:"Отдохни",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Пиво":{tags:{name:"Пиво",shop:"alcohol"},name:"Пиво",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Разливное пиво":{tags:{name:"Разливное пиво",shop:"alcohol"},name:"Разливное пиво",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/baby_goods/Aubert":{tags:{name:"Aubert",shop:"baby_goods"},name:"Aubert",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/baby_goods/Babies R Us":{tags:{name:"Babies R Us",shop:"baby_goods"},name:"Babies R Us",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/baby_goods/BabyOne":{tags:{name:"BabyOne",shop:"baby_goods"},name:"BabyOne",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/AILI":{tags:{name:"AILI",shop:"bakery"},name:"AILI",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Anker":{tags:{name:"Anker",shop:"bakery"},name:"Anker",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Awiteks":{tags:{name:"Awiteks",shop:"bakery"},name:"Awiteks",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Backshop":{tags:{name:"Backshop",shop:"bakery"},name:"Backshop",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Backwerk":{tags:{name:"Backwerk",shop:"bakery"},name:"Backwerk",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Baguette":{tags:{name:"Baguette",shop:"bakery"},name:"Baguette",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bakers Delight":{tags:{name:"Bakers Delight",shop:"bakery"},name:"Bakers Delight",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bakker Bart":{tags:{name:"Bakker Bart",shop:"bakery"},name:"Bakker Bart",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Banette":{tags:{name:"Banette",shop:"bakery"},name:"Banette",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bäckerei Fuchs":{tags:{name:"Bäckerei Fuchs",shop:"bakery"},name:"Bäckerei Fuchs",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bäckerei Grimminger":{tags:{name:"Bäckerei Grimminger",shop:"bakery"},name:"Bäckerei Grimminger",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bäckerei Müller":{tags:{name:"Bäckerei Müller",shop:"bakery"},name:"Bäckerei Müller",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bäckerei Schmidt":{tags:{name:"Bäckerei Schmidt",shop:"bakery"},name:"Bäckerei Schmidt",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bäckerei Schneider":{tags:{name:"Bäckerei Schneider",shop:"bakery"},name:"Bäckerei Schneider",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Cooplands":{tags:{name:"Cooplands",shop:"bakery"},name:"Cooplands",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Dat Backhus":{tags:{name:"Dat Backhus",shop:"bakery"},name:"Dat Backhus",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Der Beck":{tags:{name:"Der Beck",shop:"bakery"},name:"Der Beck",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Der Mann":{tags:{name:"Der Mann",shop:"bakery"},name:"Der Mann",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Ditsch":{tags:{name:"Ditsch",shop:"bakery"},name:"Ditsch",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Fornetti":{tags:{name:"Fornetti",shop:"bakery"},name:"Fornetti",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Goeken backen":{tags:{name:"Goeken backen",shop:"bakery"},name:"Goeken backen",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Goldilocks":{tags:{name:"Goldilocks",shop:"bakery"},name:"Goldilocks",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Greggs":{tags:{name:"Greggs",shop:"bakery"},name:"Greggs",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Hofpfisterei":{tags:{name:"Hofpfisterei",shop:"bakery"},name:"Hofpfisterei",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Ihle":{tags:{name:"Ihle",shop:"bakery"},name:"Ihle",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Julie's Bakeshop":{tags:{name:"Julie's Bakeshop",shop:"bakery"},name:"Julie's Bakeshop",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/K&U":{tags:{name:"K&U",shop:"bakery"},name:"K&U",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/K&U Bäckerei":{tags:{name:"K&U Bäckerei",shop:"bakery"},name:"K&U Bäckerei",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Kamps":{tags:{name:"Kamps",shop:"bakery"},name:"Kamps",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/La Mie Câline":{tags:{name:"La Mie Câline",shop:"bakery"},name:"La Mie Câline",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Le Crobag":{tags:{name:"Le Crobag",shop:"bakery"},name:"Le Crobag",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Le Fournil":{tags:{name:"Le Fournil",shop:"bakery"},name:"Le Fournil",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Lila Bäcker":{tags:{name:"Lila Bäcker",shop:"bakery"},name:"Lila Bäcker",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Lipóti Pékség":{tags:{name:"Lipóti Pékség",shop:"bakery"},name:"Lipóti Pékség",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Marie Blachère":{tags:{name:"Marie Blachère",shop:"bakery"},name:"Marie Blachère",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Mlinar":{tags:{name:"Mlinar",shop:"bakery"},name:"Mlinar",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Musmanni":{tags:{name:"Musmanni",shop:"bakery"},name:"Musmanni",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Oebel":{tags:{name:"Oebel",shop:"bakery"},name:"Oebel",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Paul":{tags:{name:"Paul",shop:"bakery"},name:"Paul",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Red Ribbon":{tags:{name:"Red Ribbon",shop:"bakery"},name:"Red Ribbon",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Schäfer's":{tags:{name:"Schäfer's",shop:"bakery"},name:"Schäfer's",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Sehne":{tags:{name:"Sehne",shop:"bakery"},name:"Sehne",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Stadtbäckerei":{tags:{name:"Stadtbäckerei",shop:"bakery"},name:"Stadtbäckerei",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Steinecke":{tags:{name:"Steinecke",shop:"bakery"},name:"Steinecke",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Sternenbäck":{tags:{name:"Sternenbäck",shop:"bakery"},name:"Sternenbäck",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Ströck":{tags:{name:"Ströck",shop:"bakery"},name:"Ströck",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Wiener Feinbäcker":{tags:{name:"Wiener Feinbäcker",shop:"bakery"},name:"Wiener Feinbäcker",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/von Allwörden":{tags:{name:"von Allwörden",shop:"bakery"},name:"von Allwörden",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Булочная":{tags:{name:"Булочная",shop:"bakery"},name:"Булочная",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Горячий хлеб":{tags:{name:"Горячий хлеб",shop:"bakery"},name:"Горячий хлеб",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Каравай":{tags:{name:"Каравай",shop:"bakery"},name:"Каравай",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Кулиничи":{tags:{name:"Кулиничи",shop:"bakery"},name:"Кулиничи",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Кулиничі":{tags:{name:"Кулиничі",shop:"bakery"},name:"Кулиничі",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Свежий хлеб":{tags:{name:"Свежий хлеб",shop:"bakery"},name:"Свежий хлеб",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Хлеб":{tags:{name:"Хлеб",shop:"bakery"},name:"Хлеб",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/مخبز":{tags:{name:"مخبز",shop:"bakery"},name:"مخبز",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/مخبزة":{tags:{name:"مخبزة",shop:"bakery"},name:"مخبزة",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نان لواش":{tags:{name:"نان لواش",shop:"bakery"},name:"نان لواش",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی":{tags:{name:"نانوایی",shop:"bakery"},name:"نانوایی",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی بربری":{tags:{name:"نانوایی بربری",shop:"bakery"},name:"نانوایی بربری",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی سنگک":{tags:{name:"نانوایی سنگک",shop:"bakery"},name:"نانوایی سنگک",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی سنگکی":{tags:{name:"نانوایی سنگکی",shop:"bakery"},name:"نانوایی سنگکی",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی لواش":{tags:{name:"نانوایی لواش",shop:"bakery"},name:"نانوایی لواش",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beauty/Sally Beauty Supply":{tags:{name:"Sally Beauty Supply",shop:"beauty"},name:"Sally Beauty Supply",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],suggestion:true},"shop/beauty/Yves Rocher":{tags:{name:"Yves Rocher",shop:"beauty"},name:"Yves Rocher",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],suggestion:true},"shop/bed/Matratzen Concord":{tags:{name:"Matratzen Concord",shop:"bed"},name:"Matratzen Concord",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bed/Mattress Firm":{tags:{name:"Mattress Firm",shop:"bed"},name:"Mattress Firm",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bed/Sleepy's":{tags:{name:"Sleepy's",shop:"bed"},name:"Sleepy's",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/50嵐":{tags:{name:"50嵐",shop:"beverages"},name:"50嵐",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Dursty":{tags:{name:"Dursty",shop:"beverages"},name:"Dursty",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Edeka Getränkemarkt":{tags:{name:"Edeka Getränkemarkt",shop:"beverages"},name:"Edeka Getränkemarkt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Fristo":{tags:{name:"Fristo",shop:"beverages"},name:"Fristo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Getränke Hoffmann":{tags:{name:"Getränke Hoffmann",shop:"beverages"},name:"Getränke Hoffmann",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Getränkeland":{tags:{name:"Getränkeland",shop:"beverages"},name:"Getränkeland",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Getränkemarkt":{tags:{name:"Getränkemarkt",shop:"beverages"},name:"Getränkemarkt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Orterer Getränkemarkt":{tags:{name:"Orterer Getränkemarkt",shop:"beverages"},name:"Orterer Getränkemarkt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Rewe Getränkemarkt":{tags:{name:"Rewe Getränkemarkt",shop:"beverages"},name:"Rewe Getränkemarkt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Trinkgut":{tags:{name:"Trinkgut",shop:"beverages"},name:"Trinkgut",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/茶湯會":{tags:{name:"茶湯會",shop:"beverages"},name:"茶湯會",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bicycle/Halfords":{tags:{name:"Halfords",shop:"bicycle"},name:"Halfords",icon:"maki-bicycle",geometry:["point","area"],fields:["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],suggestion:true},"shop/bicycle/Веломарка":{tags:{name:"Веломарка",shop:"bicycle"},name:"Веломарка",icon:"maki-bicycle",geometry:["point","area"],fields:["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],suggestion:true},"shop/bicycle/サイクルベースあさひ":{tags:{name:"サイクルベースあさひ",shop:"bicycle"},name:"サイクルベースあさひ",icon:"maki-bicycle",geometry:["point","area"],fields:["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/Betfred":{tags:{name:"Betfred",shop:"bookmaker"},name:"Betfred",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/Coral":{tags:{name:"Coral",shop:"bookmaker"},name:"Coral",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/Ladbrokes":{tags:{name:"Ladbrokes",shop:"bookmaker"},name:"Ladbrokes",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/Paddy Power":{tags:{name:"Paddy Power",shop:"bookmaker"},name:"Paddy Power",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/William Hill":{tags:{name:"William Hill",shop:"bookmaker"},name:"William Hill",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/ΟΠΑΠ":{tags:{name:"ΟΠΑΠ",shop:"bookmaker"},name:"ΟΠΑΠ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Boucherie Charcuterie":{tags:{name:"Boucherie Charcuterie",shop:"butcher"},name:"Boucherie Charcuterie",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Carnicería":{tags:{name:"Carnicería",shop:"butcher"},name:"Carnicería",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Fleischerei Richter":{tags:{name:"Fleischerei Richter",shop:"butcher"},name:"Fleischerei Richter",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Húsbolt":{tags:{name:"Húsbolt",shop:"butcher"},name:"Húsbolt",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Macelleria":{tags:{name:"Macelleria",shop:"butcher"},name:"Macelleria",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Vinzenzmurr":{tags:{name:"Vinzenzmurr",shop:"butcher"},name:"Vinzenzmurr",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Ариант":{tags:{name:"Ариант",shop:"butcher"},name:"Ариант",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Великолукский мясокомбинат":{tags:{name:"Великолукский мясокомбинат",shop:"butcher"},name:"Великолукский мясокомбинат",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясная лавка":{tags:{name:"Мясная лавка",shop:"butcher"},name:"Мясная лавка",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясницкий ряд":{tags:{name:"Мясницкий ряд",shop:"butcher"},name:"Мясницкий ряд",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясной":{tags:{name:"Мясной",shop:"butcher"},name:"Мясной",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясо":{tags:{name:"Мясо",shop:"butcher"},name:"Мясо",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Наша Ряба":{tags:{name:"Наша Ряба",shop:"butcher"},name:"Наша Ряба",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Свежее мясо":{tags:{name:"Свежее мясо",shop:"butcher"},name:"Свежее мясо",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car/Audi":{tags:{name:"Audi",shop:"car"},name:"Audi",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/BMW":{tags:{name:"BMW",shop:"car"},name:"BMW",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Chevrolet":{tags:{name:"Chevrolet",shop:"car"},name:"Chevrolet",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Citroën":{tags:{name:"Citroën",shop:"car"},name:"Citroën",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Dacia":{tags:{name:"Dacia",shop:"car"},name:"Dacia",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Fiat":{tags:{name:"Fiat",shop:"car"},name:"Fiat",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Ford":{tags:{name:"Ford",shop:"car"},name:"Ford",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Honda":{tags:{name:"Honda",shop:"car"},name:"Honda",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Hyundai":{tags:{name:"Hyundai",shop:"car"},name:"Hyundai",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Isuzu":{tags:{name:"Isuzu",shop:"car"},name:"Isuzu",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Kia":{tags:{name:"Kia",shop:"car"},name:"Kia",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Land Rover":{tags:{name:"Land Rover",shop:"car"},name:"Land Rover",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Lexus":{tags:{name:"Lexus",shop:"car"},name:"Lexus",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mazda":{tags:{name:"Mazda",shop:"car"},name:"Mazda",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mercedes-Benz":{tags:{name:"Mercedes-Benz",shop:"car"},name:"Mercedes-Benz",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mitsubishi":{tags:{name:"Mitsubishi",shop:"car"},name:"Mitsubishi",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mitsubishi Motors":{tags:{name:"Mitsubishi Motors",shop:"car"},name:"Mitsubishi Motors",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/NISSAN":{tags:{name:"NISSAN",shop:"car"},name:"NISSAN",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Nissan":{tags:{name:"Nissan",shop:"car"},name:"Nissan",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Opel":{tags:{name:"Opel",shop:"car"},name:"Opel",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Peugeot":{tags:{name:"Peugeot",shop:"car"},name:"Peugeot",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Porsche":{tags:{name:"Porsche",shop:"car"},name:"Porsche",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Renault":{tags:{name:"Renault",shop:"car"},name:"Renault",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Seat":{tags:{name:"Seat",shop:"car"},name:"Seat",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Skoda":{tags:{name:"Skoda",shop:"car"},name:"Skoda",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Subaru":{tags:{name:"Subaru",shop:"car"},name:"Subaru",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Suzuki":{tags:{name:"Suzuki",shop:"car"},name:"Suzuki",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Toyota":{tags:{name:"Toyota",shop:"car"},name:"Toyota",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Volkswagen":{tags:{name:"Volkswagen",shop:"car"},name:"Volkswagen",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Volvo":{tags:{name:"Volvo",shop:"car"},name:"Volvo",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Advance Auto Parts":{tags:{name:"Advance Auto Parts",shop:"car_parts"},name:"Advance Auto Parts",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/AutoZone":{tags:{name:"AutoZone",shop:"car_parts"},name:"AutoZone",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Brezan":{tags:{name:"Brezan",shop:"car_parts"},name:"Brezan",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/NAPA Auto Parts":{tags:{name:"NAPA Auto Parts",shop:"car_parts"},name:"NAPA Auto Parts",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Napa Auto Parts":{tags:{name:"Napa Auto Parts",shop:"car_parts"},name:"Napa Auto Parts",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/O'Reilly Auto Parts":{tags:{name:"O'Reilly Auto Parts",shop:"car_parts"},name:"O'Reilly Auto Parts",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Repco":{tags:{name:"Repco",shop:"car_parts"},name:"Repco",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Tokić":{tags:{name:"Tokić",shop:"car_parts"},name:"Tokić",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/repuestos automotrices":{tags:{name:"repuestos automotrices",shop:"car_parts"},name:"repuestos automotrices",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Автозапчастини":{tags:{name:"Автозапчастини",shop:"car_parts"},name:"Автозапчастини",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Автомир":{tags:{name:"Автомир",shop:"car_parts"},name:"Автомир",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/イエローハット":{tags:{name:"イエローハット",shop:"car_parts"},name:"イエローハット",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/オートバックス":{tags:{name:"オートバックス",shop:"car_parts"},name:"オートバックス",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/タイヤ館":{tags:{name:"タイヤ館",shop:"car_parts"},name:"タイヤ館",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/A.T.U":{tags:{name:"A.T.U",shop:"car_repair"},name:"A.T.U",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Bosch Car Service":{tags:{name:"Bosch Car Service",shop:"car_repair"},name:"Bosch Car Service",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Carglass":{tags:{name:"Carglass",shop:"car_repair"},name:"Carglass",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Euromaster":{tags:{name:"Euromaster",shop:"car_repair"},name:"Euromaster",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Feu Vert":{tags:{name:"Feu Vert",shop:"car_repair"},name:"Feu Vert",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Firestone":{tags:{name:"Firestone",shop:"car_repair"},name:"Firestone",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Firestone Complete Auto Care":{tags:{name:"Firestone Complete Auto Care",shop:"car_repair"},name:"Firestone Complete Auto Care",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Garage Renault":{tags:{name:"Garage Renault",shop:"car_repair"},name:"Garage Renault",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Gomeria":{tags:{name:"Gomeria",shop:"car_repair"},name:"Gomeria",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Gomería":{tags:{name:"Gomería",shop:"car_repair"},name:"Gomería",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Goodyear":{tags:{name:"Goodyear",shop:"car_repair"},name:"Goodyear",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Grease Monkey":{tags:{name:"Grease Monkey",shop:"car_repair"},name:"Grease Monkey",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Jiffy Lube":{tags:{name:"Jiffy Lube",shop:"car_repair"},name:"Jiffy Lube",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Kwik Fit":{tags:{name:"Kwik Fit",shop:"car_repair"},name:"Kwik Fit",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Lubricentro":{tags:{name:"Lubricentro",shop:"car_repair"},name:"Lubricentro",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Meineke":{tags:{name:"Meineke",shop:"car_repair"},name:"Meineke",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Mekonomen":{tags:{name:"Mekonomen",shop:"car_repair"},name:"Mekonomen",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Midas":{tags:{name:"Midas",shop:"car_repair"},name:"Midas",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Mr. Lube":{tags:{name:"Mr. Lube",shop:"car_repair"},name:"Mr. Lube",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Norauto":{tags:{name:"Norauto",shop:"car_repair"},name:"Norauto",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Pep Boys":{tags:{name:"Pep Boys",shop:"car_repair"},name:"Pep Boys",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Pit Stop":{tags:{name:"Pit Stop",shop:"car_repair"},name:"Pit Stop",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Point S":{tags:{name:"Point S",shop:"car_repair"},name:"Point S",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Roady":{tags:{name:"Roady",shop:"car_repair"},name:"Roady",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Sears Auto Center":{tags:{name:"Sears Auto Center",shop:"car_repair"},name:"Sears Auto Center",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Speedy":{tags:{name:"Speedy",shop:"car_repair"},name:"Speedy",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Stacja Kontroli Pojazdów":{tags:{name:"Stacja Kontroli Pojazdów",shop:"car_repair"},name:"Stacja Kontroli Pojazdów",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Taller":{tags:{name:"Taller",shop:"car_repair"},name:"Taller",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Valvoline":{tags:{name:"Valvoline",shop:"car_repair"},name:"Valvoline",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Valvoline Instant Oil Change":{tags:{name:"Valvoline Instant Oil Change",shop:"car_repair"},name:"Valvoline Instant Oil Change",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Wulkanizacja":{tags:{name:"Wulkanizacja",shop:"car_repair"},name:"Wulkanizacja",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/ÖAMTC":{tags:{name:"ÖAMTC",shop:"car_repair"},name:"ÖAMTC",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Автомастерская":{tags:{name:"Автомастерская",shop:"car_repair"},name:"Автомастерская",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Авторемонт":{tags:{name:"Авторемонт",shop:"car_repair"},name:"Авторемонт",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Автосервис":{tags:{name:"Автосервис",shop:"car_repair"},name:"Автосервис",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Автосервис+шиномонтаж":{tags:{name:"Автосервис+шиномонтаж",shop:"car_repair"},name:"Автосервис+шиномонтаж",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Замена масла":{tags:{name:"Замена масла",shop:"car_repair"},name:"Замена масла",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/СТО":{tags:{name:"СТО",shop:"car_repair"},name:"СТО",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Шиномонтаж":{tags:{name:"Шиномонтаж",shop:"car_repair"},name:"Шиномонтаж",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/шиномонтаж":{tags:{name:"шиномонтаж",shop:"car_repair"},name:"шиномонтаж",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/carpet/Carpet Right":{tags:{name:"Carpet Right",shop:"carpet"},name:"Carpet Right",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/carpet/Carpetright":{tags:{name:"Carpetright",shop:"carpet"},name:"Carpetright",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/charity/Age UK":{tags:{name:"Age UK",shop:"charity"},name:"Age UK",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Barnardo's":{tags:{name:"Barnardo's",shop:"charity"},name:"Barnardo's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/British Heart Foundation":{tags:{name:"British Heart Foundation",shop:"charity"},name:"British Heart Foundation",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Cancer Research UK":{tags:{name:"Cancer Research UK",shop:"charity"},name:"Cancer Research UK",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Oxfam":{tags:{name:"Oxfam",shop:"charity"},name:"Oxfam",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Salvation Army":{tags:{name:"Salvation Army",shop:"charity"},name:"Salvation Army",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Scope":{tags:{name:"Scope",shop:"charity"},name:"Scope",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Sue Ryder":{tags:{name:"Sue Ryder",shop:"charity"},name:"Sue Ryder",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/chemist/7 Дней":{tags:{name:"7 Дней",shop:"chemist"},name:"7 Дней",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Bipa":{tags:{name:"Bipa",shop:"chemist"},name:"Bipa",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Budnikowsky":{tags:{name:"Budnikowsky",shop:"chemist"},name:"Budnikowsky",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Etos":{tags:{name:"Etos",shop:"chemist"},name:"Etos",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Kruidvat":{tags:{name:"Kruidvat",shop:"chemist"},name:"Kruidvat",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Matas":{tags:{name:"Matas",shop:"chemist"},name:"Matas",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Müller":{tags:{name:"Müller",shop:"chemist"},name:"Müller",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Rossmann":{tags:{name:"Rossmann",shop:"chemist"},name:"Rossmann",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Schlecker":{tags:{name:"Schlecker",shop:"chemist"},name:"Schlecker",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Teta":{tags:{name:"Teta",shop:"chemist"},name:"Teta",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Trekpleister":{tags:{name:"Trekpleister",shop:"chemist"},name:"Trekpleister",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Watsons":{tags:{name:"Watsons",shop:"chemist"},name:"Watsons",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/dm":{tags:{name:"dm",shop:"chemist"},name:"dm",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Бытовая химия":{tags:{name:"Бытовая химия",shop:"chemist"},name:"Бытовая химия",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Магнит Косметик":{tags:{name:"Магнит Косметик",shop:"chemist"},name:"Магнит Косметик",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Мила":{tags:{name:"Мила",shop:"chemist"},name:"Мила",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Остров чистоты":{tags:{name:"Остров чистоты",shop:"chemist"},name:"Остров чистоты",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Рубль Бум":{tags:{name:"Рубль Бум",shop:"chemist"},name:"Рубль Бум",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Улыбка радуги":{tags:{name:"Улыбка радуги",shop:"chemist"},name:"Улыбка радуги",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/屈臣氏":{tags:{name:"屈臣氏",shop:"chemist"},name:"屈臣氏",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/康是美":{tags:{name:"康是美",shop:"chemist"},name:"康是美",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/AOKI":{tags:{name:"AOKI",shop:"clothes"},name:"AOKI",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/AWG":{tags:{name:"AWG",shop:"clothes"},name:"AWG",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Ackermans":{tags:{name:"Ackermans",shop:"clothes"},name:"Ackermans",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Adidas":{tags:{name:"Adidas",shop:"clothes"},name:"Adidas",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/American Apparel":{tags:{name:"American Apparel",shop:"clothes"},name:"American Apparel",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/American Eagle Outfitters":{tags:{name:"American Eagle Outfitters",shop:"clothes"},name:"American Eagle Outfitters",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Anthropologie":{tags:{name:"Anthropologie",shop:"clothes"},name:"Anthropologie",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Ardene":{tags:{name:"Ardene",shop:"clothes"},name:"Ardene",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Armand Thiery":{tags:{name:"Armand Thiery",shop:"clothes"},name:"Armand Thiery",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Banana Republic":{tags:{name:"Banana Republic",shop:"clothes"},name:"Banana Republic",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Benetton":{tags:{name:"Benetton",shop:"clothes"},name:"Benetton",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Bershka":{tags:{name:"Bershka",shop:"clothes"},name:"Bershka",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Bonita":{tags:{name:"Bonita",shop:"clothes"},name:"Bonita",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Bonobo":{tags:{name:"Bonobo",shop:"clothes"},name:"Bonobo",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Brooks Brothers":{tags:{name:"Brooks Brothers",shop:"clothes"},name:"Brooks Brothers",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Burberry":{tags:{name:"Burberry",shop:"clothes"},name:"Burberry",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Burlington Coat Factory":{tags:{name:"Burlington Coat Factory",shop:"clothes"},name:"Burlington Coat Factory",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Burton":{tags:{name:"Burton",shop:"clothes"},name:"Burton",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/C&A":{tags:{name:"C&A",shop:"clothes"},name:"C&A",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Cache Cache":{tags:{name:"Cache Cache",shop:"clothes"},name:"Cache Cache",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Calvin Klein":{tags:{name:"Calvin Klein",shop:"clothes"},name:"Calvin Klein",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Calzedonia":{tags:{name:"Calzedonia",shop:"clothes"},name:"Calzedonia",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Camaïeu":{tags:{name:"Camaïeu",shop:"clothes"},name:"Camaïeu",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Caroll":{tags:{name:"Caroll",shop:"clothes"},name:"Caroll",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Carter's":{tags:{name:"Carter's",shop:"clothes"},name:"Carter's",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Cecil":{tags:{name:"Cecil",shop:"clothes"},name:"Cecil",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Celio":{tags:{name:"Celio",shop:"clothes"},name:"Celio",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Charles Vögele":{tags:{name:"Charles Vögele",shop:"clothes"},name:"Charles Vögele",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Chico's":{tags:{name:"Chico's",shop:"clothes"},name:"Chico's",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Cropp":{tags:{name:"Cropp",shop:"clothes"},name:"Cropp",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Cubus":{tags:{name:"Cubus",shop:"clothes"},name:"Cubus",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Desigual":{tags:{name:"Desigual",shop:"clothes"},name:"Desigual",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Devred":{tags:{name:"Devred",shop:"clothes"},name:"Devred",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Didi":{tags:{name:"Didi",shop:"clothes"},name:"Didi",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Diesel":{tags:{name:"Diesel",shop:"clothes"},name:"Diesel",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Dorothy Perkins":{tags:{name:"Dorothy Perkins",shop:"clothes"},name:"Dorothy Perkins",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Dress Barn":{tags:{name:"Dress Barn",shop:"clothes"},name:"Dress Barn",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Dressmann":{tags:{name:"Dressmann",shop:"clothes"},name:"Dressmann",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Eddie Bauer":{tags:{name:"Eddie Bauer",shop:"clothes"},name:"Eddie Bauer",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Edgars":{tags:{name:"Edgars",shop:"clothes"},name:"Edgars",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Engbers":{tags:{name:"Engbers",shop:"clothes"},name:"Engbers",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Ernsting's family":{tags:{name:"Ernsting's family",shop:"clothes"},name:"Ernsting's family",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Esprit":{tags:{name:"Esprit",shop:"clothes"},name:"Esprit",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Etam":{tags:{name:"Etam",shop:"clothes"},name:"Etam",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Express":{tags:{name:"Express",shop:"clothes"},name:"Express",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Fat Face":{tags:{name:"Fat Face",shop:"clothes"},name:"Fat Face",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Forever 21":{tags:{name:"Forever 21",shop:"clothes"},name:"Forever 21",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gant":{tags:{name:"Gant",shop:"clothes"},name:"Gant",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gap":{tags:{name:"Gap",shop:"clothes"},name:"Gap",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gerry Weber":{tags:{name:"Gerry Weber",shop:"clothes"},name:"Gerry Weber",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gina Laura":{tags:{name:"Gina Laura",shop:"clothes"},name:"Gina Laura",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Guess":{tags:{name:"Guess",shop:"clothes"},name:"Guess",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gymboree":{tags:{name:"Gymboree",shop:"clothes"},name:"Gymboree",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gémo":{tags:{name:"Gémo",shop:"clothes"},name:"Gémo",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/H&M":{tags:{name:"H&M",shop:"clothes"},name:"H&M",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Hallhuber":{tags:{name:"Hallhuber",shop:"clothes"},name:"Hallhuber",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/House":{tags:{name:"House",shop:"clothes"},name:"House",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Hugo Boss":{tags:{name:"Hugo Boss",shop:"clothes"},name:"Hugo Boss",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Humana":{tags:{name:"Humana",shop:"clothes"},name:"Humana",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Hunkemöller":{tags:{name:"Hunkemöller",shop:"clothes"},name:"Hunkemöller",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Intimissimi":{tags:{name:"Intimissimi",shop:"clothes"},name:"Intimissimi",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/JBC":{tags:{name:"JBC",shop:"clothes"},name:"JBC",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jack & Jones":{tags:{name:"Jack & Jones",shop:"clothes"},name:"Jack & Jones",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jack Wolfskin":{tags:{name:"Jack Wolfskin",shop:"clothes"},name:"Jack Wolfskin",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jeans Fritz":{tags:{name:"Jeans Fritz",shop:"clothes"},name:"Jeans Fritz",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jennyfer":{tags:{name:"Jennyfer",shop:"clothes"},name:"Jennyfer",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jigsaw":{tags:{name:"Jigsaw",shop:"clothes"},name:"Jigsaw",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jules":{tags:{name:"Jules",shop:"clothes"},name:"Jules",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Justice":{tags:{name:"Justice",shop:"clothes"},name:"Justice",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/KappAhl":{tags:{name:"KappAhl",shop:"clothes"},name:"KappAhl",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/KiK":{tags:{name:"KiK",shop:"clothes"},name:"KiK",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Kiabi":{tags:{name:"Kiabi",shop:"clothes"},name:"Kiabi",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/La Halle":{tags:{name:"La Halle",shop:"clothes"},name:"La Halle",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Lacoste":{tags:{name:"Lacoste",shop:"clothes"},name:"Lacoste",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Lane Bryant":{tags:{name:"Lane Bryant",shop:"clothes"},name:"Lane Bryant",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Levi's":{tags:{name:"Levi's",shop:"clothes"},name:"Levi's",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Lindex":{tags:{name:"Lindex",shop:"clothes"},name:"Lindex",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Loft":{tags:{name:"Loft",shop:"clothes"},name:"Loft",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Mango":{tags:{name:"Mango",shop:"clothes"},name:"Mango",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Marc O'Polo":{tags:{name:"Marc O'Polo",shop:"clothes"},name:"Marc O'Polo",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Mark's":{tags:{name:"Mark's",shop:"clothes"},name:"Mark's",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Marshalls":{tags:{name:"Marshalls",shop:"clothes"},name:"Marshalls",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Massimo Dutti":{tags:{name:"Massimo Dutti",shop:"clothes"},name:"Massimo Dutti",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Matalan":{tags:{name:"Matalan",shop:"clothes"},name:"Matalan",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Maurices":{tags:{name:"Maurices",shop:"clothes"},name:"Maurices",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Max Mara":{tags:{name:"Max Mara",shop:"clothes"},name:"Max Mara",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Men's Wearhouse":{tags:{name:"Men's Wearhouse",shop:"clothes"},name:"Men's Wearhouse",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Mexx":{tags:{name:"Mexx",shop:"clothes"},name:"Mexx",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Michael Kors":{tags:{name:"Michael Kors",shop:"clothes"},name:"Michael Kors",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Mim":{tags:{name:"Mim",shop:"clothes"},name:"Mim",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Monsoon":{tags:{name:"Monsoon",shop:"clothes"},name:"Monsoon",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Mr Price":{tags:{name:"Mr Price",shop:"clothes"},name:"Mr Price",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/NKD":{tags:{name:"NKD",shop:"clothes"},name:"NKD",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/New Look":{tags:{name:"New Look",shop:"clothes"},name:"New Look",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/New Yorker":{tags:{name:"New Yorker",shop:"clothes"},name:"New Yorker",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/NewYorker":{tags:{name:"NewYorker",shop:"clothes"},name:"NewYorker",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Next":{tags:{name:"Next",shop:"clothes"},name:"Next",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Nike":{tags:{name:"Nike",shop:"clothes"},name:"Nike",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Nordstrom Rack":{tags:{name:"Nordstrom Rack",shop:"clothes"},name:"Nordstrom Rack",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/OVS":{tags:{name:"OVS",shop:"clothes"},name:"OVS",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Okaïdi":{tags:{name:"Okaïdi",shop:"clothes"},name:"Okaïdi",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Old Navy":{tags:{name:"Old Navy",shop:"clothes"},name:"Old Navy",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Only":{tags:{name:"Only",shop:"clothes"},name:"Only",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Orchestra":{tags:{name:"Orchestra",shop:"clothes"},name:"Orchestra",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Original Marines":{tags:{name:"Original Marines",shop:"clothes"},name:"Original Marines",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Orsay":{tags:{name:"Orsay",shop:"clothes"},name:"Orsay",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Outfit":{tags:{name:"Outfit",shop:"clothes"},name:"Outfit",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Outlet":{tags:{name:"Outlet",shop:"clothes"},name:"Outlet",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Palmers":{tags:{name:"Palmers",shop:"clothes"},name:"Palmers",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Peacocks":{tags:{name:"Peacocks",shop:"clothes"},name:"Peacocks",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Peek & Cloppenburg":{tags:{name:"Peek & Cloppenburg",shop:"clothes"},name:"Peek & Cloppenburg",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Pep":{tags:{name:"Pep",shop:"clothes"},name:"Pep",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Pepco":{tags:{name:"Pepco",shop:"clothes"},name:"Pepco",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Petit Bateau":{tags:{name:"Petit Bateau",shop:"clothes"},name:"Petit Bateau",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Pimkie":{tags:{name:"Pimkie",shop:"clothes"},name:"Pimkie",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Plato's Closet":{tags:{name:"Plato's Closet",shop:"clothes"},name:"Plato's Closet",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Primark":{tags:{name:"Primark",shop:"clothes"},name:"Primark",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Promod":{tags:{name:"Promod",shop:"clothes"},name:"Promod",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Pull & Bear":{tags:{name:"Pull & Bear",shop:"clothes"},name:"Pull & Bear",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Reitmans":{tags:{name:"Reitmans",shop:"clothes"},name:"Reitmans",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Reserved":{tags:{name:"Reserved",shop:"clothes"},name:"Reserved",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/River Island":{tags:{name:"River Island",shop:"clothes"},name:"River Island",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Ross":{tags:{name:"Ross",shop:"clothes"},name:"Ross",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Sela":{tags:{name:"Sela",shop:"clothes"},name:"Sela",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Sergent Major":{tags:{name:"Sergent Major",shop:"clothes"},name:"Sergent Major",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Shoeby":{tags:{name:"Shoeby",shop:"clothes"},name:"Shoeby",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Sisley":{tags:{name:"Sisley",shop:"clothes"},name:"Sisley",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Springfield":{tags:{name:"Springfield",shop:"clothes"},name:"Springfield",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Stefanel":{tags:{name:"Stefanel",shop:"clothes"},name:"Stefanel",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Steps":{tags:{name:"Steps",shop:"clothes"},name:"Steps",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Stradivarius":{tags:{name:"Stradivarius",shop:"clothes"},name:"Stradivarius",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Street One":{tags:{name:"Street One",shop:"clothes"},name:"Street One",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Superdry":{tags:{name:"Superdry",shop:"clothes"},name:"Superdry",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/TJ Maxx":{tags:{name:"TJ Maxx",shop:"clothes"},name:"TJ Maxx",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/TK Maxx":{tags:{name:"TK Maxx",shop:"clothes"},name:"TK Maxx",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Takko":{tags:{name:"Takko",shop:"clothes"},name:"Takko",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Talbots":{tags:{name:"Talbots",shop:"clothes"},name:"Talbots",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tally Weijl":{tags:{name:"Tally Weijl",shop:"clothes"},name:"Tally Weijl",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tati":{tags:{name:"Tati",shop:"clothes"},name:"Tati",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Terranova":{tags:{name:"Terranova",shop:"clothes"},name:"Terranova",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tesha":{tags:{name:"Tesha",shop:"clothes"},name:"Tesha",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tezenis":{tags:{name:"Tezenis",shop:"clothes"},name:"Tezenis",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/The Children's Place":{tags:{name:"The Children's Place",shop:"clothes"},name:"The Children's Place",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/The North Face":{tags:{name:"The North Face",shop:"clothes"},name:"The North Face",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/The Sting":{tags:{name:"The Sting",shop:"clothes"},name:"The Sting",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Timberland":{tags:{name:"Timberland",shop:"clothes"},name:"Timberland",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Toko Pakaian":{tags:{name:"Toko Pakaian",shop:"clothes"},name:"Toko Pakaian",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tom Tailor":{tags:{name:"Tom Tailor",shop:"clothes"},name:"Tom Tailor",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tommy Hilfiger":{tags:{name:"Tommy Hilfiger",shop:"clothes"},name:"Tommy Hilfiger",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Topshop":{tags:{name:"Topshop",shop:"clothes"},name:"Topshop",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Triumph":{tags:{name:"Triumph",shop:"clothes"},name:"Triumph",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Truworths":{tags:{name:"Truworths",shop:"clothes"},name:"Truworths",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Ulla Popken":{tags:{name:"Ulla Popken",shop:"clothes"},name:"Ulla Popken",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Uniqlo":{tags:{name:"Uniqlo",shop:"clothes"},name:"Uniqlo",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/United Colors of Benetton":{tags:{name:"United Colors of Benetton",shop:"clothes"},name:"United Colors of Benetton",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Urban Outfitters":{tags:{name:"Urban Outfitters",shop:"clothes"},name:"Urban Outfitters",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Vero Moda":{tags:{name:"Vero Moda",shop:"clothes"},name:"Vero Moda",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Victoria's Secret":{tags:{name:"Victoria's Secret",shop:"clothes"},name:"Victoria's Secret",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Vögele":{tags:{name:"Vögele",shop:"clothes"},name:"Vögele",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/WE":{tags:{name:"WE",shop:"clothes"},name:"WE",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Wibra":{tags:{name:"Wibra",shop:"clothes"},name:"Wibra",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Winners":{tags:{name:"Winners",shop:"clothes"},name:"Winners",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Yamamay":{tags:{name:"Yamamay",shop:"clothes"},name:"Yamamay",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Zara":{tags:{name:"Zara",shop:"clothes"},name:"Zara",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Zeeman":{tags:{name:"Zeeman",shop:"clothes"},name:"Zeeman",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/mister*lady":{tags:{name:"mister*lady",shop:"clothes"},name:"mister*lady",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/s.Oliver":{tags:{name:"s.Oliver",shop:"clothes"},name:"s.Oliver",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Детская одежда":{tags:{name:"Детская одежда",shop:"clothes"},name:"Детская одежда",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Женская одежда":{tags:{name:"Женская одежда",shop:"clothes"},name:"Женская одежда",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Липненски":{tags:{name:"Липненски",shop:"clothes"},name:"Липненски",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Московская ярмарка":{tags:{name:"Московская ярмарка",shop:"clothes"},name:"Московская ярмарка",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Одежда":{tags:{name:"Одежда",shop:"clothes"},name:"Одежда",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Смешные цены":{tags:{name:"Смешные цены",shop:"clothes"},name:"Смешные цены",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Спецодежда":{tags:{name:"Спецодежда",shop:"clothes"},name:"Спецодежда",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/しまむら":{tags:{name:"しまむら",shop:"clothes"},name:"しまむら",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/ユニクロ":{tags:{name:"ユニクロ",shop:"clothes"},name:"ユニクロ",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/ワークマン":{tags:{name:"ワークマン",shop:"clothes"},name:"ワークマン",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/洋服の青山":{tags:{name:"洋服の青山",shop:"clothes"},name:"洋服の青山",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/西松屋":{tags:{name:"西松屋",shop:"clothes"},name:"西松屋",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/coffee/Nespresso":{tags:{name:"Nespresso",shop:"coffee"},name:"Nespresso",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/coffee/Tchibo":{tags:{name:"Tchibo",shop:"coffee"},name:"Tchibo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/computer/Apple Store":{tags:{name:"Apple Store",shop:"computer"},name:"Apple Store",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/computer/DNS":{tags:{name:"DNS",shop:"computer"},name:"DNS",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/computer/PC World":{tags:{name:"PC World",shop:"computer"},name:"PC World",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/computer/ДНС":{tags:{name:"ДНС",shop:"computer"},name:"ДНС",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/confectionery/Fagyizó":{tags:{name:"Fagyizó",shop:"confectionery"},name:"Fagyizó",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/confectionery/Hussel":{tags:{name:"Hussel",shop:"confectionery"},name:"Hussel",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/confectionery/Leonidas":{tags:{name:"Leonidas",shop:"confectionery"},name:"Leonidas",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/confectionery/T. SN":{tags:{name:"T. SN",shop:"confectionery"},name:"T. SN",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/confectionery/Thorntons":{tags:{name:"Thorntons",shop:"confectionery"},name:"Thorntons",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/711":{tags:{name:"711",shop:"convenience"},name:"711",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/777":{tags:{name:"777",shop:"convenience"},name:"777",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/24 часа":{tags:{name:"24 часа",shop:"convenience"},name:"24 часа",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/7-Eleven":{tags:{name:"7-Eleven",shop:"convenience"},name:"7-Eleven",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/8 à Huit":{tags:{name:"8 à Huit",shop:"convenience"},name:"8 à Huit",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/99 Speedmart":{tags:{name:"99 Speedmart",shop:"convenience"},name:"99 Speedmart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ABC":{tags:{name:"ABC",shop:"convenience"},name:"ABC",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/AMPM":{tags:{name:"AMPM",shop:"convenience"},name:"AMPM",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Aibė":{tags:{name:"Aibė",shop:"convenience"},name:"Aibė",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Alepa":{tags:{name:"Alepa",shop:"convenience"},name:"Alepa",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Alfamart":{tags:{name:"Alfamart",shop:"convenience"},name:"Alfamart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Alimentara":{tags:{name:"Alimentara",shop:"convenience"},name:"Alimentara",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Almacen":{tags:{name:"Almacen",shop:"convenience"},name:"Almacen",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Almacén":{tags:{name:"Almacén",shop:"convenience"},name:"Almacén",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/BP Shop":{tags:{name:"BP Shop",shop:"convenience"},name:"BP Shop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Baqala":{tags:{name:"Baqala",shop:"convenience"},name:"Baqala",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Best One":{tags:{name:"Best One",shop:"convenience"},name:"Best One",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Best-One":{tags:{name:"Best-One",shop:"convenience"},name:"Best-One",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Bodega":{tags:{name:"Bodega",shop:"convenience"},name:"Bodega",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Bonjour":{tags:{name:"Bonjour",shop:"convenience"},name:"Bonjour",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/CBA":{tags:{name:"CBA",shop:"convenience"},name:"CBA",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/COOP":{tags:{name:"COOP",shop:"convenience"},name:"COOP",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/COOP Jednota":{tags:{name:"COOP Jednota",shop:"convenience"},name:"COOP Jednota",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/CU":{tags:{name:"CU",shop:"convenience"},name:"CU",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Casino Shop":{tags:{name:"Casino Shop",shop:"convenience"},name:"Casino Shop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Centra":{tags:{name:"Centra",shop:"convenience"},name:"Centra",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Central Convenience Store":{tags:{name:"Central Convenience Store",shop:"convenience"},name:"Central Convenience Store",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Circle K":{tags:{name:"Circle K",shop:"convenience"},name:"Circle K",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Coop Jednota":{tags:{name:"Coop Jednota",shop:"convenience"},name:"Coop Jednota",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Corner Store":{tags:{name:"Corner Store",shop:"convenience"},name:"Corner Store",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Costcutter":{tags:{name:"Costcutter",shop:"convenience"},name:"Costcutter",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Couche-Tard":{tags:{name:"Couche-Tard",shop:"convenience"},name:"Couche-Tard",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Cumberland Farms":{tags:{name:"Cumberland Farms",shop:"convenience"},name:"Cumberland Farms",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Daisy Mart":{tags:{name:"Daisy Mart",shop:"convenience"},name:"Daisy Mart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Delikatesy":{tags:{name:"Delikatesy",shop:"convenience"},name:"Delikatesy",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Dollar General":{tags:{name:"Dollar General",shop:"convenience"},name:"Dollar General",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Dépanneur":{tags:{name:"Dépanneur",shop:"convenience"},name:"Dépanneur",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/FamilyMart":{tags:{name:"FamilyMart",shop:"convenience"},name:"FamilyMart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Food Mart":{tags:{name:"Food Mart",shop:"convenience"},name:"Food Mart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Four Square":{tags:{name:"Four Square",shop:"convenience"},name:"Four Square",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Fresh":{tags:{name:"Fresh",shop:"convenience"},name:"Fresh",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Freshmarket":{tags:{name:"Freshmarket",shop:"convenience"},name:"Freshmarket",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/GS25":{tags:{name:"GS25",shop:"convenience"},name:"GS25",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Groszek":{tags:{name:"Groszek",shop:"convenience"},name:"Groszek",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Hasty Market":{tags:{name:"Hasty Market",shop:"convenience"},name:"Hasty Market",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Hruška":{tags:{name:"Hruška",shop:"convenience"},name:"Hruška",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Indomaret":{tags:{name:"Indomaret",shop:"convenience"},name:"Indomaret",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Jednota":{tags:{name:"Jednota",shop:"convenience"},name:"Jednota",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Joker":{tags:{name:"Joker",shop:"convenience"},name:"Joker",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/K-Market":{tags:{name:"K-Market",shop:"convenience"},name:"K-Market",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Kangaroo Express":{tags:{name:"Kangaroo Express",shop:"convenience"},name:"Kangaroo Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Kisbolt":{tags:{name:"Kisbolt",shop:"convenience"},name:"Kisbolt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Lawson":{tags:{name:"Lawson",shop:"convenience"},name:"Lawson",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Lewiatan":{tags:{name:"Lewiatan",shop:"convenience"},name:"Lewiatan",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Lifestyle Express":{tags:{name:"Lifestyle Express",shop:"convenience"},name:"Lifestyle Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Londis":{tags:{name:"Londis",shop:"convenience"},name:"Londis",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/M&S Simply Food":{tags:{name:"M&S Simply Food",shop:"convenience"},name:"M&S Simply Food",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mac's":{tags:{name:"Mac's",shop:"convenience"},name:"Mac's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mace":{tags:{name:"Mace",shop:"convenience"},name:"Mace",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Magazin":{tags:{name:"Magazin",shop:"convenience"},name:"Magazin",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Magazin Mixt":{tags:{name:"Magazin Mixt",shop:"convenience"},name:"Magazin Mixt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Magazin Non-Stop":{tags:{name:"Magazin Non-Stop",shop:"convenience"},name:"Magazin Non-Stop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Magazin mixt":{tags:{name:"Magazin mixt",shop:"convenience"},name:"Magazin mixt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Maxikiosco":{tags:{name:"Maxikiosco",shop:"convenience"},name:"Maxikiosco",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Małpka Express":{tags:{name:"Małpka Express",shop:"convenience"},name:"Małpka Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/McColl's":{tags:{name:"McColl's",shop:"convenience"},name:"McColl's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Migrolino":{tags:{name:"Migrolino",shop:"convenience"},name:"Migrolino",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mini ABC":{tags:{name:"Mini ABC",shop:"convenience"},name:"Mini ABC",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mini Market":{tags:{name:"Mini Market",shop:"convenience"},name:"Mini Market",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mini Market Non-Stop":{tags:{name:"Mini Market Non-Stop",shop:"convenience"},name:"Mini Market Non-Stop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mini Mart":{tags:{name:"Mini Mart",shop:"convenience"},name:"Mini Mart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mini Stop":{tags:{name:"Mini Stop",shop:"convenience"},name:"Mini Stop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Minimercado":{tags:{name:"Minimercado",shop:"convenience"},name:"Minimercado",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mlin i pekare":{tags:{name:"Mlin i pekare",shop:"convenience"},name:"Mlin i pekare",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Nasz Sklep":{tags:{name:"Nasz Sklep",shop:"convenience"},name:"Nasz Sklep",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Nisa":{tags:{name:"Nisa",shop:"convenience"},name:"Nisa",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Nisa Local":{tags:{name:"Nisa Local",shop:"convenience"},name:"Nisa Local",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/OK-Mart":{tags:{name:"OK-Mart",shop:"convenience"},name:"OK-Mart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/OK便利商店":{tags:{name:"OK便利商店",shop:"convenience"},name:"OK便利商店",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/OK便利店 Circle K":{tags:{name:"OK便利店 Circle K",shop:"convenience"},name:"OK便利店 Circle K",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Odido":{tags:{name:"Odido",shop:"convenience"},name:"Odido",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/On The Run":{tags:{name:"On The Run",shop:"convenience"},name:"On The Run",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/On the Run":{tags:{name:"On the Run",shop:"convenience"},name:"On the Run",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/One Stop":{tags:{name:"One Stop",shop:"convenience"},name:"One Stop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Oxxo":{tags:{name:"Oxxo",shop:"convenience"},name:"Oxxo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Parduotuvė":{tags:{name:"Parduotuvė",shop:"convenience"},name:"Parduotuvė",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Petit Casino":{tags:{name:"Petit Casino",shop:"convenience"},name:"Petit Casino",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Plaid Pantry":{tags:{name:"Plaid Pantry",shop:"convenience"},name:"Plaid Pantry",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Potraviny":{tags:{name:"Potraviny",shop:"convenience"},name:"Potraviny",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Prehrana":{tags:{name:"Prehrana",shop:"convenience"},name:"Prehrana",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Premier":{tags:{name:"Premier",shop:"convenience"},name:"Premier",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Proxi":{tags:{name:"Proxi",shop:"convenience"},name:"Proxi",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Proxy":{tags:{name:"Proxy",shop:"convenience"},name:"Proxy",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Pulperia":{tags:{name:"Pulperia",shop:"convenience"},name:"Pulperia",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Royal Farms":{tags:{name:"Royal Farms",shop:"convenience"},name:"Royal Farms",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Sale":{tags:{name:"Sale",shop:"convenience"},name:"Sale",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Sari-sari Store":{tags:{name:"Sari-sari Store",shop:"convenience"},name:"Sari-sari Store",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Select":{tags:{name:"Select",shop:"convenience"},name:"Select",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Shell Select":{tags:{name:"Shell Select",shop:"convenience"},name:"Shell Select",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Shop & Go":{tags:{name:"Shop & Go",shop:"convenience"},name:"Shop & Go",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Siwa":{tags:{name:"Siwa",shop:"convenience"},name:"Siwa",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Sklep spożywczy":{tags:{name:"Sklep spożywczy",shop:"convenience"},name:"Sklep spożywczy",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Smíšené zboží":{tags:{name:"Smíšené zboží",shop:"convenience"},name:"Smíšené zboží",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Społem":{tags:{name:"Społem",shop:"convenience"},name:"Społem",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Spätkauf":{tags:{name:"Spätkauf",shop:"convenience"},name:"Spätkauf",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Stewart's":{tags:{name:"Stewart's",shop:"convenience"},name:"Stewart's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Stores":{tags:{name:"Stores",shop:"convenience"},name:"Stores",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Stripes":{tags:{name:"Stripes",shop:"convenience"},name:"Stripes",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Studenac":{tags:{name:"Studenac",shop:"convenience"},name:"Studenac",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Sunkus":{tags:{name:"Sunkus",shop:"convenience"},name:"Sunkus",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Słoneczko":{tags:{name:"Słoneczko",shop:"convenience"},name:"Słoneczko",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/TESCO Lotus Express":{tags:{name:"TESCO Lotus Express",shop:"convenience"},name:"TESCO Lotus Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Tesco Express":{tags:{name:"Tesco Express",shop:"convenience"},name:"Tesco Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Tesco Lotus Express":{tags:{name:"Tesco Lotus Express",shop:"convenience"},name:"Tesco Lotus Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Tom Market 89":{tags:{name:"Tom Market 89",shop:"convenience"},name:"Tom Market 89",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/United Dairy Farmers":{tags:{name:"United Dairy Farmers",shop:"convenience"},name:"United Dairy Farmers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Vegyesbolt":{tags:{name:"Vegyesbolt",shop:"convenience"},name:"Vegyesbolt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Večerka":{tags:{name:"Večerka",shop:"convenience"},name:"Večerka",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Vival":{tags:{name:"Vival",shop:"convenience"},name:"Vival",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Wawa":{tags:{name:"Wawa",shop:"convenience"},name:"Wawa",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Weltladen":{tags:{name:"Weltladen",shop:"convenience"},name:"Weltladen",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/abc":{tags:{name:"abc",shop:"convenience"},name:"abc",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ampm":{tags:{name:"ampm",shop:"convenience"},name:"ampm",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/best-one":{tags:{name:"best-one",shop:"convenience"},name:"best-one",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/odido":{tags:{name:"odido",shop:"convenience"},name:"odido",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Élelmiszer":{tags:{name:"Élelmiszer",shop:"convenience"},name:"Élelmiszer",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Élelmiszerbolt":{tags:{name:"Élelmiszerbolt",shop:"convenience"},name:"Élelmiszerbolt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Żabka":{tags:{name:"Żabka",shop:"convenience"},name:"Żabka",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Žabka":{tags:{name:"Žabka",shop:"convenience"},name:"Žabka",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Августина":{tags:{name:"Августина",shop:"convenience"},name:"Августина",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Авоська":{tags:{name:"Авоська",shop:"convenience"},name:"Авоська",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Агрокомплекс":{tags:{name:"Агрокомплекс",shop:"convenience"},name:"Агрокомплекс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Альянс":{tags:{name:"Альянс",shop:"convenience"},name:"Альянс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Апельсин":{tags:{name:"Апельсин",shop:"convenience"},name:"Апельсин",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ассорти":{tags:{name:"Ассорти",shop:"convenience"},name:"Ассорти",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Белорусские продукты":{tags:{name:"Белорусские продукты",shop:"convenience"},name:"Белорусские продукты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Берёзка":{tags:{name:"Берёзка",shop:"convenience"},name:"Берёзка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Везунчик":{tags:{name:"Везунчик",shop:"convenience"},name:"Везунчик",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Весна":{tags:{name:"Весна",shop:"convenience"},name:"Весна",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ветеран":{tags:{name:"Ветеран",shop:"convenience"},name:"Ветеран",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Визит":{tags:{name:"Визит",shop:"convenience"},name:"Визит",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Виктория":{tags:{name:"Виктория",shop:"convenience"},name:"Виктория",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ВкусВилл":{tags:{name:"ВкусВилл",shop:"convenience"},name:"ВкусВилл",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Гастроном":{tags:{name:"Гастроном",shop:"convenience"},name:"Гастроном",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Гермес":{tags:{name:"Гермес",shop:"convenience"},name:"Гермес",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Гурман":{tags:{name:"Гурман",shop:"convenience"},name:"Гурман",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Домашний":{tags:{name:"Домашний",shop:"convenience"},name:"Домашний",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Елена":{tags:{name:"Елена",shop:"convenience"},name:"Елена",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ермолино":{tags:{name:"Ермолино",shop:"convenience"},name:"Ермолино",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Калинка":{tags:{name:"Калинка",shop:"convenience"},name:"Калинка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Кировский":{tags:{name:"Кировский",shop:"convenience"},name:"Кировский",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Колобок":{tags:{name:"Колобок",shop:"convenience"},name:"Колобок",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Колосок":{tags:{name:"Колосок",shop:"convenience"},name:"Колосок",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Копеечка":{tags:{name:"Копеечка",shop:"convenience"},name:"Копеечка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Копейка":{tags:{name:"Копейка",shop:"convenience"},name:"Копейка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Корзинка":{tags:{name:"Корзинка",shop:"convenience"},name:"Корзинка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Крамниця":{tags:{name:"Крамниця",shop:"convenience"},name:"Крамниця",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Кристалл":{tags:{name:"Кристалл",shop:"convenience"},name:"Кристалл",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Кулинария":{tags:{name:"Кулинария",shop:"convenience"},name:"Кулинария",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Купец":{tags:{name:"Купец",shop:"convenience"},name:"Купец",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ласточка":{tags:{name:"Ласточка",shop:"convenience"},name:"Ласточка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Лидер":{tags:{name:"Лидер",shop:"convenience"},name:"Лидер",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Любимый":{tags:{name:"Любимый",shop:"convenience"},name:"Любимый",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Люкс":{tags:{name:"Люкс",shop:"convenience"},name:"Люкс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Магазин при АЗС":{tags:{name:"Магазин при АЗС",shop:"convenience"},name:"Магазин при АЗС",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Мария-Ра":{tags:{name:"Мария-Ра",shop:"convenience"},name:"Мария-Ра",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Маяк":{tags:{name:"Маяк",shop:"convenience"},name:"Маяк",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Меркурий":{tags:{name:"Меркурий",shop:"convenience"},name:"Меркурий",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Мечта":{tags:{name:"Мечта",shop:"convenience"},name:"Мечта",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Минимаркет":{tags:{name:"Минимаркет",shop:"convenience"},name:"Минимаркет",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Мираж":{tags:{name:"Мираж",shop:"convenience"},name:"Мираж",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Надежда":{tags:{name:"Надежда",shop:"convenience"},name:"Надежда",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ника":{tags:{name:"Ника",shop:"convenience"},name:"Ника",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Оазис":{tags:{name:"Оазис",shop:"convenience"},name:"Оазис",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Олимп":{tags:{name:"Олимп",shop:"convenience"},name:"Олимп",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Подсолнух":{tags:{name:"Подсолнух",shop:"convenience"},name:"Подсолнух",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Престиж":{tags:{name:"Престиж",shop:"convenience"},name:"Престиж",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продукти":{tags:{name:"Продукти",shop:"convenience"},name:"Продукти",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продуктовый":{tags:{name:"Продуктовый",shop:"convenience"},name:"Продуктовый",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продуктовый магазин":{tags:{name:"Продуктовый магазин",shop:"convenience"},name:"Продуктовый магазин",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продукты":{tags:{name:"Продукты",shop:"convenience"},name:"Продукты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продукты 24":{tags:{name:"Продукты 24",shop:"convenience"},name:"Продукты 24",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Радуга":{tags:{name:"Радуга",shop:"convenience"},name:"Радуга",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Родны кут":{tags:{name:"Родны кут",shop:"convenience"},name:"Родны кут",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ромашка":{tags:{name:"Ромашка",shop:"convenience"},name:"Ромашка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Русь":{tags:{name:"Русь",shop:"convenience"},name:"Русь",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Светлана":{tags:{name:"Светлана",shop:"convenience"},name:"Светлана",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Смак":{tags:{name:"Смак",shop:"convenience"},name:"Смак",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Солнечный":{tags:{name:"Солнечный",shop:"convenience"},name:"Солнечный",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Татьяна":{tags:{name:"Татьяна",shop:"convenience"},name:"Татьяна",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Тройка":{tags:{name:"Тройка",shop:"convenience"},name:"Тройка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/У Палыча":{tags:{name:"У Палыча",shop:"convenience"},name:"У Палыча",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Универсам":{tags:{name:"Универсам",shop:"convenience"},name:"Универсам",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Фортуна":{tags:{name:"Фортуна",shop:"convenience"},name:"Фортуна",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Хороший":{tags:{name:"Хороший",shop:"convenience"},name:"Хороший",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Центральный":{tags:{name:"Центральный",shop:"convenience"},name:"Центральный",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Чайка":{tags:{name:"Чайка",shop:"convenience"},name:"Чайка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Шанс":{tags:{name:"Шанс",shop:"convenience"},name:"Шанс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Эконом":{tags:{name:"Эконом",shop:"convenience"},name:"Эконом",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Юбилейный":{tags:{name:"Юбилейный",shop:"convenience"},name:"Юбилейный",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Юлия":{tags:{name:"Юлия",shop:"convenience"},name:"Юлия",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/продукты":{tags:{name:"продукты",shop:"convenience"},name:"продукты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/მარკეტი":{tags:{name:"მარკეტი",shop:"convenience"},name:"მარკეტი",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/サンクス":{tags:{name:"サンクス","name:en":"Sunkus",shop:"convenience"},name:"サンクス",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/サークルK":{tags:{name:"サークルK","name:en":"Circle K",shop:"convenience"},name:"サークルK",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/スリーエフ":{tags:{name:"スリーエフ",shop:"convenience"},name:"スリーエフ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/セイコーマート":{tags:{name:"セイコーマート",shop:"convenience"},name:"セイコーマート",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/セブン-イレブン":{tags:{name:"セブン-イレブン","name:en":"7-Eleven",shop:"convenience"},name:"セブン-イレブン",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/セブンイレブン(Seven-Eleven)":{tags:{name:"セブンイレブン(Seven-Eleven)",shop:"convenience"},name:"セブンイレブン(Seven-Eleven)",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/セーブオン":{tags:{name:"セーブオン",shop:"convenience"},name:"セーブオン",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/デイリーヤマザキ":{tags:{name:"デイリーヤマザキ",shop:"convenience"},name:"デイリーヤマザキ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ファミリーマート":{tags:{name:"ファミリーマート","name:en":"FamilyMart",shop:"convenience"},name:"ファミリーマート",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ポプラ":{tags:{name:"ポプラ",shop:"convenience"},name:"ポプラ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ミニストップ":{tags:{name:"ミニストップ","name:en":"MINISTOP",shop:"convenience"},name:"ミニストップ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ヤマザキショップ":{tags:{name:"ヤマザキショップ",shop:"convenience"},name:"ヤマザキショップ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ローソン":{tags:{name:"ローソン","name:en":"Lawson",shop:"convenience"},name:"ローソン",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ローソンストア100":{tags:{name:"ローソンストア100",shop:"convenience"},name:"ローソンストア100",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/全家":{tags:{name:"全家",shop:"convenience"},name:"全家",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/全家便利商店":{tags:{name:"全家便利商店",shop:"convenience"},name:"全家便利商店",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/萊爾富":{tags:{name:"萊爾富",shop:"convenience"},name:"萊爾富",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/세븐일레븐":{tags:{name:"세븐일레븐",shop:"convenience"},name:"세븐일레븐",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/copyshop/FedEx Office":{tags:{name:"FedEx Office",shop:"copyshop"},name:"FedEx Office",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/copyshop/FedEx Office Print and Ship Center":{tags:{name:"FedEx Office Print and Ship Center",shop:"copyshop"},name:"FedEx Office Print and Ship Center",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Douglas":{tags:{name:"Douglas",shop:"cosmetics"},name:"Douglas",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Lush":{tags:{name:"Lush",shop:"cosmetics"},name:"Lush",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Marionnaud":{tags:{name:"Marionnaud",shop:"cosmetics"},name:"Marionnaud",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Sephora":{tags:{name:"Sephora",shop:"cosmetics"},name:"Sephora",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/The Body Shop":{tags:{name:"The Body Shop",shop:"cosmetics"},name:"The Body Shop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Л'Этуаль":{tags:{name:"Л'Этуаль",shop:"cosmetics"},name:"Л'Этуаль",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Магнит косметик":{tags:{name:"Магнит косметик",shop:"cosmetics"},name:"Магнит косметик",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Магнит-Косметик":{tags:{name:"Магнит-Косметик",shop:"cosmetics"},name:"Магнит-Косметик",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Подружка":{tags:{name:"Подружка",shop:"cosmetics"},name:"Подружка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/craft/Hobby Lobby":{tags:{name:"Hobby Lobby",shop:"craft"},name:"Hobby Lobby",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/craft/Michaels":{tags:{name:"Michaels",shop:"craft"},name:"Michaels",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Argos":{tags:{name:"Argos",shop:"department_store"},name:"Argos",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Bed Bath & Beyond":{tags:{name:"Bed Bath & Beyond",shop:"department_store"},name:"Bed Bath & Beyond",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Big Lots":{tags:{name:"Big Lots",shop:"department_store"},name:"Big Lots",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Big W":{tags:{name:"Big W",shop:"department_store"},name:"Big W",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Canadian Tire":{tags:{name:"Canadian Tire",shop:"department_store"},name:"Canadian Tire",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Coppel":{tags:{name:"Coppel",shop:"department_store"},name:"Coppel",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Debenhams":{tags:{name:"Debenhams",shop:"department_store"},name:"Debenhams",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Dillard's":{tags:{name:"Dillard's",shop:"department_store"},name:"Dillard's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/El Corte Inglés":{tags:{name:"El Corte Inglés",shop:"department_store"},name:"El Corte Inglés",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Galeria Kaufhof":{tags:{name:"Galeria Kaufhof",shop:"department_store"},name:"Galeria Kaufhof",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/HEMA":{tags:{name:"HEMA",shop:"department_store"},name:"HEMA",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Harvey Norman":{tags:{name:"Harvey Norman",shop:"department_store"},name:"Harvey Norman",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/JCPenney":{tags:{name:"JCPenney",shop:"department_store"},name:"JCPenney",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Karstadt":{tags:{name:"Karstadt",shop:"department_store"},name:"Karstadt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Kmart":{tags:{name:"Kmart",shop:"department_store"},name:"Kmart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Kohl's":{tags:{name:"Kohl's",shop:"department_store"},name:"Kohl's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Lojas Americanas":{tags:{name:"Lojas Americanas",shop:"department_store"},name:"Lojas Americanas",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Macy's":{tags:{name:"Macy's",shop:"department_store"},name:"Macy's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Marks & Spencer":{tags:{name:"Marks & Spencer",shop:"department_store"},name:"Marks & Spencer",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Myer":{tags:{name:"Myer",shop:"department_store"},name:"Myer",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Nordstrom":{tags:{name:"Nordstrom",shop:"department_store"},name:"Nordstrom",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Sears":{tags:{name:"Sears",shop:"department_store"},name:"Sears",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Shopko":{tags:{name:"Shopko",shop:"department_store"},name:"Shopko",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Target":{tags:{name:"Target",shop:"department_store"},name:"Target",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/The Warehouse":{tags:{name:"The Warehouse",shop:"department_store"},name:"The Warehouse",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Woolworth":{tags:{name:"Woolworth",shop:"department_store"},name:"Woolworth",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Универмаг":{tags:{name:"Универмаг",shop:"department_store"},name:"Универмаг",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Ace Hardware":{tags:{name:"Ace Hardware",shop:"doityourself"},name:"Ace Hardware",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/B&Q":{tags:{name:"B&Q",shop:"doityourself"},name:"B&Q",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Bauhaus":{tags:{name:"Bauhaus",shop:"doityourself"},name:"Bauhaus",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Biltema":{tags:{name:"Biltema",shop:"doityourself"},name:"Biltema",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Brico":{tags:{name:"Brico",shop:"doityourself"},name:"Brico",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Bricomarché":{tags:{name:"Bricomarché",shop:"doityourself"},name:"Bricomarché",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Bricorama":{tags:{name:"Bricorama",shop:"doityourself"},name:"Bricorama",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Bunnings Warehouse":{tags:{name:"Bunnings Warehouse",shop:"doityourself"},name:"Bunnings Warehouse",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Castorama":{tags:{name:"Castorama",shop:"doityourself"},name:"Castorama",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Easy":{tags:{name:"Easy",shop:"doityourself"},name:"Easy",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Gamma":{tags:{name:"Gamma",shop:"doityourself"},name:"Gamma",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Globus Baumarkt":{tags:{name:"Globus Baumarkt",shop:"doityourself"},name:"Globus Baumarkt",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Hagebaumarkt":{tags:{name:"Hagebaumarkt",shop:"doityourself"},name:"Hagebaumarkt",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Hellweg":{tags:{name:"Hellweg",shop:"doityourself"},name:"Hellweg",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Home Depot":{tags:{name:"Home Depot",shop:"doityourself"},name:"Home Depot",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Home Hardware":{tags:{name:"Home Hardware",shop:"doityourself"},name:"Home Hardware",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Homebase":{tags:{name:"Homebase",shop:"doityourself"},name:"Homebase",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Hornbach":{tags:{name:"Hornbach",shop:"doityourself"},name:"Hornbach",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Hubo":{tags:{name:"Hubo",shop:"doityourself"},name:"Hubo",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Karwei":{tags:{name:"Karwei",shop:"doityourself"},name:"Karwei",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Lagerhaus":{tags:{name:"Lagerhaus",shop:"doityourself"},name:"Lagerhaus",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Leroy Merlin":{tags:{name:"Leroy Merlin",shop:"doityourself"},name:"Leroy Merlin",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Lowe's":{tags:{name:"Lowe's",shop:"doityourself"},name:"Lowe's",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Lowes":{tags:{name:"Lowes",shop:"doityourself"},name:"Lowes",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Menards":{tags:{name:"Menards",shop:"doityourself"},name:"Menards",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Mr Bricolage":{tags:{name:"Mr Bricolage",shop:"doityourself"},name:"Mr Bricolage",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Mr.Bricolage":{tags:{name:"Mr.Bricolage",shop:"doityourself"},name:"Mr.Bricolage",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/OBI":{tags:{name:"OBI",shop:"doityourself"},name:"OBI",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Point P":{tags:{name:"Point P",shop:"doityourself"},name:"Point P",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Praktiker":{tags:{name:"Praktiker",shop:"doityourself"},name:"Praktiker",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Praxis":{tags:{name:"Praxis",shop:"doityourself"},name:"Praxis",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Rona":{tags:{name:"Rona",shop:"doityourself"},name:"Rona",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Screwfix":{tags:{name:"Screwfix",shop:"doityourself"},name:"Screwfix",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Sonderpreis Baumarkt":{tags:{name:"Sonderpreis Baumarkt",shop:"doityourself"},name:"Sonderpreis Baumarkt",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Tekzen":{tags:{name:"Tekzen",shop:"doityourself"},name:"Tekzen",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Toom Baumarkt":{tags:{name:"Toom Baumarkt",shop:"doityourself"},name:"Toom Baumarkt",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Weldom":{tags:{name:"Weldom",shop:"doityourself"},name:"Weldom",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Wickes":{tags:{name:"Wickes",shop:"doityourself"},name:"Wickes",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Леруа Мерлен":{tags:{name:"Леруа Мерлен",shop:"doityourself"},name:"Леруа Мерлен",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Мастер":{tags:{name:"Мастер",shop:"doityourself"},name:"Мастер",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Строитель":{tags:{name:"Строитель",shop:"doityourself"},name:"Строитель",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Стройматериалы":{tags:{name:"Стройматериалы",shop:"doityourself"},name:"Стройматериалы",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/カインズホーム":{tags:{name:"カインズホーム",shop:"doityourself"},name:"カインズホーム",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/コメリ":{tags:{name:"コメリ",shop:"doityourself"},name:"コメリ",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/コーナン":{tags:{name:"コーナン",shop:"doityourself"},name:"コーナン",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/dry_cleaning/Cleaners":{tags:{name:"Cleaners",shop:"dry_cleaning"},name:"Cleaners",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/dry_cleaning/Pressing":{tags:{name:"Pressing",shop:"dry_cleaning"},name:"Pressing",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/dry_cleaning/Диана":{tags:{name:"Диана",shop:"dry_cleaning"},name:"Диана",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/dry_cleaning/Химчистка":{tags:{name:"Химчистка",shop:"dry_cleaning"},name:"Химчистка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/dry_cleaning/ホワイト急便":{tags:{name:"ホワイト急便",shop:"dry_cleaning"},name:"ホワイト急便",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/BCC":{tags:{name:"BCC",shop:"electronics"},name:"BCC",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Batteries Plus Bulbs":{tags:{name:"Batteries Plus Bulbs",shop:"electronics"},name:"Batteries Plus Bulbs",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Best Buy":{tags:{name:"Best Buy",shop:"electronics"},name:"Best Buy",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Boulanger":{tags:{name:"Boulanger",shop:"electronics"},name:"Boulanger",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Currys":{tags:{name:"Currys",shop:"electronics"},name:"Currys",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Currys PC World":{tags:{name:"Currys PC World",shop:"electronics"},name:"Currys PC World",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Darty":{tags:{name:"Darty",shop:"electronics"},name:"Darty",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Elektra":{tags:{name:"Elektra",shop:"electronics"},name:"Elektra",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Elgiganten":{tags:{name:"Elgiganten",shop:"electronics"},name:"Elgiganten",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Euronics":{tags:{name:"Euronics",shop:"electronics"},name:"Euronics",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Expert":{tags:{name:"Expert",shop:"electronics"},name:"Expert",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Hartlauer":{tags:{name:"Hartlauer",shop:"electronics"},name:"Hartlauer",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Interdiscount":{tags:{name:"Interdiscount",shop:"electronics"},name:"Interdiscount",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/La Curacao":{tags:{name:"La Curacao",shop:"electronics"},name:"La Curacao",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Maplin":{tags:{name:"Maplin",shop:"electronics"},name:"Maplin",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Media Expert":{tags:{name:"Media Expert",shop:"electronics"},name:"Media Expert",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Media Markt":{tags:{name:"Media Markt",shop:"electronics"},name:"Media Markt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Musimundo":{tags:{name:"Musimundo",shop:"electronics"},name:"Musimundo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Neonet":{tags:{name:"Neonet",shop:"electronics"},name:"Neonet",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/RTV Euro AGD":{tags:{name:"RTV Euro AGD",shop:"electronics"},name:"RTV Euro AGD",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Radio Shack":{tags:{name:"Radio Shack",shop:"electronics"},name:"Radio Shack",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Rogers":{tags:{name:"Rogers",shop:"electronics"},name:"Rogers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Samsung":{tags:{name:"Samsung",shop:"electronics"},name:"Samsung",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Saturn":{tags:{name:"Saturn",shop:"electronics"},name:"Saturn",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Sony":{tags:{name:"Sony",shop:"electronics"},name:"Sony",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/The Source":{tags:{name:"The Source",shop:"electronics"},name:"The Source",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Unieuro":{tags:{name:"Unieuro",shop:"electronics"},name:"Unieuro",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/М.Видео":{tags:{name:"М.Видео",shop:"electronics"},name:"М.Видео",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Фокстрот":{tags:{name:"Фокстрот",shop:"electronics"},name:"Фокстрот",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Эксперт":{tags:{name:"Эксперт",shop:"electronics"},name:"Эксперт",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Эльдорадо":{tags:{name:"Эльдорадо",shop:"electronics"},name:"Эльдорадо",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/エディオン":{tags:{name:"エディオン",shop:"electronics"},name:"エディオン",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/ケーズデンキ":{tags:{name:"ケーズデンキ",shop:"electronics"},name:"ケーズデンキ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/コジマ":{tags:{name:"コジマ",shop:"electronics"},name:"コジマ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/ヤマダ電機":{tags:{name:"ヤマダ電機",shop:"electronics"},name:"ヤマダ電機",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/全國電子":{tags:{name:"全國電子",shop:"electronics"},name:"全國電子",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/燦坤3C":{tags:{name:"燦坤3C",shop:"electronics"},name:"燦坤3C",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/erotic/Orion":{tags:{name:"Orion",shop:"erotic"},name:"Orion",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/fabric/Ткани":{tags:{name:"Ткани",shop:"fabric"},name:"Ткани",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/farm/Hofladen":{tags:{name:"Hofladen",shop:"farm"},name:"Hofladen",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Blume 2000":{tags:{name:"Blume 2000",shop:"florist"},name:"Blume 2000",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Blumen Risse":{tags:{name:"Blumen Risse",shop:"florist"},name:"Blumen Risse",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Fleuriste":{tags:{name:"Fleuriste",shop:"florist"},name:"Fleuriste",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Interflora":{tags:{name:"Interflora",shop:"florist"},name:"Interflora",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Monceau Fleurs":{tags:{name:"Monceau Fleurs",shop:"florist"},name:"Monceau Fleurs",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Virágbolt":{tags:{name:"Virágbolt",shop:"florist"},name:"Virágbolt",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Квіти":{tags:{name:"Квіти",shop:"florist"},name:"Квіти",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Цветочный магазин":{tags:{name:"Цветочный магазин",shop:"florist"},name:"Цветочный магазин",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Цветы":{tags:{name:"Цветы",shop:"florist"},name:"Цветы",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/frame/rumah penduduk":{tags:{name:"rumah penduduk",shop:"frame"},name:"rumah penduduk",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/funeral_directors/The Co-operative Funeralcare":{tags:{name:"The Co-operative Funeralcare",shop:"funeral_directors"},name:"The Co-operative Funeralcare",icon:"maki-cemetery",geometry:["point","area"],fields:["name","operator","address","building_area","religion","denomination"],suggestion:true},"shop/funeral_directors/Ритуальные услуги":{tags:{name:"Ритуальные услуги",shop:"funeral_directors"},name:"Ритуальные услуги",icon:"maki-cemetery",geometry:["point","area"],fields:["name","operator","address","building_area","religion","denomination"],suggestion:true},"shop/furniture/Aaron's":{tags:{name:"Aaron's",shop:"furniture"},name:"Aaron's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Black Red White":{tags:{name:"Black Red White",shop:"furniture"},name:"Black Red White",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Bodzio":{tags:{name:"Bodzio",shop:"furniture"},name:"Bodzio",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/But":{tags:{name:"But",shop:"furniture"},name:"But",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Conforama":{tags:{name:"Conforama",shop:"furniture"},name:"Conforama",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/DFS":{tags:{name:"DFS",shop:"furniture"},name:"DFS",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Dänisches Bettenlager":{tags:{name:"Dänisches Bettenlager",shop:"furniture"},name:"Dänisches Bettenlager",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Fly":{tags:{name:"Fly",shop:"furniture"},name:"Fly",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Harveys":{tags:{name:"Harveys",shop:"furniture"},name:"Harveys",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/IKEA":{tags:{name:"IKEA",shop:"furniture"},name:"IKEA",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/JYSK":{tags:{name:"JYSK",shop:"furniture"},name:"JYSK",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Kwantum":{tags:{name:"Kwantum",shop:"furniture"},name:"Kwantum",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Leen Bakker":{tags:{name:"Leen Bakker",shop:"furniture"},name:"Leen Bakker",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Pier 1 Imports":{tags:{name:"Pier 1 Imports",shop:"furniture"},name:"Pier 1 Imports",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Roller":{tags:{name:"Roller",shop:"furniture"},name:"Roller",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/The Brick":{tags:{name:"The Brick",shop:"furniture"},name:"The Brick",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Меблі":{tags:{name:"Меблі",shop:"furniture"},name:"Меблі",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/ニトリ":{tags:{name:"ニトリ",shop:"furniture"},name:"ニトリ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Dehner":{tags:{name:"Dehner",shop:"garden_centre"},name:"Dehner",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Gamm Vert":{tags:{name:"Gamm Vert",shop:"garden_centre"},name:"Gamm Vert",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Jardiland":{tags:{name:"Jardiland",shop:"garden_centre"},name:"Jardiland",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Point Vert":{tags:{name:"Point Vert",shop:"garden_centre"},name:"Point Vert",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Welkoop":{tags:{name:"Welkoop",shop:"garden_centre"},name:"Welkoop",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Семена":{tags:{name:"Семена",shop:"garden_centre"},name:"Семена",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/gift/Card Factory":{tags:{name:"Card Factory",shop:"gift"},name:"Card Factory",icon:"maki-gift",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/gift/Hallmark":{tags:{name:"Hallmark",shop:"gift"},name:"Hallmark",icon:"maki-gift",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/gift/Подарки":{tags:{name:"Подарки",shop:"gift"},name:"Подарки",icon:"maki-gift",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/greengrocer/Frutería":{tags:{name:"Frutería",shop:"greengrocer"},name:"Frutería",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/greengrocer/Овощи и фрукты":{tags:{name:"Овощи и фрукты",shop:"greengrocer"},name:"Овощи и фрукты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Berber":{tags:{name:"Berber",shop:"hairdresser"},name:"Berber",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Cost Cutters":{tags:{name:"Cost Cutters",shop:"hairdresser"},name:"Cost Cutters",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Fantastic Sams":{tags:{name:"Fantastic Sams",shop:"hairdresser"},name:"Fantastic Sams",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Figaro":{tags:{name:"Figaro",shop:"hairdresser"},name:"Figaro",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/First Choice Haircutters":{tags:{name:"First Choice Haircutters",shop:"hairdresser"},name:"First Choice Haircutters",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Franck Provost":{tags:{name:"Franck Provost",shop:"hairdresser"},name:"Franck Provost",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Frizerie":{tags:{name:"Frizerie",shop:"hairdresser"},name:"Frizerie",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Great Clips":{tags:{name:"Great Clips",shop:"hairdresser"},name:"Great Clips",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Haarmonie":{tags:{name:"Haarmonie",shop:"hairdresser"},name:"Haarmonie",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Haarscharf":{tags:{name:"Haarscharf",shop:"hairdresser"},name:"Haarscharf",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Hair Cuttery":{tags:{name:"Hair Cuttery",shop:"hairdresser"},name:"Hair Cuttery",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Hairkiller":{tags:{name:"Hairkiller",shop:"hairdresser"},name:"Hairkiller",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Jean Louis David":{tags:{name:"Jean Louis David",shop:"hairdresser"},name:"Jean Louis David",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Jean-Louis David":{tags:{name:"Jean-Louis David",shop:"hairdresser"},name:"Jean-Louis David",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Klier":{tags:{name:"Klier",shop:"hairdresser"},name:"Klier",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Klipp":{tags:{name:"Klipp",shop:"hairdresser"},name:"Klipp",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Le Salon":{tags:{name:"Le Salon",shop:"hairdresser"},name:"Le Salon",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Marco Aldany":{tags:{name:"Marco Aldany",shop:"hairdresser"},name:"Marco Aldany",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Peluquería":{tags:{name:"Peluquería",shop:"hairdresser"},name:"Peluquería",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Salon fryzjerski":{tags:{name:"Salon fryzjerski",shop:"hairdresser"},name:"Salon fryzjerski",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Sport Clips":{tags:{name:"Sport Clips",shop:"hairdresser"},name:"Sport Clips",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Super Cuts":{tags:{name:"Super Cuts",shop:"hairdresser"},name:"Super Cuts",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Supercuts":{tags:{name:"Supercuts",shop:"hairdresser"},name:"Supercuts",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Tchip":{tags:{name:"Tchip",shop:"hairdresser"},name:"Tchip",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/The Barber Shop":{tags:{name:"The Barber Shop",shop:"hairdresser"},name:"The Barber Shop",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Toni & Guy":{tags:{name:"Toni & Guy",shop:"hairdresser"},name:"Toni & Guy",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Top Hair":{tags:{name:"Top Hair",shop:"hairdresser"},name:"Top Hair",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Локон":{tags:{name:"Локон",shop:"hairdresser"},name:"Локон",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Парикмахерская":{tags:{name:"Парикмахерская",shop:"hairdresser"},name:"Парикмахерская",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Перукарня":{tags:{name:"Перукарня",shop:"hairdresser"},name:"Перукарня",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Салон красоты":{tags:{name:"Салон красоты",shop:"hairdresser"},name:"Салон красоты",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Стиль":{tags:{name:"Стиль",shop:"hairdresser"},name:"Стиль",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Шарм":{tags:{name:"Шарм",shop:"hairdresser"},name:"Шарм",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/حلاق":{tags:{name:"حلاق",shop:"hairdresser"},name:"حلاق",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/1000 мелочей":{tags:{name:"1000 мелочей",shop:"hardware"},name:"1000 мелочей",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Ferretería":{tags:{name:"Ferretería",shop:"hardware"},name:"Ferretería",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Harbor Freight Tools":{tags:{name:"Harbor Freight Tools",shop:"hardware"},name:"Harbor Freight Tools",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Quincaillerie":{tags:{name:"Quincaillerie",shop:"hardware"},name:"Quincaillerie",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/True Value":{tags:{name:"True Value",shop:"hardware"},name:"True Value",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Würth":{tags:{name:"Würth",shop:"hardware"},name:"Würth",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Промтовары":{tags:{name:"Промтовары",shop:"hardware"},name:"Промтовары",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Сантехника":{tags:{name:"Сантехника",shop:"hardware"},name:"Сантехника",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Товары для дома":{tags:{name:"Товары для дома",shop:"hardware"},name:"Товары для дома",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Хозтовары":{tags:{name:"Хозтовары",shop:"hardware"},name:"Хозтовары",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hearing_aids/Amplifon":{tags:{name:"Amplifon",shop:"hearing_aids"},name:"Amplifon",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hearing_aids/Geers":{tags:{name:"Geers",shop:"hearing_aids"},name:"Geers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hearing_aids/Kind Hörgeräte":{tags:{name:"Kind Hörgeräte",shop:"hearing_aids"},name:"Kind Hörgeräte",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hearing_aids/amplifon":{tags:{name:"amplifon",shop:"hearing_aids"},name:"amplifon",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hifi/Bang & Olufsen":{tags:{name:"Bang & Olufsen",shop:"hifi"},name:"Bang & Olufsen",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/houseware/Blokker":{tags:{name:"Blokker",shop:"houseware"},name:"Blokker",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/houseware/Marskramer":{tags:{name:"Marskramer",shop:"houseware"},name:"Marskramer",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/houseware/Xenos":{tags:{name:"Xenos",shop:"houseware"},name:"Xenos",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/interior_decoration/Casa":{tags:{name:"Casa",shop:"interior_decoration"},name:"Casa",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/interior_decoration/Depot":{tags:{name:"Depot",shop:"interior_decoration"},name:"Depot",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/585":{tags:{name:"585",shop:"jewelry"},name:"585",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Apart":{tags:{name:"Apart",shop:"jewelry"},name:"Apart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Bijou Brigitte":{tags:{name:"Bijou Brigitte",shop:"jewelry"},name:"Bijou Brigitte",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Christ":{tags:{name:"Christ",shop:"jewelry"},name:"Christ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Claire's":{tags:{name:"Claire's",shop:"jewelry"},name:"Claire's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Ernest Jones":{tags:{name:"Ernest Jones",shop:"jewelry"},name:"Ernest Jones",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/H Samuel":{tags:{name:"H Samuel",shop:"jewelry"},name:"H Samuel",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/James Avery Jewelry":{tags:{name:"James Avery Jewelry",shop:"jewelry"},name:"James Avery Jewelry",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Julien d'Orcel":{tags:{name:"Julien d'Orcel",shop:"jewelry"},name:"Julien d'Orcel",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Kay Jewelers":{tags:{name:"Kay Jewelers",shop:"jewelry"},name:"Kay Jewelers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Pandora":{tags:{name:"Pandora",shop:"jewelry"},name:"Pandora",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Swarovski":{tags:{name:"Swarovski",shop:"jewelry"},name:"Swarovski",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Адамас":{tags:{name:"Адамас",shop:"jewelry"},name:"Адамас",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Золото":{tags:{name:"Золото",shop:"jewelry"},name:"Золото",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/kiosk/KIOS":{tags:{name:"KIOS",shop:"kiosk"},name:"KIOS",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Kiosko":{tags:{name:"Kiosko",shop:"kiosk"},name:"Kiosko",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Kiosque":{tags:{name:"Kiosque",shop:"kiosk"},name:"Kiosque",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Kolporter":{tags:{name:"Kolporter",shop:"kiosk"},name:"Kolporter",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Lietuvos spauda":{tags:{name:"Lietuvos spauda",shop:"kiosk"},name:"Lietuvos spauda",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Narvesen":{tags:{name:"Narvesen",shop:"kiosk"},name:"Narvesen",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Pressbyrån":{tags:{name:"Pressbyrån",shop:"kiosk"},name:"Pressbyrån",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Pulpería":{tags:{name:"Pulpería",shop:"kiosk"},name:"Pulpería",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/R-Kioski":{tags:{name:"R-Kioski",shop:"kiosk"},name:"R-Kioski",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Ruch":{tags:{name:"Ruch",shop:"kiosk"},name:"Ruch",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Tabak Trafik":{tags:{name:"Tabak Trafik",shop:"kiosk"},name:"Tabak Trafik",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Tisak":{tags:{name:"Tisak",shop:"kiosk"},name:"Tisak",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Trafik":{tags:{name:"Trafik",shop:"kiosk"},name:"Trafik",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Trafika":{tags:{name:"Trafika",shop:"kiosk"},name:"Trafika",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Trinkhalle":{tags:{name:"Trinkhalle",shop:"kiosk"},name:"Trinkhalle",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Белсоюзпечать":{tags:{name:"Белсоюзпечать",shop:"kiosk"},name:"Белсоюзпечать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Киоск":{tags:{name:"Киоск",shop:"kiosk"},name:"Киоск",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/მარკეტი (Market)":{tags:{name:"მარკეტი (Market)",shop:"kiosk"},name:"მარკეტი (Market)",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kitchen/Cuisinella":{tags:{name:"Cuisinella",shop:"kitchen"},name:"Cuisinella",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/kitchen/Home Utensils":{tags:{name:"Home Utensils",shop:"kitchen"},name:"Home Utensils",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/laundry/Launderette":{tags:{name:"Launderette",shop:"laundry"},name:"Launderette",icon:"maki-laundry",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/laundry/Lavandería":{tags:{name:"Lavandería",shop:"laundry"},name:"Lavandería",icon:"maki-laundry",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/laundry/コインランドリー":{tags:{name:"コインランドリー",shop:"laundry"},name:"コインランドリー",icon:"maki-laundry",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/Loteria de la Provincia":{tags:{name:"Loteria de la Provincia",shop:"lottery"},name:"Loteria de la Provincia",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/Lotería Nacional":{tags:{name:"Lotería Nacional",shop:"lottery"},name:"Lotería Nacional",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/Lotería de la Provincia":{tags:{name:"Lotería de la Provincia",shop:"lottery"},name:"Lotería de la Provincia",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/Lotto":{tags:{name:"Lotto",shop:"lottery"},name:"Lotto",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/Lottózó":{tags:{name:"Lottózó",shop:"lottery"},name:"Lottózó",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/ONCE":{tags:{name:"ONCE",shop:"lottery"},name:"ONCE",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mall/Торговый центр":{tags:{name:"Торговый центр",shop:"mall"},name:"Торговый центр",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"shop/massage/Massage Envy":{tags:{name:"Massage Envy",shop:"massage"},name:"Massage Envy",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/medical_supply/Pofam-Poznań":{tags:{name:"Pofam-Poznań",shop:"medical_supply"},name:"Pofam-Poznań",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/3 Store":{tags:{name:"3 Store",shop:"mobile_phone"},name:"3 Store",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/AT&T":{tags:{name:"AT&T",shop:"mobile_phone"},name:"AT&T",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Bell":{tags:{name:"Bell",shop:"mobile_phone"},name:"Bell",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Bitė":{tags:{name:"Bitė",shop:"mobile_phone"},name:"Bitė",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Boost Mobile":{tags:{name:"Boost Mobile",shop:"mobile_phone"},name:"Boost Mobile",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Carphone Warehouse":{tags:{name:"Carphone Warehouse",shop:"mobile_phone"},name:"Carphone Warehouse",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Claro":{tags:{name:"Claro",shop:"mobile_phone"},name:"Claro",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Cricket Wireless":{tags:{name:"Cricket Wireless",shop:"mobile_phone"},name:"Cricket Wireless",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Digicel":{tags:{name:"Digicel",shop:"mobile_phone"},name:"Digicel",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/EE":{tags:{name:"EE",shop:"mobile_phone"},name:"EE",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/MetroPCS":{tags:{name:"MetroPCS",shop:"mobile_phone"},name:"MetroPCS",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Movistar":{tags:{name:"Movistar",shop:"mobile_phone"},name:"Movistar",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/O2":{tags:{name:"O2",shop:"mobile_phone"},name:"O2",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Orange":{tags:{name:"Orange",shop:"mobile_phone"},name:"Orange",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Personal":{tags:{name:"Personal",shop:"mobile_phone"},name:"Personal",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Play":{tags:{name:"Play",shop:"mobile_phone"},name:"Play",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Plus":{tags:{name:"Plus",shop:"mobile_phone"},name:"Plus",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/SFR":{tags:{name:"SFR",shop:"mobile_phone"},name:"SFR",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Sprint":{tags:{name:"Sprint",shop:"mobile_phone"},name:"Sprint",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/T-Mobile":{tags:{name:"T-Mobile",shop:"mobile_phone"},name:"T-Mobile",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/TIM":{tags:{name:"TIM",shop:"mobile_phone"},name:"TIM",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Telcel":{tags:{name:"Telcel",shop:"mobile_phone"},name:"Telcel",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Tele2":{tags:{name:"Tele2",shop:"mobile_phone"},name:"Tele2",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Telekom":{tags:{name:"Telekom",shop:"mobile_phone"},name:"Telekom",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Telekom Shop":{tags:{name:"Telekom Shop",shop:"mobile_phone"},name:"Telekom Shop",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Telenor":{tags:{name:"Telenor",shop:"mobile_phone"},name:"Telenor",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Telus":{tags:{name:"Telus",shop:"mobile_phone"},name:"Telus",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/The Phone House":{tags:{name:"The Phone House",shop:"mobile_phone"},name:"The Phone House",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Three":{tags:{name:"Three",shop:"mobile_phone"},name:"Three",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Tim":{tags:{name:"Tim",shop:"mobile_phone"},name:"Tim",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Télécentre":{tags:{name:"Télécentre",shop:"mobile_phone"},name:"Télécentre",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Verizon":{tags:{name:"Verizon",shop:"mobile_phone"},name:"Verizon",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Verizon Wireless":{tags:{name:"Verizon Wireless",shop:"mobile_phone"},name:"Verizon Wireless",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Vodafone":{tags:{name:"Vodafone",shop:"mobile_phone"},name:"Vodafone",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Vodafone Shop":{tags:{name:"Vodafone Shop",shop:"mobile_phone"},name:"Vodafone Shop",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Wind":{tags:{name:"Wind",shop:"mobile_phone"},name:"Wind",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Yoigo":{tags:{name:"Yoigo",shop:"mobile_phone"},name:"Yoigo",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/au":{tags:{name:"au",shop:"mobile_phone"},name:"au",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/auショップ":{tags:{name:"auショップ",shop:"mobile_phone"},name:"auショップ",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/mobilcom debitel":{tags:{name:"mobilcom debitel",shop:"mobile_phone"},name:"mobilcom debitel",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Алло":{tags:{name:"Алло",shop:"mobile_phone"},name:"Алло",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Билайн":{tags:{name:"Билайн",shop:"mobile_phone"},name:"Билайн",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Евросеть":{tags:{name:"Евросеть",shop:"mobile_phone"},name:"Евросеть",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Київстар":{tags:{name:"Київстар",shop:"mobile_phone"},name:"Київстар",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/МТС":{tags:{name:"МТС",shop:"mobile_phone"},name:"МТС",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Мегафон":{tags:{name:"Мегафон",shop:"mobile_phone"},name:"Мегафон",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Связной":{tags:{name:"Связной",shop:"mobile_phone"},name:"Связной",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Теле2":{tags:{name:"Теле2",shop:"mobile_phone"},name:"Теле2",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/ソフトバンクショップ":{tags:{name:"ソフトバンクショップ",shop:"mobile_phone"},name:"ソフトバンクショップ",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/ドコモショップ":{tags:{name:"ドコモショップ",shop:"mobile_phone"},name:"ドコモショップ",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/money_lender/Money Mart":{tags:{name:"Money Mart",shop:"money_lender"},name:"Money Mart",icon:"maki-bank",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","currency_multi"],suggestion:true},"shop/motorcycle/Harley Davidson":{tags:{name:"Harley Davidson",shop:"motorcycle"},name:"Harley Davidson",icon:"fas-motorcycle",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/motorcycle/Yamaha":{tags:{name:"Yamaha",shop:"motorcycle"},name:"Yamaha",icon:"fas-motorcycle",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/music/HMV":{tags:{name:"HMV",shop:"music"},name:"HMV",icon:"maki-music",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/musical_instrument/Guitar Center":{tags:{name:"Guitar Center",shop:"musical_instrument"},name:"Guitar Center",icon:"maki-music",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Edicola":{tags:{name:"Edicola",shop:"newsagent"},name:"Edicola",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Maison de la Presse":{tags:{name:"Maison de la Presse",shop:"newsagent"},name:"Maison de la Presse",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Relay":{tags:{name:"Relay",shop:"newsagent"},name:"Relay",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Tabac Presse":{tags:{name:"Tabac Presse",shop:"newsagent"},name:"Tabac Presse",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/WHSmith":{tags:{name:"WHSmith",shop:"newsagent"},name:"WHSmith",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Витебскоблсоюзпечать":{tags:{name:"Витебскоблсоюзпечать",shop:"newsagent"},name:"Витебскоблсоюзпечать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Первая полоса":{tags:{name:"Первая полоса",shop:"newsagent"},name:"Первая полоса",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Печать":{tags:{name:"Печать",shop:"newsagent"},name:"Печать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Роспечать":{tags:{name:"Роспечать",shop:"newsagent"},name:"Роспечать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Союзпечать":{tags:{name:"Союзпечать",shop:"newsagent"},name:"Союзпечать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Alain Afflelou":{tags:{name:"Alain Afflelou",shop:"optician"},name:"Alain Afflelou",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Apollo":{tags:{name:"Apollo",shop:"optician"},name:"Apollo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Atol":{tags:{name:"Atol",shop:"optician"},name:"Atol",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Boots Opticians":{tags:{name:"Boots Opticians",shop:"optician"},name:"Boots Opticians",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Fielmann":{tags:{name:"Fielmann",shop:"optician"},name:"Fielmann",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/General Óptica":{tags:{name:"General Óptica",shop:"optician"},name:"General Óptica",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Grand Optical":{tags:{name:"Grand Optical",shop:"optician"},name:"Grand Optical",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Générale d'Optique":{tags:{name:"Générale d'Optique",shop:"optician"},name:"Générale d'Optique",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Hakim Optical":{tags:{name:"Hakim Optical",shop:"optician"},name:"Hakim Optical",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Hans Anders":{tags:{name:"Hans Anders",shop:"optician"},name:"Hans Anders",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Krys":{tags:{name:"Krys",shop:"optician"},name:"Krys",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Les Opticiens Mutualistes":{tags:{name:"Les Opticiens Mutualistes",shop:"optician"},name:"Les Opticiens Mutualistes",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Optic 2000":{tags:{name:"Optic 2000",shop:"optician"},name:"Optic 2000",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Optical Center":{tags:{name:"Optical Center",shop:"optician"},name:"Optical Center",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Pearle":{tags:{name:"Pearle",shop:"optician"},name:"Pearle",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Pearle Vision":{tags:{name:"Pearle Vision",shop:"optician"},name:"Pearle Vision",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Specsavers":{tags:{name:"Specsavers",shop:"optician"},name:"Specsavers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Sunglass Hut":{tags:{name:"Sunglass Hut",shop:"optician"},name:"Sunglass Hut",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Synoptik":{tags:{name:"Synoptik",shop:"optician"},name:"Synoptik",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Vision Express":{tags:{name:"Vision Express",shop:"optician"},name:"Vision Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/แว่นท็อปเจริญ":{tags:{name:"แว่นท็อปเจริญ",shop:"optician"},name:"แว่นท็อปเจริญ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/メガネスーパー":{tags:{name:"メガネスーパー",shop:"optician"},name:"メガネスーパー",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/眼鏡市場":{tags:{name:"眼鏡市場",shop:"optician"},name:"眼鏡市場",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/outdoor/Mountain Warehouse":{tags:{name:"Mountain Warehouse",shop:"outdoor"},name:"Mountain Warehouse",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/outdoor/REI":{tags:{name:"REI",shop:"outdoor"},name:"REI",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/outdoor/Рыболов":{tags:{name:"Рыболов",shop:"outdoor"},name:"Рыболов",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/Benjamin Moore":{tags:{name:"Benjamin Moore",shop:"paint"},name:"Benjamin Moore",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/Comex":{tags:{name:"Comex",shop:"paint"},name:"Comex",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/Jotun":{tags:{name:"Jotun",shop:"paint"},name:"Jotun",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/National Paints":{tags:{name:"National Paints",shop:"paint"},name:"National Paints",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/Sherwin Williams":{tags:{name:"Sherwin Williams",shop:"paint"},name:"Sherwin Williams",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/Sherwin-Williams Paints":{tags:{name:"Sherwin-Williams Paints",shop:"paint"},name:"Sherwin-Williams Paints",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pawnbroker/Cash Converters":{tags:{name:"Cash Converters",shop:"pawnbroker"},name:"Cash Converters",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pawnbroker/Lombard":{tags:{name:"Lombard",shop:"pawnbroker"},name:"Lombard",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pawnbroker/Palawan Pawnshop":{tags:{name:"Palawan Pawnshop",shop:"pawnbroker"},name:"Palawan Pawnshop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Das Futterhaus":{tags:{name:"Das Futterhaus",shop:"pet"},name:"Das Futterhaus",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Fressnapf":{tags:{name:"Fressnapf",shop:"pet"},name:"Fressnapf",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Global Pet Foods":{tags:{name:"Global Pet Foods",shop:"pet"},name:"Global Pet Foods",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Maxi Zoo":{tags:{name:"Maxi Zoo",shop:"pet"},name:"Maxi Zoo",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Pet Valu":{tags:{name:"Pet Valu",shop:"pet"},name:"Pet Valu",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/PetSmart":{tags:{name:"PetSmart",shop:"pet"},name:"PetSmart",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Petco":{tags:{name:"Petco",shop:"pet"},name:"Petco",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Pets at Home":{tags:{name:"Pets at Home",shop:"pet"},name:"Pets at Home",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Бетховен":{tags:{name:"Бетховен",shop:"pet"},name:"Бетховен",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Зоотовары":{tags:{name:"Зоотовары",shop:"pet"},name:"Зоотовары",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Четыре лапы":{tags:{name:"Четыре лапы",shop:"pet"},name:"Четыре лапы",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/second_hand/Goodwill":{tags:{name:"Goodwill",shop:"second_hand"},name:"Goodwill",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/second_hand/Value Village":{tags:{name:"Value Village",shop:"second_hand"},name:"Value Village",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Aldo":{tags:{name:"Aldo",shop:"shoes"},name:"Aldo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Bata":{tags:{name:"Bata",shop:"shoes"},name:"Bata",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Besson Chaussures":{tags:{name:"Besson Chaussures",shop:"shoes"},name:"Besson Chaussures",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Brantano":{tags:{name:"Brantano",shop:"shoes"},name:"Brantano",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/CCC":{tags:{name:"CCC",shop:"shoes"},name:"CCC",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Camper":{tags:{name:"Camper",shop:"shoes"},name:"Camper",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Chaussea":{tags:{name:"Chaussea",shop:"shoes"},name:"Chaussea",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Clarks":{tags:{name:"Clarks",shop:"shoes"},name:"Clarks",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Converse":{tags:{name:"Converse",shop:"shoes"},name:"Converse",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Crocs":{tags:{name:"Crocs",shop:"shoes"},name:"Crocs",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/DSW":{tags:{name:"DSW",shop:"shoes"},name:"DSW",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Deichmann":{tags:{name:"Deichmann",shop:"shoes"},name:"Deichmann",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Dosenbach":{tags:{name:"Dosenbach",shop:"shoes"},name:"Dosenbach",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Ecco":{tags:{name:"Ecco",shop:"shoes"},name:"Ecco",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Famous Footwear":{tags:{name:"Famous Footwear",shop:"shoes"},name:"Famous Footwear",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Foot Locker":{tags:{name:"Foot Locker",shop:"shoes"},name:"Foot Locker",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Geox":{tags:{name:"Geox",shop:"shoes"},name:"Geox",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Kari":{tags:{name:"Kari",shop:"shoes"},name:"Kari",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/La Halle aux Chaussures":{tags:{name:"La Halle aux Chaussures",shop:"shoes"},name:"La Halle aux Chaussures",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Mephisto":{tags:{name:"Mephisto",shop:"shoes"},name:"Mephisto",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Minelli":{tags:{name:"Minelli",shop:"shoes"},name:"Minelli",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/New Balance":{tags:{name:"New Balance",shop:"shoes"},name:"New Balance",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Payless":{tags:{name:"Payless",shop:"shoes"},name:"Payless",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Payless Shoe Source":{tags:{name:"Payless Shoe Source",shop:"shoes"},name:"Payless Shoe Source",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Payless ShoeSource":{tags:{name:"Payless ShoeSource",shop:"shoes"},name:"Payless ShoeSource",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Quick Schuh":{tags:{name:"Quick Schuh",shop:"shoes"},name:"Quick Schuh",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Rack Room Shoes":{tags:{name:"Rack Room Shoes",shop:"shoes"},name:"Rack Room Shoes",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Reno":{tags:{name:"Reno",shop:"shoes"},name:"Reno",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Rieker":{tags:{name:"Rieker",shop:"shoes"},name:"Rieker",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Salamander":{tags:{name:"Salamander",shop:"shoes"},name:"Salamander",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/San Marina":{tags:{name:"San Marina",shop:"shoes"},name:"San Marina",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Scapino":{tags:{name:"Scapino",shop:"shoes"},name:"Scapino",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Shoe Carnival":{tags:{name:"Shoe Carnival",shop:"shoes"},name:"Shoe Carnival",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Shoe Zone":{tags:{name:"Shoe Zone",shop:"shoes"},name:"Shoe Zone",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Siemes Schuhcenter":{tags:{name:"Siemes Schuhcenter",shop:"shoes"},name:"Siemes Schuhcenter",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Skechers":{tags:{name:"Skechers",shop:"shoes"},name:"Skechers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Tamaris":{tags:{name:"Tamaris",shop:"shoes"},name:"Tamaris",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/vanHaren":{tags:{name:"vanHaren",shop:"shoes"},name:"vanHaren",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Éram":{tags:{name:"Éram",shop:"shoes"},name:"Éram",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Ремонт обуви":{tags:{name:"Ремонт обуви",shop:"shoes"},name:"Ремонт обуви",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/ЦентрОбувь":{tags:{name:"ЦентрОбувь",shop:"shoes"},name:"ЦентрОбувь",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Юничел":{tags:{name:"Юничел",shop:"shoes"},name:"Юничел",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/東京靴流通センター":{tags:{name:"東京靴流通センター",shop:"shoes"},name:"東京靴流通センター",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Aktiesport":{tags:{name:"Aktiesport",shop:"sports"},name:"Aktiesport",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Big 5 Sporting Goods":{tags:{name:"Big 5 Sporting Goods",shop:"sports"},name:"Big 5 Sporting Goods",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Decathlon":{tags:{name:"Decathlon",shop:"sports"},name:"Decathlon",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Dick's Sporting Goods":{tags:{name:"Dick's Sporting Goods",shop:"sports"},name:"Dick's Sporting Goods",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Hervis":{tags:{name:"Hervis",shop:"sports"},name:"Hervis",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Intersport":{tags:{name:"Intersport",shop:"sports"},name:"Intersport",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/JD Sports":{tags:{name:"JD Sports",shop:"sports"},name:"JD Sports",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Sport 2000":{tags:{name:"Sport 2000",shop:"sports"},name:"Sport 2000",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Sports Authority":{tags:{name:"Sports Authority",shop:"sports"},name:"Sports Authority",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Sports Direct":{tags:{name:"Sports Direct",shop:"sports"},name:"Sports Direct",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Спортмастер":{tags:{name:"Спортмастер",shop:"sports"},name:"Спортмастер",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Спорттовары":{tags:{name:"Спорттовары",shop:"sports"},name:"Спорттовары",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Bureau Vallée":{tags:{name:"Bureau Vallée",shop:"stationery"},name:"Bureau Vallée",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Libro":{tags:{name:"Libro",shop:"stationery"},name:"Libro",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/McPaper":{tags:{name:"McPaper",shop:"stationery"},name:"McPaper",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Office Depot":{tags:{name:"Office Depot",shop:"stationery"},name:"Office Depot",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Office Max":{tags:{name:"Office Max",shop:"stationery"},name:"Office Max",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Officeworks":{tags:{name:"Officeworks",shop:"stationery"},name:"Officeworks",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Pagro":{tags:{name:"Pagro",shop:"stationery"},name:"Pagro",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Paperchase":{tags:{name:"Paperchase",shop:"stationery"},name:"Paperchase",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Ryman":{tags:{name:"Ryman",shop:"stationery"},name:"Ryman",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Staples":{tags:{name:"Staples",shop:"stationery"},name:"Staples",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Канцтовары":{tags:{name:"Канцтовары",shop:"stationery"},name:"Канцтовары",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/A&O":{tags:{name:"A&O",shop:"supermarket"},name:"A&O",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/A101":{tags:{name:"A101",shop:"supermarket"},name:"A101",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/AD Delhaize":{tags:{name:"AD Delhaize",shop:"supermarket"},name:"AD Delhaize",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ADEG":{tags:{name:"ADEG",shop:"supermarket"},name:"ADEG",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Ahorramás":{tags:{name:"Ahorramás",shop:"supermarket"},name:"Ahorramás",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Albert":{tags:{name:"Albert",shop:"supermarket"},name:"Albert",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Albert Heijn":{tags:{name:"Albert Heijn",shop:"supermarket"},name:"Albert Heijn",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Albertsons":{tags:{name:"Albertsons",shop:"supermarket"},name:"Albertsons",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Aldi":{tags:{name:"Aldi",shop:"supermarket"},name:"Aldi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Aldi Nord":{tags:{name:"Aldi Nord",shop:"supermarket"},name:"Aldi Nord",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Aldi Süd":{tags:{name:"Aldi Süd",shop:"supermarket"},name:"Aldi Süd",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Alimerka":{tags:{name:"Alimerka",shop:"supermarket"},name:"Alimerka",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Alnatura":{tags:{name:"Alnatura",shop:"supermarket"},name:"Alnatura",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Asda":{tags:{name:"Asda",shop:"supermarket"},name:"Asda",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Atac":{tags:{name:"Atac",shop:"supermarket"},name:"Atac",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Atacadão":{tags:{name:"Atacadão",shop:"supermarket"},name:"Atacadão",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Auchan":{tags:{name:"Auchan",shop:"supermarket"},name:"Auchan",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/BM":{tags:{name:"BM",shop:"supermarket"},name:"BM",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Biedronka":{tags:{name:"Biedronka",shop:"supermarket"},name:"Biedronka",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Big C":{tags:{name:"Big C",shop:"supermarket"},name:"Big C",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Billa":{tags:{name:"Billa",shop:"supermarket"},name:"Billa",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Bim":{tags:{name:"Bim",shop:"supermarket"},name:"Bim",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Biocoop":{tags:{name:"Biocoop",shop:"supermarket"},name:"Biocoop",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Bodega Aurrera":{tags:{name:"Bodega Aurrera",shop:"supermarket"},name:"Bodega Aurrera",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Budgens":{tags:{name:"Budgens",shop:"supermarket"},name:"Budgens",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Bulk Barn":{tags:{name:"Bulk Barn",shop:"supermarket"},name:"Bulk Barn",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Bunnpris":{tags:{name:"Bunnpris",shop:"supermarket"},name:"Bunnpris",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/CONAD":{tags:{name:"CONAD",shop:"supermarket"},name:"CONAD",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/CRAI":{tags:{name:"CRAI",shop:"supermarket"},name:"CRAI",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Caprabo":{tags:{name:"Caprabo",shop:"supermarket"},name:"Caprabo",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Cargills Food City":{tags:{name:"Cargills Food City",shop:"supermarket"},name:"Cargills Food City",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Carrefour":{tags:{name:"Carrefour",shop:"supermarket"},name:"Carrefour",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Carrefour City":{tags:{name:"Carrefour City",shop:"supermarket"},name:"Carrefour City",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Carrefour Contact":{tags:{name:"Carrefour Contact",shop:"supermarket"},name:"Carrefour Contact",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Carrefour Express":{tags:{name:"Carrefour Express",shop:"supermarket"},name:"Carrefour Express",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Centre Commercial E. Leclerc":{tags:{name:"Centre Commercial E. Leclerc",shop:"supermarket"},name:"Centre Commercial E. Leclerc",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Checkers":{tags:{name:"Checkers",shop:"supermarket"},name:"Checkers",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Chedraui":{tags:{name:"Chedraui",shop:"supermarket"},name:"Chedraui",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Co-Op":{tags:{name:"Co-Op",shop:"supermarket"},name:"Co-Op",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Co-op":{tags:{name:"Co-op",shop:"supermarket"},name:"Co-op",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Co-operative":{tags:{name:"Co-operative",shop:"supermarket"},name:"Co-operative",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coles":{tags:{name:"Coles",shop:"supermarket"},name:"Coles",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Colmado":{tags:{name:"Colmado",shop:"supermarket"},name:"Colmado",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Colruyt":{tags:{name:"Colruyt",shop:"supermarket"},name:"Colruyt",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Combi":{tags:{name:"Combi",shop:"supermarket"},name:"Combi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Comercial Mexicana":{tags:{name:"Comercial Mexicana",shop:"supermarket"},name:"Comercial Mexicana",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Conad":{tags:{name:"Conad",shop:"supermarket"},name:"Conad",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Conad City":{tags:{name:"Conad City",shop:"supermarket"},name:"Conad City",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Condis":{tags:{name:"Condis",shop:"supermarket"},name:"Condis",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Consum":{tags:{name:"Consum",shop:"supermarket"},name:"Consum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Continente":{tags:{name:"Continente",shop:"supermarket"},name:"Continente",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coop":{tags:{name:"Coop",shop:"supermarket"},name:"Coop",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coop Extra":{tags:{name:"Coop Extra",shop:"supermarket"},name:"Coop Extra",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coop Konsum":{tags:{name:"Coop Konsum",shop:"supermarket"},name:"Coop Konsum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Costco Gasoline":{tags:{name:"Costco Gasoline",shop:"supermarket"},name:"Costco Gasoline",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coto":{tags:{name:"Coto",shop:"supermarket"},name:"Coto",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Countdown":{tags:{name:"Countdown",shop:"supermarket"},name:"Countdown",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coviran":{tags:{name:"Coviran",shop:"supermarket"},name:"Coviran",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Covirán":{tags:{name:"Covirán",shop:"supermarket"},name:"Covirán",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Crai":{tags:{name:"Crai",shop:"supermarket"},name:"Crai",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Cub Foods":{tags:{name:"Cub Foods",shop:"supermarket"},name:"Cub Foods",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dagli'Brugsen":{tags:{name:"Dagli'Brugsen",shop:"supermarket"},name:"Dagli'Brugsen",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Deen":{tags:{name:"Deen",shop:"supermarket"},name:"Deen",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Delhaize":{tags:{name:"Delhaize",shop:"supermarket"},name:"Delhaize",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Delikatesy Centrum":{tags:{name:"Delikatesy Centrum",shop:"supermarket"},name:"Delikatesy Centrum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Denner":{tags:{name:"Denner",shop:"supermarket"},name:"Denner",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Despar":{tags:{name:"Despar",shop:"supermarket"},name:"Despar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Despensa Familiar":{tags:{name:"Despensa Familiar",shop:"supermarket"},name:"Despensa Familiar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dia":{tags:{name:"Dia",shop:"supermarket"},name:"Dia",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dia %":{tags:{name:"Dia %",shop:"supermarket"},name:"Dia %",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dia Market":{tags:{name:"Dia Market",shop:"supermarket"},name:"Dia Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dino":{tags:{name:"Dino",shop:"supermarket"},name:"Dino",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dirk van den Broek":{tags:{name:"Dirk van den Broek",shop:"supermarket"},name:"Dirk van den Broek",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Disco":{tags:{name:"Disco",shop:"supermarket"},name:"Disco",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Diska":{tags:{name:"Diska",shop:"supermarket"},name:"Diska",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dunnes Stores":{tags:{name:"Dunnes Stores",shop:"supermarket"},name:"Dunnes Stores",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/E-Center":{tags:{name:"E-Center",shop:"supermarket"},name:"E-Center",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/E. Leclerc":{tags:{name:"E. Leclerc",shop:"supermarket"},name:"E. Leclerc",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/E. Leclerc Drive":{tags:{name:"E. Leclerc Drive",shop:"supermarket"},name:"E. Leclerc Drive",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/EMTÉ":{tags:{name:"EMTÉ",shop:"supermarket"},name:"EMTÉ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Edeka":{tags:{name:"Edeka",shop:"supermarket"},name:"Edeka",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Ekom":{tags:{name:"Ekom",shop:"supermarket"},name:"Ekom",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Ekono":{tags:{name:"Ekono",shop:"supermarket"},name:"Ekono",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/El Árbol":{tags:{name:"El Árbol",shop:"supermarket"},name:"El Árbol",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Eroski":{tags:{name:"Eroski",shop:"supermarket"},name:"Eroski",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Esselunga":{tags:{name:"Esselunga",shop:"supermarket"},name:"Esselunga",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/EuroSpin":{tags:{name:"EuroSpin",shop:"supermarket"},name:"EuroSpin",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Eurospar":{tags:{name:"Eurospar",shop:"supermarket"},name:"Eurospar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Eurospin":{tags:{name:"Eurospin",shop:"supermarket"},name:"Eurospin",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Extra":{tags:{name:"Extra",shop:"supermarket"},name:"Extra",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Famiglia Cooperativa":{tags:{name:"Famiglia Cooperativa",shop:"supermarket"},name:"Famiglia Cooperativa",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Famila":{tags:{name:"Famila",shop:"supermarket"},name:"Famila",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Fareway":{tags:{name:"Fareway",shop:"supermarket"},name:"Fareway",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Farmfoods":{tags:{name:"Farmfoods",shop:"supermarket"},name:"Farmfoods",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Feneberg":{tags:{name:"Feneberg",shop:"supermarket"},name:"Feneberg",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Food Basics":{tags:{name:"Food Basics",shop:"supermarket"},name:"Food Basics",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Food Lion":{tags:{name:"Food Lion",shop:"supermarket"},name:"Food Lion",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Foodland":{tags:{name:"Foodland",shop:"supermarket"},name:"Foodland",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Foodworks":{tags:{name:"Foodworks",shop:"supermarket"},name:"Foodworks",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Franprix":{tags:{name:"Franprix",shop:"supermarket"},name:"Franprix",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Fred Meyer":{tags:{name:"Fred Meyer",shop:"supermarket"},name:"Fred Meyer",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Froiz":{tags:{name:"Froiz",shop:"supermarket"},name:"Froiz",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Føtex":{tags:{name:"Føtex",shop:"supermarket"},name:"Føtex",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/G20":{tags:{name:"G20",shop:"supermarket"},name:"G20",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Gadis":{tags:{name:"Gadis",shop:"supermarket"},name:"Gadis",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Giant":{tags:{name:"Giant",shop:"supermarket"},name:"Giant",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Giant Eagle":{tags:{name:"Giant Eagle",shop:"supermarket"},name:"Giant Eagle",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Grand Frais":{tags:{name:"Grand Frais",shop:"supermarket"},name:"Grand Frais",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Grocery Outlet":{tags:{name:"Grocery Outlet",shop:"supermarket"},name:"Grocery Outlet",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Géant Casino":{tags:{name:"Géant Casino",shop:"supermarket"},name:"Géant Casino",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/H-E-B":{tags:{name:"H-E-B",shop:"supermarket"},name:"H-E-B",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/HIT":{tags:{name:"HIT",shop:"supermarket"},name:"HIT",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Hannaford":{tags:{name:"Hannaford",shop:"supermarket"},name:"Hannaford",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Harris Teeter":{tags:{name:"Harris Teeter",shop:"supermarket"},name:"Harris Teeter",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Hemköp":{tags:{name:"Hemköp",shop:"supermarket"},name:"Hemköp",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Heron Foods":{tags:{name:"Heron Foods",shop:"supermarket"},name:"Heron Foods",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Hofer":{tags:{name:"Hofer",shop:"supermarket"},name:"Hofer",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Hoogvliet":{tags:{name:"Hoogvliet",shop:"supermarket"},name:"Hoogvliet",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Hy-Vee":{tags:{name:"Hy-Vee",shop:"supermarket"},name:"Hy-Vee",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ICA":{tags:{name:"ICA",shop:"supermarket"},name:"ICA",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ICA Kvantum":{tags:{name:"ICA Kvantum",shop:"supermarket"},name:"ICA Kvantum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/IDEA":{tags:{name:"IDEA",shop:"supermarket"},name:"IDEA",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/IGA":{tags:{name:"IGA",shop:"supermarket"},name:"IGA",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Iceland":{tags:{name:"Iceland",shop:"supermarket"},name:"Iceland",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Intermarché":{tags:{name:"Intermarché",shop:"supermarket"},name:"Intermarché",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Intermarché Contact":{tags:{name:"Intermarché Contact",shop:"supermarket"},name:"Intermarché Contact",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Intermarché Super":{tags:{name:"Intermarché Super",shop:"supermarket"},name:"Intermarché Super",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Interspar":{tags:{name:"Interspar",shop:"supermarket"},name:"Interspar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Irma":{tags:{name:"Irma",shop:"supermarket"},name:"Irma",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Jewel-Osco":{tags:{name:"Jewel-Osco",shop:"supermarket"},name:"Jewel-Osco",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Jumbo":{tags:{name:"Jumbo",shop:"supermarket"},name:"Jumbo",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/K+K":{tags:{name:"K+K",shop:"supermarket"},name:"K+K",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Kaufland":{tags:{name:"Kaufland",shop:"supermarket"},name:"Kaufland",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/King Soopers":{tags:{name:"King Soopers",shop:"supermarket"},name:"King Soopers",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Kiwi":{tags:{name:"Kiwi",shop:"supermarket"},name:"Kiwi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Konsum":{tags:{name:"Konsum",shop:"supermarket"},name:"Konsum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Konzum":{tags:{name:"Konzum",shop:"supermarket"},name:"Konzum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Kroger":{tags:{name:"Kroger",shop:"supermarket"},name:"Kroger",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Kvickly":{tags:{name:"Kvickly",shop:"supermarket"},name:"Kvickly",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/La Vie Claire":{tags:{name:"La Vie Claire",shop:"supermarket"},name:"La Vie Claire",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Landi":{tags:{name:"Landi",shop:"supermarket"},name:"Landi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Leader Price":{tags:{name:"Leader Price",shop:"supermarket"},name:"Leader Price",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Leclerc Drive":{tags:{name:"Leclerc Drive",shop:"supermarket"},name:"Leclerc Drive",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Lider":{tags:{name:"Lider",shop:"supermarket"},name:"Lider",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Lidl":{tags:{name:"Lidl",shop:"supermarket"},name:"Lidl",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Lupa":{tags:{name:"Lupa",shop:"supermarket"},name:"Lupa",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/MPREIS":{tags:{name:"MPREIS",shop:"supermarket"},name:"MPREIS",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Makro":{tags:{name:"Makro",shop:"supermarket"},name:"Makro",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Markant":{tags:{name:"Markant",shop:"supermarket"},name:"Markant",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Market Basket":{tags:{name:"Market Basket",shop:"supermarket"},name:"Market Basket",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Marktkauf":{tags:{name:"Marktkauf",shop:"supermarket"},name:"Marktkauf",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Match":{tags:{name:"Match",shop:"supermarket"},name:"Match",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Maxi":{tags:{name:"Maxi",shop:"supermarket"},name:"Maxi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Maxi Dia":{tags:{name:"Maxi Dia",shop:"supermarket"},name:"Maxi Dia",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Maxima":{tags:{name:"Maxima",shop:"supermarket"},name:"Maxima",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Maxima X":{tags:{name:"Maxima X",shop:"supermarket"},name:"Maxima X",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Maxima XX":{tags:{name:"Maxima XX",shop:"supermarket"},name:"Maxima XX",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mega Image":{tags:{name:"Mega Image",shop:"supermarket"},name:"Mega Image",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mego":{tags:{name:"Mego",shop:"supermarket"},name:"Mego",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Meijer":{tags:{name:"Meijer",shop:"supermarket"},name:"Meijer",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Meny":{tags:{name:"Meny",shop:"supermarket"},name:"Meny",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mercado Municipal":{tags:{name:"Mercado Municipal",shop:"supermarket"},name:"Mercado Municipal",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mercado de Abastos":{tags:{name:"Mercado de Abastos",shop:"supermarket"},name:"Mercado de Abastos",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mercadona":{tags:{name:"Mercadona",shop:"supermarket"},name:"Mercadona",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mercator":{tags:{name:"Mercator",shop:"supermarket"},name:"Mercator",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Merkur":{tags:{name:"Merkur",shop:"supermarket"},name:"Merkur",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Metro":{tags:{name:"Metro",shop:"supermarket"},name:"Metro",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Migros":{tags:{name:"Migros",shop:"supermarket"},name:"Migros",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mila":{tags:{name:"Mila",shop:"supermarket"},name:"Mila",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Minipreço":{tags:{name:"Minipreço",shop:"supermarket"},name:"Minipreço",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mix Markt":{tags:{name:"Mix Markt",shop:"supermarket"},name:"Mix Markt",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Monoprix":{tags:{name:"Monoprix",shop:"supermarket"},name:"Monoprix",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/More":{tags:{name:"More",shop:"supermarket"},name:"More",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Morrisons":{tags:{name:"Morrisons",shop:"supermarket"},name:"Morrisons",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/NORMA":{tags:{name:"NORMA",shop:"supermarket"},name:"NORMA",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/NP":{tags:{name:"NP",shop:"supermarket"},name:"NP",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Nah & Frisch":{tags:{name:"Nah & Frisch",shop:"supermarket"},name:"Nah & Frisch",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Nahkauf":{tags:{name:"Nahkauf",shop:"supermarket"},name:"Nahkauf",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Netto":{tags:{name:"Netto",shop:"supermarket"},name:"Netto",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Netto Marken-Discount":{tags:{name:"Netto Marken-Discount",shop:"supermarket"},name:"Netto Marken-Discount",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/New World":{tags:{name:"New World",shop:"supermarket"},name:"New World",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/No Frills":{tags:{name:"No Frills",shop:"supermarket"},name:"No Frills",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Norfa XL":{tags:{name:"Norfa XL",shop:"supermarket"},name:"Norfa XL",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Norma":{tags:{name:"Norma",shop:"supermarket"},name:"Norma",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/PENNY":{tags:{name:"PENNY",shop:"supermarket"},name:"PENNY",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/PLUS":{tags:{name:"PLUS",shop:"supermarket"},name:"PLUS",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/POLOmarket":{tags:{name:"POLOmarket",shop:"supermarket"},name:"POLOmarket",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Palí":{tags:{name:"Palí",shop:"supermarket"},name:"Palí",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Pam":{tags:{name:"Pam",shop:"supermarket"},name:"Pam",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Penny":{tags:{name:"Penny",shop:"supermarket"},name:"Penny",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Penny Markt":{tags:{name:"Penny Markt",shop:"supermarket"},name:"Penny Markt",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Pick n Pay":{tags:{name:"Pick n Pay",shop:"supermarket"},name:"Pick n Pay",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Piggly Wiggly":{tags:{name:"Piggly Wiggly",shop:"supermarket"},name:"Piggly Wiggly",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Pingo Doce":{tags:{name:"Pingo Doce",shop:"supermarket"},name:"Pingo Doce",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Piotr i Paweł":{tags:{name:"Piotr i Paweł",shop:"supermarket"},name:"Piotr i Paweł",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Plaza Vea":{tags:{name:"Plaza Vea",shop:"supermarket"},name:"Plaza Vea",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Plodine":{tags:{name:"Plodine",shop:"supermarket"},name:"Plodine",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Poiesz":{tags:{name:"Poiesz",shop:"supermarket"},name:"Poiesz",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Price Chopper":{tags:{name:"Price Chopper",shop:"supermarket"},name:"Price Chopper",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Prix":{tags:{name:"Prix",shop:"supermarket"},name:"Prix",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Profi":{tags:{name:"Profi",shop:"supermarket"},name:"Profi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Proxy Delhaize":{tags:{name:"Proxy Delhaize",shop:"supermarket"},name:"Proxy Delhaize",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Publix":{tags:{name:"Publix",shop:"supermarket"},name:"Publix",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Punto Simply":{tags:{name:"Punto Simply",shop:"supermarket"},name:"Punto Simply",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Puregold":{tags:{name:"Puregold",shop:"supermarket"},name:"Puregold",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Pão de Açúcar":{tags:{name:"Pão de Açúcar",shop:"supermarket"},name:"Pão de Açúcar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/QFC":{tags:{name:"QFC",shop:"supermarket"},name:"QFC",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/REMA 1000":{tags:{name:"REMA 1000",shop:"supermarket"},name:"REMA 1000",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Ralphs":{tags:{name:"Ralphs",shop:"supermarket"},name:"Ralphs",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Real":{tags:{name:"Real",shop:"supermarket"},name:"Real",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Real Canadian Superstore":{tags:{name:"Real Canadian Superstore",shop:"supermarket"},name:"Real Canadian Superstore",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Reliance Fresh":{tags:{name:"Reliance Fresh",shop:"supermarket"},name:"Reliance Fresh",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Rema 1000":{tags:{name:"Rema 1000",shop:"supermarket"},name:"Rema 1000",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Rewe":{tags:{name:"Rewe",shop:"supermarket"},name:"Rewe",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Rewe City":{tags:{name:"Rewe City",shop:"supermarket"},name:"Rewe City",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Rimi":{tags:{name:"Rimi",shop:"supermarket"},name:"Rimi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/S-Market":{tags:{name:"S-Market",shop:"supermarket"},name:"S-Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Safeway":{tags:{name:"Safeway",shop:"supermarket"},name:"Safeway",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sainsbury's":{tags:{name:"Sainsbury's",shop:"supermarket"},name:"Sainsbury's",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sainsbury's Local":{tags:{name:"Sainsbury's Local",shop:"supermarket"},name:"Sainsbury's Local",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sam's Club":{tags:{name:"Sam's Club",shop:"supermarket"},name:"Sam's Club",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Santa Isabel":{tags:{name:"Santa Isabel",shop:"supermarket"},name:"Santa Isabel",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Save-A-Lot":{tags:{name:"Save-A-Lot",shop:"supermarket"},name:"Save-A-Lot",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ShopRite":{tags:{name:"ShopRite",shop:"supermarket"},name:"ShopRite",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Shoprite":{tags:{name:"Shoprite",shop:"supermarket"},name:"Shoprite",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sigma":{tags:{name:"Sigma",shop:"supermarket"},name:"Sigma",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Simply Market":{tags:{name:"Simply Market",shop:"supermarket"},name:"Simply Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sky":{tags:{name:"Sky",shop:"supermarket"},name:"Sky",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Smith's":{tags:{name:"Smith's",shop:"supermarket"},name:"Smith's",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sobeys":{tags:{name:"Sobeys",shop:"supermarket"},name:"Sobeys",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Soriana":{tags:{name:"Soriana",shop:"supermarket"},name:"Soriana",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Spar":{tags:{name:"Spar",shop:"supermarket"},name:"Spar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sprouts Farmers Market":{tags:{name:"Sprouts Farmers Market",shop:"supermarket"},name:"Sprouts Farmers Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Stokrotka":{tags:{name:"Stokrotka",shop:"supermarket"},name:"Stokrotka",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Stop & Shop":{tags:{name:"Stop & Shop",shop:"supermarket"},name:"Stop & Shop",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Super C":{tags:{name:"Super C",shop:"supermarket"},name:"Super C",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Super U":{tags:{name:"Super U",shop:"supermarket"},name:"Super U",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/SuperBrugsen":{tags:{name:"SuperBrugsen",shop:"supermarket"},name:"SuperBrugsen",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/SuperValu":{tags:{name:"SuperValu",shop:"supermarket"},name:"SuperValu",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Superama":{tags:{name:"Superama",shop:"supermarket"},name:"Superama",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Supersol":{tags:{name:"Supersol",shop:"supermarket"},name:"Supersol",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Superspar":{tags:{name:"Superspar",shop:"supermarket"},name:"Superspar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tegut":{tags:{name:"Tegut",shop:"supermarket"},name:"Tegut",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tengelmann":{tags:{name:"Tengelmann",shop:"supermarket"},name:"Tengelmann",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tesco":{tags:{name:"Tesco",shop:"supermarket"},name:"Tesco",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tesco Extra":{tags:{name:"Tesco Extra",shop:"supermarket"},name:"Tesco Extra",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tesco Lotus":{tags:{name:"Tesco Lotus",shop:"supermarket"},name:"Tesco Lotus",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tesco Metro":{tags:{name:"Tesco Metro",shop:"supermarket"},name:"Tesco Metro",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/The Co-operative":{tags:{name:"The Co-operative",shop:"supermarket"},name:"The Co-operative",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/The Co-operative Food":{tags:{name:"The Co-operative Food",shop:"supermarket"},name:"The Co-operative Food",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tommy":{tags:{name:"Tommy",shop:"supermarket"},name:"Tommy",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tottus":{tags:{name:"Tottus",shop:"supermarket"},name:"Tottus",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Trader Joe's":{tags:{name:"Trader Joe's",shop:"supermarket"},name:"Trader Joe's",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Treff 3000":{tags:{name:"Treff 3000",shop:"supermarket"},name:"Treff 3000",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/U Express":{tags:{name:"U Express",shop:"supermarket"},name:"U Express",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Unimarc":{tags:{name:"Unimarc",shop:"supermarket"},name:"Unimarc",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Unimarkt":{tags:{name:"Unimarkt",shop:"supermarket"},name:"Unimarkt",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Utile":{tags:{name:"Utile",shop:"supermarket"},name:"Utile",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Vea":{tags:{name:"Vea",shop:"supermarket"},name:"Vea",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Volg":{tags:{name:"Volg",shop:"supermarket"},name:"Volg",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Waitrose":{tags:{name:"Waitrose",shop:"supermarket"},name:"Waitrose",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Walmart":{tags:{name:"Walmart",shop:"supermarket"},name:"Walmart",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Walmart Neighborhood Market":{tags:{name:"Walmart Neighborhood Market",shop:"supermarket"},name:"Walmart Neighborhood Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Walmart Supercenter":{tags:{name:"Walmart Supercenter",shop:"supermarket"},name:"Walmart Supercenter",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Wasgau":{tags:{name:"Wasgau",shop:"supermarket"},name:"Wasgau",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Wegmans":{tags:{name:"Wegmans",shop:"supermarket"},name:"Wegmans",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Wellcome":{tags:{name:"Wellcome",shop:"supermarket"},name:"Wellcome",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Whole Foods Market":{tags:{name:"Whole Foods Market",shop:"supermarket"},name:"Whole Foods Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Willys":{tags:{name:"Willys",shop:"supermarket"},name:"Willys",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/WinCo Foods":{tags:{name:"WinCo Foods",shop:"supermarket"},name:"WinCo Foods",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Winn Dixie":{tags:{name:"Winn Dixie",shop:"supermarket"},name:"Winn Dixie",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Woolworths":{tags:{name:"Woolworths",shop:"supermarket"},name:"Woolworths",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/denn's Biomarkt":{tags:{name:"denn's Biomarkt",shop:"supermarket"},name:"denn's Biomarkt",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/fakta":{tags:{name:"fakta",shop:"supermarket"},name:"fakta",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/real":{tags:{name:"real",shop:"supermarket"},name:"real",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/tegut":{tags:{name:"tegut",shop:"supermarket"},name:"tegut",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Şok":{tags:{name:"Şok",shop:"supermarket"},name:"Şok",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ΑΒ Βασιλόπουλος":{tags:{name:"ΑΒ Βασιλόπουλος",shop:"supermarket"},name:"ΑΒ Βασιλόπουλος",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Γαλαξίας":{tags:{name:"Γαλαξίας",shop:"supermarket"},name:"Γαλαξίας",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Μασούτης":{tags:{name:"Μασούτης",shop:"supermarket"},name:"Μασούτης",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Σκλαβενίτης":{tags:{name:"Σκλαβενίτης",shop:"supermarket"},name:"Σκλαβενίτης",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/АТБ":{tags:{name:"АТБ",shop:"supermarket"},name:"АТБ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Абсолют":{tags:{name:"Абсолют",shop:"supermarket"},name:"Абсолют",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Азбука Вкуса":{tags:{name:"Азбука Вкуса",shop:"supermarket"},name:"Азбука Вкуса",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Атак":{tags:{name:"Атак",shop:"supermarket"},name:"Атак",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Ашан":{tags:{name:"Ашан",shop:"supermarket"},name:"Ашан",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Верный":{tags:{name:"Верный",shop:"supermarket"},name:"Верный",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Вопак":{tags:{name:"Вопак",shop:"supermarket"},name:"Вопак",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Гроздь":{tags:{name:"Гроздь",shop:"supermarket"},name:"Гроздь",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Десяточка":{tags:{name:"Десяточка",shop:"supermarket"},name:"Десяточка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Дикси":{tags:{name:"Дикси",shop:"supermarket"},name:"Дикси",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Евроопт":{tags:{name:"Евроопт",shop:"supermarket"},name:"Евроопт",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Карусель":{tags:{name:"Карусель",shop:"supermarket"},name:"Карусель",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Квартал":{tags:{name:"Квартал",shop:"supermarket"},name:"Квартал",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Командор":{tags:{name:"Командор",shop:"supermarket"},name:"Командор",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Красный Яр":{tags:{name:"Красный Яр",shop:"supermarket"},name:"Красный Яр",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Лента":{tags:{name:"Лента",shop:"supermarket"},name:"Лента",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Магнит":{tags:{name:"Магнит",shop:"supermarket"},name:"Магнит",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Магнолия":{tags:{name:"Магнолия",shop:"supermarket"},name:"Магнолия",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Монетка":{tags:{name:"Монетка",shop:"supermarket"},name:"Монетка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Народная 7Я семьЯ":{tags:{name:"Народная 7Я семьЯ",shop:"supermarket"},name:"Народная 7Я семьЯ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Перекресток":{tags:{name:"Перекресток",shop:"supermarket"},name:"Перекресток",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Покупочка":{tags:{name:"Покупочка",shop:"supermarket"},name:"Покупочка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Полушка":{tags:{name:"Полушка",shop:"supermarket"},name:"Полушка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Пятёрочка":{tags:{name:"Пятёрочка",shop:"supermarket"},name:"Пятёрочка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Радеж":{tags:{name:"Радеж",shop:"supermarket"},name:"Радеж",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Рукавичка":{tags:{name:"Рукавичка",shop:"supermarket"},name:"Рукавичка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Светофор":{tags:{name:"Светофор",shop:"supermarket"},name:"Светофор",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Седьмой континент":{tags:{name:"Седьмой континент",shop:"supermarket"},name:"Седьмой континент",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Семейный":{tags:{name:"Семейный",shop:"supermarket"},name:"Семейный",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Семья":{tags:{name:"Семья",shop:"supermarket"},name:"Семья",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Супермаркет":{tags:{name:"Супермаркет",shop:"supermarket"},name:"Супермаркет",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Сільпо":{tags:{name:"Сільпо",shop:"supermarket"},name:"Сільпо",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Таврія‑В":{tags:{name:"Таврія‑В",shop:"supermarket"},name:"Таврія‑В",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Фора":{tags:{name:"Фора",shop:"supermarket"},name:"Фора",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Фуршет":{tags:{name:"Фуршет",shop:"supermarket"},name:"Фуршет",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Хүнсний дэлгүүр":{tags:{name:"Хүнсний дэлгүүр",shop:"supermarket"},name:"Хүнсний дэлгүүр",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Эдельвейс":{tags:{name:"Эдельвейс",shop:"supermarket"},name:"Эдельвейс",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/хүнсний дэлгүүр":{tags:{name:"хүнсний дэлгүүр",shop:"supermarket"},name:"хүнсний дэлгүүр",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/بقالة":{tags:{name:"بقالة",shop:"supermarket"},name:"بقالة",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/سوپر مارکت":{tags:{name:"سوپر مارکت",shop:"supermarket"},name:"سوپر مارکت",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/سوپرمارکت":{tags:{name:"سوپرمارکت",shop:"supermarket"},name:"سوپرمارکت",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/いなげや":{tags:{name:"いなげや",shop:"supermarket"},name:"いなげや",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/まいばすけっと":{tags:{name:"まいばすけっと",shop:"supermarket"},name:"まいばすけっと",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/イオン":{tags:{name:"イオン",shop:"supermarket"},name:"イオン",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/イトーヨーカドー":{tags:{name:"イトーヨーカドー",shop:"supermarket"},name:"イトーヨーカドー",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/カスミ":{tags:{name:"カスミ",shop:"supermarket"},name:"カスミ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/マックスバリュ":{tags:{name:"マックスバリュ",shop:"supermarket"},name:"マックスバリュ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/マルエツ":{tags:{name:"マルエツ",shop:"supermarket"},name:"マルエツ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ライフ":{tags:{name:"ライフ",shop:"supermarket"},name:"ライフ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/全聯":{tags:{name:"全聯",shop:"supermarket"},name:"全聯",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/全聯福利中心":{tags:{name:"全聯福利中心",shop:"supermarket"},name:"全聯福利中心",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/惠康 Wellcome":{tags:{name:"惠康 Wellcome",shop:"supermarket"},name:"惠康 Wellcome",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/業務スーパー":{tags:{name:"業務スーパー",shop:"supermarket"},name:"業務スーパー",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/美廉社":{tags:{name:"美廉社",shop:"supermarket"},name:"美廉社",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/西友":{tags:{name:"西友",shop:"supermarket"},name:"西友",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tailor/Atelier de couture":{tags:{name:"Atelier de couture",shop:"tailor"},name:"Atelier de couture",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/ticket/Boutique Grandes Lignes":{tags:{name:"Boutique Grandes Lignes",shop:"ticket"},name:"Boutique Grandes Lignes",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/ticket/Guichet Transilien":{tags:{name:"Guichet Transilien",shop:"ticket"},name:"Guichet Transilien",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/ticket/Касса":{tags:{name:"Касса",shop:"ticket"},name:"Касса",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/ticket/Проездные билеты":{tags:{name:"Проездные билеты",shop:"ticket"},name:"Проездные билеты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tobacco/Dohánybolt":{tags:{name:"Dohánybolt",shop:"tobacco"},name:"Dohánybolt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tobacco/Estanco":{tags:{name:"Estanco",shop:"tobacco"},name:"Estanco",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tobacco/Nemzeti Dohánybolt":{tags:{name:"Nemzeti Dohánybolt",shop:"tobacco"},name:"Nemzeti Dohánybolt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tobacco/Tabacos":{tags:{name:"Tabacos",shop:"tobacco"},name:"Tabacos",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tobacco/Табакерка":{tags:{name:"Табакерка",shop:"tobacco"},name:"Табакерка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Dráčik":{tags:{name:"Dráčik",shop:"toys"},name:"Dráčik",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Intertoys":{tags:{name:"Intertoys",shop:"toys"},name:"Intertoys",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/King Jouet":{tags:{name:"King Jouet",shop:"toys"},name:"King Jouet",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/La Grande Récré":{tags:{name:"La Grande Récré",shop:"toys"},name:"La Grande Récré",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Maxi Toys":{tags:{name:"Maxi Toys",shop:"toys"},name:"Maxi Toys",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Toys R Us":{tags:{name:"Toys R Us",shop:"toys"},name:"Toys R Us",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Детский мир":{tags:{name:"Детский мир",shop:"toys"},name:"Детский мир",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Игрушки":{tags:{name:"Игрушки",shop:"toys"},name:"Игрушки",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/D-reizen":{tags:{name:"D-reizen",shop:"travel_agency"},name:"D-reizen",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/DER Reisebüro":{tags:{name:"DER Reisebüro",shop:"travel_agency"},name:"DER Reisebüro",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/First Reisebüro":{tags:{name:"First Reisebüro",shop:"travel_agency"},name:"First Reisebüro",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/Flight Centre":{tags:{name:"Flight Centre",shop:"travel_agency"},name:"Flight Centre",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/Reiseland":{tags:{name:"Reiseland",shop:"travel_agency"},name:"Reiseland",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/TUI":{tags:{name:"TUI",shop:"travel_agency"},name:"TUI",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/The Co-operative Travel":{tags:{name:"The Co-operative Travel",shop:"travel_agency"},name:"The Co-operative Travel",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/Thomas Cook":{tags:{name:"Thomas Cook",shop:"travel_agency"},name:"Thomas Cook",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/Thomson":{tags:{name:"Thomson",shop:"travel_agency"},name:"Thomson",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Borracharia":{tags:{name:"Borracharia",shop:"tyres"},name:"Borracharia",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Bridgestone":{tags:{name:"Bridgestone",shop:"tyres"},name:"Bridgestone",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Discount Tire":{tags:{name:"Discount Tire",shop:"tyres"},name:"Discount Tire",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Les Schwab Tire Center":{tags:{name:"Les Schwab Tire Center",shop:"tyres"},name:"Les Schwab Tire Center",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Vianor":{tags:{name:"Vianor",shop:"tyres"},name:"Vianor",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Вулканизация":{tags:{name:"Вулканизация",shop:"tyres"},name:"Вулканизация",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Action":{tags:{name:"Action",shop:"variety_store"},name:"Action",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Bazar":{tags:{name:"Bazar",shop:"variety_store"},name:"Bazar",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Big Bazar":{tags:{name:"Big Bazar",shop:"variety_store"},name:"Big Bazar",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Dollar Tree":{tags:{name:"Dollar Tree",shop:"variety_store"},name:"Dollar Tree",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Dollarama":{tags:{name:"Dollarama",shop:"variety_store"},name:"Dollarama",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/EuroShop":{tags:{name:"EuroShop",shop:"variety_store"},name:"EuroShop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Family Dollar":{tags:{name:"Family Dollar",shop:"variety_store"},name:"Family Dollar",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Fix Price":{tags:{name:"Fix Price",shop:"variety_store"},name:"Fix Price",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Fix price":{tags:{name:"Fix price",shop:"variety_store"},name:"Fix price",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/FixPrice":{tags:{name:"FixPrice",shop:"variety_store"},name:"FixPrice",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/GiFi":{tags:{name:"GiFi",shop:"variety_store"},name:"GiFi",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Home Bargains":{tags:{name:"Home Bargains",shop:"variety_store"},name:"Home Bargains",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Mäc-Geiz":{tags:{name:"Mäc-Geiz",shop:"variety_store"},name:"Mäc-Geiz",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/NOZ":{tags:{name:"NOZ",shop:"variety_store"},name:"NOZ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Poundland":{tags:{name:"Poundland",shop:"variety_store"},name:"Poundland",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Poundworld":{tags:{name:"Poundworld",shop:"variety_store"},name:"Poundworld",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Tedi":{tags:{name:"Tedi",shop:"variety_store"},name:"Tedi",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/ダイソー":{tags:{name:"ダイソー",shop:"variety_store"},name:"ダイソー",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video/Blockbuster":{tags:{name:"Blockbuster",shop:"video"},name:"Blockbuster",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video/Family Video":{tags:{name:"Family Video",shop:"video"},name:"Family Video",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video/TSUTAYA":{tags:{name:"TSUTAYA",shop:"video"},name:"TSUTAYA",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video/World of Video":{tags:{name:"World of Video",shop:"video"},name:"World of Video",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video/ゲオ":{tags:{name:"ゲオ",shop:"video"},name:"ゲオ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video_games/EB Games":{tags:{name:"EB Games",shop:"video_games"},name:"EB Games",icon:"maki-gaming",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video_games/Game":{tags:{name:"Game",shop:"video_games"},name:"Game",icon:"maki-gaming",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video_games/GameStop":{tags:{name:"GameStop",shop:"video_games"},name:"GameStop",icon:"maki-gaming",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video_games/Micromania":{tags:{name:"Micromania",shop:"video_games"},name:"Micromania",icon:"maki-gaming",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"tourism/alpine_hut/КОШ":{tags:{name:"КОШ",tourism:"alpine_hut"},name:"КОШ",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/apartment/Двухкомнатная квартира на сутки":{tags:{name:"Двухкомнатная квартира на сутки",tourism:"apartment"},name:"Двухкомнатная квартира на сутки",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/attraction/Arch":{tags:{name:"Arch",tourism:"attraction"},name:"Arch",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Kursächsische Postmeilensäule":{tags:{name:"Kursächsische Postmeilensäule",tourism:"attraction"},name:"Kursächsische Postmeilensäule",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Maibaum":{tags:{name:"Maibaum",tourism:"attraction"},name:"Maibaum",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Moab trail":{tags:{name:"Moab trail",tourism:"attraction"},name:"Moab trail",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Moai":{tags:{name:"Moai",tourism:"attraction"},name:"Moai",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/OWŚ":{tags:{name:"OWŚ",tourism:"attraction"},name:"OWŚ",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Sommerrodelbahn":{tags:{name:"Sommerrodelbahn",tourism:"attraction"},name:"Sommerrodelbahn",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/path contiunes":{tags:{name:"path contiunes",tourism:"attraction"},name:"path contiunes",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/white blaze":{tags:{name:"white blaze",tourism:"attraction"},name:"white blaze",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Кладбище еврейское":{tags:{name:"Кладбище еврейское",tourism:"attraction"},name:"Кладбище еврейское",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Колесо обозрения":{tags:{name:"Колесо обозрения",tourism:"attraction"},name:"Колесо обозрения",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Приусадебный парк":{tags:{name:"Приусадебный парк",tourism:"attraction"},name:"Приусадебный парк",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Усадьба":{tags:{name:"Усадьба",tourism:"attraction"},name:"Усадьба",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Хозяйственный двор":{tags:{name:"Хозяйственный двор",tourism:"attraction"},name:"Хозяйственный двор",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Часовня":{tags:{name:"Часовня",tourism:"attraction"},name:"Часовня",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/дольмен":{tags:{name:"дольмен",tourism:"attraction"},name:"дольмен",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/camp_site/Camping Municipal":{tags:{name:"Camping Municipal",tourism:"camp_site"},name:"Camping Municipal",icon:"maki-campsite",geometry:["point","vertex","area"],fields:["name","operator","address","access_simple","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/camp_site/Camping municipal":{tags:{name:"Camping municipal",tourism:"camp_site"},name:"Camping municipal",icon:"maki-campsite",geometry:["point","vertex","area"],fields:["name","operator","address","access_simple","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/guest_house/Home":{tags:{name:"Home",tourism:"guest_house"},name:"Home",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/guest_house/OW Bielanka":{tags:{name:"OW Bielanka",tourism:"guest_house"},name:"OW Bielanka",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hostel/Albergue de Peregrinos":{tags:{name:"Albergue de Peregrinos",tourism:"hostel"},name:"Albergue de Peregrinos",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hostel/Hospedaje":{tags:{name:"Hospedaje",tourism:"hostel"},name:"Hospedaje",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hostel/Hostal":{tags:{name:"Hostal",tourism:"hostel"},name:"Hostal",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/B&B Hôtel":{tags:{name:"B&B Hôtel",tourism:"hotel"},name:"B&B Hôtel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/B&b Hôtel":{tags:{name:"B&b Hôtel",tourism:"hotel"},name:"B&b Hôtel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Best Western":{tags:{name:"Best Western",tourism:"hotel"},name:"Best Western",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Campanile":{tags:{name:"Campanile",tourism:"hotel"},name:"Campanile",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Central Hotel":{tags:{name:"Central Hotel",tourism:"hotel"},name:"Central Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/City Hotel":{tags:{name:"City Hotel",tourism:"hotel"},name:"City Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Comfort Inn":{tags:{name:"Comfort Inn",tourism:"hotel"},name:"Comfort Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Comfort Inn & Suites":{tags:{name:"Comfort Inn & Suites",tourism:"hotel"},name:"Comfort Inn & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Comfort Suites":{tags:{name:"Comfort Suites",tourism:"hotel"},name:"Comfort Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Country Inn & Suites":{tags:{name:"Country Inn & Suites",tourism:"hotel"},name:"Country Inn & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Courtyard by Marriott":{tags:{name:"Courtyard by Marriott",tourism:"hotel"},name:"Courtyard by Marriott",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Crowne Plaza":{tags:{name:"Crowne Plaza",tourism:"hotel"},name:"Crowne Plaza",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Days Inn":{tags:{name:"Days Inn",tourism:"hotel"},name:"Days Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Embassy Suites":{tags:{name:"Embassy Suites",tourism:"hotel"},name:"Embassy Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Extended Stay America":{tags:{name:"Extended Stay America",tourism:"hotel"},name:"Extended Stay America",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Fairfield Inn":{tags:{name:"Fairfield Inn",tourism:"hotel"},name:"Fairfield Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Fairfield Inn & Suites":{tags:{name:"Fairfield Inn & Suites",tourism:"hotel"},name:"Fairfield Inn & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Formule 1":{tags:{name:"Formule 1",tourism:"hotel"},name:"Formule 1",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Grand Hotel":{tags:{name:"Grand Hotel",tourism:"hotel"},name:"Grand Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hampton Inn":{tags:{name:"Hampton Inn",tourism:"hotel"},name:"Hampton Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hampton Inn & Suites":{tags:{name:"Hampton Inn & Suites",tourism:"hotel"},name:"Hampton Inn & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hilton Garden Inn":{tags:{name:"Hilton Garden Inn",tourism:"hotel"},name:"Hilton Garden Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Holiday Inn":{tags:{name:"Holiday Inn",tourism:"hotel"},name:"Holiday Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Holiday Inn Express":{tags:{name:"Holiday Inn Express",tourism:"hotel"},name:"Holiday Inn Express",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Holiday Inn Express & Suites":{tags:{name:"Holiday Inn Express & Suites",tourism:"hotel"},name:"Holiday Inn Express & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Homewood Suites":{tags:{name:"Homewood Suites",tourism:"hotel"},name:"Homewood Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Central":{tags:{name:"Hotel Central",tourism:"hotel"},name:"Hotel Central",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Europa":{tags:{name:"Hotel Europa",tourism:"hotel"},name:"Hotel Europa",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Ibis":{tags:{name:"Hotel Ibis",tourism:"hotel"},name:"Hotel Ibis",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Krone":{tags:{name:"Hotel Krone",tourism:"hotel"},name:"Hotel Krone",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Panorama":{tags:{name:"Hotel Panorama",tourism:"hotel"},name:"Hotel Panorama",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Plaza":{tags:{name:"Hotel Plaza",tourism:"hotel"},name:"Hotel Plaza",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Post":{tags:{name:"Hotel Post",tourism:"hotel"},name:"Hotel Post",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Royal":{tags:{name:"Hotel Royal",tourism:"hotel"},name:"Hotel Royal",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Victoria":{tags:{name:"Hotel Victoria",tourism:"hotel"},name:"Hotel Victoria",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel zur Post":{tags:{name:"Hotel zur Post",tourism:"hotel"},name:"Hotel zur Post",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hôtel Ibis":{tags:{name:"Hôtel Ibis",tourism:"hotel"},name:"Hôtel Ibis",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hôtel de France":{tags:{name:"Hôtel de France",tourism:"hotel"},name:"Hôtel de France",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Ibis":{tags:{name:"Ibis",tourism:"hotel"},name:"Ibis",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Ibis Budget":{tags:{name:"Ibis Budget",tourism:"hotel"},name:"Ibis Budget",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Ibis Styles":{tags:{name:"Ibis Styles",tourism:"hotel"},name:"Ibis Styles",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Kyriad":{tags:{name:"Kyriad",tourism:"hotel"},name:"Kyriad",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/La Quinta":{tags:{name:"La Quinta",tourism:"hotel"},name:"La Quinta",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Marriott":{tags:{name:"Marriott",tourism:"hotel"},name:"Marriott",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Mercure":{tags:{name:"Mercure",tourism:"hotel"},name:"Mercure",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Novotel":{tags:{name:"Novotel",tourism:"hotel"},name:"Novotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Palace Hotel":{tags:{name:"Palace Hotel",tourism:"hotel"},name:"Palace Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Park Hotel":{tags:{name:"Park Hotel",tourism:"hotel"},name:"Park Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Parkhotel":{tags:{name:"Parkhotel",tourism:"hotel"},name:"Parkhotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Premier Inn":{tags:{name:"Premier Inn",tourism:"hotel"},name:"Premier Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Première Classe":{tags:{name:"Première Classe",tourism:"hotel"},name:"Première Classe",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Quality Inn":{tags:{name:"Quality Inn",tourism:"hotel"},name:"Quality Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Quality Inn & Suites":{tags:{name:"Quality Inn & Suites",tourism:"hotel"},name:"Quality Inn & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Ramada":{tags:{name:"Ramada",tourism:"hotel"},name:"Ramada",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Residence Inn":{tags:{name:"Residence Inn",tourism:"hotel"},name:"Residence Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Royal Hotel":{tags:{name:"Royal Hotel",tourism:"hotel"},name:"Royal Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Sheraton":{tags:{name:"Sheraton",tourism:"hotel"},name:"Sheraton",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Sleep Inn":{tags:{name:"Sleep Inn",tourism:"hotel"},name:"Sleep Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Staybridge Suites":{tags:{name:"Staybridge Suites",tourism:"hotel"},name:"Staybridge Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Super 8":{tags:{name:"Super 8",tourism:"hotel"},name:"Super 8",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Travelodge":{tags:{name:"Travelodge",tourism:"hotel"},name:"Travelodge",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Гостиница":{tags:{name:"Гостиница",tourism:"hotel"},name:"Гостиница",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/東横イン":{tags:{name:"東横イン",tourism:"hotel"},name:"東横イン",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/motel/Budget Inn":{tags:{name:"Budget Inn",tourism:"motel"},name:"Budget Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/motel/Econo Lodge":{tags:{name:"Econo Lodge",tourism:"motel"},name:"Econo Lodge",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/motel/Motel 6":{tags:{name:"Motel 6",tourism:"motel"},name:"Motel 6",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/motel/Rodeway Inn":{tags:{name:"Rodeway Inn",tourism:"motel"},name:"Rodeway Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/museum/Heimatmuseum":{tags:{name:"Heimatmuseum",tourism:"museum"},name:"Heimatmuseum",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"tourism/museum/Stadtmuseum":{tags:{name:"Stadtmuseum",tourism:"museum"},name:"Stadtmuseum",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"tourism/museum/Tájház":{tags:{name:"Tájház",tourism:"museum"},name:"Tájház",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"tourism/museum/Краеведческий музей":{tags:{name:"Краеведческий музей",tourism:"museum"},name:"Краеведческий музей",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"tourism/museum/Музей":{tags:{name:"Музей",tourism:"museum"},name:"Музей",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true}};
23659
23660   var defaults = {area:["category-landuse","category-building","category-water-area","category-natural-area","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","area"],line:["category-road","category-rail","category-path","category-water-line","category-barrier","category-natural-line","power/line","line"],point:["category-natural-point","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","amenity/fast_food","amenity/bar","amenity/bank","shop/supermarket","point"],vertex:["highway/crosswalk","highway/crossing","railway/level_crossing","highway/traffic_signals","highway/turning_circle","highway/turning_loop","traffic_calming","highway/mini_roundabout","highway/motorway_junction","vertex"],relation:["category-route","category-restriction","public_transport/stop_area","type/boundary","type/waterway","type/multipolygon","type/site","relation"]};
23661
23662   var categories = {"category-barrier":{icon:"maki-roadblock",geometry:"line",name:"Barrier Features",members:["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{icon:"maki-building",geometry:"area",name:"Building Features",members:["building","building/house","building/apartments","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf":{icon:"maki-golf",geometry:"area",name:"Golf Features",members:["golf/fairway","golf/green","golf/lateral_water_hazard_area","golf/rough","golf/bunker","golf/tee","golf/water_hazard_area"]},"category-landuse":{icon:"maki-landuse",geometry:"area",name:"Land Use Features",members:["landuse/residential","landuse/industrial","landuse/commercial","landuse/retail","landuse/farmland","landuse/farmyard","landuse/forest","landuse/meadow","landuse/aquaculture","landuse/cemetery","landuse/military","landuse/religious"]},"category-natural-area":{icon:"maki-natural",geometry:"area",name:"Natural Features",members:["natural/water","natural/wood","natural/scrub","natural/wetland","natural/grassland","natural/heath","natural/bare_rock","natural/beach","natural/cave_entrance","natural/glacier"]},"category-natural-line":{icon:"maki-natural",geometry:"line",name:"Natural Features",members:["natural/coastline","natural/tree_row"]},"category-natural-point":{icon:"maki-natural",geometry:"point",name:"Natural Features",members:["natural/peak","natural/cliff","natural/beach","natural/cave_entrance"]},"category-path":{icon:"iD-category-path",geometry:"line",name:"Path Features",members:["footway/crosswalk","footway/sidewalk","highway/steps","highway/path","highway/footway","highway/cycleway","highway/bridleway","highway/pedestrian_line"]},"category-rail":{icon:"iD-category-rail",geometry:"line",name:"Rail Features",members:["railway/rail","railway/subway","railway/tram","railway/monorail","railway/disused","railway/abandoned"]},"category-restriction":{icon:"iD-restriction",geometry:"relation",name:"Restriction Features",members:["type/restriction/no_left_turn","type/restriction/no_right_turn","type/restriction/no_straight_on","type/restriction/no_u_turn","type/restriction/only_left_turn","type/restriction/only_right_turn","type/restriction/only_straight_on","type/restriction/only_u_turn","type/restriction"]},"category-road":{icon:"iD-category-roads",geometry:"line",name:"Road Features",members:["highway/residential","highway/motorway","highway/trunk","highway/primary","highway/secondary","highway/tertiary","highway/living_street","highway/unclassified","highway/service","highway/track","highway/motorway_link","highway/trunk_link","highway/primary_link","highway/secondary_link","highway/tertiary_link","highway/road"]},"category-route":{icon:"iD-route",geometry:"relation",name:"Route Features",members:["type/route/road","type/route/bicycle","type/route/foot","type/route/hiking","type/route/horse","type/route/piste","type/route/bus","type/route/train","type/route/light_rail","type/route/tram","type/route/subway","type/route/ferry","type/route/power","type/route/pipeline","type/route/detour","type/route_master","type/route"]},"category-water-area":{icon:"maki-water",geometry:"area",name:"Water Features",members:["natural/water/lake","natural/water/pond","natural/water/reservoir","natural/water"]},"category-water-line":{icon:"iD-category-water",geometry:"line",name:"Water Features",members:["waterway/river","waterway/stream","waterway/canal","waterway/ditch","waterway/drain"]}};
23663
23664   var fields = {access_simple:{key:"access",type:"combo",label:"Allowed Access",options:["yes","permissive","private","customers","permit","no"]},access:{keys:["access","foot","motor_vehicle","bicycle","horse"],reference:{key:"access"},type:"access",label:"Allowed Access",placeholder:"Not Specified",strings:{types:{access:"All",foot:"Foot",motor_vehicle:"Motor Vehicles",bicycle:"Bicycles",horse:"Horses"},options:{yes:{title:"Allowed",description:"Access allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}}},address:{type:"address",keys:["addr:block_number","addr:city","addr:block_number","addr:conscriptionnumber","addr:county","addr:country","addr:county","addr:district","addr:floor","addr:hamlet","addr:housename","addr:housenumber","addr:neighbourhood","addr:place","addr:postcode","addr:province","addr:quarter","addr:state","addr:street","addr:subdistrict","addr:suburb","addr:unit"],reference:{key:"addr"},icon:"address",universal:true,label:"Address",strings:{placeholders:{block_number:"Block Number","block_number!jp":"Block No.",city:"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town",conscriptionnumber:"123",country:"Country",county:"County","county!jp":"District",district:"District","district!vn":"Arrondissement/Town/District",floor:"Floor",hamlet:"Hamlet",housename:"Housename",housenumber:"123","housenumber!jp":"Building No./Lot No.",neighbourhood:"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza",place:"Place",postcode:"Postcode",province:"Province","province!jp":"Prefecture",quarter:"Quarter","quarter!jp":"Ōaza/Machi",state:"State",street:"Street",subdistrict:"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet",suburb:"Suburb","suburb!jp":"Ward",unit:"Unit"}}},admin_level:{key:"admin_level",type:"number",minValue:1,label:"Admin Level"},aerialway:{key:"aerialway",type:"typeCombo",label:"Type"},"aerialway/access":{key:"aerialway:access",type:"combo",label:"Access",strings:{options:{entry:"Entry",exit:"Exit",both:"Both"}}},"aerialway/bubble":{key:"aerialway:bubble",type:"check",label:"Bubble"},"aerialway/capacity":{key:"aerialway:capacity",type:"number",minValue:0,label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{key:"aerialway:duration",type:"number",minValue:0,label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{key:"aerialway:heating",type:"check",label:"Heated"},"aerialway/occupancy":{key:"aerialway:occupancy",type:"number",minValue:0,label:"Occupancy",placeholder:"2, 4, 8..."},"aerialway/summer/access":{key:"aerialway:summer:access",type:"combo",label:"Access (summer)",strings:{options:{entry:"Entry",exit:"Exit",both:"Both"}}},aeroway:{key:"aeroway",type:"typeCombo",label:"Type"},agrarian:{key:"agrarian",type:"semiCombo",label:"Products"},amenity:{key:"amenity",type:"typeCombo",label:"Type"},animal_boarding:{key:"animal_boarding",type:"semiCombo",label:"For Animals"},animal_breeding:{key:"animal_breeding",type:"semiCombo",label:"For Animals"},animal_shelter:{key:"animal_shelter",type:"semiCombo",label:"For Animals"},"area/highway":{key:"area:highway",type:"typeCombo",label:"Type"},artist:{key:"artist_name",type:"text",label:"Artist"},artwork_type:{key:"artwork_type",type:"combo",label:"Type"},atm:{key:"atm",type:"check",label:"ATM"},backrest:{key:"backrest",type:"check",label:"Backrest"},barrier:{key:"barrier",type:"typeCombo",label:"Type"},"bath/open_air":{key:"bath:open_air",label:"Open Air",type:"check"},"bath/sand_bath":{key:"bath:sand_bath",label:"Sand Bath",type:"check"},"bath/type":{key:"bath:type",type:"combo",label:"Specialty",strings:{options:{onsen:"Japanese Onsen",foot_bath:"Foot Bath",hot_spring:"Hot Spring"}}},beauty:{key:"beauty",type:"combo",label:"Shop Type"},bench:{key:"bench",type:"check",label:"Bench"},bicycle_parking:{key:"bicycle_parking",type:"combo",label:"Type"},bin:{key:"bin",type:"check",label:"Waste Bin"},blood_components:{key:"blood:",type:"multiCombo",label:"Blood Components",strings:{options:{whole:"whole blood",plasma:"plasma",platelets:"platelets",stemcells:"stem cell samples"}}},board_type:{key:"board_type",type:"typeCombo",label:"Type"},booth:{key:"booth",type:"combo",label:"Booth",caseSensitive:true},boules:{key:"boules",type:"typeCombo",label:"Type"},boundary:{key:"boundary",type:"combo",label:"Type"},brand:{key:"brand",type:"text",label:"Brand"},brewery:{key:"brewery",type:"semiCombo",label:"Draft Beers"},bridge:{key:"bridge",type:"typeCombo",label:"Type",placeholder:"Default"},building_area:{key:"building",type:"combo","default":"yes",geometry:"area",label:"Building"},building:{key:"building",type:"combo",label:"Building"},bunker_type:{key:"bunker_type",type:"combo",label:"Type"},cables:{key:"cables",type:"number",minValue:1,label:"Cables",placeholder:"1, 2, 3..."},"camera/direction":{key:"camera:direction",type:"number",label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},"camera/mount":{key:"camera:mount",type:"combo",label:"Camera Mount"},"camera/type":{key:"camera:type",type:"combo",label:"Camera Type",strings:{options:{fixed:"Fixed",panning:"Panning",dome:"Dome"}}},capacity:{key:"capacity",type:"number",minValue:0,label:"Capacity",placeholder:"50, 100, 200..."},cash_in:{key:"cash_in",type:"check",label:"Cash In"},castle_type:{key:"castle_type",type:"combo",label:"Type"},clothes:{key:"clothes",type:"semiCombo",label:"Clothes"},club:{key:"club",type:"typeCombo",label:"Type"},collection_times:{key:"collection_times",type:"text",label:"Collection Times"},comment:{key:"comment",type:"textarea",label:"Changeset Comment",placeholder:"Brief description of your contributions (required)"},communication_multi:{key:"communication:",type:"multiCombo",label:"Communication Types"},construction:{key:"construction",type:"combo",label:"Type"},"contact/webcam":{key:"contact:webcam",type:"url",icon:"website",label:"Webcam URL",placeholder:"http://example.com/"},content:{key:"content",type:"combo",label:"Content",options:["silage","water","oil","fuel","slurry","gas","manure","sewage"]},country:{key:"country",type:"combo",label:"Country"},covered:{key:"covered",type:"check",label:"Covered"},craft:{key:"craft",type:"typeCombo",label:"Type"},"crane/type":{key:"crane:type",type:"combo",label:"Crane Type",strings:{options:{portal_crane:"Portal Crane","floor-mounted_crane":"Floor-mounted Crane",travel_lift:"Travel Lift"}}},crop:{key:"crop",type:"semiCombo",label:"Crops"},crossing:{key:"crossing",type:"combo",label:"Type"},cuisine:{key:"cuisine",type:"semiCombo",label:"Cuisines"},currency_multi:{key:"currency:",type:"multiCombo",label:"Currency Types"},cutting:{key:"cutting",type:"typeCombo",label:"Type",placeholder:"Default"},cycle_network:{key:"cycle_network",type:"networkCombo",label:"Network"},cycleway:{keys:["cycleway:left","cycleway:right"],reference:{key:"cycleway"},type:"cycleway",label:"Bike Lanes",placeholder:"none",strings:{types:{"cycleway:left":"Left side","cycleway:right":"Right side"},options:{none:{title:"None",description:"No bike lane"},lane:{title:"Standard bike lane",description:"A bike lane separated from auto traffic by a painted line"},shared_lane:{title:"Shared bike lane",description:"A bike lane with no separation from auto traffic"},track:{title:"Bike track",description:"A bike lane separated from traffic by a physical barrier"},share_busway:{title:"Bike lane shared with bus",description:"A bike lane shared with a bus lane"},opposite_lane:{title:"Opposite bike lane",description:"A bike lane that travels in the opposite direction of traffic"},opposite:{title:"Contraflow bike lane",description:"A bike lane that travels in both directions on a one-way street"}}}},"dance/style":{key:"dance:style",type:"semiCombo",label:"Dance Styles"},date:{key:"date",type:"check",label:"Date"},delivery:{key:"delivery",type:"check",label:"Delivery"},denomination:{key:"denomination",type:"combo",label:"Denomination"},denotation:{key:"denotation",type:"combo",label:"Denotation"},description:{key:"description",type:"textarea",label:"Description",universal:true},devices:{key:"devices",type:"number",minValue:0,label:"Devices",placeholder:"1, 2, 3..."},diaper:{key:"diaper",type:"combo",label:"Diaper Changing Available",options:["yes","no","room","1","2","3","4","5"]},direction_cardinal:{key:"direction",type:"combo",label:"Direction",strings:{options:{N:"North",E:"East",S:"South",W:"West",NE:"Northeast",SE:"Southeast",SW:"Southwest",NW:"Northwest",NNE:"North-northeast",ENE:"East-northeast",ESE:"East-southeast",SSE:"South-southeast",SSW:"South-southwest",WSW:"West-southwest",WNW:"West-northwest",NNW:"North-northwest"}}},direction_clock:{key:"direction",type:"combo",label:"Direction",strings:{options:{clockwise:"Clockwise",anticlockwise:"Counterclockwise"}}},direction_vertex:{key:"direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},direction:{key:"direction",type:"number",label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},dispensing:{key:"dispensing",type:"check",label:"Dispenses Prescriptions","default":"yes"},display:{key:"display",type:"combo",label:"Display",options:["analog","digital","sundial","unorthodox"]},distance:{key:"distance",type:"text",label:"Total Distance"},dock:{key:"dock",type:"combo",label:"Type"},drive_through:{key:"drive_through",type:"check",label:"Drive-Through"},duration:{key:"duration",type:"text",label:"Duration",placeholder:"00:00"},electrified:{key:"electrified",type:"combo",label:"Electrification",placeholder:"Contact Line, Electrified Rail...",strings:{options:{contact_line:"Contact Line",rail:"Electrified Rail",yes:"Yes (unspecified)",no:"No"}}},elevation:{key:"ele",type:"number",icon:"elevation",universal:true,label:"Elevation"},email:{key:"email",type:"email",placeholder:"example@example.com",universal:true,label:"Email"},embankment:{key:"embankment",type:"typeCombo",label:"Type",placeholder:"Default"},emergency:{key:"emergency",type:"check",label:"Emergency"},entrance:{key:"entrance",type:"typeCombo",label:"Type"},except:{key:"except",type:"combo",label:"Exceptions"},faces:{key:"faces",type:"number",minValue:0,label:"Faces"},fax:{key:"fax",type:"tel",label:"Fax",universal:true,placeholder:"+31 42 123 4567"},fee:{key:"fee",type:"check",label:"Fee"},fence_type:{key:"fence_type",type:"combo",label:"Type"},"fire_hydrant/position":{key:"fire_hydrant:position",type:"combo",label:"Position",strings:{options:{lane:"Lane",parking_lot:"Parking Lot",sidewalk:"Sidewalk",green:"Green"}}},"fire_hydrant/type":{key:"fire_hydrant:type",type:"combo",label:"Type",strings:{options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pond:"Pond"}}},fitness_station:{key:"fitness_station",type:"typeCombo",label:"Equipment Type"},fixme:{key:"fixme",type:"textarea",label:"Fix Me",universal:true},ford:{key:"ford",type:"typeCombo",label:"Type",placeholder:"Default"},frequency:{key:"frequency",type:"combo",label:"Operating Frequency"},fuel_multi:{key:"fuel:",type:"multiCombo",label:"Fuel Types"},fuel:{key:"fuel",type:"combo",label:"Fuel"},gauge:{key:"gauge",type:"combo",label:"Gauge"},gender:{type:"radio",keys:["male","female","unisex"],label:"Gender",placeholder:"Unknown",strings:{options:{male:"Male",female:"Female",unisex:"Unisex"}}},"generator/method":{key:"generator:method",type:"combo",label:"Method"},"generator/output/electricity":{key:"generator:output:electricity",type:"text",label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW..."},"generator/source":{key:"generator:source",type:"combo",label:"Source"},"generator/type":{key:"generator:type",type:"combo",label:"Type"},government:{key:"government",type:"typeCombo",label:"Type"},grape_variety:{key:"grape_variety",type:"semiCombo",label:"Grape Varieties"},handicap:{key:"handicap",type:"number",label:"Handicap",placeholder:"1-18"},handrail:{key:"handrail",type:"check",label:"Handrail"},hashtags:{key:"hashtags",type:"semiCombo",label:"Suggested Hashtags",placeholder:"#example"},healthcare:{key:"healthcare",type:"typeCombo",label:"Type"},"healthcare/speciality":{key:"healthcare:speciality",type:"semiCombo",reference:{key:"healthcare"},label:"Specialties"},height:{key:"height",minValue:0,type:"number",label:"Height (Meters)"},highway:{key:"highway",type:"typeCombo",label:"Type"},historic:{key:"historic",type:"typeCombo",label:"Type"},"historic/civilization":{key:"historic:civilization",type:"combo",label:"Historic Civilization"},hoops:{key:"hoops",type:"number",minValue:0,label:"Hoops",placeholder:"1, 2, 4..."},horse_dressage:{key:"sport",type:"check",label:"Dressage Riding",strings:{options:{"undefined":"No",equestrian:"Yes"}},reference:{key:"sport",value:"equestrian"}},horse_riding:{key:"leisure",type:"check",label:"Horseback Riding",strings:{options:{"undefined":"No",horse_riding:"Yes"}},reference:{key:"leisure",value:"horse_riding"}},horse_scale:{key:"horse_scale",type:"combo",label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",strings:{options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}}},horse_stables:{key:"amenity",type:"check",label:"Riding Stable",strings:{options:{"undefined":"No",stables:"Yes"}},reference:{key:"amenity",value:"stables"}},iata:{key:"iata",type:"text",label:"IATA"},icao:{key:"icao",type:"text",label:"ICAO"},incline_steps:{key:"incline",type:"combo",label:"Incline",strings:{options:{up:"Up",down:"Down"}}},incline:{key:"incline",type:"combo",label:"Incline"},indoor:{key:"indoor",type:"check",label:"Indoor"},industrial:{key:"industrial",type:"combo",label:"Type"},information:{key:"information",type:"typeCombo",label:"Type"},inscription:{key:"inscription",type:"textarea",label:"Inscription"},intermittent:{key:"intermittent",type:"check",label:"Intermittent"},internet_access:{key:"internet_access",type:"combo",label:"Internet Access",strings:{options:{yes:"Yes",no:"No",wlan:"Wifi",wired:"Wired",terminal:"Terminal"}}},"internet_access/fee":{key:"internet_access:fee",type:"check",label:"Internet Access Fee"},"internet_access/ssid":{key:"internet_access:ssid",type:"text",label:"SSID (Network Name)"},kerb:{key:"kerb",type:"combo",label:"Curb"},label:{key:"label",type:"textarea",label:"Label"},lamp_type:{key:"lamp_type",type:"combo",label:"Type"},landuse:{key:"landuse",type:"typeCombo",label:"Type"},lanes:{key:"lanes",type:"number",minValue:0,label:"Lanes",placeholder:"1, 2, 3..."},layer:{key:"layer",type:"number",label:"Layer",placeholder:"0"},leaf_cycle_singular:{key:"leaf_cycle",type:"combo",label:"Leaf Cycle",strings:{options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous"}}},leaf_cycle:{key:"leaf_cycle",type:"combo",label:"Leaf Cycle",strings:{options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous",mixed:"Mixed"}}},leaf_type_singular:{key:"leaf_type",type:"combo",label:"Leaf Type",strings:{options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",leafless:"Leafless"}}},leaf_type:{key:"leaf_type",type:"combo",label:"Leaf Type",strings:{options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",mixed:"Mixed",leafless:"Leafless"}}},leisure:{key:"leisure",type:"typeCombo",label:"Type"},length:{key:"length",type:"number",minValue:0,label:"Length (Meters)"},level:{key:"level",type:"combo",label:"Level",universal:true},levels:{key:"building:levels",type:"number",minValue:0,label:"Levels",placeholder:"2, 4, 6..."},lit:{key:"lit",type:"check",label:"Lit"},location:{key:"location",type:"combo",label:"Location"},man_made:{key:"man_made",type:"typeCombo",label:"Type"},manhole:{key:"manhole",type:"typeCombo",label:"Type"},map_size:{key:"map_size",type:"typeCombo",label:"Coverage"},map_type:{key:"map_type",type:"typeCombo",label:"Type"},maxheight:{key:"maxheight",type:"combo",label:"Max Height",placeholder:"4, 4.5, 5, 14'0\", 14'6\", 15'0\"",snake_case:false},maxspeed:{key:"maxspeed",type:"maxspeed",label:"Speed Limit",placeholder:"40, 50, 60..."},"maxspeed/advisory":{key:"maxspeed:advisory",type:"maxspeed",label:"Advisory Speed Limit",placeholder:"40, 50, 60..."},maxstay:{key:"maxstay",type:"combo",label:"Max Stay",options:["15 min","30 min","45 min","1 hr","1.5 hr","2 hr","2.5 hr","3 hr","4 hr","1 day","2 day"],snake_case:false},maxweight:{key:"maxweight",type:"combo",label:"Max Weight",snake_case:false},memorial:{key:"memorial",type:"typeCombo",label:"Type"},monitoring_multi:{key:"monitoring:",type:"multiCombo",label:"Monitoring"},"mtb/scale":{key:"mtb:scale",type:"combo",label:"Mountain Biking Difficulty",placeholder:"0, 1, 2, 3...",strings:{options:{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}}},"mtb/scale/imba":{key:"mtb:scale:imba",type:"combo",label:"IMBA Trail Difficulty",placeholder:"Easy, Medium, Difficult...",strings:{options:{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}}},"mtb/scale/uphill":{key:"mtb:scale:uphill",type:"combo",label:"Mountain Biking Uphill Difficulty",placeholder:"0, 1, 2, 3...",strings:{options:{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}}},name:{key:"name",type:"localized",label:"Name",universal:true,placeholder:"Common name (if any)"},natural:{key:"natural",type:"typeCombo",label:"Natural"},network_bicycle:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lcn:"Local",rcn:"Regional",ncn:"National",icn:"International"}}},network_foot:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lwn:"Local",rwn:"Regional",nwn:"National",iwn:"International"}}},network_horse:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lhn:"Local",rhn:"Regional",nhn:"National",ihn:"International"}}},network_road:{key:"network",type:"networkCombo",label:"Network"},network:{key:"network",type:"text",label:"Network"},note:{key:"note",type:"textarea",universal:true,icon:"note",label:"Note"},office:{key:"office",type:"typeCombo",label:"Type"},oneway_yes:{key:"oneway",type:"onewayCheck",label:"One Way",strings:{options:{"undefined":"Assumed to be Yes",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}}},oneway:{key:"oneway",type:"onewayCheck",label:"One Way",strings:{options:{"undefined":"Assumed to be No",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}}},opening_hours:{key:"opening_hours",type:"combo",label:"Hours",snake_case:false},operator:{key:"operator",type:"text",label:"Operator"},outdoor_seating:{key:"outdoor_seating",type:"check",label:"Outdoor Seating"},par:{key:"par",type:"number",minValue:1,label:"Par",placeholder:"3, 4, 5..."},park_ride:{key:"park_ride",type:"check",label:"Park and Ride"},parking:{key:"parking",type:"combo",label:"Type",strings:{options:{surface:"Surface","multi-storey":"Multilevel",underground:"Underground",sheds:"Sheds",carports:"Carports",garage_boxes:"Garage Boxes",lane:"Roadside Lane"}}},passenger_information_display:{key:"passenger_information_display",type:"check",label:"Passenger information display"},payment_multi:{key:"payment:",type:"multiCombo",label:"Payment Types",universal:true},phases:{key:"phases",type:"number",minValue:1,label:"Phases",placeholder:"1, 2, 3..."},phone:{key:"phone",type:"tel",icon:"maki-telephone",universal:true,label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice (instructional)",easy:"Easy (green circle)",intermediate:"Intermediate (blue square)",advanced:"Advanced (black diamond)",expert:"Expert (double black diamond)",freeride:"Freeride (off-piste)",extreme:"Extreme (climbing equipment required)"}}},"piste/grooming":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"piste/type":{key:"piste:type",type:"typeCombo",label:"Type",strings:{options:{downhill:"Downhill",nordic:"Nordic",skitour:"Skitour",sled:"Sled",hike:"Hike",sleigh:"Sleigh",ice_skate:"Ice Skate",snow_park:"Snow Park",playground:"Playground"}}},place:{key:"place",type:"typeCombo",label:"Type"},plant:{key:"plant",type:"combo",label:"Plant"},"plant/output/electricity":{key:"plant:output:electricity",type:"text",label:"Power Output",placeholder:"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{key:"baby",type:"check",label:"Baby Seat"},"playground/max_age":{key:"max_age",type:"number",minValue:0,label:"Maximum Age"},"playground/min_age":{key:"min_age",type:"number",minValue:0,label:"Minimum Age"},population:{key:"population",type:"text",label:"Population"},power_supply:{key:"power_supply",type:"check",label:"Power Supply"},power:{key:"power",type:"typeCombo",label:"Type"},produce:{key:"produce",type:"semiCombo",label:"Produce"},product:{key:"product",type:"semiCombo",label:"Products"},railway:{key:"railway",type:"typeCombo",label:"Type"},"railway/position":{key:"railway:position",type:"text",placeholder:"Distance to one decimal (123.4)",label:"Milestone Position"},"railway/signal/direction":{key:"railway:signal:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},rating:{key:"rating",type:"combo",label:"Power Rating",snake_case:false},recycling_accepts:{key:"recycling:",type:"multiCombo",label:"Accepts"},ref_aeroway_gate:{key:"ref",type:"text",label:"Gate Number"},ref_golf_hole:{key:"ref",type:"text",label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{key:"ref",type:"text",label:"Junction Number"},ref_platform:{key:"ref",type:"text",label:"Platform Number"},ref_road_number:{key:"ref",type:"text",label:"Road Number"},ref_route:{key:"ref",type:"text",label:"Route Number"},ref_runway:{key:"ref",type:"text",label:"Runway Number",placeholder:"e.g. 01L/19R"},ref_stop_position:{key:"ref",type:"text",label:"Stop Number"},ref_taxiway:{key:"ref",type:"text",label:"Taxiway Name",placeholder:"e.g. A5"},ref:{key:"ref",type:"text",label:"Reference Code"},"ref/isil":{key:"ref:isil",type:"text",label:"ISIL Code"},relation:{key:"type",type:"combo",label:"Type"},religion:{key:"religion",type:"combo",label:"Religion"},restriction:{key:"restriction",type:"combo",label:"Type"},restrictions:{type:"restrictions",geometry:"vertex",icon:"iD-restrictions",reference:{rtype:"restriction"},label:"Turn Restrictions"},rooms:{key:"rooms",type:"number",minValue:0,label:"Rooms"},route_master:{key:"route_master",type:"combo",label:"Type"},route:{key:"route",type:"combo",label:"Type"},sac_scale:{key:"sac_scale",type:"combo",label:"Hiking Difficulty",placeholder:"Mountain Hiking, Alpine Hiking...",strings:{options:{hiking:"T1: Hiking",mountain_hiking:"T2: Mountain Hiking",demanding_mountain_hiking:"T3: Demanding Mountain Hiking",alpine_hiking:"T4: Alpine Hiking",demanding_alpine_hiking:"T5: Demanding Alpine Hiking",difficult_alpine_hiking:"T6: Difficult Alpine Hiking"}}},sanitary_dump_station:{key:"sanitary_dump_station",type:"check",label:"Toilet Disposal"},seasonal:{key:"seasonal",type:"check",label:"Seasonal"},second_hand:{key:"second_hand",type:"combo",label:"Sells Used",placeholder:"Yes, No, Only",strings:{options:{yes:"Yes",no:"No",only:"Only"}}},service_rail:{key:"service",type:"combo",label:"Service Type",strings:{options:{spur:"Spur",yard:"Yard",siding:"Siding",crossover:"Crossover"}}},service_times:{key:"service_times",type:"text",label:"Service Times"},service:{key:"service",type:"combo",label:"Type",options:["parking_aisle","driveway","alley","emergency_access","drive-through"]},"service/bicycle":{key:"service:bicycle:",type:"multiCombo",label:"Services"},"service/vehicle":{key:"service:vehicle:",type:"multiCombo",label:"Services"},shelter_type:{key:"shelter_type",type:"combo",label:"Type"},shelter:{key:"shelter",type:"check",label:"Shelter"},shop:{key:"shop",type:"typeCombo",label:"Type"},"siren/purpose":{key:"siren:purpose",type:"combo",label:"Purpose"},"siren/type":{key:"siren:type",type:"combo",label:"Type",strings:{options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}}},site_type:{key:"site_type",type:"combo",label:"Site Type"},site:{key:"site",type:"combo",label:"Type"},smoking:{key:"smoking",type:"combo",label:"Smoking",placeholder:"No, Separated, Yes...",strings:{options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}}},smoothness:{key:"smoothness",type:"combo",label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",strings:{options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}}},social_facility_for:{key:"social_facility:for",type:"combo",label:"People Served"},social_facility:{key:"social_facility",type:"combo",label:"Type"},source:{key:"source",type:"semiCombo",icon:"source",universal:true,label:"Sources",snake_case:false,caseSensitive:true,options:["survey","local knowledge","gps","aerial imagery","streetlevel imagery"]},sport_ice:{key:"sport",type:"semiCombo",label:"Sports",options:["skating","hockey","multi","curling","ice_stock"]},sport_racing_motor:{key:"sport",type:"semiCombo",label:"Sports",options:["motor","karting","motocross"]},sport_racing_nonmotor:{key:"sport",type:"semiCombo",label:"Sports",options:["bmx","cycling","dog_racing","horse_racing","running"]},sport:{key:"sport",type:"semiCombo",label:"Sports"},stars:{key:"stars",type:"combo",label:"Stars"},start_date:{key:"start_date",type:"text",universal:true,label:"Start Date"},step_count:{key:"step_count",type:"number",minValue:0,label:"Number of Steps"},stop:{key:"stop",type:"combo",label:"Stop Type",strings:{options:{all:"All Ways",minor:"Minor Road"}}},structure_waterway:{type:"structureRadio",keys:["tunnel"],label:"Structure",placeholder:"Unknown",strings:{options:{tunnel:"Tunnel"}}},structure:{type:"structureRadio",keys:["bridge","tunnel","embankment","cutting","ford"],label:"Structure",placeholder:"Unknown",strings:{options:{bridge:"Bridge",tunnel:"Tunnel",embankment:"Embankment",cutting:"Cutting",ford:"Ford"}}},studio:{key:"studio",type:"combo",label:"Type"},substance:{key:"substance",type:"combo",label:"Substance"},substation:{key:"substation",type:"typeCombo",label:"Type"},supervised:{key:"supervised",type:"check",label:"Supervised"},support:{key:"support",type:"combo",label:"Support"},surface:{key:"surface",type:"combo",label:"Surface"},surveillance:{key:"surveillance",type:"combo",label:"Surveillance Kind"},"surveillance/type":{key:"surveillance:type",type:"combo",label:"Surveillance Type",strings:{options:{camera:"Camera",guard:"Guard",ALPR:"Automatic License Plate Reader"}}},"surveillance/zone":{key:"surveillance:zone",type:"combo",label:"Surveillance Zone"},"switch":{key:"switch",type:"combo",label:"Type",strings:{options:{mechanical:"Mechanical",circuit_breaker:"Circuit Breaker",disconnector:"Disconnector",earthing:"Earthing"}}},tactile_paving:{key:"tactile_paving",type:"check",label:"Tactile Paving"},takeaway:{key:"takeaway",type:"combo",label:"Takeaway",placeholder:"Yes, No, Takeaway Only...",strings:{options:{yes:"Yes",no:"No",only:"Takeaway Only"}}},"toilets/disposal":{key:"toilets:disposal",type:"combo",label:"Disposal",strings:{options:{flush:"Flush",pitlatrine:"Pit/Latrine",chemical:"Chemical",bucket:"Bucket"}}},toll:{key:"toll",type:"check",label:"Toll"},tomb:{key:"tomb",type:"typeCombo",label:"Type"},tourism_attraction:{key:"tourism","default":"attraction",type:"typeCombo",universal:true,label:"Tourism"},tourism:{key:"tourism",type:"typeCombo",label:"Type"},"tower/construction":{key:"tower:construction",type:"combo",label:"Construction",placeholder:"Guyed, Lattice, Concealed, ..."},"tower/type":{key:"tower:type",type:"combo",label:"Type"},tracktype:{key:"tracktype",type:"combo",label:"Track Type",placeholder:"Solid, Mostly Solid, Soft...",strings:{options:{grade1:"Solid: paved or heavily compacted hardcore surface",grade2:"Mostly Solid: gravel/rock with some soft material mixed in",grade3:"Even mixture of hard and soft materials",grade4:"Mostly Soft: soil/sand/grass with some hard material mixed in",grade5:"Soft: soil/sand/grass"}}},trade:{key:"trade",type:"typeCombo",label:"Type"},traffic_calming:{key:"traffic_calming",type:"typeCombo",label:"Type"},traffic_signals:{key:"traffic_signals",type:"combo",label:"Type","default":"signal"},"traffic_signals/direction":{key:"traffic_signals:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},trail_visibility:{key:"trail_visibility",type:"combo",label:"Trail Visibility",placeholder:"Excellent, Good, Bad...",strings:{options:{excellent:"Excellent: unambiguous path or markers everywhere",good:"Good: markers visible, sometimes require searching",intermediate:"Intermediate: few markers, path mostly visible",bad:"Bad: no markers, path sometimes invisible/pathless",horrible:"Horrible: often pathless, some orientation skills required",no:"No: pathless, excellent orientation skills required"}}},transformer:{key:"transformer",type:"combo",label:"Type",strings:{options:{distribution:"Distribution",generator:"Generator",converter:"Converter",traction:"Traction",auto:"Autotransformer",phase_angle_regulator:"Phase Angle Regulator",auxiliary:"Auxiliary",yes:"Unknown"}}},trees:{key:"trees",type:"semiCombo",label:"Trees"},tunnel:{key:"tunnel",type:"typeCombo",label:"Type",placeholder:"Default"},usage_rail:{key:"usage",type:"combo",label:"Usage Type",strings:{options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}}},vending:{key:"vending",type:"semiCombo",label:"Types of Goods"},visibility:{key:"visibility",type:"combo",label:"Visibility",strings:{options:{house:"Up to 5m (16ft)",street:"5 to 20m (16 to 65ft)",area:"Over 20m (65ft)"}}},"volcano/status":{key:"volcano:status",type:"combo",label:"Volcano Status",strings:{options:{active:"Active",dormant:"Dormant",extinct:"Extinct"}}},"volcano/type":{key:"volcano:type",type:"combo",label:"Volcano Type",strings:{options:{stratovolcano:"Stratovolcano",shield:"Shield",scoria:"Scoria"}}},voltage:{key:"voltage",type:"combo",label:"Voltage"},"voltage/primary":{key:"voltage:primary",type:"combo",label:"Primary Voltage"},"voltage/secondary":{key:"voltage:secondary",type:"combo",label:"Secondary Voltage"},"voltage/tertiary":{key:"voltage:tertiary",type:"combo",label:"Tertiary Voltage"},wall:{key:"wall",type:"combo",label:"Type"},water_point:{key:"water_point",type:"check",label:"Water Point"},water:{key:"water",type:"combo",label:"Type"},waterway:{key:"waterway",type:"typeCombo",label:"Type"},website:{key:"website",type:"url",icon:"website",placeholder:"http://example.com/",universal:true,label:"Website"},wetland:{key:"wetland",type:"combo",label:"Type"},wheelchair:{key:"wheelchair",type:"radio",options:["yes","limited","no"],icon:"maki-wheelchair",universal:true,label:"Wheelchair Access"},wholesale:{key:"wholesale",type:"typeCombo",label:"Wholesale"},width:{key:"width",type:"number",minValue:0,label:"Width (Meters)"},wikipedia:{key:"wikipedia",keys:["wikipedia","wikidata"],type:"wikipedia",icon:"wikipedia",universal:true,label:"Wikipedia"},windings:{key:"windings",type:"number",minValue:1,label:"Windings",placeholder:"1, 2, 3..."},"windings/configuration":{key:"windings:configuration",type:"combo",label:"Windings Configuration",strings:{options:{star:"Star / Wye",delta:"Delta","open-delta":"Open Delta",zigzag:"Zig Zag",open:"Open",scott:"Scott",leblanc:"Leblanc"}}}};
23665
23666   var quickselect_1 = quickselect;
23667   var default_1 = quickselect;
23668
23669   function quickselect(arr, k, left, right, compare) {
23670       quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
23671   }
23672   function quickselectStep(arr, k, left, right, compare) {
23673
23674       while (right > left) {
23675           if (right - left > 600) {
23676               var n = right - left + 1;
23677               var m = k - left + 1;
23678               var z = Math.log(n);
23679               var s = 0.5 * Math.exp(2 * z / 3);
23680               var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
23681               var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
23682               var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
23683               quickselectStep(arr, k, newLeft, newRight, compare);
23684           }
23685
23686           var t = arr[k];
23687           var i = left;
23688           var j = right;
23689
23690           swap(arr, left, k);
23691           if (compare(arr[right], t) > 0) swap(arr, left, right);
23692
23693           while (i < j) {
23694               swap(arr, i, j);
23695               i++;
23696               j--;
23697               while (compare(arr[i], t) < 0) i++;
23698               while (compare(arr[j], t) > 0) j--;
23699           }
23700
23701           if (compare(arr[left], t) === 0) swap(arr, left, j);
23702           else {
23703               j++;
23704               swap(arr, j, right);
23705           }
23706
23707           if (j <= k) left = j + 1;
23708           if (k <= j) right = j - 1;
23709       }
23710   }
23711
23712   function swap(arr, i, j) {
23713       var tmp = arr[i];
23714       arr[i] = arr[j];
23715       arr[j] = tmp;
23716   }
23717
23718   function defaultCompare(a, b) {
23719       return a < b ? -1 : a > b ? 1 : 0;
23720   }
23721   quickselect_1.default = default_1;
23722
23723   var quickselect$1 = /*#__PURE__*/Object.freeze({
23724     default: quickselect_1,
23725     __moduleExports: quickselect_1
23726   });
23727
23728   var quickselect$2 = ( quickselect$1 && quickselect_1 ) || quickselect$1;
23729
23730   var rbush_1 = rbush;
23731   var default_1$1 = rbush;
23732
23733
23734
23735   function rbush(maxEntries, format) {
23736       if (!(this instanceof rbush)) return new rbush(maxEntries, format);
23737
23738       // max entries in a node is 9 by default; min node fill is 40% for best performance
23739       this._maxEntries = Math.max(4, maxEntries || 9);
23740       this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
23741
23742       if (format) {
23743           this._initFormat(format);
23744       }
23745
23746       this.clear();
23747   }
23748
23749   rbush.prototype = {
23750
23751       all: function () {
23752           return this._all(this.data, []);
23753       },
23754
23755       search: function (bbox) {
23756
23757           var node = this.data,
23758               result = [],
23759               toBBox = this.toBBox;
23760
23761           if (!intersects$1(bbox, node)) return result;
23762
23763           var nodesToSearch = [],
23764               i, len, child, childBBox;
23765
23766           while (node) {
23767               for (i = 0, len = node.children.length; i < len; i++) {
23768
23769                   child = node.children[i];
23770                   childBBox = node.leaf ? toBBox(child) : child;
23771
23772                   if (intersects$1(bbox, childBBox)) {
23773                       if (node.leaf) result.push(child);
23774                       else if (contains$2(bbox, childBBox)) this._all(child, result);
23775                       else nodesToSearch.push(child);
23776                   }
23777               }
23778               node = nodesToSearch.pop();
23779           }
23780
23781           return result;
23782       },
23783
23784       collides: function (bbox) {
23785
23786           var node = this.data,
23787               toBBox = this.toBBox;
23788
23789           if (!intersects$1(bbox, node)) return false;
23790
23791           var nodesToSearch = [],
23792               i, len, child, childBBox;
23793
23794           while (node) {
23795               for (i = 0, len = node.children.length; i < len; i++) {
23796
23797                   child = node.children[i];
23798                   childBBox = node.leaf ? toBBox(child) : child;
23799
23800                   if (intersects$1(bbox, childBBox)) {
23801                       if (node.leaf || contains$2(bbox, childBBox)) return true;
23802                       nodesToSearch.push(child);
23803                   }
23804               }
23805               node = nodesToSearch.pop();
23806           }
23807
23808           return false;
23809       },
23810
23811       load: function (data) {
23812           if (!(data && data.length)) return this;
23813
23814           if (data.length < this._minEntries) {
23815               for (var i = 0, len = data.length; i < len; i++) {
23816                   this.insert(data[i]);
23817               }
23818               return this;
23819           }
23820
23821           // recursively build the tree with the given data from scratch using OMT algorithm
23822           var node = this._build(data.slice(), 0, data.length - 1, 0);
23823
23824           if (!this.data.children.length) {
23825               // save as is if tree is empty
23826               this.data = node;
23827
23828           } else if (this.data.height === node.height) {
23829               // split root if trees have the same height
23830               this._splitRoot(this.data, node);
23831
23832           } else {
23833               if (this.data.height < node.height) {
23834                   // swap trees if inserted one is bigger
23835                   var tmpNode = this.data;
23836                   this.data = node;
23837                   node = tmpNode;
23838               }
23839
23840               // insert the small tree into the large tree at appropriate level
23841               this._insert(node, this.data.height - node.height - 1, true);
23842           }
23843
23844           return this;
23845       },
23846
23847       insert: function (item) {
23848           if (item) this._insert(item, this.data.height - 1);
23849           return this;
23850       },
23851
23852       clear: function () {
23853           this.data = createNode([]);
23854           return this;
23855       },
23856
23857       remove: function (item, equalsFn) {
23858           if (!item) return this;
23859
23860           var node = this.data,
23861               bbox = this.toBBox(item),
23862               path = [],
23863               indexes = [],
23864               i, parent, index, goingUp;
23865
23866           // depth-first iterative tree traversal
23867           while (node || path.length) {
23868
23869               if (!node) { // go up
23870                   node = path.pop();
23871                   parent = path[path.length - 1];
23872                   i = indexes.pop();
23873                   goingUp = true;
23874               }
23875
23876               if (node.leaf) { // check current node
23877                   index = findItem(item, node.children, equalsFn);
23878
23879                   if (index !== -1) {
23880                       // item found, remove the item and condense tree upwards
23881                       node.children.splice(index, 1);
23882                       path.push(node);
23883                       this._condense(path);
23884                       return this;
23885                   }
23886               }
23887
23888               if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
23889                   path.push(node);
23890                   indexes.push(i);
23891                   i = 0;
23892                   parent = node;
23893                   node = node.children[0];
23894
23895               } else if (parent) { // go right
23896                   i++;
23897                   node = parent.children[i];
23898                   goingUp = false;
23899
23900               } else node = null; // nothing found
23901           }
23902
23903           return this;
23904       },
23905
23906       toBBox: function (item) { return item; },
23907
23908       compareMinX: compareNodeMinX,
23909       compareMinY: compareNodeMinY,
23910
23911       toJSON: function () { return this.data; },
23912
23913       fromJSON: function (data) {
23914           this.data = data;
23915           return this;
23916       },
23917
23918       _all: function (node, result) {
23919           var nodesToSearch = [];
23920           while (node) {
23921               if (node.leaf) result.push.apply(result, node.children);
23922               else nodesToSearch.push.apply(nodesToSearch, node.children);
23923
23924               node = nodesToSearch.pop();
23925           }
23926           return result;
23927       },
23928
23929       _build: function (items, left, right, height) {
23930
23931           var N = right - left + 1,
23932               M = this._maxEntries,
23933               node;
23934
23935           if (N <= M) {
23936               // reached leaf level; return leaf
23937               node = createNode(items.slice(left, right + 1));
23938               calcBBox(node, this.toBBox);
23939               return node;
23940           }
23941
23942           if (!height) {
23943               // target height of the bulk-loaded tree
23944               height = Math.ceil(Math.log(N) / Math.log(M));
23945
23946               // target number of root entries to maximize storage utilization
23947               M = Math.ceil(N / Math.pow(M, height - 1));
23948           }
23949
23950           node = createNode([]);
23951           node.leaf = false;
23952           node.height = height;
23953
23954           // split the items into M mostly square tiles
23955
23956           var N2 = Math.ceil(N / M),
23957               N1 = N2 * Math.ceil(Math.sqrt(M)),
23958               i, j, right2, right3;
23959
23960           multiSelect(items, left, right, N1, this.compareMinX);
23961
23962           for (i = left; i <= right; i += N1) {
23963
23964               right2 = Math.min(i + N1 - 1, right);
23965
23966               multiSelect(items, i, right2, N2, this.compareMinY);
23967
23968               for (j = i; j <= right2; j += N2) {
23969
23970                   right3 = Math.min(j + N2 - 1, right2);
23971
23972                   // pack each entry recursively
23973                   node.children.push(this._build(items, j, right3, height - 1));
23974               }
23975           }
23976
23977           calcBBox(node, this.toBBox);
23978
23979           return node;
23980       },
23981
23982       _chooseSubtree: function (bbox, node, level, path) {
23983
23984           var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
23985
23986           while (true) {
23987               path.push(node);
23988
23989               if (node.leaf || path.length - 1 === level) break;
23990
23991               minArea = minEnlargement = Infinity;
23992
23993               for (i = 0, len = node.children.length; i < len; i++) {
23994                   child = node.children[i];
23995                   area = bboxArea(child);
23996                   enlargement = enlargedArea(bbox, child) - area;
23997
23998                   // choose entry with the least area enlargement
23999                   if (enlargement < minEnlargement) {
24000                       minEnlargement = enlargement;
24001                       minArea = area < minArea ? area : minArea;
24002                       targetNode = child;
24003
24004                   } else if (enlargement === minEnlargement) {
24005                       // otherwise choose one with the smallest area
24006                       if (area < minArea) {
24007                           minArea = area;
24008                           targetNode = child;
24009                       }
24010                   }
24011               }
24012
24013               node = targetNode || node.children[0];
24014           }
24015
24016           return node;
24017       },
24018
24019       _insert: function (item, level, isNode) {
24020
24021           var toBBox = this.toBBox,
24022               bbox = isNode ? item : toBBox(item),
24023               insertPath = [];
24024
24025           // find the best node for accommodating the item, saving all nodes along the path too
24026           var node = this._chooseSubtree(bbox, this.data, level, insertPath);
24027
24028           // put the item into the node
24029           node.children.push(item);
24030           extend$1(node, bbox);
24031
24032           // split on node overflow; propagate upwards if necessary
24033           while (level >= 0) {
24034               if (insertPath[level].children.length > this._maxEntries) {
24035                   this._split(insertPath, level);
24036                   level--;
24037               } else break;
24038           }
24039
24040           // adjust bboxes along the insertion path
24041           this._adjustParentBBoxes(bbox, insertPath, level);
24042       },
24043
24044       // split overflowed node into two
24045       _split: function (insertPath, level) {
24046
24047           var node = insertPath[level],
24048               M = node.children.length,
24049               m = this._minEntries;
24050
24051           this._chooseSplitAxis(node, m, M);
24052
24053           var splitIndex = this._chooseSplitIndex(node, m, M);
24054
24055           var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
24056           newNode.height = node.height;
24057           newNode.leaf = node.leaf;
24058
24059           calcBBox(node, this.toBBox);
24060           calcBBox(newNode, this.toBBox);
24061
24062           if (level) insertPath[level - 1].children.push(newNode);
24063           else this._splitRoot(node, newNode);
24064       },
24065
24066       _splitRoot: function (node, newNode) {
24067           // split root node
24068           this.data = createNode([node, newNode]);
24069           this.data.height = node.height + 1;
24070           this.data.leaf = false;
24071           calcBBox(this.data, this.toBBox);
24072       },
24073
24074       _chooseSplitIndex: function (node, m, M) {
24075
24076           var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
24077
24078           minOverlap = minArea = Infinity;
24079
24080           for (i = m; i <= M - m; i++) {
24081               bbox1 = distBBox(node, 0, i, this.toBBox);
24082               bbox2 = distBBox(node, i, M, this.toBBox);
24083
24084               overlap = intersectionArea(bbox1, bbox2);
24085               area = bboxArea(bbox1) + bboxArea(bbox2);
24086
24087               // choose distribution with minimum overlap
24088               if (overlap < minOverlap) {
24089                   minOverlap = overlap;
24090                   index = i;
24091
24092                   minArea = area < minArea ? area : minArea;
24093
24094               } else if (overlap === minOverlap) {
24095                   // otherwise choose distribution with minimum area
24096                   if (area < minArea) {
24097                       minArea = area;
24098                       index = i;
24099                   }
24100               }
24101           }
24102
24103           return index;
24104       },
24105
24106       // sorts node children by the best axis for split
24107       _chooseSplitAxis: function (node, m, M) {
24108
24109           var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
24110               compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
24111               xMargin = this._allDistMargin(node, m, M, compareMinX),
24112               yMargin = this._allDistMargin(node, m, M, compareMinY);
24113
24114           // if total distributions margin value is minimal for x, sort by minX,
24115           // otherwise it's already sorted by minY
24116           if (xMargin < yMargin) node.children.sort(compareMinX);
24117       },
24118
24119       // total margin of all possible split distributions where each node is at least m full
24120       _allDistMargin: function (node, m, M, compare) {
24121
24122           node.children.sort(compare);
24123
24124           var toBBox = this.toBBox,
24125               leftBBox = distBBox(node, 0, m, toBBox),
24126               rightBBox = distBBox(node, M - m, M, toBBox),
24127               margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
24128               i, child;
24129
24130           for (i = m; i < M - m; i++) {
24131               child = node.children[i];
24132               extend$1(leftBBox, node.leaf ? toBBox(child) : child);
24133               margin += bboxMargin(leftBBox);
24134           }
24135
24136           for (i = M - m - 1; i >= m; i--) {
24137               child = node.children[i];
24138               extend$1(rightBBox, node.leaf ? toBBox(child) : child);
24139               margin += bboxMargin(rightBBox);
24140           }
24141
24142           return margin;
24143       },
24144
24145       _adjustParentBBoxes: function (bbox, path, level) {
24146           // adjust bboxes along the given tree path
24147           for (var i = level; i >= 0; i--) {
24148               extend$1(path[i], bbox);
24149           }
24150       },
24151
24152       _condense: function (path) {
24153           // go through the path, removing empty nodes and updating bboxes
24154           for (var i = path.length - 1, siblings; i >= 0; i--) {
24155               if (path[i].children.length === 0) {
24156                   if (i > 0) {
24157                       siblings = path[i - 1].children;
24158                       siblings.splice(siblings.indexOf(path[i]), 1);
24159
24160                   } else this.clear();
24161
24162               } else calcBBox(path[i], this.toBBox);
24163           }
24164       },
24165
24166       _initFormat: function (format) {
24167           // data format (minX, minY, maxX, maxY accessors)
24168
24169           // uses eval-type function compilation instead of just accepting a toBBox function
24170           // because the algorithms are very sensitive to sorting functions performance,
24171           // so they should be dead simple and without inner calls
24172
24173           var compareArr = ['return a', ' - b', ';'];
24174
24175           this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
24176           this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
24177
24178           this.toBBox = new Function('a',
24179               'return {minX: a' + format[0] +
24180               ', minY: a' + format[1] +
24181               ', maxX: a' + format[2] +
24182               ', maxY: a' + format[3] + '};');
24183       }
24184   };
24185
24186   function findItem(item, items, equalsFn) {
24187       if (!equalsFn) return items.indexOf(item);
24188
24189       for (var i = 0; i < items.length; i++) {
24190           if (equalsFn(item, items[i])) return i;
24191       }
24192       return -1;
24193   }
24194
24195   // calculate node's bbox from bboxes of its children
24196   function calcBBox(node, toBBox) {
24197       distBBox(node, 0, node.children.length, toBBox, node);
24198   }
24199
24200   // min bounding rectangle of node children from k to p-1
24201   function distBBox(node, k, p, toBBox, destNode) {
24202       if (!destNode) destNode = createNode(null);
24203       destNode.minX = Infinity;
24204       destNode.minY = Infinity;
24205       destNode.maxX = -Infinity;
24206       destNode.maxY = -Infinity;
24207
24208       for (var i = k, child; i < p; i++) {
24209           child = node.children[i];
24210           extend$1(destNode, node.leaf ? toBBox(child) : child);
24211       }
24212
24213       return destNode;
24214   }
24215
24216   function extend$1(a, b) {
24217       a.minX = Math.min(a.minX, b.minX);
24218       a.minY = Math.min(a.minY, b.minY);
24219       a.maxX = Math.max(a.maxX, b.maxX);
24220       a.maxY = Math.max(a.maxY, b.maxY);
24221       return a;
24222   }
24223
24224   function compareNodeMinX(a, b) { return a.minX - b.minX; }
24225   function compareNodeMinY(a, b) { return a.minY - b.minY; }
24226
24227   function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
24228   function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
24229
24230   function enlargedArea(a, b) {
24231       return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
24232              (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
24233   }
24234
24235   function intersectionArea(a, b) {
24236       var minX = Math.max(a.minX, b.minX),
24237           minY = Math.max(a.minY, b.minY),
24238           maxX = Math.min(a.maxX, b.maxX),
24239           maxY = Math.min(a.maxY, b.maxY);
24240
24241       return Math.max(0, maxX - minX) *
24242              Math.max(0, maxY - minY);
24243   }
24244
24245   function contains$2(a, b) {
24246       return a.minX <= b.minX &&
24247              a.minY <= b.minY &&
24248              b.maxX <= a.maxX &&
24249              b.maxY <= a.maxY;
24250   }
24251
24252   function intersects$1(a, b) {
24253       return b.minX <= a.maxX &&
24254              b.minY <= a.maxY &&
24255              b.maxX >= a.minX &&
24256              b.maxY >= a.minY;
24257   }
24258
24259   function createNode(children) {
24260       return {
24261           children: children,
24262           height: 1,
24263           leaf: true,
24264           minX: Infinity,
24265           minY: Infinity,
24266           maxX: -Infinity,
24267           maxY: -Infinity
24268       };
24269   }
24270
24271   // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
24272   // combines selection algorithm with binary divide & conquer approach
24273
24274   function multiSelect(arr, left, right, n, compare) {
24275       var stack = [left, right],
24276           mid;
24277
24278       while (stack.length) {
24279           right = stack.pop();
24280           left = stack.pop();
24281
24282           if (right - left <= n) continue;
24283
24284           mid = left + Math.ceil((right - left) / n / 2) * n;
24285           quickselect$2(arr, mid, left, right, compare);
24286
24287           stack.push(left, mid, mid, right);
24288       }
24289   }
24290   rbush_1.default = default_1$1;
24291
24292   var lineclip_1 = lineclip;
24293
24294   lineclip.polyline = lineclip;
24295   lineclip.polygon = polygonclip;
24296
24297
24298   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
24299   // handle polylines rather than just segments
24300
24301   function lineclip(points, bbox, result) {
24302
24303       var len = points.length,
24304           codeA = bitCode(points[0], bbox),
24305           part = [],
24306           i, a, b, codeB, lastCode;
24307
24308       if (!result) result = [];
24309
24310       for (i = 1; i < len; i++) {
24311           a = points[i - 1];
24312           b = points[i];
24313           codeB = lastCode = bitCode(b, bbox);
24314
24315           while (true) {
24316
24317               if (!(codeA | codeB)) { // accept
24318                   part.push(a);
24319
24320                   if (codeB !== lastCode) { // segment went outside
24321                       part.push(b);
24322
24323                       if (i < len - 1) { // start a new line
24324                           result.push(part);
24325                           part = [];
24326                       }
24327                   } else if (i === len - 1) {
24328                       part.push(b);
24329                   }
24330                   break;
24331
24332               } else if (codeA & codeB) { // trivial reject
24333                   break;
24334
24335               } else if (codeA) { // a outside, intersect with clip edge
24336                   a = intersect$1(a, b, codeA, bbox);
24337                   codeA = bitCode(a, bbox);
24338
24339               } else { // b outside
24340                   b = intersect$1(a, b, codeB, bbox);
24341                   codeB = bitCode(b, bbox);
24342               }
24343           }
24344
24345           codeA = lastCode;
24346       }
24347
24348       if (part.length) result.push(part);
24349
24350       return result;
24351   }
24352
24353   // Sutherland-Hodgeman polygon clipping algorithm
24354
24355   function polygonclip(points, bbox) {
24356
24357       var result, edge, prev, prevInside, i, p, inside;
24358
24359       // clip against each side of the clip rectangle
24360       for (edge = 1; edge <= 8; edge *= 2) {
24361           result = [];
24362           prev = points[points.length - 1];
24363           prevInside = !(bitCode(prev, bbox) & edge);
24364
24365           for (i = 0; i < points.length; i++) {
24366               p = points[i];
24367               inside = !(bitCode(p, bbox) & edge);
24368
24369               // if segment goes through the clip window, add an intersection
24370               if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
24371
24372               if (inside) result.push(p); // add a point if it's inside
24373
24374               prev = p;
24375               prevInside = inside;
24376           }
24377
24378           points = result;
24379
24380           if (!points.length) break;
24381       }
24382
24383       return result;
24384   }
24385
24386   // intersect a segment against one of the 4 lines that make up the bbox
24387
24388   function intersect$1(a, b, edge, bbox) {
24389       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
24390              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
24391              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
24392              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
24393              null;
24394   }
24395
24396   // bit code reflects the point position relative to the bbox:
24397
24398   //         left  mid  right
24399   //    top  1001  1000  1010
24400   //    mid  0001  0000  0010
24401   // bottom  0101  0100  0110
24402
24403   function bitCode(p, bbox) {
24404       var code = 0;
24405
24406       if (p[0] < bbox[0]) code |= 1; // left
24407       else if (p[0] > bbox[2]) code |= 2; // right
24408
24409       if (p[1] < bbox[1]) code |= 4; // bottom
24410       else if (p[1] > bbox[3]) code |= 8; // top
24411
24412       return code;
24413   }
24414
24415   var lineclip$1 = /*#__PURE__*/Object.freeze({
24416     default: lineclip_1,
24417     __moduleExports: lineclip_1
24418   });
24419
24420   var lineclip$2 = ( lineclip$1 && lineclip_1 ) || lineclip$1;
24421
24422   var whichPolygon_1 = whichPolygon;
24423
24424   function whichPolygon(data) {
24425       var bboxes = [];
24426       for (var i = 0; i < data.features.length; i++) {
24427           var feature = data.features[i];
24428           var coords = feature.geometry.coordinates;
24429
24430           if (feature.geometry.type === 'Polygon') {
24431               bboxes.push(treeItem(coords, feature.properties));
24432
24433           } else if (feature.geometry.type === 'MultiPolygon') {
24434               for (var j = 0; j < coords.length; j++) {
24435                   bboxes.push(treeItem(coords[j], feature.properties));
24436               }
24437           }
24438       }
24439
24440       var tree = rbush_1().load(bboxes);
24441
24442       function query(p, multi) {
24443           var output = [],
24444               result = tree.search({
24445                   minX: p[0],
24446                   minY: p[1],
24447                   maxX: p[0],
24448                   maxY: p[1]
24449               });
24450           for (var i = 0; i < result.length; i++) {
24451               if (insidePolygon(result[i].coords, p)) {
24452                   if (multi)
24453                       output.push(result[i].props);
24454                   else
24455                       return result[i].props;
24456               }
24457           }
24458           return multi && output.length ? output : null;
24459       }
24460
24461       query.tree = tree;
24462       query.bbox = function queryBBox(bbox) {
24463           var output = [];
24464           var result = tree.search({
24465               minX: bbox[0],
24466               minY: bbox[1],
24467               maxX: bbox[2],
24468               maxY: bbox[3]
24469           });
24470           for (var i = 0; i < result.length; i++) {
24471               if (polygonIntersectsBBox(result[i].coords, bbox)) {
24472                   output.push(result[i].props);
24473               }
24474           }
24475           return output;
24476       };
24477
24478       return query;
24479   }
24480
24481   function polygonIntersectsBBox(polygon, bbox) {
24482       var bboxCenter = [
24483           (bbox[0] + bbox[2]) / 2,
24484           (bbox[1] + bbox[3]) / 2
24485       ];
24486       if (insidePolygon(polygon, bboxCenter)) return true;
24487       for (var i = 0; i < polygon.length; i++) {
24488           if (lineclip$2(polygon[i], bbox).length > 0) return true;
24489       }
24490       return false;
24491   }
24492
24493   // ray casting algorithm for detecting if point is in polygon
24494   function insidePolygon(rings, p) {
24495       var inside = false;
24496       for (var i = 0, len = rings.length; i < len; i++) {
24497           var ring = rings[i];
24498           for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
24499               if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
24500           }
24501       }
24502       return inside;
24503   }
24504
24505   function rayIntersect(p, p1, p2) {
24506       return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]);
24507   }
24508
24509   function treeItem(coords, props) {
24510       var item = {
24511           minX: Infinity,
24512           minY: Infinity,
24513           maxX: -Infinity,
24514           maxY: -Infinity,
24515           coords: coords,
24516           props: props
24517       };
24518
24519       for (var i = 0; i < coords[0].length; i++) {
24520           var p = coords[0][i];
24521           item.minX = Math.min(item.minX, p[0]);
24522           item.minY = Math.min(item.minY, p[1]);
24523           item.maxX = Math.max(item.maxX, p[0]);
24524           item.maxY = Math.max(item.maxY, p[1]);
24525       }
24526       return item;
24527   }
24528
24529   // index the osm-community-index
24530   var ociFeatureCollection = values$1(features$2).map(function(feature) {
24531       // workaround for which-polygon: only supports `properties`, not `id`
24532       // https://github.com/mapbox/which-polygon/pull/6
24533       feature.properties = {
24534           id: feature.id,
24535           area: d3_geoArea(feature)   // also precompute areas
24536       };
24537       return feature;
24538   });
24539
24540
24541   var data = {
24542       community: {
24543           features: features$2,
24544           resources: resources,
24545           query: whichPolygon_1({
24546               type: 'FeatureCollection',
24547               features: ociFeatureCollection
24548           })
24549       },
24550       imagery: dataImagery,  //legacy
24551       presets: {
24552           presets: presets,
24553           defaults: defaults,
24554           categories: categories,
24555           fields: fields
24556       }
24557   };
24558
24559   function osmEntity$$1(attrs) {
24560       // For prototypal inheritance.
24561       if (this instanceof osmEntity$$1) return;
24562
24563       // Create the appropriate subtype.
24564       if (attrs && attrs.type) {
24565           return osmEntity$$1[attrs.type].apply(this, arguments);
24566       } else if (attrs && attrs.id) {
24567           return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
24568       }
24569
24570       // Initialize a generic Entity (used only in tests).
24571       return (new osmEntity$$1()).initialize(arguments);
24572   }
24573
24574
24575   osmEntity$$1.id = function(type) {
24576       return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
24577   };
24578
24579
24580   osmEntity$$1.id.next = {
24581       changeset: -1, node: -1, way: -1, relation: -1
24582   };
24583
24584
24585   osmEntity$$1.id.fromOSM = function(type, id) {
24586       return type[0] + id;
24587   };
24588
24589
24590   osmEntity$$1.id.toOSM = function(id) {
24591       return id.slice(1);
24592   };
24593
24594
24595   osmEntity$$1.id.type = function(id) {
24596       return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
24597   };
24598
24599
24600   // A function suitable for use as the second argument to d3.selection#data().
24601   osmEntity$$1.key = function(entity) {
24602       return entity.id + 'v' + (entity.v || 0);
24603   };
24604
24605
24606   osmEntity$$1.prototype = {
24607
24608       tags: {},
24609
24610
24611       initialize: function(sources) {
24612           for (var i = 0; i < sources.length; ++i) {
24613               var source = sources[i];
24614               for (var prop in source) {
24615                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
24616                       if (source[prop] === undefined) {
24617                           delete this[prop];
24618                       } else {
24619                           this[prop] = source[prop];
24620                       }
24621                   }
24622               }
24623           }
24624
24625           if (!this.id && this.type) {
24626               this.id = osmEntity$$1.id(this.type);
24627           }
24628           if (!this.hasOwnProperty('visible')) {
24629               this.visible = true;
24630           }
24631
24632           return this;
24633       },
24634
24635
24636       copy: function(resolver, copies) {
24637           if (copies[this.id])
24638               return copies[this.id];
24639
24640           var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
24641           copies[this.id] = copy;
24642
24643           return copy;
24644       },
24645
24646
24647       osmId: function() {
24648           return osmEntity$$1.id.toOSM(this.id);
24649       },
24650
24651
24652       isNew: function() {
24653           return this.osmId() < 0;
24654       },
24655
24656
24657       update: function(attrs) {
24658           return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
24659       },
24660
24661
24662       mergeTags: function(tags) {
24663           var merged = clone(this.tags), changed = false;
24664           for (var k in tags) {
24665               var t1 = merged[k],
24666                   t2 = tags[k];
24667               if (!t1) {
24668                   changed = true;
24669                   merged[k] = t2;
24670               } else if (t1 !== t2) {
24671                   changed = true;
24672                   merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
24673               }
24674           }
24675           return changed ? this.update({tags: merged}) : this;
24676       },
24677
24678
24679       intersects: function(extent, resolver) {
24680           return this.extent(resolver).intersects(extent);
24681       },
24682
24683
24684       isUsed: function(resolver) {
24685           return without(Object.keys(this.tags), 'area').length > 0 ||
24686               resolver.parentRelations(this).length > 0;
24687       },
24688
24689
24690       hasInterestingTags: function() {
24691           return keys$1(this.tags).some(osmIsInterestingTag);
24692       },
24693
24694
24695       isHighwayIntersection: function() {
24696           return false;
24697       },
24698
24699       isDegenerate: function() {
24700           return true;
24701       },
24702
24703       deprecatedTags: function() {
24704           var tags = toPairs(this.tags);
24705           var deprecated = {};
24706
24707           dataDeprecated.forEach(function(d) {
24708               var match = toPairs(d.old)[0];
24709               tags.forEach(function(t) {
24710                   if (t[0] === match[0] &&
24711                       (t[1] === match[1] || match[1] === '*')) {
24712                       deprecated[t[0]] = t[1];
24713                   }
24714               });
24715           });
24716
24717           return deprecated;
24718       }
24719   };
24720
24721   function geoExtent$$1(min, max) {
24722       if (!(this instanceof geoExtent$$1)) {
24723           return new geoExtent$$1(min, max);
24724       } else if (min instanceof geoExtent$$1) {
24725           return min;
24726       } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
24727           this[0] = min[0];
24728           this[1] = min[1];
24729       } else {
24730           this[0] = min        || [ Infinity,  Infinity];
24731           this[1] = max || min || [-Infinity, -Infinity];
24732       }
24733   }
24734
24735   // $FlowFixMe
24736   geoExtent$$1.prototype = new Array(2);
24737
24738   assignIn(geoExtent$$1.prototype, {
24739
24740       equals: function (obj) {
24741           return this[0][0] === obj[0][0] &&
24742               this[0][1] === obj[0][1] &&
24743               this[1][0] === obj[1][0] &&
24744               this[1][1] === obj[1][1];
24745       },
24746
24747
24748       extend: function(obj) {
24749           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24750           return geoExtent$$1(
24751               [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
24752               [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
24753           );
24754       },
24755
24756
24757       _extend: function(extent) {
24758           this[0][0] = Math.min(extent[0][0], this[0][0]);
24759           this[0][1] = Math.min(extent[0][1], this[0][1]);
24760           this[1][0] = Math.max(extent[1][0], this[1][0]);
24761           this[1][1] = Math.max(extent[1][1], this[1][1]);
24762       },
24763
24764
24765       area: function() {
24766           return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
24767       },
24768
24769
24770       center: function() {
24771           return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
24772       },
24773
24774
24775       rectangle: function() {
24776           return [this[0][0], this[0][1], this[1][0], this[1][1]];
24777       },
24778
24779
24780       bbox: function() {
24781           return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
24782       },
24783
24784
24785       polygon: function() {
24786           return [
24787               [this[0][0], this[0][1]],
24788               [this[0][0], this[1][1]],
24789               [this[1][0], this[1][1]],
24790               [this[1][0], this[0][1]],
24791               [this[0][0], this[0][1]]
24792           ];
24793       },
24794
24795
24796       contains: function(obj) {
24797           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24798           return obj[0][0] >= this[0][0] &&
24799                  obj[0][1] >= this[0][1] &&
24800                  obj[1][0] <= this[1][0] &&
24801                  obj[1][1] <= this[1][1];
24802       },
24803
24804
24805       intersects: function(obj) {
24806           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24807           return obj[0][0] <= this[1][0] &&
24808                  obj[0][1] <= this[1][1] &&
24809                  obj[1][0] >= this[0][0] &&
24810                  obj[1][1] >= this[0][1];
24811       },
24812
24813
24814       intersection: function(obj) {
24815           if (!this.intersects(obj)) return new geoExtent$$1();
24816           return new geoExtent$$1(
24817               [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
24818               [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
24819           );
24820       },
24821
24822
24823       percentContainedIn: function(obj) {
24824           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24825           var a1 = this.intersection(obj).area();
24826           var a2 = this.area();
24827
24828           if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
24829               return 0;
24830           } else {
24831               return a1 / a2;
24832           }
24833       },
24834
24835
24836       padByMeters: function(meters) {
24837           var dLat = geoMetersToLat(meters);
24838           var dLon = geoMetersToLon(meters, this.center()[1]);
24839           return geoExtent$$1(
24840               [this[0][0] - dLon, this[0][1] - dLat],
24841               [this[1][0] + dLon, this[1][1] + dLat]
24842           );
24843       },
24844
24845
24846       toParam: function() {
24847           return this.rectangle().join(',');
24848       }
24849
24850   });
24851
24852   // constants
24853   var TAU = 2 * Math.PI;
24854   var EQUATORIAL_RADIUS = 6356752.314245179;
24855   var POLAR_RADIUS = 6378137.0;
24856
24857
24858   function geoLatToMeters(dLat) {
24859       return dLat * (TAU * POLAR_RADIUS / 360);
24860   }
24861
24862
24863   function geoLonToMeters(dLon, atLat) {
24864       return Math.abs(atLat) >= 90 ? 0 :
24865           dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
24866   }
24867
24868
24869   function geoMetersToLat(m) {
24870       return m / (TAU * POLAR_RADIUS / 360);
24871   }
24872
24873
24874   function geoMetersToLon(m, atLat) {
24875       return Math.abs(atLat) >= 90 ? 0 :
24876           m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
24877   }
24878
24879
24880   function geoMetersToOffset(meters, tileSize) {
24881       tileSize = tileSize || 256;
24882       return [
24883           meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
24884           -meters[1] * tileSize / (TAU * POLAR_RADIUS)
24885       ];
24886   }
24887
24888
24889   function geoOffsetToMeters(offset, tileSize) {
24890       tileSize = tileSize || 256;
24891       return [
24892           offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
24893           -offset[1] * TAU * POLAR_RADIUS / tileSize
24894       ];
24895   }
24896
24897
24898   // Equirectangular approximation of spherical distances on Earth
24899   function geoSphericalDistance(a, b) {
24900       var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
24901       var y = geoLatToMeters(a[1] - b[1]);
24902       return Math.sqrt((x * x) + (y * y));
24903   }
24904
24905
24906   // scale to zoom
24907   function geoScaleToZoom(k, tileSize) {
24908       tileSize = tileSize || 256;
24909       var log2ts = Math.log(tileSize) * Math.LOG2E;
24910       return Math.log(k * TAU) / Math.LN2 - log2ts;
24911   }
24912
24913
24914   // zoom to scale
24915   function geoZoomToScale(z, tileSize) {
24916       tileSize = tileSize || 256;
24917       return tileSize * Math.pow(2, z) / TAU;
24918   }
24919
24920   /**
24921    * A specialized version of `_.every` for arrays without support for
24922    * iteratee shorthands.
24923    *
24924    * @private
24925    * @param {Array} [array] The array to iterate over.
24926    * @param {Function} predicate The function invoked per iteration.
24927    * @returns {boolean} Returns `true` if all elements pass the predicate check,
24928    *  else `false`.
24929    */
24930   function arrayEvery(array, predicate) {
24931     var index = -1,
24932         length = array == null ? 0 : array.length;
24933
24934     while (++index < length) {
24935       if (!predicate(array[index], index, array)) {
24936         return false;
24937       }
24938     }
24939     return true;
24940   }
24941
24942   /**
24943    * The base implementation of `_.every` without support for iteratee shorthands.
24944    *
24945    * @private
24946    * @param {Array|Object} collection The collection to iterate over.
24947    * @param {Function} predicate The function invoked per iteration.
24948    * @returns {boolean} Returns `true` if all elements pass the predicate check,
24949    *  else `false`
24950    */
24951   function baseEvery(collection, predicate) {
24952     var result = true;
24953     baseEach(collection, function(value, index, collection) {
24954       result = !!predicate(value, index, collection);
24955       return result;
24956     });
24957     return result;
24958   }
24959
24960   /**
24961    * Checks if `predicate` returns truthy for **all** elements of `collection`.
24962    * Iteration is stopped once `predicate` returns falsey. The predicate is
24963    * invoked with three arguments: (value, index|key, collection).
24964    *
24965    * **Note:** This method returns `true` for
24966    * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
24967    * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
24968    * elements of empty collections.
24969    *
24970    * @static
24971    * @memberOf _
24972    * @since 0.1.0
24973    * @category Collection
24974    * @param {Array|Object} collection The collection to iterate over.
24975    * @param {Function} [predicate=_.identity] The function invoked per iteration.
24976    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
24977    * @returns {boolean} Returns `true` if all elements pass the predicate check,
24978    *  else `false`.
24979    * @example
24980    *
24981    * _.every([true, 1, null, 'yes'], Boolean);
24982    * // => false
24983    *
24984    * var users = [
24985    *   { 'user': 'barney', 'age': 36, 'active': false },
24986    *   { 'user': 'fred',   'age': 40, 'active': false }
24987    * ];
24988    *
24989    * // The `_.matches` iteratee shorthand.
24990    * _.every(users, { 'user': 'barney', 'active': false });
24991    * // => false
24992    *
24993    * // The `_.matchesProperty` iteratee shorthand.
24994    * _.every(users, ['active', false]);
24995    * // => true
24996    *
24997    * // The `_.property` iteratee shorthand.
24998    * _.every(users, 'active');
24999    * // => false
25000    */
25001   function every(collection, predicate, guard) {
25002     var func = isArray(collection) ? arrayEvery : baseEvery;
25003     if (guard && isIterateeCall(collection, predicate, guard)) {
25004       predicate = undefined;
25005     }
25006     return func(collection, baseIteratee(predicate, 3));
25007   }
25008
25009   /**
25010    * The base implementation of `_.some` without support for iteratee shorthands.
25011    *
25012    * @private
25013    * @param {Array|Object} collection The collection to iterate over.
25014    * @param {Function} predicate The function invoked per iteration.
25015    * @returns {boolean} Returns `true` if any element passes the predicate check,
25016    *  else `false`.
25017    */
25018   function baseSome(collection, predicate) {
25019     var result;
25020
25021     baseEach(collection, function(value, index, collection) {
25022       result = predicate(value, index, collection);
25023       return !result;
25024     });
25025     return !!result;
25026   }
25027
25028   /**
25029    * Checks if `predicate` returns truthy for **any** element of `collection`.
25030    * Iteration is stopped once `predicate` returns truthy. The predicate is
25031    * invoked with three arguments: (value, index|key, collection).
25032    *
25033    * @static
25034    * @memberOf _
25035    * @since 0.1.0
25036    * @category Collection
25037    * @param {Array|Object} collection The collection to iterate over.
25038    * @param {Function} [predicate=_.identity] The function invoked per iteration.
25039    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
25040    * @returns {boolean} Returns `true` if any element passes the predicate check,
25041    *  else `false`.
25042    * @example
25043    *
25044    * _.some([null, 0, 'yes', false], Boolean);
25045    * // => true
25046    *
25047    * var users = [
25048    *   { 'user': 'barney', 'active': true },
25049    *   { 'user': 'fred',   'active': false }
25050    * ];
25051    *
25052    * // The `_.matches` iteratee shorthand.
25053    * _.some(users, { 'user': 'barney', 'active': false });
25054    * // => false
25055    *
25056    * // The `_.matchesProperty` iteratee shorthand.
25057    * _.some(users, ['active', false]);
25058    * // => true
25059    *
25060    * // The `_.property` iteratee shorthand.
25061    * _.some(users, 'active');
25062    * // => true
25063    */
25064   function some(collection, predicate, guard) {
25065     var func = isArray(collection) ? arraySome : baseSome;
25066     if (guard && isIterateeCall(collection, predicate, guard)) {
25067       predicate = undefined;
25068     }
25069     return func(collection, baseIteratee(predicate, 3));
25070   }
25071
25072   // vector equals
25073   function geoVecEqual(a, b, epsilon) {
25074       if (epsilon) {
25075           return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
25076       } else {
25077           return (a[0] === b[0]) && (a[1] === b[1]);
25078       }
25079   }
25080
25081   // vector addition
25082   function geoVecAdd(a, b) {
25083       return [ a[0] + b[0], a[1] + b[1] ];
25084   }
25085
25086   // vector subtraction
25087   function geoVecSubtract(a, b) {
25088       return [ a[0] - b[0], a[1] - b[1] ];
25089   }
25090
25091   // vector scaling
25092   function geoVecScale(a, mag) {
25093       return [ a[0] * mag, a[1] * mag ];
25094   }
25095
25096   // vector rounding (was: geoRoundCoordinates)
25097   function geoVecFloor(a) {
25098       return [ Math.floor(a[0]), Math.floor(a[1]) ];
25099   }
25100
25101   // linear interpolation
25102   function geoVecInterp(a, b, t) {
25103       return [
25104           a[0] + (b[0] - a[0]) * t,
25105           a[1] + (b[1] - a[1]) * t
25106       ];
25107   }
25108
25109   // http://jsperf.com/id-dist-optimization
25110   function geoVecLength(a, b) {
25111       var x = a[0] - b[0];
25112       var y = a[1] - b[1];
25113       return Math.sqrt((x * x) + (y * y));
25114   }
25115
25116   // Return the counterclockwise angle in the range (-pi, pi)
25117   // between the positive X axis and the line intersecting a and b.
25118   function geoVecAngle(a, b) {
25119       return Math.atan2(b[1] - a[1], b[0] - a[0]);
25120   }
25121
25122   // dot product
25123   function geoVecDot(a, b, origin) {
25124       origin = origin || [0, 0];
25125       return (a[0] - origin[0]) * (b[0] - origin[0]) +
25126           (a[1] - origin[1]) * (b[1] - origin[1]);
25127   }
25128
25129   // 2D cross product of OA and OB vectors, returns magnitude of Z vector
25130   // Returns a positive value, if OAB makes a counter-clockwise turn,
25131   // negative for clockwise turn, and zero if the points are collinear.
25132   function geoVecCross(a, b, origin) {
25133       origin = origin || [0, 0];
25134       return (a[0] - origin[0]) * (b[1] - origin[1]) -
25135           (a[1] - origin[1]) * (b[0] - origin[0]);
25136   }
25137
25138   // Return the counterclockwise angle in the range (-pi, pi)
25139   // between the positive X axis and the line intersecting a and b.
25140   function geoAngle(a, b, projection) {
25141       return geoVecAngle(projection(a.loc), projection(b.loc));
25142   }
25143
25144   function geoEdgeEqual(a, b) {
25145       return (a[0] === b[0] && a[1] === b[1]) ||
25146           (a[0] === b[1] && a[1] === b[0]);
25147   }
25148
25149   // Rotate all points counterclockwise around a pivot point by given angle
25150   function geoRotate(points, angle, around) {
25151       return points.map(function(point) {
25152           var radial = geoVecSubtract(point, around);
25153           return [
25154               radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
25155               radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
25156           ];
25157       });
25158   }
25159
25160
25161   // Choose the edge with the minimal distance from `point` to its orthogonal
25162   // projection onto that edge, if such a projection exists, or the distance to
25163   // the closest vertex on that edge. Returns an object with the `index` of the
25164   // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
25165   function geoChooseEdge(nodes, point, projection, activeID) {
25166       var dist = geoVecLength;
25167       var points = nodes.map(function(n) { return projection(n.loc); });
25168       var ids = nodes.map(function(n) { return n.id; });
25169       var min = Infinity;
25170       var idx;
25171       var loc;
25172
25173       for (var i = 0; i < points.length - 1; i++) {
25174           if (ids[i] === activeID || ids[i + 1] === activeID) continue;
25175
25176           var o = points[i];
25177           var s = geoVecSubtract(points[i + 1], o);
25178           var v = geoVecSubtract(point, o);
25179           var proj = geoVecDot(v, s) / geoVecDot(s, s);
25180           var p;
25181
25182           if (proj < 0) {
25183               p = o;
25184           } else if (proj > 1) {
25185               p = points[i + 1];
25186           } else {
25187               p = [o[0] + proj * s[0], o[1] + proj * s[1]];
25188           }
25189
25190           var d = dist(p, point);
25191           if (d < min) {
25192               min = d;
25193               idx = i + 1;
25194               loc = projection.invert(p);
25195           }
25196       }
25197
25198       if (idx !== undefined) {
25199           return { index: idx, distance: min, loc: loc };
25200       } else {
25201           return null;
25202       }
25203   }
25204
25205
25206   // Test active (dragged or drawing) segments against inactive segments
25207   // This is used to test e.g. multipolygon rings that cross
25208   // `activeNodes` is the ring containing the activeID being dragged.
25209   // `inactiveNodes` is the other ring to test against
25210   function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
25211       var actives = [];
25212       var inactives = [];
25213       var j, k, n1, n2, segment;
25214
25215       // gather active segments (only segments in activeNodes that contain the activeID)
25216       for (j = 0; j < activeNodes.length - 1; j++) {
25217           n1 = activeNodes[j];
25218           n2 = activeNodes[j+1];
25219           segment = [n1.loc, n2.loc];
25220           if (n1.id === activeID || n2.id === activeID) {
25221               actives.push(segment);
25222           }
25223       }
25224
25225       // gather inactive segments
25226       for (j = 0; j < inactiveNodes.length - 1; j++) {
25227           n1 = inactiveNodes[j];
25228           n2 = inactiveNodes[j+1];
25229           segment = [n1.loc, n2.loc];
25230           inactives.push(segment);
25231       }
25232
25233       // test
25234       for (j = 0; j < actives.length; j++) {
25235           for (k = 0; k < inactives.length; k++) {
25236               var p = actives[j];
25237               var q = inactives[k];
25238               var hit = geoLineIntersection(p, q);
25239               if (hit) {
25240                   return true;
25241               }
25242           }
25243       }
25244
25245       return false;
25246   }
25247
25248
25249   // Test active (dragged or drawing) segments against inactive segments
25250   // This is used to test whether a way intersects with itself.
25251   function geoHasSelfIntersections(nodes, activeID) {
25252       var actives = [];
25253       var inactives = [];
25254       var j, k;
25255
25256       // group active and passive segments along the nodes
25257       for (j = 0; j < nodes.length - 1; j++) {
25258           var n1 = nodes[j];
25259           var n2 = nodes[j+1];
25260           var segment = [n1.loc, n2.loc];
25261           if (n1.id === activeID || n2.id === activeID) {
25262               actives.push(segment);
25263           } else {
25264               inactives.push(segment);
25265           }
25266       }
25267
25268       // test
25269       for (j = 0; j < actives.length; j++) {
25270           for (k = 0; k < inactives.length; k++) {
25271               var p = actives[j];
25272               var q = inactives[k];
25273               // skip if segments share an endpoint
25274               if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
25275                   geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
25276                   continue;
25277               }
25278
25279               var hit = geoLineIntersection(p, q);
25280               if (hit) {
25281                   var epsilon = 1e-8;
25282                   // skip if the hit is at the segment's endpoint
25283                   if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
25284                       geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
25285                       continue;
25286                   } else {
25287                       return true;
25288                   }
25289               }
25290           }
25291       }
25292
25293       return false;
25294   }
25295
25296
25297   // Return the intersection point of 2 line segments.
25298   // From https://github.com/pgkelley4/line-segments-intersect
25299   // This uses the vector cross product approach described below:
25300   //  http://stackoverflow.com/a/565282/786339
25301   function geoLineIntersection(a, b) {
25302       var p = [a[0][0], a[0][1]];
25303       var p2 = [a[1][0], a[1][1]];
25304       var q = [b[0][0], b[0][1]];
25305       var q2 = [b[1][0], b[1][1]];
25306       var r = geoVecSubtract(p2, p);
25307       var s = geoVecSubtract(q2, q);
25308       var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
25309       var denominator = geoVecCross(r, s);
25310
25311       if (uNumerator && denominator) {
25312           var u = uNumerator / denominator;
25313           var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
25314
25315           if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
25316               return geoVecInterp(p, p2, t);
25317           }
25318       }
25319
25320       return null;
25321   }
25322
25323
25324   function geoPathIntersections(path1, path2) {
25325       var intersections = [];
25326       for (var i = 0; i < path1.length - 1; i++) {
25327           for (var j = 0; j < path2.length - 1; j++) {
25328               var a = [ path1[i], path1[i+1] ];
25329               var b = [ path2[j], path2[j+1] ];
25330               var hit = geoLineIntersection(a, b);
25331               if (hit) {
25332                   intersections.push(hit);
25333               }
25334           }
25335       }
25336       return intersections;
25337   }
25338
25339   function geoPathHasIntersections(path1, path2) {
25340       for (var i = 0; i < path1.length - 1; i++) {
25341           for (var j = 0; j < path2.length - 1; j++) {
25342               var a = [ path1[i], path1[i+1] ];
25343               var b = [ path2[j], path2[j+1] ];
25344               var hit = geoLineIntersection(a, b);
25345               if (hit) {
25346                   return true;
25347               }
25348           }
25349       }
25350       return false;
25351   }
25352
25353
25354   // Return whether point is contained in polygon.
25355   //
25356   // `point` should be a 2-item array of coordinates.
25357   // `polygon` should be an array of 2-item arrays of coordinates.
25358   //
25359   // From https://github.com/substack/point-in-polygon.
25360   // ray-casting algorithm based on
25361   // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
25362   //
25363   function geoPointInPolygon(point, polygon) {
25364       var x = point[0];
25365       var y = point[1];
25366       var inside = false;
25367
25368       for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
25369           var xi = polygon[i][0];
25370           var yi = polygon[i][1];
25371           var xj = polygon[j][0];
25372           var yj = polygon[j][1];
25373
25374           var intersect = ((yi > y) !== (yj > y)) &&
25375               (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
25376           if (intersect) inside = !inside;
25377       }
25378
25379       return inside;
25380   }
25381
25382
25383   function geoPolygonContainsPolygon(outer, inner) {
25384       return every(inner, function(point) {
25385           return geoPointInPolygon(point, outer);
25386       });
25387   }
25388
25389
25390   function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
25391       function testPoints(outer, inner) {
25392           return some(inner, function(point) {
25393               return geoPointInPolygon(point, outer);
25394           });
25395       }
25396
25397      return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
25398   }
25399
25400
25401   function geoPathLength(path) {
25402       var length = 0;
25403       for (var i = 0; i < path.length - 1; i++) {
25404           length += geoVecLength(path[i], path[i + 1]);
25405       }
25406       return length;
25407   }
25408
25409
25410   // If the given point is at the edge of the padded viewport,
25411   // return a vector that will nudge the viewport in that direction
25412   function geoViewportEdge(point, dimensions) {
25413       var pad = [80, 20, 50, 20];   // top, right, bottom, left
25414       var x = 0;
25415       var y = 0;
25416
25417       if (point[0] > dimensions[0] - pad[1])
25418           x = -10;
25419       if (point[0] < pad[3])
25420           x = 10;
25421       if (point[1] > dimensions[1] - pad[2])
25422           y = -10;
25423       if (point[1] < pad[0])
25424           y = 10;
25425
25426       if (x || y) {
25427           return [x, y];
25428       } else {
25429           return null;
25430       }
25431   }
25432
25433   /*
25434       Bypasses features of D3's default projection stream pipeline that are unnecessary:
25435       * Antimeridian clipping
25436       * Spherical rotation
25437       * Resampling
25438   */
25439   function geoRawMercator() {
25440       var project = mercatorRaw;
25441       var k = 512 / Math.PI; // scale
25442       var x = 0;
25443       var y = 0; // translate
25444       var clipExtent = [[0, 0], [0, 0]];
25445
25446
25447       function projection$$1(point) {
25448           point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
25449           return [point[0] * k + x, y - point[1] * k];
25450       }
25451
25452
25453       projection$$1.invert = function(point) {
25454           point = project.invert((point[0] - x) / k, (y - point[1]) / k);
25455           return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
25456       };
25457
25458
25459       projection$$1.scale = function(_) {
25460           if (!arguments.length) return k;
25461           k = +_;
25462           return projection$$1;
25463       };
25464
25465
25466       projection$$1.translate = function(_) {
25467           if (!arguments.length) return [x, y];
25468           x = +_[0];
25469           y = +_[1];
25470           return projection$$1;
25471       };
25472
25473
25474       projection$$1.clipExtent = function(_) {
25475           if (!arguments.length) return clipExtent;
25476           clipExtent = _;
25477           return projection$$1;
25478       };
25479
25480
25481       projection$$1.transform = function(obj) {
25482           if (!arguments.length) return identity$7.translate(x, y).scale(k);
25483           x = +obj.x;
25484           y = +obj.y;
25485           k = +obj.k;
25486           return projection$$1;
25487       };
25488
25489
25490       projection$$1.stream = d3_geoTransform({
25491           point: function(x, y) {
25492               var vec = projection$$1([x, y]);
25493               this.stream.point(vec[0], vec[1]);
25494           }
25495       }).stream;
25496
25497
25498       return projection$$1;
25499   }
25500
25501   function osmChangeset() {
25502       if (!(this instanceof osmChangeset)) {
25503           return (new osmChangeset()).initialize(arguments);
25504       } else if (arguments.length) {
25505           this.initialize(arguments);
25506       }
25507   }
25508
25509
25510   osmEntity$$1.changeset = osmChangeset;
25511
25512   osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
25513
25514   assignIn(osmChangeset.prototype, {
25515
25516       type: 'changeset',
25517
25518
25519       extent: function() {
25520           return new geoExtent$$1();
25521       },
25522
25523
25524       geometry: function() {
25525           return 'changeset';
25526       },
25527
25528
25529       asJXON: function() {
25530           return {
25531               osm: {
25532                   changeset: {
25533                       tag: map$3(this.tags, function(value, key) {
25534                           return { '@k': key, '@v': value };
25535                       }),
25536                       '@version': 0.6,
25537                       '@generator': 'iD'
25538                   }
25539               }
25540           };
25541       },
25542
25543
25544       // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
25545       // XML. Returns a string.
25546       osmChangeJXON: function(changes) {
25547           var changeset_id = this.id;
25548
25549           function nest(x, order) {
25550               var groups = {};
25551               for (var i = 0; i < x.length; i++) {
25552                   var tagName = Object.keys(x[i])[0];
25553                   if (!groups[tagName]) groups[tagName] = [];
25554                   groups[tagName].push(x[i][tagName]);
25555               }
25556               var ordered = {};
25557               order.forEach(function(o) {
25558                   if (groups[o]) ordered[o] = groups[o];
25559               });
25560               return ordered;
25561           }
25562
25563
25564           // sort relations in a changeset by dependencies
25565           function sort(changes) {
25566
25567               // find a referenced relation in the current changeset
25568               function resolve(item) {
25569                   return find$1(relations, function(relation) {
25570                       return item.keyAttributes.type === 'relation'
25571                           && item.keyAttributes.ref === relation['@id'];
25572                   });
25573               }
25574
25575               // a new item is an item that has not been already processed
25576               function isNew(item) {
25577                   return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
25578                       return proc['@id'] === item['@id'];
25579                   });
25580               }
25581
25582               var processing = [],
25583                   sorted = {},
25584                   relations = changes.relation;
25585
25586               if (!relations) return changes;
25587
25588               for (var i = 0; i < relations.length; i++) {
25589                   var relation = relations[i];
25590
25591                   // skip relation if already sorted
25592                   if (!sorted[relation['@id']]) {
25593                       processing.push(relation);
25594                   }
25595
25596                   while (processing.length > 0) {
25597                       var next = processing[0],
25598                       deps = filter(compact(next.member.map(resolve)), isNew);
25599                       if (deps.length === 0) {
25600                           sorted[next['@id']] = next;
25601                           processing.shift();
25602                       } else {
25603                           processing = deps.concat(processing);
25604                       }
25605                   }
25606               }
25607
25608               changes.relation = values$1(sorted);
25609               return changes;
25610           }
25611
25612           function rep(entity) {
25613               return entity.asJXON(changeset_id);
25614           }
25615
25616           return {
25617               osmChange: {
25618                   '@version': 0.6,
25619                   '@generator': 'iD',
25620                   'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
25621                   'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
25622                   'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
25623               }
25624           };
25625       },
25626
25627
25628       asGeoJSON: function() {
25629           return {};
25630       }
25631
25632   });
25633
25634   /**
25635    * Creates a duplicate-free version of an array, using
25636    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25637    * for equality comparisons, in which only the first occurrence of each element
25638    * is kept. The order of result values is determined by the order they occur
25639    * in the array.
25640    *
25641    * @static
25642    * @memberOf _
25643    * @since 0.1.0
25644    * @category Array
25645    * @param {Array} array The array to inspect.
25646    * @returns {Array} Returns the new duplicate free array.
25647    * @example
25648    *
25649    * _.uniq([2, 1, 2]);
25650    * // => [2, 1]
25651    */
25652   function uniq(array) {
25653     return (array && array.length) ? baseUniq(array) : [];
25654   }
25655
25656   function osmNode() {
25657       if (!(this instanceof osmNode)) {
25658           return (new osmNode()).initialize(arguments);
25659       } else if (arguments.length) {
25660           this.initialize(arguments);
25661       }
25662   }
25663
25664   osmEntity$$1.node = osmNode;
25665
25666   osmNode.prototype = Object.create(osmEntity$$1.prototype);
25667
25668   assignIn(osmNode.prototype, {
25669
25670       type: 'node',
25671
25672
25673       extent: function() {
25674           return new geoExtent$$1(this.loc);
25675       },
25676
25677
25678       geometry: function(graph) {
25679           return graph.transient(this, 'geometry', function() {
25680               return graph.isPoi(this) ? 'point' : 'vertex';
25681           });
25682       },
25683
25684
25685       move: function(loc) {
25686           return this.update({loc: loc});
25687       },
25688
25689
25690       isDegenerate: function() {
25691           return !(
25692               Array.isArray(this.loc) && this.loc.length === 2 &&
25693               this.loc[0] >= -180 && this.loc[0] <= 180 &&
25694               this.loc[1] >= -90 && this.loc[1] <= 90
25695           );
25696       },
25697
25698
25699       // Inspect tags and geometry to determine which direction(s) this node/vertex points
25700       directions: function(resolver, projection) {
25701           var val;
25702           var i;
25703
25704           // which tag to use?
25705           if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
25706               // all-way stop tag on a highway intersection
25707               val = 'all';
25708           } else {
25709               // generic direction tag
25710               val = (this.tags.direction || '').toLowerCase();
25711
25712               // better suffix-style direction tag
25713               var re = /:direction$/i;
25714               var keys = Object.keys(this.tags);
25715               for (i = 0; i < keys.length; i++) {
25716                   if (re.test(keys[i])) {
25717                       val = this.tags[keys[i]].toLowerCase();
25718                       break;
25719                   }
25720               }
25721           }
25722
25723           if (val === '') return [];
25724
25725           var cardinal = {
25726               north: 0,               n: 0,
25727               northnortheast: 22,     nne: 22,
25728               northeast: 45,          ne: 45,
25729               eastnortheast: 67,      ene: 67,
25730               east: 90,               e: 90,
25731               eastsoutheast: 112,     ese: 112,
25732               southeast: 135,         se: 135,
25733               southsoutheast: 157,    sse: 157,
25734               south: 180,             s: 180,
25735               southsouthwest: 202,    ssw: 202,
25736               southwest: 225,         sw: 225,
25737               westsouthwest: 247,     wsw: 247,
25738               west: 270,              w: 270,
25739               westnorthwest: 292,     wnw: 292,
25740               northwest: 315,         nw: 315,
25741               northnorthwest: 337,    nnw: 337
25742           };
25743
25744
25745           var values = val.split(';');
25746           var results = [];
25747
25748           values.forEach(function(v) {
25749               // swap cardinal for numeric directions
25750               if (cardinal[v] !== undefined) {
25751                   v = cardinal[v];
25752               }
25753
25754               // numeric direction - just add to results
25755               if (v !== '' && !isNaN(+v)) {
25756                   results.push(+v);
25757                   return;
25758               }
25759
25760               // string direction - inspect parent ways
25761               var lookBackward =
25762                   (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
25763               var lookForward =
25764                   (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
25765
25766               if (!lookForward && !lookBackward) return;
25767
25768               var nodeIds = {};
25769               resolver.parentWays(this).forEach(function(parent) {
25770                   var nodes = parent.nodes;
25771                   for (i = 0; i < nodes.length; i++) {
25772                       if (nodes[i] === this.id) {  // match current entity
25773                           if (lookForward && i > 0) {
25774                               nodeIds[nodes[i - 1]] = true;  // look back to prev node
25775                           }
25776                           if (lookBackward && i < nodes.length - 1) {
25777                               nodeIds[nodes[i + 1]] = true;  // look ahead to next node
25778                           }
25779                       }
25780                   }
25781               }, this);
25782
25783               Object.keys(nodeIds).forEach(function(nodeId) {
25784                   // +90 because geoAngle returns angle from X axis, not Y (north)
25785                   results.push(
25786                       (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
25787                   );
25788               }, this);
25789
25790           }, this);
25791
25792           return uniq(results);
25793       },
25794
25795
25796       isEndpoint: function(resolver) {
25797           return resolver.transient(this, 'isEndpoint', function() {
25798               var id = this.id;
25799               return resolver.parentWays(this).filter(function(parent) {
25800                   return !parent.isClosed() && !!parent.affix(id);
25801               }).length > 0;
25802           });
25803       },
25804
25805
25806       isConnected: function(resolver) {
25807           return resolver.transient(this, 'isConnected', function() {
25808               var parents = resolver.parentWays(this);
25809
25810               function isLine(entity) {
25811                   return entity.geometry(resolver) === 'line' &&
25812                       entity.hasInterestingTags();
25813               }
25814
25815               // vertex is connected to multiple parent lines
25816               if (parents.length > 1 && some(parents, isLine)) {
25817                   return true;
25818
25819               } else if (parents.length === 1) {
25820                   var way = parents[0],
25821                       nodes = way.nodes.slice();
25822                   if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
25823
25824                   // return true if vertex appears multiple times (way is self intersecting)
25825                   return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
25826               }
25827
25828               return false;
25829           });
25830       },
25831
25832
25833       isIntersection: function(resolver) {
25834           return resolver.transient(this, 'isIntersection', function() {
25835               return resolver.parentWays(this).filter(function(parent) {
25836                   return (parent.tags.highway ||
25837                       parent.tags.waterway ||
25838                       parent.tags.railway ||
25839                       parent.tags.aeroway) &&
25840                       parent.geometry(resolver) === 'line';
25841               }).length > 1;
25842           });
25843       },
25844
25845
25846       isHighwayIntersection: function(resolver) {
25847           return resolver.transient(this, 'isHighwayIntersection', function() {
25848               return resolver.parentWays(this).filter(function(parent) {
25849                   return parent.tags.highway && parent.geometry(resolver) === 'line';
25850               }).length > 1;
25851           });
25852       },
25853
25854
25855       isOnAddressLine: function(resolver) {
25856           return resolver.transient(this, 'isOnAddressLine', function() {
25857               return resolver.parentWays(this).filter(function(parent) {
25858                   return parent.tags.hasOwnProperty('addr:interpolation') &&
25859                       parent.geometry(resolver) === 'line';
25860               }).length > 0;
25861           });
25862       },
25863
25864
25865       asJXON: function(changeset_id) {
25866           var r = {
25867               node: {
25868                   '@id': this.osmId(),
25869                   '@lon': this.loc[0],
25870                   '@lat': this.loc[1],
25871                   '@version': (this.version || 0),
25872                   tag: map$3(this.tags, function(v, k) {
25873                       return { keyAttributes: { k: k, v: v } };
25874                   })
25875               }
25876           };
25877           if (changeset_id) r.node['@changeset'] = changeset_id;
25878           return r;
25879       },
25880
25881
25882       asGeoJSON: function() {
25883           return {
25884               type: 'Point',
25885               coordinates: this.loc
25886           };
25887       }
25888   });
25889
25890   function osmNote() {
25891       if (!(this instanceof osmNote)) {
25892           return (new osmNote()).initialize(arguments);
25893       } else if (arguments.length) {
25894           this.initialize(arguments);
25895       }
25896   }
25897
25898
25899   osmNote.id = function() {
25900       return osmNote.id.next--;
25901   };
25902
25903
25904   osmNote.id.next = -1;
25905
25906
25907   assignIn(osmNote.prototype, {
25908
25909       type: 'note',
25910
25911       initialize: function(sources) {
25912           for (var i = 0; i < sources.length; ++i) {
25913               var source = sources[i];
25914               for (var prop in source) {
25915                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
25916                       if (source[prop] === undefined) {
25917                           delete this[prop];
25918                       } else {
25919                           this[prop] = source[prop];
25920                       }
25921                   }
25922               }
25923           }
25924
25925           if (!this.id) {
25926               this.id = osmNote.id() + '';  // as string
25927           }
25928
25929           return this;
25930       },
25931
25932       extent: function() {
25933           return new geoExtent$$1(this.loc);
25934       },
25935
25936       update: function(attrs) {
25937           return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
25938       },
25939
25940       isNew: function() {
25941           return this.id < 0;
25942       },
25943
25944       move: function(loc) {
25945           return this.update({ loc: loc });
25946       }
25947
25948   });
25949
25950   /** Error message constants. */
25951   var FUNC_ERROR_TEXT$1 = 'Expected a function';
25952
25953   /**
25954    * Creates a function that negates the result of the predicate `func`. The
25955    * `func` predicate is invoked with the `this` binding and arguments of the
25956    * created function.
25957    *
25958    * @static
25959    * @memberOf _
25960    * @since 3.0.0
25961    * @category Function
25962    * @param {Function} predicate The predicate to negate.
25963    * @returns {Function} Returns the new negated function.
25964    * @example
25965    *
25966    * function isEven(n) {
25967    *   return n % 2 == 0;
25968    * }
25969    *
25970    * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
25971    * // => [1, 3, 5]
25972    */
25973   function negate(predicate) {
25974     if (typeof predicate != 'function') {
25975       throw new TypeError(FUNC_ERROR_TEXT$1);
25976     }
25977     return function() {
25978       var args = arguments;
25979       switch (args.length) {
25980         case 0: return !predicate.call(this);
25981         case 1: return !predicate.call(this, args[0]);
25982         case 2: return !predicate.call(this, args[0], args[1]);
25983         case 3: return !predicate.call(this, args[0], args[1], args[2]);
25984       }
25985       return !predicate.apply(this, args);
25986     };
25987   }
25988
25989   /**
25990    * The opposite of `_.filter`; this method returns the elements of `collection`
25991    * that `predicate` does **not** return truthy for.
25992    *
25993    * @static
25994    * @memberOf _
25995    * @since 0.1.0
25996    * @category Collection
25997    * @param {Array|Object} collection The collection to iterate over.
25998    * @param {Function} [predicate=_.identity] The function invoked per iteration.
25999    * @returns {Array} Returns the new filtered array.
26000    * @see _.filter
26001    * @example
26002    *
26003    * var users = [
26004    *   { 'user': 'barney', 'age': 36, 'active': false },
26005    *   { 'user': 'fred',   'age': 40, 'active': true }
26006    * ];
26007    *
26008    * _.reject(users, function(o) { return !o.active; });
26009    * // => objects for ['fred']
26010    *
26011    * // The `_.matches` iteratee shorthand.
26012    * _.reject(users, { 'age': 40, 'active': true });
26013    * // => objects for ['barney']
26014    *
26015    * // The `_.matchesProperty` iteratee shorthand.
26016    * _.reject(users, ['active', false]);
26017    * // => objects for ['fred']
26018    *
26019    * // The `_.property` iteratee shorthand.
26020    * _.reject(users, 'active');
26021    * // => objects for ['barney']
26022    */
26023   function reject(collection, predicate) {
26024     var func = isArray(collection) ? arrayFilter : baseFilter;
26025     return func(collection, negate(baseIteratee(predicate, 3)));
26026   }
26027
26028   /*
26029   Order the nodes of a way in reverse order and reverse any direction dependent tags
26030   other than `oneway`. (We assume that correcting a backwards oneway is the primary
26031   reason for reversing a way.)
26032
26033   In addition, numeric-valued `incline` tags are negated.
26034
26035   The JOSM implementation was used as a guide, but transformations that were of unclear benefit
26036   or adjusted tags that don't seem to be used in practice were omitted.
26037
26038   References:
26039       http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
26040       http://wiki.openstreetmap.org/wiki/Key:direction#Steps
26041       http://wiki.openstreetmap.org/wiki/Key:incline
26042       http://wiki.openstreetmap.org/wiki/Route#Members
26043       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
26044       http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
26045       http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
26046   */
26047   function actionReverse(wayID, options) {
26048       var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
26049       var numeric = /^([+\-]?)(?=[\d.])/;
26050       var keyReplacements = [
26051           [/:right$/, ':left'],
26052           [/:left$/, ':right'],
26053           [/:forward$/, ':backward'],
26054           [/:backward$/, ':forward']
26055       ];
26056       var valueReplacements = {
26057           left: 'right',
26058           right: 'left',
26059           up: 'down',
26060           down: 'up',
26061           forward: 'backward',
26062           backward: 'forward',
26063           forwards: 'backward',
26064           backwards: 'forward',
26065       };
26066       var roleReplacements = {
26067           forward: 'backward',
26068           backward: 'forward',
26069           forwards: 'backward',
26070           backwards: 'forward'
26071       };
26072       var onewayReplacements = {
26073           yes: '-1',
26074           '1': '-1',
26075           '-1': 'yes'
26076       };
26077
26078
26079       function reverseKey(key) {
26080           for (var i = 0; i < keyReplacements.length; ++i) {
26081               var replacement = keyReplacements[i];
26082               if (replacement[0].test(key)) {
26083                   return key.replace(replacement[0], replacement[1]);
26084               }
26085           }
26086           return key;
26087       }
26088
26089
26090       function reverseValue(key, value) {
26091           if (ignoreKey.test(key)) return value;
26092
26093           if (key === 'incline' && numeric.test(value)) {
26094               return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
26095           } else if (options && options.reverseOneway && key === 'oneway') {
26096               return onewayReplacements[value] || value;
26097           } else {
26098               return valueReplacements[value] || value;
26099           }
26100       }
26101
26102
26103       // Reverse the direction of tags attached to the nodes - #3076
26104       function reverseNodeTags(graph, nodeIDs) {
26105           for (var i = 0; i < nodeIDs.length; i++) {
26106               var node = graph.hasEntity(nodeIDs[i]);
26107               if (!node || !Object.keys(node.tags).length) continue;
26108
26109               var tags = {};
26110               for (var key in node.tags) {
26111                   tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
26112               }
26113               graph = graph.replace(node.update({tags: tags}));
26114           }
26115           return graph;
26116       }
26117
26118
26119       return function(graph) {
26120           var way = graph.entity(wayID);
26121           var nodes = way.nodes.slice().reverse();
26122           var tags = {};
26123           var role;
26124
26125           for (var key in way.tags) {
26126               tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
26127           }
26128
26129           graph.parentRelations(way).forEach(function(relation) {
26130               relation.members.forEach(function(member, index) {
26131                   if (member.id === way.id && (role = roleReplacements[member.role])) {
26132                       relation = relation.updateMember({role: role}, index);
26133                       graph = graph.replace(relation);
26134                   }
26135               });
26136           });
26137
26138           // Reverse any associated directions on nodes on the way and then replace
26139           // the way itself with the reversed node ids and updated way tags
26140           return reverseNodeTags(graph, nodes)
26141               .replace(way.update({nodes: nodes, tags: tags}));
26142       };
26143   }
26144
26145   /** `Object#toString` result references. */
26146   var numberTag$4 = '[object Number]';
26147
26148   /**
26149    * Checks if `value` is classified as a `Number` primitive or object.
26150    *
26151    * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
26152    * classified as numbers, use the `_.isFinite` method.
26153    *
26154    * @static
26155    * @memberOf _
26156    * @since 0.1.0
26157    * @category Lang
26158    * @param {*} value The value to check.
26159    * @returns {boolean} Returns `true` if `value` is a number, else `false`.
26160    * @example
26161    *
26162    * _.isNumber(3);
26163    * // => true
26164    *
26165    * _.isNumber(Number.MIN_VALUE);
26166    * // => true
26167    *
26168    * _.isNumber(Infinity);
26169    * // => true
26170    *
26171    * _.isNumber('3');
26172    * // => false
26173    */
26174   function isNumber(value) {
26175     return typeof value == 'number' ||
26176       (isObjectLike(value) && baseGetTag(value) == numberTag$4);
26177   }
26178
26179   /** `Object#toString` result references. */
26180   var stringTag$4 = '[object String]';
26181
26182   /**
26183    * Checks if `value` is classified as a `String` primitive or object.
26184    *
26185    * @static
26186    * @since 0.1.0
26187    * @memberOf _
26188    * @category Lang
26189    * @param {*} value The value to check.
26190    * @returns {boolean} Returns `true` if `value` is a string, else `false`.
26191    * @example
26192    *
26193    * _.isString('abc');
26194    * // => true
26195    *
26196    * _.isString(1);
26197    * // => false
26198    */
26199   function isString(value) {
26200     return typeof value == 'string' ||
26201       (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
26202   }
26203
26204   /**
26205    * Checks if `value` is `NaN`.
26206    *
26207    * **Note:** This method is based on
26208    * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
26209    * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
26210    * `undefined` and other non-number values.
26211    *
26212    * @static
26213    * @memberOf _
26214    * @since 0.1.0
26215    * @category Lang
26216    * @param {*} value The value to check.
26217    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
26218    * @example
26219    *
26220    * _.isNaN(NaN);
26221    * // => true
26222    *
26223    * _.isNaN(new Number(NaN));
26224    * // => true
26225    *
26226    * isNaN(undefined);
26227    * // => true
26228    *
26229    * _.isNaN(undefined);
26230    * // => false
26231    */
26232   function isNaN$1(value) {
26233     // An `NaN` primitive is the only value that is not equal to itself.
26234     // Perform the `toStringTag` check first to avoid errors with some
26235     // ActiveX objects in IE.
26236     return isNumber(value) && value != +value;
26237   }
26238
26239   function osmLanes(entity) {
26240       if (entity.type !== 'way') return null;
26241       if (!entity.tags.highway) return null;
26242
26243       var tags = entity.tags;
26244       var isOneWay = entity.isOneWay();
26245       var laneCount = getLaneCount(tags, isOneWay);
26246       var maxspeed = parseMaxspeed(tags);
26247
26248       var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
26249       var forward = laneDirections.forward;
26250       var backward = laneDirections.backward;
26251       var bothways = laneDirections.bothways;
26252
26253       // parse the piped string 'x|y|z' format
26254       var turnLanes = {};
26255       turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
26256       turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
26257       turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
26258
26259       var maxspeedLanes = {};
26260       maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
26261       maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
26262       maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
26263
26264       var psvLanes = {};
26265       psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
26266       psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
26267       psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
26268
26269       var busLanes = {};
26270       busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
26271       busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
26272       busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
26273
26274       var taxiLanes = {};
26275       taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
26276       taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
26277       taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
26278
26279       var hovLanes = {};
26280       hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
26281       hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
26282       hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
26283
26284       var hgvLanes = {};
26285       hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
26286       hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
26287       hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
26288
26289       var bicyclewayLanes = {};
26290       bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
26291       bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
26292       bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
26293
26294       var lanesObj = {
26295           forward: [],
26296           backward: [],
26297           unspecified: []
26298       };
26299
26300       // map forward/backward/unspecified of each lane type to lanesObj
26301       mapToLanesObj(lanesObj, turnLanes, 'turnLane');
26302       mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
26303       mapToLanesObj(lanesObj, psvLanes, 'psv');
26304       mapToLanesObj(lanesObj, busLanes, 'bus');
26305       mapToLanesObj(lanesObj, taxiLanes, 'taxi');
26306       mapToLanesObj(lanesObj, hovLanes, 'hov');
26307       mapToLanesObj(lanesObj, hgvLanes, 'hgv');
26308       mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
26309
26310       return {
26311           metadata: {
26312               count: laneCount,
26313               oneway: isOneWay,
26314               forward: forward,
26315               backward: backward,
26316               bothways: bothways,
26317               turnLanes: turnLanes,
26318               maxspeed: maxspeed,
26319               maxspeedLanes: maxspeedLanes,
26320               psvLanes: psvLanes,
26321               busLanes: busLanes,
26322               taxiLanes: taxiLanes,
26323               hovLanes: hovLanes,
26324               hgvLanes: hgvLanes,
26325               bicyclewayLanes: bicyclewayLanes
26326           },
26327           lanes: lanesObj
26328       };
26329   }
26330
26331
26332   function getLaneCount(tags, isOneWay) {
26333       var count;
26334       if (tags.lanes) {
26335           count = parseInt(tags.lanes, 10);
26336           if (count > 0) {
26337               return count;
26338           }
26339       }
26340
26341
26342       switch (tags.highway) {
26343           case 'trunk':
26344           case 'motorway':
26345               count = isOneWay ? 2 : 4;
26346               break;
26347           default:
26348               count = isOneWay ? 1 : 2;
26349               break;
26350       }
26351
26352       return count;
26353   }
26354
26355
26356   function parseMaxspeed(tags) {
26357       var maxspeed = tags.maxspeed;
26358       if (isNumber(maxspeed)) return maxspeed;
26359       if (isString(maxspeed)) {
26360           maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
26361           if (!maxspeed) return;
26362           return parseInt(maxspeed, 10);
26363       }
26364   }
26365
26366
26367   function parseLaneDirections(tags, isOneWay, laneCount) {
26368       var forward = parseInt(tags['lanes:forward'], 10);
26369       var backward = parseInt(tags['lanes:backward'], 10);
26370       var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
26371
26372       if (parseInt(tags.oneway, 10) === -1) {
26373           forward = 0;
26374           bothways = 0;
26375           backward = laneCount;
26376       }
26377       else if (isOneWay) {
26378           forward = laneCount;
26379           bothways = 0;
26380           backward = 0;
26381       }
26382       else if (isNaN$1(forward) && isNaN$1(backward)) {
26383           backward = Math.floor((laneCount - bothways) / 2);
26384           forward = laneCount - bothways - backward;
26385       }
26386       else if (isNaN$1(forward)) {
26387           if (backward > laneCount - bothways) {
26388               backward = laneCount - bothways;
26389           }
26390           forward = laneCount - bothways - backward;
26391       }
26392       else if (isNaN$1(backward)) {
26393           if (forward > laneCount - bothways) {
26394               forward = laneCount - bothways;
26395           }
26396           backward = laneCount - bothways - forward;
26397       }
26398       return {
26399           forward: forward,
26400           backward: backward,
26401           bothways: bothways
26402       };
26403   }
26404
26405
26406   function parseTurnLanes(tag){
26407       if (!tag) return;
26408
26409       var validValues = [
26410           'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
26411           'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
26412       ];
26413
26414       return tag.split('|')
26415           .map(function (s) {
26416               if (s === '') s = 'none';
26417               return s.split(';')
26418                   .map(function (d) {
26419                       return validValues.indexOf(d) === -1 ? 'unknown': d;
26420                   });
26421           });
26422   }
26423
26424
26425   function parseMaxspeedLanes(tag, maxspeed) {
26426       if (!tag) return;
26427
26428       return tag.split('|')
26429           .map(function (s) {
26430               if (s === 'none') return s;
26431               var m = parseInt(s, 10);
26432               if (s === '' || m === maxspeed) return null;
26433               return isNaN$1(m) ? 'unknown': m;
26434           });
26435   }
26436
26437
26438   function parseMiscLanes(tag) {
26439       if (!tag) return;
26440
26441       var validValues = [
26442           'yes', 'no', 'designated'
26443       ];
26444
26445       return tag.split('|')
26446           .map(function (s) {
26447               if (s === '') s = 'no';
26448               return validValues.indexOf(s) === -1 ? 'unknown': s;
26449           });
26450   }
26451
26452
26453   function parseBicycleWay(tag) {
26454       if (!tag) return;
26455
26456       var validValues = [
26457           'yes', 'no', 'designated', 'lane'
26458       ];
26459
26460       return tag.split('|')
26461           .map(function (s) {
26462               if (s === '') s = 'no';
26463               return validValues.indexOf(s) === -1 ? 'unknown': s;
26464           });
26465   }
26466
26467
26468   function mapToLanesObj(lanesObj, data, key) {
26469       if (data.forward) data.forward.forEach(function(l, i) {
26470           if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
26471           lanesObj.forward[i][key] = l;
26472       });
26473       if (data.backward) data.backward.forEach(function(l, i) {
26474           if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
26475           lanesObj.backward[i][key] = l;
26476       });
26477       if (data.unspecified) data.unspecified.forEach(function(l, i) {
26478           if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
26479           lanesObj.unspecified[i][key] = l;
26480       });
26481   }
26482
26483   /** Used to compose bitmasks for cloning. */
26484   var CLONE_DEEP_FLAG$2 = 1,
26485       CLONE_SYMBOLS_FLAG$3 = 4;
26486
26487   /**
26488    * This method is like `_.clone` except that it recursively clones `value`.
26489    *
26490    * @static
26491    * @memberOf _
26492    * @since 1.0.0
26493    * @category Lang
26494    * @param {*} value The value to recursively clone.
26495    * @returns {*} Returns the deep cloned value.
26496    * @see _.clone
26497    * @example
26498    *
26499    * var objects = [{ 'a': 1 }, { 'b': 2 }];
26500    *
26501    * var deep = _.cloneDeep(objects);
26502    * console.log(deep[0] === objects[0]);
26503    * // => false
26504    */
26505   function cloneDeep(value) {
26506     return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
26507   }
26508
26509   /**
26510    * Gets the timestamp of the number of milliseconds that have elapsed since
26511    * the Unix epoch (1 January 1970 00:00:00 UTC).
26512    *
26513    * @static
26514    * @memberOf _
26515    * @since 2.4.0
26516    * @category Date
26517    * @returns {number} Returns the timestamp.
26518    * @example
26519    *
26520    * _.defer(function(stamp) {
26521    *   console.log(_.now() - stamp);
26522    * }, _.now());
26523    * // => Logs the number of milliseconds it took for the deferred invocation.
26524    */
26525   var now$1 = function() {
26526     return root$2.Date.now();
26527   };
26528
26529   /** Error message constants. */
26530   var FUNC_ERROR_TEXT$2 = 'Expected a function';
26531
26532   /* Built-in method references for those with the same name as other `lodash` methods. */
26533   var nativeMax$2 = Math.max,
26534       nativeMin = Math.min;
26535
26536   /**
26537    * Creates a debounced function that delays invoking `func` until after `wait`
26538    * milliseconds have elapsed since the last time the debounced function was
26539    * invoked. The debounced function comes with a `cancel` method to cancel
26540    * delayed `func` invocations and a `flush` method to immediately invoke them.
26541    * Provide `options` to indicate whether `func` should be invoked on the
26542    * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
26543    * with the last arguments provided to the debounced function. Subsequent
26544    * calls to the debounced function return the result of the last `func`
26545    * invocation.
26546    *
26547    * **Note:** If `leading` and `trailing` options are `true`, `func` is
26548    * invoked on the trailing edge of the timeout only if the debounced function
26549    * is invoked more than once during the `wait` timeout.
26550    *
26551    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
26552    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
26553    *
26554    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
26555    * for details over the differences between `_.debounce` and `_.throttle`.
26556    *
26557    * @static
26558    * @memberOf _
26559    * @since 0.1.0
26560    * @category Function
26561    * @param {Function} func The function to debounce.
26562    * @param {number} [wait=0] The number of milliseconds to delay.
26563    * @param {Object} [options={}] The options object.
26564    * @param {boolean} [options.leading=false]
26565    *  Specify invoking on the leading edge of the timeout.
26566    * @param {number} [options.maxWait]
26567    *  The maximum time `func` is allowed to be delayed before it's invoked.
26568    * @param {boolean} [options.trailing=true]
26569    *  Specify invoking on the trailing edge of the timeout.
26570    * @returns {Function} Returns the new debounced function.
26571    * @example
26572    *
26573    * // Avoid costly calculations while the window size is in flux.
26574    * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
26575    *
26576    * // Invoke `sendMail` when clicked, debouncing subsequent calls.
26577    * jQuery(element).on('click', _.debounce(sendMail, 300, {
26578    *   'leading': true,
26579    *   'trailing': false
26580    * }));
26581    *
26582    * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
26583    * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
26584    * var source = new EventSource('/stream');
26585    * jQuery(source).on('message', debounced);
26586    *
26587    * // Cancel the trailing debounced invocation.
26588    * jQuery(window).on('popstate', debounced.cancel);
26589    */
26590   function debounce(func, wait, options) {
26591     var lastArgs,
26592         lastThis,
26593         maxWait,
26594         result,
26595         timerId,
26596         lastCallTime,
26597         lastInvokeTime = 0,
26598         leading = false,
26599         maxing = false,
26600         trailing = true;
26601
26602     if (typeof func != 'function') {
26603       throw new TypeError(FUNC_ERROR_TEXT$2);
26604     }
26605     wait = toNumber(wait) || 0;
26606     if (isObject(options)) {
26607       leading = !!options.leading;
26608       maxing = 'maxWait' in options;
26609       maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
26610       trailing = 'trailing' in options ? !!options.trailing : trailing;
26611     }
26612
26613     function invokeFunc(time) {
26614       var args = lastArgs,
26615           thisArg = lastThis;
26616
26617       lastArgs = lastThis = undefined;
26618       lastInvokeTime = time;
26619       result = func.apply(thisArg, args);
26620       return result;
26621     }
26622
26623     function leadingEdge(time) {
26624       // Reset any `maxWait` timer.
26625       lastInvokeTime = time;
26626       // Start the timer for the trailing edge.
26627       timerId = setTimeout(timerExpired, wait);
26628       // Invoke the leading edge.
26629       return leading ? invokeFunc(time) : result;
26630     }
26631
26632     function remainingWait(time) {
26633       var timeSinceLastCall = time - lastCallTime,
26634           timeSinceLastInvoke = time - lastInvokeTime,
26635           timeWaiting = wait - timeSinceLastCall;
26636
26637       return maxing
26638         ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
26639         : timeWaiting;
26640     }
26641
26642     function shouldInvoke(time) {
26643       var timeSinceLastCall = time - lastCallTime,
26644           timeSinceLastInvoke = time - lastInvokeTime;
26645
26646       // Either this is the first call, activity has stopped and we're at the
26647       // trailing edge, the system time has gone backwards and we're treating
26648       // it as the trailing edge, or we've hit the `maxWait` limit.
26649       return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
26650         (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
26651     }
26652
26653     function timerExpired() {
26654       var time = now$1();
26655       if (shouldInvoke(time)) {
26656         return trailingEdge(time);
26657       }
26658       // Restart the timer.
26659       timerId = setTimeout(timerExpired, remainingWait(time));
26660     }
26661
26662     function trailingEdge(time) {
26663       timerId = undefined;
26664
26665       // Only invoke if we have `lastArgs` which means `func` has been
26666       // debounced at least once.
26667       if (trailing && lastArgs) {
26668         return invokeFunc(time);
26669       }
26670       lastArgs = lastThis = undefined;
26671       return result;
26672     }
26673
26674     function cancel() {
26675       if (timerId !== undefined) {
26676         clearTimeout(timerId);
26677       }
26678       lastInvokeTime = 0;
26679       lastArgs = lastCallTime = lastThis = timerId = undefined;
26680     }
26681
26682     function flush() {
26683       return timerId === undefined ? result : trailingEdge(now$1());
26684     }
26685
26686     function debounced() {
26687       var time = now$1(),
26688           isInvoking = shouldInvoke(time);
26689
26690       lastArgs = arguments;
26691       lastThis = this;
26692       lastCallTime = time;
26693
26694       if (isInvoking) {
26695         if (timerId === undefined) {
26696           return leadingEdge(lastCallTime);
26697         }
26698         if (maxing) {
26699           // Handle invocations in a tight loop.
26700           timerId = setTimeout(timerExpired, wait);
26701           return invokeFunc(lastCallTime);
26702         }
26703       }
26704       if (timerId === undefined) {
26705         timerId = setTimeout(timerExpired, wait);
26706       }
26707       return result;
26708     }
26709     debounced.cancel = cancel;
26710     debounced.flush = flush;
26711     return debounced;
26712   }
26713
26714   /**
26715    * Casts `value` to `identity` if it's not a function.
26716    *
26717    * @private
26718    * @param {*} value The value to inspect.
26719    * @returns {Function} Returns cast function.
26720    */
26721   function castFunction(value) {
26722     return typeof value == 'function' ? value : identity$8;
26723   }
26724
26725   /**
26726    * Iterates over elements of `collection` and invokes `iteratee` for each element.
26727    * The iteratee is invoked with three arguments: (value, index|key, collection).
26728    * Iteratee functions may exit iteration early by explicitly returning `false`.
26729    *
26730    * **Note:** As with other "Collections" methods, objects with a "length"
26731    * property are iterated like arrays. To avoid this behavior use `_.forIn`
26732    * or `_.forOwn` for object iteration.
26733    *
26734    * @static
26735    * @memberOf _
26736    * @since 0.1.0
26737    * @alias each
26738    * @category Collection
26739    * @param {Array|Object} collection The collection to iterate over.
26740    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26741    * @returns {Array|Object} Returns `collection`.
26742    * @see _.forEachRight
26743    * @example
26744    *
26745    * _.forEach([1, 2], function(value) {
26746    *   console.log(value);
26747    * });
26748    * // => Logs `1` then `2`.
26749    *
26750    * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
26751    *   console.log(key);
26752    * });
26753    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26754    */
26755   function forEach(collection, iteratee) {
26756     var func = isArray(collection) ? arrayEach : baseEach;
26757     return func(collection, castFunction(iteratee));
26758   }
26759
26760   /**
26761    * Iterates over own enumerable string keyed properties of an object and
26762    * invokes `iteratee` for each property. The iteratee is invoked with three
26763    * arguments: (value, key, object). Iteratee functions may exit iteration
26764    * early by explicitly returning `false`.
26765    *
26766    * @static
26767    * @memberOf _
26768    * @since 0.3.0
26769    * @category Object
26770    * @param {Object} object The object to iterate over.
26771    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26772    * @returns {Object} Returns `object`.
26773    * @see _.forOwnRight
26774    * @example
26775    *
26776    * function Foo() {
26777    *   this.a = 1;
26778    *   this.b = 2;
26779    * }
26780    *
26781    * Foo.prototype.c = 3;
26782    *
26783    * _.forOwn(new Foo, function(value, key) {
26784    *   console.log(key);
26785    * });
26786    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26787    */
26788   function forOwn(object, iteratee) {
26789     return object && baseForOwn(object, castFunction(iteratee));
26790   }
26791
26792   var translations = Object.create(null);
26793
26794   var currentLocale = 'en';
26795   var textDirection = 'ltr';
26796
26797   function setLocale(_) {
26798       if (translations[_] !== undefined) {
26799           currentLocale = _;
26800       } else if (translations[_.split('-')[0]]) {
26801           currentLocale = _.split('-')[0];
26802       }
26803   }
26804
26805   function addTranslation(id, value) {
26806       translations[id] = value;
26807   }
26808
26809   /**
26810    * Given a string identifier, try to find that string in the current
26811    * language, and return it.  This function will be called recursively
26812    * with locale `en` if a string can not be found in the requested language.
26813    *
26814    * @param {string}   s   string identifier
26815    * @param {object?}  o   object of token replacements and default string
26816    * @param {string?}  loc locale to use
26817    * @returns {string?} locale string
26818    */
26819   function t(s, o, loc) {
26820       loc = loc || currentLocale;
26821
26822       var path = s
26823           .split('.')
26824           .map(function (s) { return s.replace('<TX_DOT>', '.'); })
26825           .reverse();
26826
26827       var rep = translations[loc];
26828
26829       while (rep !== undefined && path.length) {
26830           rep = rep[path.pop()];
26831       }
26832
26833       if (rep !== undefined) {
26834           if (o) {
26835               for (var k in o) {
26836                   rep = rep.replace('{' + k + '}', o[k]);
26837               }
26838           }
26839           return rep;
26840       }
26841
26842       if (loc !== 'en') {
26843           return t(s, o, 'en');
26844       }
26845
26846       if (o && 'default' in o) {
26847           return o.default;
26848       }
26849
26850       var missing = 'Missing ' + loc + ' translation: ' + s;
26851       if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
26852
26853       return missing;
26854   }
26855
26856   /**
26857    * Given string 'ltr' or 'rtl', save that setting
26858    *
26859    * @param {string} dir ltr or rtl
26860    */
26861
26862   function setTextDirection(dir) {
26863       textDirection = dir;
26864   }
26865
26866   /** Used to compose bitmasks for cloning. */
26867   var CLONE_DEEP_FLAG$3 = 1,
26868       CLONE_SYMBOLS_FLAG$4 = 4;
26869
26870   /**
26871    * This method is like `_.cloneWith` except that it recursively clones `value`.
26872    *
26873    * @static
26874    * @memberOf _
26875    * @since 4.0.0
26876    * @category Lang
26877    * @param {*} value The value to recursively clone.
26878    * @param {Function} [customizer] The function to customize cloning.
26879    * @returns {*} Returns the deep cloned value.
26880    * @see _.cloneWith
26881    * @example
26882    *
26883    * function customizer(value) {
26884    *   if (_.isElement(value)) {
26885    *     return value.cloneNode(true);
26886    *   }
26887    * }
26888    *
26889    * var el = _.cloneDeepWith(document.body, customizer);
26890    *
26891    * console.log(el === document.body);
26892    * // => false
26893    * console.log(el.nodeName);
26894    * // => 'BODY'
26895    * console.log(el.childNodes.length);
26896    * // => 20
26897    */
26898   function cloneDeepWith(value, customizer) {
26899     customizer = typeof customizer == 'function' ? customizer : undefined;
26900     return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
26901   }
26902
26903   /**
26904    * Creates an array of `array` values not included in the other given arrays
26905    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
26906    * for equality comparisons. The order and references of result values are
26907    * determined by the first array.
26908    *
26909    * **Note:** Unlike `_.pullAll`, this method returns a new array.
26910    *
26911    * @static
26912    * @memberOf _
26913    * @since 0.1.0
26914    * @category Array
26915    * @param {Array} array The array to inspect.
26916    * @param {...Array} [values] The values to exclude.
26917    * @returns {Array} Returns the new array of filtered values.
26918    * @see _.without, _.xor
26919    * @example
26920    *
26921    * _.difference([2, 1], [2, 3]);
26922    * // => [1]
26923    */
26924   var difference = baseRest(function(array, values) {
26925     return isArrayLikeObject(array)
26926       ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
26927       : [];
26928   });
26929
26930   /** `Object#toString` result references. */
26931   var mapTag$7 = '[object Map]',
26932       setTag$7 = '[object Set]';
26933
26934   /** Used for built-in method references. */
26935   var objectProto$h = Object.prototype;
26936
26937   /** Used to check objects for own properties. */
26938   var hasOwnProperty$e = objectProto$h.hasOwnProperty;
26939
26940   /**
26941    * Checks if `value` is an empty object, collection, map, or set.
26942    *
26943    * Objects are considered empty if they have no own enumerable string keyed
26944    * properties.
26945    *
26946    * Array-like values such as `arguments` objects, arrays, buffers, strings, or
26947    * jQuery-like collections are considered empty if they have a `length` of `0`.
26948    * Similarly, maps and sets are considered empty if they have a `size` of `0`.
26949    *
26950    * @static
26951    * @memberOf _
26952    * @since 0.1.0
26953    * @category Lang
26954    * @param {*} value The value to check.
26955    * @returns {boolean} Returns `true` if `value` is empty, else `false`.
26956    * @example
26957    *
26958    * _.isEmpty(null);
26959    * // => true
26960    *
26961    * _.isEmpty(true);
26962    * // => true
26963    *
26964    * _.isEmpty(1);
26965    * // => true
26966    *
26967    * _.isEmpty([1, 2, 3]);
26968    * // => false
26969    *
26970    * _.isEmpty({ 'a': 1 });
26971    * // => false
26972    */
26973   function isEmpty(value) {
26974     if (value == null) {
26975       return true;
26976     }
26977     if (isArrayLike(value) &&
26978         (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
26979           isBuffer(value) || isTypedArray(value) || isArguments(value))) {
26980       return !value.length;
26981     }
26982     var tag = getTag$1(value);
26983     if (tag == mapTag$7 || tag == setTag$7) {
26984       return !value.size;
26985     }
26986     if (isPrototype(value)) {
26987       return !baseKeys(value).length;
26988     }
26989     for (var key in value) {
26990       if (hasOwnProperty$e.call(value, key)) {
26991         return false;
26992       }
26993     }
26994     return true;
26995   }
26996
26997   var detected;
26998
26999   function utilDetect(force) {
27000       if (detected && !force) return detected;
27001       detected = {};
27002
27003       var ua = navigator.userAgent,
27004           m = null;
27005
27006       m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
27007       if (m !== null) {
27008           detected.browser = m[1];
27009           detected.version = m[2];
27010       }
27011       if (!detected.browser) {
27012           m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
27013           if (m !== null) {
27014               detected.browser = 'msie';
27015               detected.version = m[1];
27016           }
27017       }
27018       if (!detected.browser) {
27019           m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
27020           if (m !== null) {
27021               detected.browser = 'Opera';
27022               detected.version = m[2];
27023           }
27024       }
27025       if (!detected.browser) {
27026           m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
27027           if (m !== null) {
27028               detected.browser = m[1];
27029               detected.version = m[2];
27030               m = ua.match(/version\/([\.\d]+)/i);
27031               if (m !== null) detected.version = m[1];
27032           }
27033       }
27034       if (!detected.browser) {
27035           detected.browser = navigator.appName;
27036           detected.version = navigator.appVersion;
27037       }
27038
27039       // keep major.minor version only..
27040       detected.version = detected.version.split(/\W/).slice(0,2).join('.');
27041
27042       if (detected.browser.toLowerCase() === 'msie') {
27043           detected.ie = true;
27044           detected.browser = 'Internet Explorer';
27045           detected.support = parseFloat(detected.version) >= 11;
27046       } else {
27047           detected.ie = false;
27048           detected.support = true;
27049       }
27050
27051       // Added due to incomplete svg style support. See #715
27052       detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
27053
27054       detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
27055       detected.language = detected.locale.split('-')[0];
27056
27057       // Search `navigator.languages` for a better locale.. Prefer the first language,
27058       // unless the second language is a culture-specific version of the first one, see #3842
27059       if (navigator.languages && navigator.languages.length > 0) {
27060           var code0 = navigator.languages[0],
27061               parts0 = code0.split('-');
27062
27063           detected.locale = code0;
27064           detected.language = parts0[0];
27065
27066           if (navigator.languages.length > 1 && parts0.length === 1) {
27067               var code1 = navigator.languages[1],
27068                   parts1 = code1.split('-');
27069
27070               if (parts1[0] === parts0[0]) {
27071                   detected.locale = code1;
27072               }
27073           }
27074       }
27075
27076       // Loaded locale is stored in currentLocale
27077       // return that instead (except in the situation where 'en' might override 'en-US')
27078       var loadedLocale = currentLocale || 'en';
27079       if (loadedLocale !== 'en') {
27080           detected.locale = loadedLocale;
27081           detected.language = detected.locale.split('-')[0];
27082       }
27083
27084       // detect text direction
27085       var q = utilStringQs(window.location.hash.substring(1));
27086       var lang = dataLocales[detected.locale];
27087       if ((lang && lang.rtl) || (q.rtl === 'true')) {
27088           detected.textDirection = 'rtl';
27089       } else {
27090           detected.textDirection = 'ltr';
27091       }
27092       setTextDirection(detected.textDirection);
27093
27094       // detect host
27095       var loc = window.top.location;
27096       var origin = loc.origin;
27097       if (!origin) {  // for unpatched IE11
27098           origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
27099       }
27100
27101       detected.host = origin + loc.pathname;
27102
27103       detected.filedrop = (window.FileReader && 'ondrop' in window);
27104
27105       detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27106
27107       detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27108
27109       function nav(x) {
27110           return navigator.userAgent.indexOf(x) !== -1;
27111       }
27112
27113       if (nav('Win')) {
27114           detected.os = 'win';
27115           detected.platform = 'Windows';
27116       }
27117       else if (nav('Mac')) {
27118           detected.os = 'mac';
27119           detected.platform = 'Macintosh';
27120       }
27121       else if (nav('X11') || nav('Linux')) {
27122           detected.os = 'linux';
27123           detected.platform = 'Linux';
27124       }
27125       else {
27126           detected.os = 'win';
27127           detected.platform = 'Unknown';
27128       }
27129
27130       return detected;
27131   }
27132
27133   var remove$1 = removeDiacritics;
27134
27135   var replacementList = [
27136     {
27137       base: ' ',
27138       chars: "\u00A0",
27139     }, {
27140       base: '0',
27141       chars: "\u07C0",
27142     }, {
27143       base: 'A',
27144       chars: "\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F",
27145     }, {
27146       base: 'AA',
27147       chars: "\uA732",
27148     }, {
27149       base: 'AE',
27150       chars: "\u00C6\u01FC\u01E2",
27151     }, {
27152       base: 'AO',
27153       chars: "\uA734",
27154     }, {
27155       base: 'AU',
27156       chars: "\uA736",
27157     }, {
27158       base: 'AV',
27159       chars: "\uA738\uA73A",
27160     }, {
27161       base: 'AY',
27162       chars: "\uA73C",
27163     }, {
27164       base: 'B',
27165       chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
27166     }, {
27167       base: 'C',
27168       chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
27169     }, {
27170       base: 'D',
27171       chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
27172     }, {
27173       base: 'Dh',
27174       chars: "\u00D0",
27175     }, {
27176       base: 'DZ',
27177       chars: "\u01F1\u01C4",
27178     }, {
27179       base: 'Dz',
27180       chars: "\u01F2\u01C5",
27181     }, {
27182       base: 'E',
27183       chars: "\u025B\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E\u1D07",
27184     }, {
27185       base: 'F',
27186       chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
27187     }, {
27188       base: 'G',
27189       chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
27190     }, {
27191       base: 'H',
27192       chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
27193     }, {
27194       base: 'I',
27195       chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
27196     }, {
27197       base: 'J',
27198       chars: "\u24BF\uFF2A\u0134\u0248\u0237",
27199     }, {
27200       base: 'K',
27201       chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
27202     }, {
27203       base: 'L',
27204       chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
27205     }, {
27206       base: 'LJ',
27207       chars: "\u01C7",
27208     }, {
27209       base: 'Lj',
27210       chars: "\u01C8",
27211     }, {
27212       base: 'M',
27213       chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
27214     }, {
27215       base: 'N',
27216       chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
27217     }, {
27218       base: 'NJ',
27219       chars: "\u01CA",
27220     }, {
27221       base: 'Nj',
27222       chars: "\u01CB",
27223     }, {
27224       base: 'O',
27225       chars: "\u24C4\uFF2F\xD2\xD3\xD4\u1ED2\u1ED0\u1ED6\u1ED4\xD5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\xD6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\xD8\u01FE\u0186\u019F\uA74A\uA74C",
27226     }, {
27227       base: 'OE',
27228       chars: "\u0152",
27229     }, {
27230       base: 'OI',
27231       chars: "\u01A2",
27232     }, {
27233       base: 'OO',
27234       chars: "\uA74E",
27235     }, {
27236       base: 'OU',
27237       chars: "\u0222",
27238     }, {
27239       base: 'P',
27240       chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
27241     }, {
27242       base: 'Q',
27243       chars: "\u24C6\uFF31\uA756\uA758\u024A",
27244     }, {
27245       base: 'R',
27246       chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
27247     }, {
27248       base: 'S',
27249       chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
27250     }, {
27251       base: 'T',
27252       chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
27253     }, {
27254       base: 'Th',
27255       chars: "\u00DE",
27256     }, {
27257       base: 'TZ',
27258       chars: "\uA728",
27259     }, {
27260       base: 'U',
27261       chars: "\u24CA\uFF35\xD9\xDA\xDB\u0168\u1E78\u016A\u1E7A\u016C\xDC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244",
27262     }, {
27263       base: 'V',
27264       chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
27265     }, {
27266       base: 'VY',
27267       chars: "\uA760",
27268     }, {
27269       base: 'W',
27270       chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
27271     }, {
27272       base: 'X',
27273       chars: "\u24CD\uFF38\u1E8A\u1E8C",
27274     }, {
27275       base: 'Y',
27276       chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
27277     }, {
27278       base: 'Z',
27279       chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
27280     }, {
27281       base: 'a',
27282       chars: "\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250\u0251",
27283     }, {
27284       base: 'aa',
27285       chars: "\uA733",
27286     }, {
27287       base: 'ae',
27288       chars: "\u00E6\u01FD\u01E3",
27289     }, {
27290       base: 'ao',
27291       chars: "\uA735",
27292     }, {
27293       base: 'au',
27294       chars: "\uA737",
27295     }, {
27296       base: 'av',
27297       chars: "\uA739\uA73B",
27298     }, {
27299       base: 'ay',
27300       chars: "\uA73D",
27301     }, {
27302       base: 'b',
27303       chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
27304     }, {
27305       base: 'c',
27306       chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
27307     }, {
27308       base: 'd',
27309       chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
27310     }, {
27311       base: 'dh',
27312       chars: "\u00F0",
27313     }, {
27314       base: 'dz',
27315       chars: "\u01F3\u01C6",
27316     }, {
27317       base: 'e',
27318       chars: "\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u01DD",
27319     }, {
27320       base: 'f',
27321       chars: "\u24D5\uFF46\u1E1F\u0192",
27322     }, {
27323       base: 'ff',
27324       chars: "\uFB00",
27325     }, {
27326       base: 'fi',
27327       chars: "\uFB01",
27328     }, {
27329       base: 'fl',
27330       chars: "\uFB02",
27331     }, {
27332       base: 'ffi',
27333       chars: "\uFB03",
27334     }, {
27335       base: 'ffl',
27336       chars: "\uFB04",
27337     }, {
27338       base: 'g',
27339       chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
27340     }, {
27341       base: 'h',
27342       chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
27343     }, {
27344       base: 'hv',
27345       chars: "\u0195",
27346     }, {
27347       base: 'i',
27348       chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
27349     }, {
27350       base: 'j',
27351       chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
27352     }, {
27353       base: 'k',
27354       chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
27355     }, {
27356       base: 'l',
27357       chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
27358     }, {
27359       base: 'lj',
27360       chars: "\u01C9",
27361     }, {
27362       base: 'm',
27363       chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
27364     }, {
27365       base: 'n',
27366       chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
27367     }, {
27368       base: 'nj',
27369       chars: "\u01CC",
27370     }, {
27371       base: 'o',
27372       chars: "\u24DE\uFF4F\xF2\xF3\xF4\u1ED3\u1ED1\u1ED7\u1ED5\xF5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\xF6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\xF8\u01FF\uA74B\uA74D\u0275\u0254\u1D11",
27373     }, {
27374       base: 'oe',
27375       chars: "\u0153",
27376     }, {
27377       base: 'oi',
27378       chars: "\u01A3",
27379     }, {
27380       base: 'oo',
27381       chars: "\uA74F",
27382     }, {
27383       base: 'ou',
27384       chars: "\u0223",
27385     }, {
27386       base: 'p',
27387       chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
27388     }, {
27389       base: 'q',
27390       chars: "\u24E0\uFF51\u024B\uA757\uA759",
27391     }, {
27392       base: 'r',
27393       chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
27394     }, {
27395       base: 's',
27396       chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
27397     }, {
27398       base: 'ss',
27399       chars: "\xDF",
27400     }, {
27401       base: 't',
27402       chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
27403     }, {
27404       base: 'th',
27405       chars: "\u00FE",
27406     }, {
27407       base: 'tz',
27408       chars: "\uA729",
27409     }, {
27410       base: 'u',
27411       chars: "\u24E4\uFF55\xF9\xFA\xFB\u0169\u1E79\u016B\u1E7B\u016D\xFC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289",
27412     }, {
27413       base: 'v',
27414       chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
27415     }, {
27416       base: 'vy',
27417       chars: "\uA761",
27418     }, {
27419       base: 'w',
27420       chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
27421     }, {
27422       base: 'x',
27423       chars: "\u24E7\uFF58\u1E8B\u1E8D",
27424     }, {
27425       base: 'y',
27426       chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
27427     }, {
27428       base: 'z',
27429       chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
27430     }
27431   ];
27432
27433   var diacriticsMap = {};
27434   for (var i = 0; i < replacementList.length; i += 1) {
27435     var chars = replacementList[i].chars;
27436     for (var j = 0; j < chars.length; j += 1) {
27437       diacriticsMap[chars[j]] = replacementList[i].base;
27438     }
27439   }
27440
27441   function removeDiacritics(str) {
27442     return str.replace(/[^\u0000-\u007e]/g, function(c) {
27443       return diacriticsMap[c] || c;
27444     });
27445   }
27446
27447   // see https://github.com/openstreetmap/iD/pull/3707
27448   // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
27449
27450   var chars$1 = {
27451       // madda above alef
27452       1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
27453
27454       // hamza above and below alef
27455       1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
27456       // 1572 is ؤ
27457       1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
27458       // 1574 is ئ
27459       1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
27460       1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
27461
27462       // 1577 ة
27463       1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
27464
27465       1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
27466       1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
27467       1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
27468       1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
27469       1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
27470       1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
27471       1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
27472       1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
27473       1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
27474       1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
27475       1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
27476       1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
27477       1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
27478       1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
27479       1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
27480       1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
27481       1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
27482       1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
27483
27484       // 1595 ػ - may be very rare
27485
27486       1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
27487       1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
27488       1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
27489       1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
27490       1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
27491       1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
27492       1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
27493
27494       // 1609 ى
27495       1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
27496       // 1610 ي
27497       1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
27498
27499       // short vowel sounds / tashkil markings
27500
27501       1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
27502
27503       1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
27504       1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
27505       1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
27506       1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
27507       1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
27508       5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
27509   };
27510
27511   var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
27512
27513   function fixRTLTextForSvg(inputText) {
27514       var context = true;
27515       var ret = '';
27516       var rtlBuffer = [];
27517       var arabicRegex = /[\u0600-\u06FF]/g;
27518       var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
27519       var thaanaVowel = /[\u07A6-\u07B0]/;
27520       var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
27521
27522       if (!arabicRegex.test(inputText)) {
27523           // Hebrew or Thaana RTL script
27524           for (var n = 0; n < inputText.length; n++) {
27525               var c = inputText[n];
27526               if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
27527                   rtlBuffer[rtlBuffer.length - 1] += c;
27528               } else if (rtlRegex.test(c)) {
27529                   rtlBuffer.push(c);
27530               } else if (c === ' ' && rtlBuffer.length) {
27531                   // whitespace within RTL text
27532                   rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27533               } else {
27534                   // non-RTL character
27535                   ret += rtlBuffer.reverse().join('') + c;
27536                   rtlBuffer = [];
27537               }
27538           }
27539       } else {
27540           for (var i = 0, l = inputText.length; i < l; i++) {
27541               var code = inputText[i].charCodeAt(0);
27542               var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
27543
27544               if (!chars$1[code]) {
27545                   if (code === 32 && rtlBuffer.length) {
27546                       // whitespace
27547                       rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27548                   } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
27549                       // tashkil mark
27550                       rtlBuffer[rtlBuffer.length - 1] += inputText[i];
27551                   } else {
27552                       // non-RTL character
27553                       ret += rtlBuffer.reverse().join('') + inputText[i];
27554                       rtlBuffer = [];
27555                   }
27556                   continue;
27557               }
27558               if (context) {
27559                   if (i === l - 1 || nextCode === 32) {
27560                       rtlBuffer.push(chars$1[code].isolated);
27561                   } else {
27562                       // special case for لا
27563                       if (code === 1604 && nextCode === 1575) {
27564                           rtlBuffer.push(chars$1[5000].initial);
27565                           i++;
27566                           context = true;
27567                           continue;
27568                       }
27569                       rtlBuffer.push(chars$1[code].initial);
27570                   }
27571               } else {
27572                   if (i === l - 1 || nextCode === 32){
27573                       rtlBuffer.push(chars$1[code].final);
27574                   } else {
27575                       // special case for ﻼ
27576                       if (code === 1604 && nextCode === 1575){
27577                           rtlBuffer.push(chars$1[5000].final);
27578                           i++;
27579                           context = true;
27580                           continue;
27581                       }
27582                       if (chars$1[code].medial === ''){
27583                           rtlBuffer.push(chars$1[code].final);
27584                       } else {
27585                           rtlBuffer.push(chars$1[code].medial);
27586                       }
27587                   }
27588               }
27589               context = (chars$1[code].medial === '') || nextCode === 32;
27590           }
27591       }
27592       ret += rtlBuffer.reverse().join('');
27593       return ret;
27594   }
27595
27596   function utilTagText(entity) {
27597       return map$3(entity.tags, function(v, k) {
27598           return k + '=' + v;
27599       }).join(', ');
27600   }
27601
27602
27603   function utilEntitySelector(ids) {
27604       return ids.length ? '.' + ids.join(',.') : 'nothing';
27605   }
27606
27607
27608   function utilEntityOrMemberSelector(ids, graph) {
27609       var s = utilEntitySelector(ids);
27610
27611       ids.forEach(function(id) {
27612           var entity = graph.hasEntity(id);
27613           if (entity && entity.type === 'relation') {
27614               entity.members.forEach(function(member) {
27615                   s += ',.' + member.id;
27616               });
27617           }
27618       });
27619
27620       return s;
27621   }
27622
27623
27624   function utilGetAllNodes(ids, graph) {
27625       var seen = {};
27626       var nodes = [];
27627       ids.forEach(getNodes);
27628       return nodes;
27629
27630       function getNodes(id) {
27631           if (seen[id]) return;
27632           seen[id] = true;
27633
27634           var entity = graph.hasEntity(id);
27635           if (!entity) return;
27636
27637           if (entity.type === 'node') {
27638               nodes.push(entity);
27639           } else if (entity.type === 'way') {
27640               entity.nodes.forEach(getNodes);
27641           } else {
27642               entity.members.map(function(member) { return member.id; }).forEach(getNodes);
27643           }
27644       }
27645   }
27646
27647
27648   function utilDisplayName(entity) {
27649       var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
27650           name = entity.tags[localizedNameKey] || entity.tags.name || '',
27651           network = entity.tags.cycle_network || entity.tags.network;
27652
27653       if (!name && entity.tags.ref) {
27654           name = entity.tags.ref;
27655           if (network) {
27656               name = network + ' ' + name;
27657           }
27658       }
27659
27660       return name;
27661   }
27662
27663
27664   function utilDisplayNameForPath(entity) {
27665       var name = utilDisplayName(entity);
27666       var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
27667
27668       if (!isFirefox && name && rtlRegex.test(name)) {
27669           name = fixRTLTextForSvg(name);
27670       }
27671
27672       return name;
27673   }
27674
27675
27676   function utilDisplayType(id) {
27677       return {
27678           n: t('inspector.node'),
27679           w: t('inspector.way'),
27680           r: t('inspector.relation')
27681       }[id.charAt(0)];
27682   }
27683
27684
27685   function utilStringQs(str) {
27686       return str.split('&').reduce(function(obj, pair){
27687           var parts = pair.split('=');
27688           if (parts.length === 2) {
27689               obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
27690           }
27691           if (parts[0] === 'mvt') {
27692               obj[parts[0]] = (parts[2] !== undefined) ? (decodeURIComponent(parts[1]) + '=' + decodeURIComponent(parts[2])) : (decodeURIComponent(parts[1]));
27693           }
27694           return obj;
27695       }, {});
27696   }
27697
27698
27699   function utilQsString(obj, noencode) {
27700       function softEncode(s) {
27701         // encode everything except special characters used in certain hash parameters:
27702         // "/" in map states, ":", ",", {" and "}" in background
27703         return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
27704       }
27705       return Object.keys(obj).sort().map(function(key) {
27706           return encodeURIComponent(key) + '=' + (
27707               noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
27708       }).join('&');
27709   }
27710
27711
27712   function utilPrefixDOMProperty(property) {
27713       var prefixes = ['webkit', 'ms', 'moz', 'o'],
27714           i = -1,
27715           n = prefixes.length,
27716           s = document.body;
27717
27718       if (property in s)
27719           return property;
27720
27721       property = property.substr(0, 1).toUpperCase() + property.substr(1);
27722
27723       while (++i < n)
27724           if (prefixes[i] + property in s)
27725               return prefixes[i] + property;
27726
27727       return false;
27728   }
27729
27730
27731   function utilPrefixCSSProperty(property) {
27732       var prefixes = ['webkit', 'ms', 'Moz', 'O'],
27733           i = -1,
27734           n = prefixes.length,
27735           s = document.body.style;
27736
27737       if (property.toLowerCase() in s)
27738           return property.toLowerCase();
27739
27740       while (++i < n)
27741           if (prefixes[i] + property in s)
27742               return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
27743
27744       return false;
27745   }
27746
27747
27748   var transformProperty;
27749   function utilSetTransform(el, x, y, scale) {
27750       var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
27751           translate = utilDetect().opera ?
27752               'translate('   + x + 'px,' + y + 'px)' :
27753               'translate3d(' + x + 'px,' + y + 'px,0)';
27754       return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
27755   }
27756
27757
27758   // Calculates Levenshtein distance between two strings
27759   // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
27760   // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
27761   function utilEditDistance(a, b) {
27762       a = remove$1(a.toLowerCase());
27763       b = remove$1(b.toLowerCase());
27764       if (a.length === 0) return b.length;
27765       if (b.length === 0) return a.length;
27766       var matrix = [];
27767       for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
27768       for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
27769       for (i = 1; i <= b.length; i++) {
27770           for (j = 1; j <= a.length; j++) {
27771               if (b.charAt(i-1) === a.charAt(j-1)) {
27772                   matrix[i][j] = matrix[i-1][j-1];
27773               } else {
27774                   matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
27775                       Math.min(matrix[i][j-1] + 1, // insertion
27776                       matrix[i-1][j] + 1)); // deletion
27777               }
27778           }
27779       }
27780       return matrix[b.length][a.length];
27781   }
27782
27783
27784   // a d3.mouse-alike which
27785   // 1. Only works on HTML elements, not SVG
27786   // 2. Does not cause style recalculation
27787   function utilFastMouse(container) {
27788       var rect = container.getBoundingClientRect(),
27789           rectLeft = rect.left,
27790           rectTop = rect.top,
27791           clientLeft = +container.clientLeft,
27792           clientTop = +container.clientTop;
27793       if (textDirection === 'rtl') {
27794           rectLeft = 0;
27795       }
27796       return function(e) {
27797           return [
27798               e.clientX - rectLeft - clientLeft,
27799               e.clientY - rectTop - clientTop];
27800       };
27801   }
27802
27803
27804   /* eslint-disable no-proto */
27805   var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
27806   /* eslint-enable no-proto */
27807
27808
27809   function utilAsyncMap(inputs, func, callback) {
27810       var remaining = inputs.length,
27811           results = [],
27812           errors = [];
27813
27814       inputs.forEach(function(d, i) {
27815           func(d, function done(err, data) {
27816               errors[i] = err;
27817               results[i] = data;
27818               remaining--;
27819               if (!remaining) callback(errors, results);
27820           });
27821       });
27822   }
27823
27824
27825   // wraps an index to an interval [0..length-1]
27826   function utilWrap(index, length) {
27827       if (index < 0)
27828           index += Math.ceil(-index/length)*length;
27829       return index % length;
27830   }
27831
27832
27833   /**
27834    * a replacement for functor
27835    *
27836    * @param {*} value any value
27837    * @returns {Function} a function that returns that value or the value if it's a function
27838    */
27839   function utilFunctor(value) {
27840       if (typeof value === 'function') return value;
27841       return function() {
27842           return value;
27843       };
27844   }
27845
27846
27847   function utilNoAuto(selection) {
27848       var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
27849
27850       return selection
27851           .attr('autocomplete', 'off')
27852           .attr('autocorrect', 'off')
27853           .attr('autocapitalize', 'off')
27854           .attr('spellcheck', isText ? 'true' : 'false');
27855   }
27856
27857
27858   // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
27859   // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
27860   function utilHashcode(str) {
27861       var hash = 0;
27862       if (str.length === 0) {
27863           return hash;
27864       }
27865       for (var i = 0; i < str.length; i++) {
27866           var char = str.charCodeAt(i);
27867           hash = ((hash << 5) - hash) + char;
27868           hash = hash & hash; // Convert to 32bit integer
27869       }
27870       return hash;
27871   }
27872
27873   // note the function should be of low priority
27874   // and should not be returning a value.
27875   function utilCallWhenIdle(func, timeout) {
27876       return function() {
27877           var args = arguments;
27878           var that = this;
27879           window.requestIdleCallback(function() {
27880               func.apply(that, args);
27881           }, {timeout: timeout});
27882       };
27883   }
27884
27885   function utilCleanTags(tags) {
27886       var out = {};
27887       for (var k in tags) {
27888           if (!k) continue;
27889           var v = tags[k];
27890           if (v !== undefined) {
27891               out[k] = cleanValue(k, v);
27892           }
27893       }
27894
27895       return out;
27896
27897
27898       function cleanValue(k, v) {
27899           function keepSpaces(k) {
27900               return /_hours|_times|:conditional$/.test(k);
27901           }
27902
27903           function skip(k) {
27904               return /^(description|note|fixme)$/.test(k);
27905           }
27906
27907           if (skip(k)) return v;
27908
27909           var cleaned = v
27910               .split(';')
27911               .map(function(s) { return s.trim(); })
27912               .join(keepSpaces(k) ? '; ' : ';');
27913
27914           // The code below is not intended to validate websites and emails.
27915           // It is only intended to prevent obvious copy-paste errors. (#2323)
27916           // clean website- and email-like tags
27917           if (k.indexOf('website') !== -1 ||
27918               k.indexOf('email') !== -1 ||
27919               cleaned.indexOf('http') === 0) {
27920               cleaned = cleaned
27921                   .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
27922
27923           }
27924
27925           return cleaned;
27926       }
27927   }
27928
27929   // Like selection.property('value', ...), but avoids no-op value sets,
27930   // which can result in layout/repaint thrashing in some situations.
27931   function utilGetSetValue(selection, value) {
27932       function d3_selection_value(value) {
27933           function valueNull() {
27934               delete this.value;
27935           }
27936
27937           function valueConstant() {
27938               if (this.value !== value) {
27939                   this.value = value;
27940               }
27941           }
27942
27943           function valueFunction() {
27944               var x = value.apply(this, arguments);
27945               if (x == null) {
27946                   delete this.value;
27947               } else if (this.value !== x) {
27948                   this.value = x;
27949               }
27950           }
27951
27952           return value == null
27953               ? valueNull : (typeof value === 'function'
27954               ? valueFunction : valueConstant);
27955       }
27956
27957       if (arguments.length === 1) {
27958           return selection.property('value');
27959       }
27960
27961       return selection.each(d3_selection_value(value));
27962   }
27963
27964   function utilIdleWorker(tasks, processor, callback) {
27965       var results = [], result;
27966       for (var i = 0; i < tasks.length; i++) {
27967           result = processor(tasks[i]);
27968           if (result) results.push(result);
27969       }
27970       callback(results);
27971
27972       // var processed = [];
27973       // var currentPos = 0;
27974       // var totalTasks = tasks.length;
27975
27976       // function worker(deadline) {
27977       //     while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27978       //         var result = processor(tasks[currentPos]);
27979
27980       //         // if falsy dont add to the processed list
27981       //         if (result) processed.push(result);
27982       //         currentPos++;
27983       //     }
27984
27985       //     // more tasks are left, we might need more idleCallbacks
27986       //     if (currentPos < totalTasks) {
27987       //         return window.requestIdleCallback(function(deadline) {worker(deadline);});
27988       //     }
27989
27990       //     // tasks are completed
27991       //     return callback(processed);
27992       // }
27993
27994       // window.requestIdleCallback(function(deadline) {worker(deadline);});
27995   }
27996
27997   // shim
27998   window.requestIdleCallback =
27999       window.requestIdleCallback ||
28000       function(cb) {
28001           var start = Date.now();
28002           return setTimeout(function() {
28003               cb({
28004                   didTimeout: false,
28005                   timeRemaining: function() {
28006                       return Math.max(0, 50 - (Date.now() - start));
28007                   }
28008               });
28009           }, 1);
28010       };
28011
28012   window.cancelIdleCallback =
28013       window.cancelIdleCallback ||
28014       function(id) {
28015           clearTimeout(id);
28016       };
28017
28018   // Copies a variable number of methods from source to target.
28019   function utilRebind(target, source) {
28020       var i = 1, n = arguments.length, method;
28021       while (++i < n) {
28022           target[method = arguments[i]] = d3_rebind(target, source, source[method]);
28023       }
28024       return target;
28025   }
28026
28027   // Method is assumed to be a standard D3 getter-setter:
28028   // If passed with no arguments, gets the value.
28029   // If passed with arguments, sets the value and returns the target.
28030   function d3_rebind(target, source, method) {
28031       return function() {
28032           var value = method.apply(source, arguments);
28033           return value === source ? target : value;
28034       };
28035   }
28036
28037   // A per-domain session mutex backed by a cookie and dead man's
28038   // switch. If the session crashes, the mutex will auto-release
28039   // after 5 seconds.
28040
28041   // This accepts a string and returns an object that complies with utilSessionMutexType
28042   function utilSessionMutex(name) {
28043       var mutex = {};
28044       var intervalID;
28045
28046       function renew() {
28047           var expires = new Date();
28048           expires.setSeconds(expires.getSeconds() + 5);
28049           document.cookie = name + '=1; expires=' + expires.toUTCString();
28050       }
28051
28052       mutex.lock = function () {
28053           if (intervalID) return true;
28054           var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
28055           if (cookie) return false;
28056           renew();
28057           intervalID = window.setInterval(renew, 4000);
28058           return true;
28059       };
28060
28061       mutex.unlock = function () {
28062           if (!intervalID) return;
28063           document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
28064           clearInterval(intervalID);
28065           intervalID = null;
28066       };
28067
28068       mutex.locked = function () {
28069           return !!intervalID;
28070       };
28071
28072       return mutex;
28073   }
28074
28075   function utilSuggestNames(preset, suggestions) {
28076       preset = preset.id.split('/', 2);
28077       var k = preset[0],
28078           v = preset[1];
28079
28080       return function(value, callback) {
28081           var result = [];
28082           if (value && value.length > 2) {
28083               if (suggestions[k] && suggestions[k][v]) {
28084                   for (var sugg in suggestions[k][v]) {
28085                       var dist = utilEditDistance(value, sugg.substring(0, value.length));
28086                       if (dist < 3) {
28087                           result.push({
28088                               title: sugg,
28089                               value: sugg,
28090                               dist: dist
28091                           });
28092                       }
28093                   }
28094               }
28095               result.sort(function(a, b) {
28096                   return a.dist - b.dist;
28097               });
28098           }
28099           result = result.slice(0,3);
28100           callback(result);
28101       };
28102   }
28103
28104   function utilTiler() {
28105       var _size = [256, 256];
28106       var _scale = 256;
28107       var _tileSize = 256;
28108       var _zoomExtent = [0, 20];
28109       var _translate = [_size[0] / 2, _size[1] / 2];
28110       var _margin = 0;
28111       var _skipNullIsland = false;
28112
28113
28114       function bound(val) {
28115           return Math.min(_zoomExtent[1], Math.max(_zoomExtent[0], val));
28116       }
28117
28118
28119       function nearNullIsland(tile) {
28120           var x = tile[0];
28121           var y = tile[1];
28122           var z = tile[2];
28123           if (z >= 7) {
28124               var center = Math.pow(2, z - 1);
28125               var width = Math.pow(2, z - 6);
28126               var min$$1 = center - (width / 2);
28127               var max$$1 = center + (width / 2) - 1;
28128               return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
28129           }
28130           return false;
28131       }
28132
28133
28134       function tiler() {
28135           var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
28136           var z0 = bound(Math.round(z));
28137           var log2ts = Math.log(_tileSize) * Math.LOG2E;
28138           var k = Math.pow(2, z - z0 + log2ts);
28139           var origin = [
28140               (_translate[0] - _scale / 2) / k,
28141               (_translate[1] - _scale / 2) / k
28142           ];
28143
28144           var cols = range(
28145               Math.max(0, Math.floor(-origin[0]) - _margin),
28146               Math.max(0, Math.ceil(_size[0] / k - origin[0]) + _margin)
28147           );
28148           var rows = range(
28149               Math.max(0, Math.floor(-origin[1]) - _margin),
28150               Math.max(0, Math.ceil(_size[1] / k - origin[1]) + _margin)
28151           );
28152
28153           var tiles = [];
28154           for (var i = 0; i < rows.length; i++) {
28155               var y = rows[i];
28156               for (var j = 0; j < cols.length; j++) {
28157                   var x = cols[j];
28158
28159                   if (i >= _margin && i <= rows.length - _margin &&
28160                       j >= _margin && j <= cols.length - _margin) {
28161                       tiles.unshift([x, y, z0]);  // tiles in view at beginning
28162                   } else {
28163                       tiles.push([x, y, z0]);     // tiles in margin at the end
28164                   }
28165               }
28166           }
28167
28168           tiles.translate = origin;
28169           tiles.scale = k;
28170
28171           return tiles;
28172       }
28173
28174
28175       /**
28176        * getTiles() returns an array of tiles that cover the map view
28177        */
28178       tiler.getTiles = function(projection) {
28179           var origin = [
28180               projection.scale() * Math.PI - projection.translate()[0],
28181               projection.scale() * Math.PI - projection.translate()[1]
28182           ];
28183
28184           this
28185               .size(projection.clipExtent()[1])
28186               .scale(projection.scale() * 2 * Math.PI)
28187               .translate(projection.translate());
28188
28189           var tiles = tiler();
28190           var ts = tiles.scale;
28191
28192           return tiles
28193               .map(function(tile) {
28194                   if (_skipNullIsland && nearNullIsland(tile)) {
28195                       return false;
28196                   }
28197                   var x = tile[0] * ts - origin[0];
28198                   var y = tile[1] * ts - origin[1];
28199                   return {
28200                       id: tile.toString(),
28201                       xyz: tile,
28202                       extent: geoExtent$$1(
28203                           projection.invert([x, y + ts]),
28204                           projection.invert([x + ts, y])
28205                       )
28206                   };
28207               }).filter(Boolean);
28208       };
28209
28210
28211       tiler.tileSize = function(val) {
28212           if (!arguments.length) return _tileSize;
28213           _tileSize = val;
28214           return tiler;
28215       };
28216
28217
28218       tiler.zoomExtent = function(val) {
28219           if (!arguments.length) return _zoomExtent;
28220           _zoomExtent = val;
28221           return tiler;
28222       };
28223
28224
28225       tiler.size = function(val) {
28226           if (!arguments.length) return _size;
28227           _size = val;
28228           return tiler;
28229       };
28230
28231
28232       tiler.scale = function(val) {
28233           if (!arguments.length) return _scale;
28234           _scale = val;
28235           return tiler;
28236       };
28237
28238
28239       tiler.translate = function(val) {
28240           if (!arguments.length) return _translate;
28241           _translate = val;
28242           return tiler;
28243       };
28244
28245
28246       // number to extend the rows/columns beyond those covering the viewport
28247       tiler.margin = function(val) {
28248           if (!arguments.length) return _margin;
28249           _margin = +val;
28250           return tiler;
28251       };
28252
28253
28254       tiler.skipNullIsland = function(val) {
28255           if (!arguments.length) return _skipNullIsland;
28256           _skipNullIsland = val;
28257           return tiler;
28258       };
28259
28260
28261       return tiler;
28262   }
28263
28264   function utilTriggerEvent(target, type) {
28265       target.each(function() {
28266           var evt = document.createEvent('HTMLEvents');
28267           evt.initEvent(type, true, true);
28268           this.dispatchEvent(evt);
28269       });
28270   }
28271
28272   function validationDeprecatedTag() {
28273
28274       var validation = function(changes) {
28275           var warnings = [];
28276           for (var i = 0; i < changes.created.length; i++) {
28277               var change = changes.created[i],
28278                   deprecatedTags = change.deprecatedTags();
28279
28280               if (!isEmpty(deprecatedTags)) {
28281                   var tags = utilTagText({ tags: deprecatedTags });
28282                   warnings.push({
28283                       id: 'deprecated_tags',
28284                       message: t('validations.deprecated_tags', { tags: tags }),
28285                       entity: change
28286                   });
28287               }
28288           }
28289
28290           return warnings;
28291       };
28292
28293
28294       return validation;
28295   }
28296
28297   function validationDisconnectedHighway() {
28298
28299       function isDisconnectedHighway(entity, graph) {
28300           if (!entity.tags.highway) return false;
28301           if (entity.geometry(graph) !== 'line') return false;
28302
28303           return graph.childNodes(entity)
28304               .every(function(vertex) {
28305                   var parents = graph.parentWays(vertex);
28306                   if (parents.length === 1) {  // standalone vertex
28307                       return true;
28308                   } else {                     // shared vertex
28309                       return !vertex.tags.entrance &&
28310                           parents.filter(function(parent) {
28311                               return parent.tags.highway && parent !== entity;
28312                           }).length === 0;
28313                   }
28314               });
28315       }
28316
28317
28318       var validation = function(changes, graph) {
28319           var warnings = [];
28320           for (var i = 0; i < changes.created.length; i++) {
28321               var entity = changes.created[i];
28322
28323               if (isDisconnectedHighway(entity, graph)) {
28324                   warnings.push({
28325                       id: 'disconnected_highway',
28326                       message: t('validations.disconnected_highway'),
28327                       tooltip: t('validations.disconnected_highway_tooltip'),
28328                       entity: entity
28329                   });
28330               }
28331           }
28332
28333           return warnings;
28334       };
28335
28336
28337       return validation;
28338   }
28339
28340   function validationManyDeletions() {
28341       var threshold = 100;
28342
28343       var validation = function(changes, graph) {
28344           var warnings = [];
28345           var nodes=0, ways=0, areas=0, relations=0;
28346
28347           changes.deleted.forEach(function(c) {
28348               if (c.type === 'node') {nodes++;}
28349               else if (c.type === 'way' && c.geometry(graph) === 'line') {ways++;}
28350               else if (c.type === 'way' && c.geometry(graph) === 'area') {areas++;}
28351               else if (c.type === 'relation') {relations++;}
28352           });
28353           if (changes.deleted.length > threshold) {
28354               warnings.push({
28355                   id: 'many_deletions',
28356                   message: t('validations.many_deletions',
28357                       { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations })
28358               });
28359           }
28360
28361           return warnings;
28362       };
28363
28364
28365       return validation;
28366   }
28367
28368   function validationMissingTag() {
28369
28370       // Slightly stricter check than Entity#isUsed (#3091)
28371       function hasTags(entity, graph) {
28372           return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
28373               graph.parentRelations(entity).length > 0;
28374       }
28375
28376       var validation = function(changes, graph) {
28377           var types = ['point', 'line', 'area', 'relation'],
28378               warnings = [];
28379
28380           for (var i = 0; i < changes.created.length; i++) {
28381               var change = changes.created[i],
28382                   geometry = change.geometry(graph);
28383
28384               if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
28385                   warnings.push({
28386                       id: 'missing_tag',
28387                       message: t('validations.untagged_' + geometry),
28388                       tooltip: t('validations.untagged_' + geometry + '_tooltip'),
28389                       entity: change
28390                   });
28391               }
28392           }
28393
28394           return warnings;
28395       };
28396
28397
28398       return validation;
28399   }
28400
28401   function validationOldMultipolygon() {
28402
28403       return function validation(changes, graph) {
28404           var warnings = [];
28405           for (var i = 0; i < changes.created.length; i++) {
28406               var entity = changes.created[i];
28407               var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
28408               if (parent) {
28409                   warnings.push({
28410                       id: 'old_multipolygon',
28411                       message: t('validations.old_multipolygon'),
28412                       tooltip: t('validations.old_multipolygon_tooltip'),
28413                       entity: parent
28414                   });
28415               }
28416           }
28417           return warnings;
28418       };
28419   }
28420
28421   // https://github.com/openstreetmap/josm/blob/mirror/src/org/
28422   // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
28423   function validationTagSuggestsArea() {
28424
28425       function tagSuggestsArea(tags) {
28426           if (isEmpty(tags)) return false;
28427
28428           var presence = ['landuse', 'amenities', 'tourism', 'shop'];
28429           for (var i = 0; i < presence.length; i++) {
28430               if (tags[presence[i]] !== undefined) {
28431                   if (presence[i] === 'tourism' && tags[presence[i]] === 'artwork') {
28432                       continue;   // exception for tourism=artwork - #5206
28433                   } else {
28434                       return presence[i] + '=' + tags[presence[i]];
28435                   }
28436               }
28437           }
28438
28439           if (tags.building && tags.building === 'yes') return 'building=yes';
28440       }
28441
28442
28443       var validation = function(changes, graph) {
28444           var warnings = [];
28445           for (var i = 0; i < changes.created.length; i++) {
28446               var change = changes.created[i],
28447                   geometry = change.geometry(graph),
28448                   suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
28449
28450               if (suggestion) {
28451                   warnings.push({
28452                       id: 'tag_suggests_area',
28453                       message: t('validations.tag_suggests_area', { tag: suggestion }),
28454                       entity: change
28455                   });
28456               }
28457           }
28458
28459           return warnings;
28460       };
28461
28462
28463       return validation;
28464   }
28465
28466
28467
28468   var Validations = /*#__PURE__*/Object.freeze({
28469     validationDeprecatedTag: validationDeprecatedTag,
28470     validationDisconnectedHighway: validationDisconnectedHighway,
28471     validationManyDeletions: validationManyDeletions,
28472     validationMissingTag: validationMissingTag,
28473     validationOldMultipolygon: validationOldMultipolygon,
28474     validationTagSuggestsArea: validationTagSuggestsArea
28475   });
28476
28477   /**
28478    * Performs a deep comparison between two values to determine if they are
28479    * equivalent.
28480    *
28481    * **Note:** This method supports comparing arrays, array buffers, booleans,
28482    * date objects, error objects, maps, numbers, `Object` objects, regexes,
28483    * sets, strings, symbols, and typed arrays. `Object` objects are compared
28484    * by their own, not inherited, enumerable properties. Functions and DOM
28485    * nodes are compared by strict equality, i.e. `===`.
28486    *
28487    * @static
28488    * @memberOf _
28489    * @since 0.1.0
28490    * @category Lang
28491    * @param {*} value The value to compare.
28492    * @param {*} other The other value to compare.
28493    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
28494    * @example
28495    *
28496    * var object = { 'a': 1 };
28497    * var other = { 'a': 1 };
28498    *
28499    * _.isEqual(object, other);
28500    * // => true
28501    *
28502    * object === other;
28503    * // => false
28504    */
28505   function isEqual(value, other) {
28506     return baseIsEqual(value, other);
28507   }
28508
28509   /*
28510       iD.Difference represents the difference between two graphs.
28511       It knows how to calculate the set of entities that were
28512       created, modified, or deleted, and also contains the logic
28513       for recursively extending a difference to the complete set
28514       of entities that will require a redraw, taking into account
28515       child and parent relationships.
28516    */
28517   function coreDifference(base, head) {
28518       var _changes = {};
28519       var _diff = {};
28520       var _length = 0;
28521       var i, k, h, b, keys;
28522
28523       function changed(h, b) {
28524           if (h === b) return false;
28525           if (!h || !b) return true;
28526
28527           if (h.loc || b.loc) {
28528               if (!h.loc && b.loc || h.loc && !b.loc ||
28529                   h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
28530           }
28531           if (h.nodes || b.nodes) {
28532               if (!isEqual(h.nodes, b.nodes)) return true;
28533           }
28534           if (h.members || b.members) {
28535               if (!isEqual(h.members, b.members)) return true;
28536           }
28537           return !isEqual(h.tags, b.tags);
28538       }
28539
28540
28541       keys = Object.keys(head.entities);
28542       for (i = 0; i < keys.length; i++) {
28543           k = keys[i];
28544           h = head.entities[k];
28545           b = base.entities[k];
28546           if (changed(h, b)) {
28547               _changes[k] = {base: b, head: h};
28548               _length++;
28549           }
28550       }
28551
28552       keys = Object.keys(base.entities);
28553       for (i = 0; i < keys.length; i++) {
28554           k = keys[i];
28555           h = head.entities[k];
28556           b = base.entities[k];
28557           if (!_changes[k] && changed(h, b)) {
28558               _changes[k] = {base: b, head: h};
28559               _length++;
28560           }
28561       }
28562
28563
28564       function addParents(parents, result) {
28565           for (var i = 0; i < parents.length; i++) {
28566               var parent = parents[i];
28567
28568               if (parent.id in result)
28569                   continue;
28570
28571               result[parent.id] = parent;
28572               addParents(head.parentRelations(parent), result);
28573           }
28574       }
28575
28576
28577       _diff.length = function length() {
28578           return _length;
28579       };
28580
28581
28582       _diff.changes = function changes() {
28583           return _changes;
28584       };
28585
28586
28587       _diff.extantIDs = function extantIDs() {
28588           var result = [];
28589           forEach(_changes, function(change, id) {
28590               if (change.head) result.push(id);
28591           });
28592           return result;
28593       };
28594
28595
28596       _diff.modified = function modified() {
28597           var result = [];
28598           forEach(_changes, function(change) {
28599               if (change.base && change.head) result.push(change.head);
28600           });
28601           return result;
28602       };
28603
28604
28605       _diff.created = function created() {
28606           var result = [];
28607           forEach(_changes, function(change) {
28608               if (!change.base && change.head) result.push(change.head);
28609           });
28610           return result;
28611       };
28612
28613
28614       _diff.deleted = function deleted() {
28615           var result = [];
28616           forEach(_changes, function(change) {
28617               if (change.base && !change.head) result.push(change.base);
28618           });
28619           return result;
28620       };
28621
28622
28623       _diff.summary = function summary() {
28624           var relevant = {};
28625
28626           function addEntity(entity, graph, changeType) {
28627               relevant[entity.id] = {
28628                   entity: entity,
28629                   graph: graph,
28630                   changeType: changeType
28631               };
28632           }
28633
28634           function addParents(entity) {
28635               var parents = head.parentWays(entity);
28636               for (var j = parents.length - 1; j >= 0; j--) {
28637                   var parent = parents[j];
28638                   if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
28639               }
28640           }
28641
28642           var keys = Object.keys(_changes);
28643           for (var i = 0; i < keys.length; i++) {
28644               var change = _changes[keys[i]];
28645
28646               if (change.head && change.head.geometry(head) !== 'vertex') {
28647                   addEntity(change.head, head, change.base ? 'modified' : 'created');
28648
28649               } else if (change.base && change.base.geometry(base) !== 'vertex') {
28650                   addEntity(change.base, base, 'deleted');
28651
28652               } else if (change.base && change.head) { // modified vertex
28653                   var moved    = !isEqual(change.base.loc,  change.head.loc);
28654                   var retagged = !isEqual(change.base.tags, change.head.tags);
28655
28656                   if (moved) {
28657                       addParents(change.head);
28658                   }
28659
28660                   if (retagged || (moved && change.head.hasInterestingTags())) {
28661                       addEntity(change.head, head, 'modified');
28662                   }
28663
28664               } else if (change.head && change.head.hasInterestingTags()) { // created vertex
28665                   addEntity(change.head, head, 'created');
28666
28667               } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
28668                   addEntity(change.base, base, 'deleted');
28669               }
28670           }
28671
28672           return values$1(relevant);
28673       };
28674
28675
28676       _diff.complete = function complete(extent) {
28677           var result = {};
28678           var id, change;
28679
28680           for (id in _changes) {
28681               change = _changes[id];
28682
28683               var h = change.head;
28684               var b = change.base;
28685               var entity = h || b;
28686
28687               if (extent &&
28688                   (!h || !h.intersects(extent, head)) &&
28689                   (!b || !b.intersects(extent, base)))
28690                   continue;
28691
28692               result[id] = h;
28693
28694               if (entity.type === 'way') {
28695                   var nh = h ? h.nodes : [];
28696                   var nb = b ? b.nodes : [];
28697                   var diff, i;
28698
28699                   diff = difference(nh, nb);
28700                   for (i = 0; i < diff.length; i++) {
28701                       result[diff[i]] = head.hasEntity(diff[i]);
28702                   }
28703
28704                   diff = difference(nb, nh);
28705                   for (i = 0; i < diff.length; i++) {
28706                       result[diff[i]] = head.hasEntity(diff[i]);
28707                   }
28708               }
28709
28710               addParents(head.parentWays(entity), result);
28711               addParents(head.parentRelations(entity), result);
28712           }
28713
28714           return result;
28715       };
28716
28717
28718       return _diff;
28719   }
28720
28721   /** Used for built-in method references. */
28722   var objectProto$i = Object.prototype;
28723
28724   /** Used to check objects for own properties. */
28725   var hasOwnProperty$f = objectProto$i.hasOwnProperty;
28726
28727   /**
28728    * Assigns own enumerable string keyed properties of source objects to the
28729    * destination object. Source objects are applied from left to right.
28730    * Subsequent sources overwrite property assignments of previous sources.
28731    *
28732    * **Note:** This method mutates `object` and is loosely based on
28733    * [`Object.assign`](https://mdn.io/Object/assign).
28734    *
28735    * @static
28736    * @memberOf _
28737    * @since 0.10.0
28738    * @category Object
28739    * @param {Object} object The destination object.
28740    * @param {...Object} [sources] The source objects.
28741    * @returns {Object} Returns `object`.
28742    * @see _.assignIn
28743    * @example
28744    *
28745    * function Foo() {
28746    *   this.a = 1;
28747    * }
28748    *
28749    * function Bar() {
28750    *   this.c = 3;
28751    * }
28752    *
28753    * Foo.prototype.b = 2;
28754    * Bar.prototype.d = 4;
28755    *
28756    * _.assign({ 'a': 0 }, new Foo, new Bar);
28757    * // => { 'a': 1, 'c': 3 }
28758    */
28759   var assign = createAssigner(function(object, source) {
28760     if (isPrototype(source) || isArrayLike(source)) {
28761       copyObject(source, keys$1(source), object);
28762       return;
28763     }
28764     for (var key in source) {
28765       if (hasOwnProperty$f.call(source, key)) {
28766         assignValue(object, key, source[key]);
28767       }
28768     }
28769   });
28770
28771   /* Built-in method references for those with the same name as other `lodash` methods. */
28772   var nativeMax$3 = Math.max;
28773
28774   /**
28775    * Checks if `value` is in `collection`. If `collection` is a string, it's
28776    * checked for a substring of `value`, otherwise
28777    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
28778    * is used for equality comparisons. If `fromIndex` is negative, it's used as
28779    * the offset from the end of `collection`.
28780    *
28781    * @static
28782    * @memberOf _
28783    * @since 0.1.0
28784    * @category Collection
28785    * @param {Array|Object|string} collection The collection to inspect.
28786    * @param {*} value The value to search for.
28787    * @param {number} [fromIndex=0] The index to search from.
28788    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
28789    * @returns {boolean} Returns `true` if `value` is found, else `false`.
28790    * @example
28791    *
28792    * _.includes([1, 2, 3], 1);
28793    * // => true
28794    *
28795    * _.includes([1, 2, 3], 1, 2);
28796    * // => false
28797    *
28798    * _.includes({ 'a': 1, 'b': 2 }, 1);
28799    * // => true
28800    *
28801    * _.includes('abcd', 'bc');
28802    * // => true
28803    */
28804   function includes(collection, value, fromIndex, guard) {
28805     collection = isArrayLike(collection) ? collection : values$1(collection);
28806     fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
28807
28808     var length = collection.length;
28809     if (fromIndex < 0) {
28810       fromIndex = nativeMax$3(length + fromIndex, 0);
28811     }
28812     return isString(collection)
28813       ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
28814       : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
28815   }
28816
28817   function coreGraph$$1(other, mutable) {
28818       if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
28819
28820       if (other instanceof coreGraph$$1) {
28821           var base = other.base();
28822           this.entities = assign(Object.create(base.entities), other.entities);
28823           this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
28824           this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
28825
28826       } else {
28827           this.entities = Object.create({});
28828           this._parentWays = Object.create({});
28829           this._parentRels = Object.create({});
28830           this.rebase(other || [], [this]);
28831       }
28832
28833       this.transients = {};
28834       this._childNodes = {};
28835       this.frozen = !mutable;
28836   }
28837
28838
28839   coreGraph$$1.prototype = {
28840
28841       hasEntity: function(id) {
28842           return this.entities[id];
28843       },
28844
28845
28846       entity: function(id) {
28847           var entity = this.entities[id];
28848
28849           //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
28850           if (!entity) {
28851               entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
28852           }
28853
28854           if (!entity) {
28855               throw new Error('entity ' + id + ' not found');
28856           }
28857           return entity;
28858       },
28859
28860
28861       transient: function(entity, key, fn) {
28862           var id = entity.id;
28863           var transients = this.transients[id] || (this.transients[id] = {});
28864
28865           if (transients[key] !== undefined) {
28866               return transients[key];
28867           }
28868
28869           transients[key] = fn.call(entity);
28870
28871           return transients[key];
28872       },
28873
28874
28875       parentWays: function(entity) {
28876           var parents = this._parentWays[entity.id];
28877           var result = [];
28878
28879           if (parents) {
28880               for (var i = 0; i < parents.length; i++) {
28881                   result.push(this.entity(parents[i]));
28882               }
28883           }
28884           return result;
28885       },
28886
28887
28888       isPoi: function(entity) {
28889           var parentWays = this._parentWays[entity.id];
28890           return !parentWays || parentWays.length === 0;
28891       },
28892
28893
28894       isShared: function(entity) {
28895           var parentWays = this._parentWays[entity.id];
28896           return parentWays && parentWays.length > 1;
28897       },
28898
28899
28900       parentRelations: function(entity) {
28901           var parents = this._parentRels[entity.id];
28902           var result = [];
28903
28904           if (parents) {
28905               for (var i = 0; i < parents.length; i++) {
28906                   result.push(this.entity(parents[i]));
28907               }
28908           }
28909           return result;
28910       },
28911
28912
28913       childNodes: function(entity) {
28914           if (this._childNodes[entity.id]) return this._childNodes[entity.id];
28915           if (!entity.nodes) return [];
28916
28917           var nodes = [];
28918           for (var i = 0; i < entity.nodes.length; i++) {
28919               nodes[i] = this.entity(entity.nodes[i]);
28920           }
28921
28922           this._childNodes[entity.id] = nodes;
28923           return this._childNodes[entity.id];
28924       },
28925
28926
28927       base: function() {
28928           return {
28929               'entities': utilGetPrototypeOf(this.entities),
28930               'parentWays': utilGetPrototypeOf(this._parentWays),
28931               'parentRels': utilGetPrototypeOf(this._parentRels)
28932           };
28933       },
28934
28935
28936       // Unlike other graph methods, rebase mutates in place. This is because it
28937       // is used only during the history operation that merges newly downloaded
28938       // data into each state. To external consumers, it should appear as if the
28939       // graph always contained the newly downloaded data.
28940       rebase: function(entities, stack, force) {
28941           var base = this.base();
28942           var i, j, k, id;
28943
28944           for (i = 0; i < entities.length; i++) {
28945               var entity = entities[i];
28946
28947               if (!entity.visible || (!force && base.entities[entity.id]))
28948                   continue;
28949
28950               // Merging data into the base graph
28951               base.entities[entity.id] = entity;
28952               this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
28953
28954               // Restore provisionally-deleted nodes that are discovered to have an extant parent
28955               if (entity.type === 'way') {
28956                   for (j = 0; j < entity.nodes.length; j++) {
28957                       id = entity.nodes[j];
28958                       for (k = 1; k < stack.length; k++) {
28959                           var ents = stack[k].entities;
28960                           if (ents.hasOwnProperty(id) && ents[id] === undefined) {
28961                               delete ents[id];
28962                           }
28963                       }
28964                   }
28965               }
28966           }
28967
28968           for (i = 0; i < stack.length; i++) {
28969               stack[i]._updateRebased();
28970           }
28971       },
28972
28973
28974       _updateRebased: function() {
28975           var base = this.base();
28976           var i, k, child, id, keys;
28977
28978           keys = Object.keys(this._parentWays);
28979           for (i = 0; i < keys.length; i++) {
28980               child = keys[i];
28981               if (base.parentWays[child]) {
28982                   for (k = 0; k < base.parentWays[child].length; k++) {
28983                       id = base.parentWays[child][k];
28984                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
28985                           this._parentWays[child].push(id);
28986                       }
28987                   }
28988               }
28989           }
28990
28991           keys = Object.keys(this._parentRels);
28992           for (i = 0; i < keys.length; i++) {
28993               child = keys[i];
28994               if (base.parentRels[child]) {
28995                   for (k = 0; k < base.parentRels[child].length; k++) {
28996                       id = base.parentRels[child][k];
28997                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
28998                           this._parentRels[child].push(id);
28999                       }
29000                   }
29001               }
29002           }
29003
29004           this.transients = {};
29005
29006           // this._childNodes is not updated, under the assumption that
29007           // ways are always downloaded with their child nodes.
29008       },
29009
29010
29011       // Updates calculated properties (parentWays, parentRels) for the specified change
29012       _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
29013           parentWays = parentWays || this._parentWays;
29014           parentRels = parentRels || this._parentRels;
29015
29016           var type = entity && entity.type || oldentity && oldentity.type;
29017           var removed, added, ways, rels, i;
29018
29019           if (type === 'way') {   // Update parentWays
29020               if (oldentity && entity) {
29021                   removed = difference(oldentity.nodes, entity.nodes);
29022                   added = difference(entity.nodes, oldentity.nodes);
29023               } else if (oldentity) {
29024                   removed = oldentity.nodes;
29025                   added = [];
29026               } else if (entity) {
29027                   removed = [];
29028                   added = entity.nodes;
29029               }
29030               for (i = 0; i < removed.length; i++) {
29031                   parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
29032               }
29033               for (i = 0; i < added.length; i++) {
29034                   ways = without(parentWays[added[i]], entity.id);
29035                   ways.push(entity.id);
29036                   parentWays[added[i]] = ways;
29037               }
29038
29039           } else if (type === 'relation') {   // Update parentRels
29040               if (oldentity && entity) {
29041                   removed = difference(oldentity.members, entity.members);
29042                   added = difference(entity.members, oldentity);
29043               } else if (oldentity) {
29044                   removed = oldentity.members;
29045                   added = [];
29046               } else if (entity) {
29047                   removed = [];
29048                   added = entity.members;
29049               }
29050               for (i = 0; i < removed.length; i++) {
29051                   parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
29052               }
29053               for (i = 0; i < added.length; i++) {
29054                   rels = without(parentRels[added[i].id], entity.id);
29055                   rels.push(entity.id);
29056                   parentRels[added[i].id] = rels;
29057               }
29058           }
29059       },
29060
29061
29062       replace: function(entity) {
29063           if (this.entities[entity.id] === entity) return this;
29064
29065           return this.update(function() {
29066               this._updateCalculated(this.entities[entity.id], entity);
29067               this.entities[entity.id] = entity;
29068           });
29069       },
29070
29071
29072       remove: function(entity) {
29073           return this.update(function() {
29074               this._updateCalculated(entity, undefined);
29075               this.entities[entity.id] = undefined;
29076           });
29077       },
29078
29079
29080       revert: function(id) {
29081           var baseEntity = this.base().entities[id];
29082           var headEntity = this.entities[id];
29083           if (headEntity === baseEntity) return this;
29084
29085           return this.update(function() {
29086               this._updateCalculated(headEntity, baseEntity);
29087               delete this.entities[id];
29088           });
29089       },
29090
29091
29092       update: function() {
29093           var graph = this.frozen ? coreGraph$$1(this, true) : this;
29094           for (var i = 0; i < arguments.length; i++) {
29095               arguments[i].call(graph, graph);
29096           }
29097
29098           if (this.frozen) graph.frozen = true;
29099
29100           return graph;
29101       },
29102
29103
29104       // Obliterates any existing entities
29105       load: function(entities) {
29106           var base = this.base();
29107           this.entities = Object.create(base.entities);
29108
29109           for (var i in entities) {
29110               this.entities[i] = entities[i];
29111               this._updateCalculated(base.entities[i], this.entities[i]);
29112           }
29113
29114           return this;
29115       }
29116   };
29117
29118   function coreTree(head) {
29119       var rtree = rbush_1(),
29120           bboxes = {},
29121           tree = {};
29122
29123
29124       function entityBBox(entity) {
29125           var bbox = entity.extent(head).bbox();
29126           bbox.id = entity.id;
29127           bboxes[entity.id] = bbox;
29128           return bbox;
29129       }
29130
29131
29132       function updateParents(entity, insertions, memo) {
29133           head.parentWays(entity).forEach(function(way) {
29134               if (bboxes[way.id]) {
29135                   rtree.remove(bboxes[way.id]);
29136                   insertions[way.id] = way;
29137               }
29138               updateParents(way, insertions, memo);
29139           });
29140
29141           head.parentRelations(entity).forEach(function(relation) {
29142               if (memo[entity.id]) return;
29143               memo[entity.id] = true;
29144               if (bboxes[relation.id]) {
29145                   rtree.remove(bboxes[relation.id]);
29146                   insertions[relation.id] = relation;
29147               }
29148               updateParents(relation, insertions, memo);
29149           });
29150       }
29151
29152
29153       tree.rebase = function(entities, force) {
29154           var insertions = {};
29155
29156           for (var i = 0; i < entities.length; i++) {
29157               var entity = entities[i];
29158
29159               if (!entity.visible)
29160                   continue;
29161
29162               if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
29163                   if (!force) {
29164                       continue;
29165                   } else if (bboxes[entity.id]) {
29166                       rtree.remove(bboxes[entity.id]);
29167                   }
29168               }
29169
29170               insertions[entity.id] = entity;
29171               updateParents(entity, insertions, {});
29172           }
29173
29174           rtree.load(map$3(insertions, entityBBox));
29175
29176           return tree;
29177       };
29178
29179
29180       tree.intersects = function(extent, graph) {
29181           if (graph !== head) {
29182               var diff = coreDifference(head, graph),
29183                   insertions = {};
29184
29185               head = graph;
29186
29187               diff.deleted().forEach(function(entity) {
29188                   rtree.remove(bboxes[entity.id]);
29189                   delete bboxes[entity.id];
29190               });
29191
29192               diff.modified().forEach(function(entity) {
29193                   rtree.remove(bboxes[entity.id]);
29194                   insertions[entity.id] = entity;
29195                   updateParents(entity, insertions, {});
29196               });
29197
29198               diff.created().forEach(function(entity) {
29199                   insertions[entity.id] = entity;
29200               });
29201
29202               rtree.load(map$3(insertions, entityBBox));
29203           }
29204
29205           return rtree.search(extent.bbox()).map(function(bbox) {
29206               return head.entity(bbox.id);
29207           });
29208       };
29209
29210
29211       return tree;
29212   }
29213
29214   /*
29215    * This code is licensed under the MIT license.
29216    *
29217    * Copyright © 2013, iD authors.
29218    *
29219    * Portions copyright © 2011, Keith Cirkel
29220    * See https://github.com/keithamus/jwerty
29221    *
29222    */
29223   function d3keybinding(namespace$$1) {
29224       var bindings = [];
29225
29226
29227       function testBindings(isCapturing) {
29228           var didMatch = false,
29229               i, binding;
29230
29231           // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
29232           // so we don't strictly match on the shift key, but we prioritize
29233           // shifted bindings first, and fallback to unshifted only if no match.
29234           // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
29235
29236           // priority match shifted bindings first
29237           for (i = 0; i < bindings.length; i++) {
29238               binding = bindings[i];
29239               if (!binding.event.modifiers.shiftKey) continue;  // no shift
29240               if (!!binding.capture !== isCapturing) continue;
29241               if (matches(binding, true)) {
29242                   binding.callback();
29243                   didMatch = true;
29244               }
29245           }
29246
29247           // then unshifted bindings
29248           if (didMatch) return;
29249           for (i = 0; i < bindings.length; i++) {
29250               binding = bindings[i];
29251               if (binding.event.modifiers.shiftKey) continue;   // shift
29252               if (!!binding.capture !== isCapturing) continue;
29253               if (matches(binding, false)) {
29254                   binding.callback();
29255               }
29256           }
29257
29258
29259           function matches(binding, testShift) {
29260               var event$$1 = event;
29261               var isMatch = false;
29262               var tryKeyCode = true;
29263
29264               // Prefer a match on `KeyboardEvent.key`
29265               if (event$$1.key !== undefined) {
29266                   tryKeyCode = (event$$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
29267                   isMatch = true;
29268
29269                   if (binding.event.key === undefined) {
29270                       isMatch = false;
29271                   } else if (Array.isArray(binding.event.key)) {
29272                       if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
29273                           isMatch = false;
29274                   } else {
29275                       if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
29276                           isMatch = false;
29277                   }
29278               }
29279
29280               // Fallback match on `KeyboardEvent.keyCode`, can happen if:
29281               // - browser doesn't support `KeyboardEvent.key`
29282               // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
29283               if (!isMatch && tryKeyCode) {
29284                   isMatch = (event$$1.keyCode === binding.event.keyCode);
29285               }
29286
29287               if (!isMatch) return false;
29288
29289               // test modifier keys
29290               if (!(event$$1.ctrlKey && event$$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
29291                   if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
29292                   if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
29293               }
29294               if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
29295               if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
29296
29297               return true;
29298           }
29299       }
29300
29301
29302       function capture() {
29303           testBindings(true);
29304       }
29305
29306
29307       function bubble() {
29308           var tagName = select(event.target).node().tagName;
29309           if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
29310               return;
29311           }
29312           testBindings(false);
29313       }
29314
29315
29316       function keybinding(selection$$1) {
29317           selection$$1 = selection$$1 || select(document);
29318           selection$$1.on('keydown.capture' + namespace$$1, capture, true);
29319           selection$$1.on('keydown.bubble' + namespace$$1, bubble, false);
29320           return keybinding;
29321       }
29322
29323
29324       keybinding.off = function(selection$$1) {
29325           bindings = [];
29326           selection$$1 = selection$$1 || select(document);
29327           selection$$1.on('keydown.capture' + namespace$$1, null);
29328           selection$$1.on('keydown.bubble' + namespace$$1, null);
29329           return keybinding;
29330       };
29331
29332
29333       keybinding.on = function(codes, callback, capture) {
29334           var arr = [].concat(codes);
29335           for (var i = 0; i < arr.length; i++) {
29336               var code = arr[i];
29337               var binding = {
29338                   event: {
29339                       key: undefined,  // preferred
29340                       keyCode: 0,      // fallback
29341                       modifiers: {
29342                           shiftKey: false,
29343                           ctrlKey: false,
29344                           altKey: false,
29345                           metaKey: false
29346                       }
29347                   },
29348                   capture: capture,
29349                   callback: callback
29350               };
29351
29352               code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
29353
29354               for (var j = 0; j < code.length; j++) {
29355                   // Normalise matching errors
29356                   if (code[j] === '++') code[j] = '+';
29357
29358                   if (code[j] in d3keybinding.modifierCodes) {
29359                       binding.event.modifiers[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true;
29360                   } else {
29361                       binding.event.key = d3keybinding.keys[code[j]] || code[j];
29362                       if (code[j] in d3keybinding.keyCodes) {
29363                           binding.event.keyCode = d3keybinding.keyCodes[code[j]];
29364                       }
29365                   }
29366               }
29367
29368               bindings.push(binding);
29369           }
29370
29371           return keybinding;
29372       };
29373
29374       return keybinding;
29375   }
29376
29377
29378   d3keybinding.modifierCodes = {
29379       // Shift key, ⇧
29380       '⇧': 16, shift: 16,
29381       // CTRL key, on Mac: ⌃
29382       '⌃': 17, ctrl: 17,
29383       // ALT key, on Mac: ⌥ (Alt)
29384       '⌥': 18, alt: 18, option: 18,
29385       // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
29386       '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
29387   };
29388
29389   d3keybinding.modifierProperties = {
29390       16: 'shiftKey',
29391       17: 'ctrlKey',
29392       18: 'altKey',
29393       91: 'metaKey'
29394   };
29395
29396   d3keybinding.keys = {
29397       // Backspace key, on Mac: ⌫ (Backspace)
29398       '⌫': 'Backspace', backspace: 'Backspace',
29399       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29400       '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
29401       // Return key, ↩
29402       '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
29403       // Pause/Break key
29404       'pause': 'Pause', 'pause-break': 'Pause',
29405       // Caps Lock key, ⇪
29406       '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
29407       // Escape key, on Mac: ⎋, on Windows: Esc
29408       '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
29409       // Space key
29410       space: [' ', 'Spacebar'],
29411       // Page-Up key, or pgup, on Mac: ↖
29412       '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
29413       // Page-Down key, or pgdown, on Mac: ↘
29414       '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
29415       // END key, on Mac: ⇟
29416       '⇟': 'End', end: 'End',
29417       // HOME key, on Mac: ⇞
29418       '⇞': 'Home', home: 'Home',
29419       // Insert key, or ins
29420       ins: 'Insert', insert: 'Insert',
29421       // Delete key, on Mac: ⌦ (Delete)
29422       '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
29423       // Left Arrow Key, or ←
29424       '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
29425       // Up Arrow Key, or ↑
29426       '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29427       // Right Arrow Key, or →
29428       '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29429       // Up Arrow Key, or ↓
29430       '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29431       // odities, stuff for backward compatibility (browsers and code):
29432       // Num-Multiply, or *
29433       '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29434       // Num-Plus or +
29435       '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29436       // Num-Subtract, or -
29437       '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29438       // Semicolon
29439       semicolon: ';',
29440       // = or equals
29441       equals: '=',
29442       // Comma, or ,
29443       comma: ',',
29444       // Period, or ., or full-stop
29445       period: '.', 'full-stop': '.',
29446       // Slash, or /, or forward-slash
29447       slash: '/', 'forward-slash': '/',
29448       // Tick, or `, or back-quote
29449       tick: '`', 'back-quote': '`',
29450       // Open bracket, or [
29451       'open-bracket': '[',
29452       // Back slash, or \
29453       'back-slash': '\\',
29454       // Close backet, or ]
29455       'close-bracket': ']',
29456       // Apostrophe, or Quote, or '
29457       quote: '\'', apostrophe: '\'',
29458       // NUMPAD 0-9
29459       'num-0': '0',
29460       'num-1': '1',
29461       'num-2': '2',
29462       'num-3': '3',
29463       'num-4': '4',
29464       'num-5': '5',
29465       'num-6': '6',
29466       'num-7': '7',
29467       'num-8': '8',
29468       'num-9': '9',
29469       // F1-F25
29470       f1: 'F1',
29471       f2: 'F2',
29472       f3: 'F3',
29473       f4: 'F4',
29474       f5: 'F5',
29475       f6: 'F6',
29476       f7: 'F7',
29477       f8: 'F8',
29478       f9: 'F9',
29479       f10: 'F10',
29480       f11: 'F11',
29481       f12: 'F12',
29482       f13: 'F13',
29483       f14: 'F14',
29484       f15: 'F15',
29485       f16: 'F16',
29486       f17: 'F17',
29487       f18: 'F18',
29488       f19: 'F19',
29489       f20: 'F20',
29490       f21: 'F21',
29491       f22: 'F22',
29492       f23: 'F23',
29493       f24: 'F24',
29494       f25: 'F25'
29495   };
29496
29497   d3keybinding.keyCodes = {
29498       // Backspace key, on Mac: ⌫ (Backspace)
29499       '⌫': 8, backspace: 8,
29500       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29501       '⇥': 9, '⇆': 9, tab: 9,
29502       // Return key, ↩
29503       '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29504       // Pause/Break key
29505       'pause': 19, 'pause-break': 19,
29506       // Caps Lock key, ⇪
29507       '⇪': 20, caps: 20, 'caps-lock': 20,
29508       // Escape key, on Mac: ⎋, on Windows: Esc
29509       '⎋': 27, escape: 27, esc: 27,
29510       // Space key
29511       space: 32,
29512       // Page-Up key, or pgup, on Mac: ↖
29513       '↖': 33, pgup: 33, 'page-up': 33,
29514       // Page-Down key, or pgdown, on Mac: ↘
29515       '↘': 34, pgdown: 34, 'page-down': 34,
29516       // END key, on Mac: ⇟
29517       '⇟': 35, end: 35,
29518       // HOME key, on Mac: ⇞
29519       '⇞': 36, home: 36,
29520       // Insert key, or ins
29521       ins: 45, insert: 45,
29522       // Delete key, on Mac: ⌦ (Delete)
29523       '⌦': 46, del: 46, 'delete': 46,
29524       // Left Arrow Key, or ←
29525       '←': 37, left: 37, 'arrow-left': 37,
29526       // Up Arrow Key, or ↑
29527       '↑': 38, up: 38, 'arrow-up': 38,
29528       // Right Arrow Key, or →
29529       '→': 39, right: 39, 'arrow-right': 39,
29530       // Up Arrow Key, or ↓
29531       '↓': 40, down: 40, 'arrow-down': 40,
29532       // odities, printing characters that come out wrong:
29533       // Firefox Equals
29534       'ffequals': 61,
29535       // Num-Multiply, or *
29536       '*': 106, star: 106, asterisk: 106, multiply: 106,
29537       // Num-Plus or +
29538       '+': 107, 'plus': 107,
29539       // Num-Subtract, or -
29540       '-': 109, subtract: 109,
29541       // Firefox Plus
29542       'ffplus': 171,
29543       // Firefox Minus
29544       'ffminus': 173,
29545       // Semicolon
29546       ';': 186, semicolon: 186,
29547       // = or equals
29548       '=': 187, 'equals': 187,
29549       // Comma, or ,
29550       ',': 188, comma: 188,
29551       // Dash / Underscore key
29552       'dash': 189,
29553       // Period, or ., or full-stop
29554       '.': 190, period: 190, 'full-stop': 190,
29555       // Slash, or /, or forward-slash
29556       '/': 191, slash: 191, 'forward-slash': 191,
29557       // Tick, or `, or back-quote
29558       '`': 192, tick: 192, 'back-quote': 192,
29559       // Open bracket, or [
29560       '[': 219, 'open-bracket': 219,
29561       // Back slash, or \
29562       '\\': 220, 'back-slash': 220,
29563       // Close backet, or ]
29564       ']': 221, 'close-bracket': 221,
29565       // Apostrophe, or Quote, or '
29566       '\'': 222, quote: 222, apostrophe: 222
29567   };
29568
29569   // NUMPAD 0-9
29570   var i$1 = 95, n = 0;
29571   while (++i$1 < 106) {
29572       d3keybinding.keyCodes['num-' + n] = i$1;
29573       ++n;
29574   }
29575
29576   // 0-9
29577   i$1 = 47; n = 0;
29578   while (++i$1 < 58) {
29579       d3keybinding.keyCodes[n] = i$1;
29580       ++n;
29581   }
29582
29583   // F1-F25
29584   i$1 = 111; n = 1;
29585   while (++i$1 < 136) {
29586       d3keybinding.keyCodes['f' + n] = i$1;
29587       ++n;
29588   }
29589
29590   // a-z
29591   i$1 = 64;
29592   while (++i$1 < 91) {
29593       d3keybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
29594   }
29595
29596   function tooltip() {
29597     var tooltip = function(selection$$1) {
29598         selection$$1.each(setup);
29599       },
29600       animation = utilFunctor(false),
29601       html = utilFunctor(false),
29602       title = function() {
29603         var title = this.getAttribute('data-original-title');
29604         if (title) {
29605           return title;
29606         } else {
29607           title = this.getAttribute('title');
29608           this.removeAttribute('title');
29609           this.setAttribute('data-original-title', title);
29610         }
29611         return title;
29612       },
29613       over = 'mouseenter.tooltip',
29614       out = 'mouseleave.tooltip',
29615       placement = utilFunctor('top');
29616
29617
29618     tooltip.title = function(_) {
29619       if (arguments.length) {
29620         title = utilFunctor(_);
29621         return tooltip;
29622       } else {
29623         return title;
29624       }
29625     };
29626
29627
29628     tooltip.html = function(_) {
29629       if (arguments.length) {
29630         html = utilFunctor(_);
29631         return tooltip;
29632       } else {
29633         return html;
29634       }
29635     };
29636
29637
29638     tooltip.placement = function(_) {
29639       if (arguments.length) {
29640         placement = utilFunctor(_);
29641         return tooltip;
29642       } else {
29643         return placement;
29644       }
29645     };
29646
29647
29648     tooltip.show = function(selection$$1) {
29649       selection$$1.each(show);
29650     };
29651
29652
29653     tooltip.hide = function(selection$$1) {
29654       selection$$1.each(hide);
29655     };
29656
29657
29658     tooltip.toggle = function(selection$$1) {
29659       selection$$1.each(toggle);
29660     };
29661
29662
29663     tooltip.destroy = function(selection$$1) {
29664       selection$$1
29665         .on(over, null)
29666         .on(out, null)
29667         .attr('title', function() {
29668           return this.getAttribute('data-original-title') || this.getAttribute('title');
29669         })
29670         .attr('data-original-title', null)
29671         .selectAll('.tooltip')
29672         .remove();
29673     };
29674
29675
29676     function setup() {
29677       var root = select(this),
29678           animate = animation.apply(this, arguments),
29679           tip = root.selectAll('.tooltip').data([0]);
29680
29681       var enter = tip.enter()
29682         .append('div')
29683         .attr('class', 'tooltip');
29684
29685       enter
29686         .append('div')
29687         .attr('class', 'tooltip-arrow');
29688
29689       enter
29690         .append('div')
29691         .attr('class', 'tooltip-inner');
29692
29693       tip = enter
29694         .merge(tip);
29695
29696       if (animate) {
29697         tip.classed('fade', true);
29698       }
29699
29700       var place = placement.apply(this, arguments);
29701       tip.classed(place, true);
29702
29703       root.on(over, show);
29704       root.on(out, hide);
29705     }
29706
29707
29708     function show() {
29709       var root = select(this),
29710         content = title.apply(this, arguments),
29711         tip = root.selectAll('.tooltip')
29712           .classed('in', true),
29713         markup = html.apply(this, arguments);
29714
29715       tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29716       var place = placement.apply(this, arguments),
29717         outer = getPosition(root.node()),
29718         inner = getPosition(tip.node()),
29719         pos;
29720
29721       switch (place) {
29722         case 'top':
29723           pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
29724           break;
29725         case 'right':
29726           pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
29727           break;
29728         case 'left':
29729           pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
29730           break;
29731         case 'bottom':
29732           pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
29733           break;
29734       }
29735
29736       if (pos) {
29737         tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29738       } else {
29739         tip.style('left', null).style('top', null);
29740       }
29741
29742       this.tooltipVisible = true;
29743     }
29744
29745
29746     function hide() {
29747       select(this).selectAll('.tooltip')
29748         .classed('in', false);
29749
29750       this.tooltipVisible = false;
29751     }
29752
29753
29754     function toggle() {
29755       if (this.tooltipVisible) {
29756         hide.apply(this, arguments);
29757       } else {
29758         show.apply(this, arguments);
29759       }
29760     }
29761
29762     return tooltip;
29763   }
29764
29765
29766   function getPosition(node) {
29767     var mode = select(node).style('position');
29768     if (mode === 'absolute' || mode === 'static') {
29769       return {
29770         x: node.offsetLeft,
29771         y: node.offsetTop,
29772         w: node.offsetWidth,
29773         h: node.offsetHeight
29774       };
29775     } else {
29776       return {
29777         x: 0,
29778         y: 0,
29779         w: node.offsetWidth,
29780         h: node.offsetHeight
29781       };
29782     }
29783   }
29784
29785   function behaviorEdit(context) {
29786
29787       function edit() {
29788           context.map()
29789               .minzoom(context.minEditableZoom());
29790       }
29791
29792
29793       edit.off = function() {
29794           context.map()
29795               .minzoom(0);
29796       };
29797
29798
29799       return edit;
29800   }
29801
29802   /*
29803      The hover behavior adds the `.hover` class on mouseover to all elements to which
29804      the identical datum is bound, and removes it on mouseout.
29805
29806      The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
29807      representation may consist of several elements scattered throughout the DOM hierarchy.
29808      Only one of these elements can have the :hover pseudo-class, but all of them will
29809      have the .hover class.
29810    */
29811   function behaviorHover(context) {
29812       var dispatch$$1 = dispatch('hover');
29813       var _selection = select(null);
29814       var _newId = null;
29815       var _buttonDown;
29816       var _altDisables;
29817       var _target;
29818
29819
29820       function keydown() {
29821           if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29822               _selection.selectAll('.hover')
29823                   .classed('hover-suppressed', true)
29824                   .classed('hover', false);
29825
29826               _selection
29827                   .classed('hover-disabled', true);
29828
29829               dispatch$$1.call('hover', this, null);
29830           }
29831       }
29832
29833
29834       function keyup() {
29835           if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29836               _selection.selectAll('.hover-suppressed')
29837                   .classed('hover-suppressed', false)
29838                   .classed('hover', true);
29839
29840               _selection
29841                   .classed('hover-disabled', false);
29842
29843               dispatch$$1.call('hover', this, _target ? _target.id : null);
29844           }
29845       }
29846
29847
29848       var hover = function(selection$$1) {
29849           _selection = selection$$1;
29850           _newId = null;
29851
29852           _selection
29853               .on('mouseover.hover', mouseover)
29854               .on('mouseout.hover', mouseout)
29855               .on('mousedown.hover', mousedown);
29856
29857           select(window)
29858               .on('keydown.hover', keydown)
29859               .on('keyup.hover', keyup);
29860
29861
29862           function mouseover() {
29863               if (_buttonDown) return;
29864               var target = event.target;
29865               enter(target ? target.__data__ : null);
29866           }
29867
29868
29869           function mouseout() {
29870               if (_buttonDown) return;
29871               var target = event.relatedTarget;
29872               enter(target ? target.__data__ : null);
29873           }
29874
29875
29876           function mousedown() {
29877               _buttonDown = true;
29878               select(window)
29879                   .on('mouseup.hover', mouseup, true);
29880           }
29881
29882
29883           function mouseup() {
29884               _buttonDown = false;
29885               select(window)
29886                   .on('mouseup.hover', null, true);
29887           }
29888
29889
29890           function enter(datum) {
29891               if (datum === _target) return;
29892               _target = datum;
29893
29894               _selection.selectAll('.hover')
29895                   .classed('hover', false);
29896               _selection.selectAll('.hover-suppressed')
29897                   .classed('hover-suppressed', false);
29898
29899               // What are we hovering over?
29900               var entity, selector$$1;
29901               if (datum && datum.__featurehash__) {
29902                   entity = datum;
29903                   selector$$1 = '.data' + datum.__featurehash__;
29904
29905               } else if (datum instanceof osmNote) {
29906                   entity = datum;
29907                   selector$$1 = '.note-' + datum.id;
29908
29909               } else if (datum instanceof osmEntity$$1) {
29910                   entity = datum;
29911                   selector$$1 = '.' + entity.id;
29912                   if (entity.type === 'relation') {
29913                       entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
29914                   }
29915
29916               } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity$$1)) {
29917                   entity = datum.properties.entity;
29918                   selector$$1 = '.' + entity.id;
29919                   if (entity.type === 'relation') {
29920                       entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
29921                   }
29922               }
29923
29924               // Update hover state and dispatch event
29925               if (entity && entity.id !== _newId) {
29926                   // If drawing a way, don't hover on a node that was just placed. #3974
29927                   var mode = context.mode() && context.mode().id;
29928                   if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
29929                       _newId = entity.id;
29930                       return;
29931                   }
29932
29933                   var suppressed = _altDisables && event && event.altKey;
29934                   _selection.selectAll(selector$$1)
29935                       .classed(suppressed ? 'hover-suppressed' : 'hover', true);
29936
29937                   dispatch$$1.call('hover', this, !suppressed && entity);
29938
29939               } else {
29940                   dispatch$$1.call('hover', this, null);
29941               }
29942           }
29943       };
29944
29945
29946       hover.off = function(selection$$1) {
29947           selection$$1.selectAll('.hover')
29948               .classed('hover', false);
29949           selection$$1.selectAll('.hover-suppressed')
29950               .classed('hover-suppressed', false);
29951           selection$$1
29952               .classed('hover-disabled', false);
29953
29954           selection$$1
29955               .on('mouseover.hover', null)
29956               .on('mouseout.hover', null)
29957               .on('mousedown.hover', null);
29958
29959           select(window)
29960               .on('keydown.hover', null)
29961               .on('keyup.hover', null);
29962       };
29963
29964
29965       hover.altDisables = function(_) {
29966           if (!arguments.length) return _altDisables;
29967           _altDisables = _;
29968           return hover;
29969       };
29970
29971
29972       return utilRebind(hover, dispatch$$1, 'on');
29973   }
29974
29975   function refresh(selection, node) {
29976       var cr = node.getBoundingClientRect();
29977       var prop = [cr.width, cr.height];
29978       selection.property('__dimensions__', prop);
29979       return prop;
29980   }
29981
29982   function utilGetDimensions(selection, force) {
29983       if (!selection || selection.empty()) {
29984           return [0, 0];
29985       }
29986       var node = selection.node(),
29987           cached = selection.property('__dimensions__');
29988       return (!cached || force) ? refresh(selection, node) : cached;
29989   }
29990
29991
29992   function utilSetDimensions(selection, dimensions) {
29993       if (!selection || selection.empty()) {
29994           return selection;
29995       }
29996       var node = selection.node();
29997       if (dimensions === null) {
29998           refresh(selection, node);
29999           return selection;
30000       }
30001       return selection
30002           .property('__dimensions__', [dimensions[0], dimensions[1]])
30003           .attr('width', dimensions[0])
30004           .attr('height', dimensions[1]);
30005   }
30006
30007   function behaviorTail() {
30008       var text,
30009           container,
30010           xmargin = 25,
30011           tooltipSize = [0, 0],
30012           selectionSize = [0, 0];
30013
30014
30015       function tail(selection$$1) {
30016           if (!text) return;
30017
30018           select(window)
30019               .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
30020
30021           container = select(document.body)
30022               .append('div')
30023               .style('display', 'none')
30024               .attr('class', 'tail tooltip-inner');
30025
30026           container.append('div')
30027               .text(text);
30028
30029           selection$$1
30030               .on('mousemove.tail', mousemove)
30031               .on('mouseenter.tail', mouseenter)
30032               .on('mouseleave.tail', mouseleave);
30033
30034           container
30035               .on('mousemove.tail', mousemove);
30036
30037           tooltipSize = utilGetDimensions(container);
30038           selectionSize = utilGetDimensions(selection$$1);
30039
30040
30041           function show() {
30042               container.style('display', 'block');
30043               tooltipSize = utilGetDimensions(container);
30044           }
30045
30046
30047           function mousemove() {
30048               if (container.style('display') === 'none') show();
30049               var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
30050                   -tooltipSize[0] - xmargin : xmargin;
30051               container.classed('left', xoffset > 0);
30052               utilSetTransform(container, event.clientX + xoffset, event.clientY);
30053           }
30054
30055
30056           function mouseleave() {
30057               if (event.relatedTarget !== container.node()) {
30058                   container.style('display', 'none');
30059               }
30060           }
30061
30062
30063           function mouseenter() {
30064               if (event.relatedTarget !== container.node()) {
30065                   show();
30066               }
30067           }
30068       }
30069
30070
30071       tail.off = function(selection$$1) {
30072           if (!text) return;
30073
30074           container
30075               .on('mousemove.tail', null)
30076               .remove();
30077
30078           selection$$1
30079               .on('mousemove.tail', null)
30080               .on('mouseenter.tail', null)
30081               .on('mouseleave.tail', null);
30082
30083           select(window)
30084               .on('resize.tail', null);
30085       };
30086
30087
30088       tail.text = function(_) {
30089           if (!arguments.length) return text;
30090           text = _;
30091           return tail;
30092       };
30093
30094
30095       return tail;
30096   }
30097
30098   var _usedTails = {};
30099   var _disableSpace = false;
30100   var _lastSpace = null;
30101
30102
30103   function behaviorDraw(context) {
30104       var dispatch$$1 = dispatch(
30105           'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
30106       );
30107
30108       var keybinding = d3keybinding('draw');
30109
30110       var hover = behaviorHover(context).altDisables(true)
30111           .on('hover', context.ui().sidebar.hover);
30112       var tail = behaviorTail();
30113       var edit = behaviorEdit(context);
30114
30115       var closeTolerance = 4;
30116       var tolerance = 12;
30117       var _mouseLeave = false;
30118       var _lastMouse = null;
30119
30120
30121       // related code
30122       // - `mode/drag_node.js` `datum()`
30123       function datum() {
30124           if (event.altKey) return {};
30125
30126           var element;
30127           if (event.type === 'keydown') {
30128               element = _lastMouse && _lastMouse.target;
30129           } else {
30130               element = event.target;
30131           }
30132
30133           // When drawing, snap only to touch targets..
30134           // (this excludes area fills and active drawing elements)
30135           var d = element.__data__;
30136           return (d && d.properties && d.properties.target) ? d : {};
30137       }
30138
30139
30140       function mousedown() {
30141
30142           function point$$1() {
30143               var p = context.container().node();
30144               return touchId !== null ? d3_touches(p).filter(function(p) {
30145                   return p.identifier === touchId;
30146               })[0] : mouse(p);
30147           }
30148
30149           var element = select(this);
30150           var touchId = event.touches ? event.changedTouches[0].identifier : null;
30151           var t1 = +new Date();
30152           var p1 = point$$1();
30153
30154           element.on('mousemove.draw', null);
30155
30156           select(window).on('mouseup.draw', function() {
30157               var t2 = +new Date();
30158               var p2 = point$$1();
30159               var dist = geoVecLength(p1, p2);
30160
30161               element.on('mousemove.draw', mousemove);
30162               select(window).on('mouseup.draw', null);
30163
30164               if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
30165                   // Prevent a quick second click
30166                   select(window).on('click.draw-block', function() {
30167                       event.stopPropagation();
30168                   }, true);
30169
30170                   context.map().dblclickEnable(false);
30171
30172                   window.setTimeout(function() {
30173                       context.map().dblclickEnable(true);
30174                       select(window).on('click.draw-block', null);
30175                   }, 500);
30176
30177                   click();
30178               }
30179           }, true);
30180       }
30181
30182
30183       function mousemove() {
30184           _lastMouse = event;
30185           dispatch$$1.call('move', this, datum());
30186       }
30187
30188
30189       function mouseenter() {
30190           _mouseLeave = false;
30191       }
30192
30193
30194       function mouseleave() {
30195           _mouseLeave = true;
30196       }
30197
30198
30199       // related code
30200       // - `mode/drag_node.js`     `doMode()`
30201       // - `behavior/draw.js`      `click()`
30202       // - `behavior/draw_way.js`  `move()`
30203       function click() {
30204           var d = datum();
30205           var target = d && d.properties && d.properties.entity;
30206
30207           if (target && target.type === 'node') {   // Snap to a node
30208               dispatch$$1.call('clickNode', this, target, d);
30209               return;
30210
30211           } else if (target && target.type === 'way') {   // Snap to a way
30212               var choice = geoChooseEdge(
30213                   context.childNodes(target), context.mouse(), context.projection, context.activeID()
30214               );
30215               if (choice) {
30216                   var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
30217                   dispatch$$1.call('clickWay', this, choice.loc, edge, d);
30218                   return;
30219               }
30220           }
30221           dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
30222       }
30223
30224
30225       function space() {
30226           event.preventDefault();
30227           event.stopPropagation();
30228
30229           var currSpace = context.mouse();
30230           if (_disableSpace && _lastSpace) {
30231               var dist = geoVecLength(_lastSpace, currSpace);
30232               if (dist > tolerance) {
30233                   _disableSpace = false;
30234               }
30235           }
30236
30237           if (_disableSpace || _mouseLeave || !_lastMouse) return;
30238
30239           // user must move mouse or release space bar to allow another click
30240           _lastSpace = currSpace;
30241           _disableSpace = true;
30242
30243           select(window).on('keyup.space-block', function() {
30244               event.preventDefault();
30245               event.stopPropagation();
30246               _disableSpace = false;
30247               select(window).on('keyup.space-block', null);
30248           });
30249
30250           click();
30251       }
30252
30253
30254       function backspace() {
30255           event.preventDefault();
30256           dispatch$$1.call('undo');
30257       }
30258
30259
30260       function del() {
30261           event.preventDefault();
30262           dispatch$$1.call('cancel');
30263       }
30264
30265
30266       function ret() {
30267           event.preventDefault();
30268           dispatch$$1.call('finish');
30269       }
30270
30271
30272       function draw(selection$$1) {
30273           context.install(hover);
30274           context.install(edit);
30275
30276           if (!context.inIntro() && !_usedTails[tail.text()]) {
30277               context.install(tail);
30278           }
30279
30280           keybinding
30281               .on('⌫', backspace)
30282               .on('⌦', del)
30283               .on('⎋', ret)
30284               .on('↩', ret)
30285               .on('space', space)
30286               .on('⌥space', space);
30287
30288           selection$$1
30289               .on('mouseenter.draw', mouseenter)
30290               .on('mouseleave.draw', mouseleave)
30291               .on('mousedown.draw', mousedown)
30292               .on('mousemove.draw', mousemove);
30293
30294           select(document)
30295               .call(keybinding);
30296
30297           return draw;
30298       }
30299
30300
30301       draw.off = function(selection$$1) {
30302           context.ui().sidebar.hover.cancel();
30303           context.uninstall(hover);
30304           context.uninstall(edit);
30305
30306           if (!context.inIntro() && !_usedTails[tail.text()]) {
30307               context.uninstall(tail);
30308               _usedTails[tail.text()] = true;
30309           }
30310
30311           selection$$1
30312               .on('mouseenter.draw', null)
30313               .on('mouseleave.draw', null)
30314               .on('mousedown.draw', null)
30315               .on('mousemove.draw', null);
30316
30317           select(window)
30318               .on('mouseup.draw', null);
30319               // note: keyup.space-block, click.draw-block should remain
30320
30321           select(document)
30322               .call(keybinding.off);
30323       };
30324
30325
30326       draw.tail = function(_) {
30327           tail.text(_);
30328           return draw;
30329       };
30330
30331
30332       return utilRebind(draw, dispatch$$1, 'on');
30333   }
30334
30335   function modeAddArea$$1(context) {
30336       var mode = {
30337           id: 'add-area',
30338           button: 'area',
30339           title: t('modes.add_area.title'),
30340           description: t('modes.add_area.description'),
30341           key: '3'
30342       };
30343
30344       var behavior = behaviorAddWay(context)
30345               .tail(t('modes.add_area.tail'))
30346               .on('start', start)
30347               .on('startFromWay', startFromWay)
30348               .on('startFromNode', startFromNode),
30349           defaultTags = { area: 'yes' };
30350
30351
30352       function actionClose(wayId) {
30353           return function (graph) {
30354               return graph.replace(graph.entity(wayId).close());
30355           };
30356       }
30357
30358
30359       function start(loc) {
30360           var startGraph = context.graph(),
30361               node = osmNode({ loc: loc }),
30362               way = osmWay({ tags: defaultTags });
30363
30364           context.perform(
30365               actionAddEntity(node),
30366               actionAddEntity(way),
30367               actionAddVertex(way.id, node.id),
30368               actionClose(way.id)
30369           );
30370
30371           context.enter(modeDrawArea(context, way.id, startGraph));
30372       }
30373
30374
30375       function startFromWay(loc, edge) {
30376           var startGraph = context.graph(),
30377               node = osmNode({ loc: loc }),
30378               way = osmWay({ tags: defaultTags });
30379
30380           context.perform(
30381               actionAddEntity(node),
30382               actionAddEntity(way),
30383               actionAddVertex(way.id, node.id),
30384               actionClose(way.id),
30385               actionAddMidpoint({ loc: loc, edge: edge }, node)
30386           );
30387
30388           context.enter(modeDrawArea(context, way.id, startGraph));
30389       }
30390
30391
30392       function startFromNode(node) {
30393           var startGraph = context.graph(),
30394               way = osmWay({ tags: defaultTags });
30395
30396           context.perform(
30397               actionAddEntity(way),
30398               actionAddVertex(way.id, node.id),
30399               actionClose(way.id)
30400           );
30401
30402           context.enter(modeDrawArea(context, way.id, startGraph));
30403       }
30404
30405
30406       mode.enter = function() {
30407           context.install(behavior);
30408       };
30409
30410
30411       mode.exit = function() {
30412           context.uninstall(behavior);
30413       };
30414
30415
30416       return mode;
30417   }
30418
30419   function modeAddLine$$1(context) {
30420       var mode = {
30421           id: 'add-line',
30422           button: 'line',
30423           title: t('modes.add_line.title'),
30424           description: t('modes.add_line.description'),
30425           key: '2'
30426       };
30427
30428       var behavior = behaviorAddWay(context)
30429           .tail(t('modes.add_line.tail'))
30430           .on('start', start)
30431           .on('startFromWay', startFromWay)
30432           .on('startFromNode', startFromNode);
30433
30434
30435       function start(loc) {
30436           var startGraph = context.graph(),
30437               node = osmNode({ loc: loc }),
30438               way = osmWay();
30439
30440           context.perform(
30441               actionAddEntity(node),
30442               actionAddEntity(way),
30443               actionAddVertex(way.id, node.id)
30444           );
30445
30446           context.enter(modeDrawLine(context, way.id, startGraph));
30447       }
30448
30449
30450       function startFromWay(loc, edge) {
30451           var startGraph = context.graph(),
30452               node = osmNode({ loc: loc }),
30453               way = osmWay();
30454
30455           context.perform(
30456               actionAddEntity(node),
30457               actionAddEntity(way),
30458               actionAddVertex(way.id, node.id),
30459               actionAddMidpoint({ loc: loc, edge: edge }, node)
30460           );
30461
30462           context.enter(modeDrawLine(context, way.id, startGraph));
30463       }
30464
30465
30466       function startFromNode(node) {
30467           var startGraph = context.graph(),
30468               way = osmWay();
30469
30470           context.perform(
30471               actionAddEntity(way),
30472               actionAddVertex(way.id, node.id)
30473           );
30474
30475           context.enter(modeDrawLine(context, way.id, startGraph));
30476       }
30477
30478
30479       mode.enter = function() {
30480           context.install(behavior);
30481       };
30482
30483
30484       mode.exit = function() {
30485           context.uninstall(behavior);
30486       };
30487
30488       return mode;
30489   }
30490
30491   function modeAddPoint$$1(context) {
30492       var mode = {
30493           id: 'add-point',
30494           button: 'point',
30495           title: t('modes.add_point.title'),
30496           description: t('modes.add_point.description'),
30497           key: '1'
30498       };
30499
30500       var behavior = behaviorDraw(context)
30501           .tail(t('modes.add_point.tail'))
30502           .on('click', add)
30503           .on('clickWay', addWay)
30504           .on('clickNode', addNode)
30505           .on('cancel', cancel)
30506           .on('finish', cancel);
30507
30508
30509       function add(loc) {
30510           var node = osmNode({ loc: loc });
30511
30512           context.perform(
30513               actionAddEntity(node),
30514               t('operations.add.annotation.point')
30515           );
30516
30517           context.enter(
30518               modeSelect(context, [node.id]).newFeature(true)
30519           );
30520       }
30521
30522
30523       function addWay(loc) {
30524           add(loc);
30525       }
30526
30527
30528       function addNode(node) {
30529           add(node.loc);
30530       }
30531
30532
30533       function cancel() {
30534           context.enter(modeBrowse(context));
30535       }
30536
30537
30538       mode.enter = function() {
30539           context.install(behavior);
30540       };
30541
30542
30543       mode.exit = function() {
30544           context.uninstall(behavior);
30545       };
30546
30547
30548       return mode;
30549   }
30550
30551   function svgAreas$$1(projection, context) {
30552       // Patterns only work in Firefox when set directly on element.
30553       // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
30554       var patterns = {
30555           beach: 'beach',
30556           cemetery: 'cemetery',
30557           construction: 'construction',
30558           farm: 'farmland',
30559           farmland: 'farmland',
30560           grave_yard: 'cemetery',
30561           meadow: 'meadow',
30562           military: 'construction',
30563           orchard: 'orchard',
30564           sand: 'beach',
30565           scrub: 'scrub',
30566           wetland: 'wetland',
30567       };
30568
30569       var patternKeys = ['landuse', 'natural', 'amenity'];
30570
30571
30572       function setPattern(d) {
30573           for (var i = 0; i < patternKeys.length; i++) {
30574               if (d.tags.building && d.tags.building !== 'no') continue;
30575
30576               if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
30577                   this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
30578                   return;
30579               }
30580           }
30581           this.style.fill = this.style.stroke = '';
30582       }
30583
30584
30585       function drawTargets(selection, graph, entities, filter) {
30586           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
30587           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
30588           var getPath = svgPath(projection).geojson;
30589           var activeID = context.activeID();
30590
30591           // The targets and nopes will be MultiLineString sub-segments of the ways
30592           var data = { targets: [], nopes: [] };
30593
30594           entities.forEach(function(way) {
30595               var features = svgSegmentWay(way, graph, activeID);
30596               data.targets.push.apply(data.targets, features.passive);
30597               data.nopes.push.apply(data.nopes, features.active);
30598           });
30599
30600
30601           // Targets allow hover and vertex snapping
30602           var targetData = data.targets.filter(getPath);
30603           var targets = selection.selectAll('.area.target-allowed')
30604               .filter(function(d) { return filter(d.properties.entity); })
30605               .data(targetData, function key(d) { return d.id; });
30606
30607           // exit
30608           targets.exit()
30609               .remove();
30610
30611           // enter/update
30612           targets.enter()
30613               .append('path')
30614               .merge(targets)
30615               .attr('d', getPath)
30616               .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
30617
30618
30619           // NOPE
30620           var nopeData = data.nopes.filter(getPath);
30621           var nopes = selection.selectAll('.area.target-nope')
30622               .filter(function(d) { return filter(d.properties.entity); })
30623               .data(nopeData, function key(d) { return d.id; });
30624
30625           // exit
30626           nopes.exit()
30627               .remove();
30628
30629           // enter/update
30630           nopes.enter()
30631               .append('path')
30632               .merge(nopes)
30633               .attr('d', getPath)
30634               .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
30635       }
30636
30637
30638       function drawAreas(selection, graph, entities, filter) {
30639           var path = svgPath(projection, graph, true),
30640               areas = {},
30641               multipolygon;
30642
30643           for (var i = 0; i < entities.length; i++) {
30644               var entity = entities[i];
30645               if (entity.geometry(graph) !== 'area') continue;
30646
30647               multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
30648               if (multipolygon) {
30649                   areas[multipolygon.id] = {
30650                       entity: multipolygon.mergeTags(entity.tags),
30651                       area: Math.abs(entity.area(graph))
30652                   };
30653               } else if (!areas[entity.id]) {
30654                   areas[entity.id] = {
30655                       entity: entity,
30656                       area: Math.abs(entity.area(graph))
30657                   };
30658               }
30659           }
30660
30661           areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
30662           areas.sort(function areaSort(a, b) { return b.area - a.area; });
30663           areas = map$3(areas, 'entity');
30664
30665           var strokes = areas.filter(function(area) {
30666               return area.type === 'way';
30667           });
30668
30669           var data = {
30670               clip: areas,
30671               shadow: strokes,
30672               stroke: strokes,
30673               fill: areas
30674           };
30675
30676           var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
30677              .filter(filter)
30678              .data(data.clip, osmEntity$$1.key);
30679
30680           clipPaths.exit()
30681              .remove();
30682
30683           var clipPathsEnter = clipPaths.enter()
30684              .append('clipPath')
30685              .attr('class', 'clipPath-osm')
30686              .attr('id', function(entity) { return entity.id + '-clippath'; });
30687
30688           clipPathsEnter
30689              .append('path');
30690
30691           clipPaths.merge(clipPathsEnter)
30692              .selectAll('path')
30693              .attr('d', path);
30694
30695
30696           var layer = selection.selectAll('.layer-areas .layer-areas-areas');
30697
30698           var areagroup = layer
30699               .selectAll('g.areagroup')
30700               .data(['fill', 'shadow', 'stroke']);
30701
30702           areagroup = areagroup.enter()
30703               .append('g')
30704               .attr('class', function(d) { return 'areagroup area-' + d; })
30705               .merge(areagroup);
30706
30707           var paths = areagroup
30708               .selectAll('path')
30709               .filter(filter)
30710               .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
30711
30712           paths.exit()
30713               .remove();
30714
30715           var fills = selection.selectAll('.area-fill path.area').nodes();
30716
30717           var bisect = bisector(function(node) {
30718               return -node.__data__.area(graph);
30719           }).left;
30720
30721           function sortedByArea(entity) {
30722               if (this._parent.__data__ === 'fill') {
30723                   return fills[bisect(fills, -entity.area(graph))];
30724               }
30725           }
30726
30727           paths = paths.enter()
30728               .insert('path', sortedByArea)
30729               .merge(paths)
30730               .each(function(entity) {
30731                   var layer = this.parentNode.__data__;
30732
30733                   this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
30734
30735                   if (layer === 'fill') {
30736                       this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
30737                       setPattern.apply(this, arguments);
30738                   }
30739               })
30740               .call(svgTagClasses())
30741               .attr('d', path);
30742
30743
30744           // touch targets
30745           selection.selectAll('.layer-areas .layer-areas-targets')
30746               .call(drawTargets, graph, data.stroke, filter);
30747       }
30748
30749       return drawAreas;
30750   }
30751
30752   /**
30753    * A specialized version of `_.reduce` for arrays without support for
30754    * iteratee shorthands.
30755    *
30756    * @private
30757    * @param {Array} [array] The array to iterate over.
30758    * @param {Function} iteratee The function invoked per iteration.
30759    * @param {*} [accumulator] The initial value.
30760    * @param {boolean} [initAccum] Specify using the first element of `array` as
30761    *  the initial value.
30762    * @returns {*} Returns the accumulated value.
30763    */
30764   function arrayReduce(array, iteratee, accumulator, initAccum) {
30765     var index = -1,
30766         length = array == null ? 0 : array.length;
30767
30768     if (initAccum && length) {
30769       accumulator = array[++index];
30770     }
30771     while (++index < length) {
30772       accumulator = iteratee(accumulator, array[index], index, array);
30773     }
30774     return accumulator;
30775   }
30776
30777   /**
30778    * The base implementation of `_.reduce` and `_.reduceRight`, without support
30779    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
30780    *
30781    * @private
30782    * @param {Array|Object} collection The collection to iterate over.
30783    * @param {Function} iteratee The function invoked per iteration.
30784    * @param {*} accumulator The initial value.
30785    * @param {boolean} initAccum Specify using the first or last element of
30786    *  `collection` as the initial value.
30787    * @param {Function} eachFunc The function to iterate over `collection`.
30788    * @returns {*} Returns the accumulated value.
30789    */
30790   function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
30791     eachFunc(collection, function(value, index, collection) {
30792       accumulator = initAccum
30793         ? (initAccum = false, value)
30794         : iteratee(accumulator, value, index, collection);
30795     });
30796     return accumulator;
30797   }
30798
30799   /**
30800    * Reduces `collection` to a value which is the accumulated result of running
30801    * each element in `collection` thru `iteratee`, where each successive
30802    * invocation is supplied the return value of the previous. If `accumulator`
30803    * is not given, the first element of `collection` is used as the initial
30804    * value. The iteratee is invoked with four arguments:
30805    * (accumulator, value, index|key, collection).
30806    *
30807    * Many lodash methods are guarded to work as iteratees for methods like
30808    * `_.reduce`, `_.reduceRight`, and `_.transform`.
30809    *
30810    * The guarded methods are:
30811    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
30812    * and `sortBy`
30813    *
30814    * @static
30815    * @memberOf _
30816    * @since 0.1.0
30817    * @category Collection
30818    * @param {Array|Object} collection The collection to iterate over.
30819    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
30820    * @param {*} [accumulator] The initial value.
30821    * @returns {*} Returns the accumulated value.
30822    * @see _.reduceRight
30823    * @example
30824    *
30825    * _.reduce([1, 2], function(sum, n) {
30826    *   return sum + n;
30827    * }, 0);
30828    * // => 3
30829    *
30830    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
30831    *   (result[value] || (result[value] = [])).push(key);
30832    *   return result;
30833    * }, {});
30834    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
30835    */
30836   function reduce(collection, iteratee, accumulator) {
30837     var func = isArray(collection) ? arrayReduce : baseReduce,
30838         initAccum = arguments.length < 3;
30839
30840     return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
30841   }
30842
30843   /** Error message constants. */
30844   var FUNC_ERROR_TEXT$3 = 'Expected a function';
30845
30846   /**
30847    * Creates a throttled function that only invokes `func` at most once per
30848    * every `wait` milliseconds. The throttled function comes with a `cancel`
30849    * method to cancel delayed `func` invocations and a `flush` method to
30850    * immediately invoke them. Provide `options` to indicate whether `func`
30851    * should be invoked on the leading and/or trailing edge of the `wait`
30852    * timeout. The `func` is invoked with the last arguments provided to the
30853    * throttled function. Subsequent calls to the throttled function return the
30854    * result of the last `func` invocation.
30855    *
30856    * **Note:** If `leading` and `trailing` options are `true`, `func` is
30857    * invoked on the trailing edge of the timeout only if the throttled function
30858    * is invoked more than once during the `wait` timeout.
30859    *
30860    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
30861    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
30862    *
30863    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
30864    * for details over the differences between `_.throttle` and `_.debounce`.
30865    *
30866    * @static
30867    * @memberOf _
30868    * @since 0.1.0
30869    * @category Function
30870    * @param {Function} func The function to throttle.
30871    * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
30872    * @param {Object} [options={}] The options object.
30873    * @param {boolean} [options.leading=true]
30874    *  Specify invoking on the leading edge of the timeout.
30875    * @param {boolean} [options.trailing=true]
30876    *  Specify invoking on the trailing edge of the timeout.
30877    * @returns {Function} Returns the new throttled function.
30878    * @example
30879    *
30880    * // Avoid excessively updating the position while scrolling.
30881    * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
30882    *
30883    * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
30884    * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
30885    * jQuery(element).on('click', throttled);
30886    *
30887    * // Cancel the trailing throttled invocation.
30888    * jQuery(window).on('popstate', throttled.cancel);
30889    */
30890   function throttle(func, wait, options) {
30891     var leading = true,
30892         trailing = true;
30893
30894     if (typeof func != 'function') {
30895       throw new TypeError(FUNC_ERROR_TEXT$3);
30896     }
30897     if (isObject(options)) {
30898       leading = 'leading' in options ? !!options.leading : leading;
30899       trailing = 'trailing' in options ? !!options.trailing : trailing;
30900     }
30901     return debounce(func, wait, {
30902       'leading': leading,
30903       'maxWait': wait,
30904       'trailing': trailing
30905     });
30906   }
30907
30908   var fastJsonStableStringify = function (data, opts) {
30909       if (!opts) opts = {};
30910       if (typeof opts === 'function') opts = { cmp: opts };
30911       var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
30912
30913       var cmp = opts.cmp && (function (f) {
30914           return function (node) {
30915               return function (a, b) {
30916                   var aobj = { key: a, value: node[a] };
30917                   var bobj = { key: b, value: node[b] };
30918                   return f(aobj, bobj);
30919               };
30920           };
30921       })(opts.cmp);
30922
30923       var seen = [];
30924       return (function stringify (node) {
30925           if (node && node.toJSON && typeof node.toJSON === 'function') {
30926               node = node.toJSON();
30927           }
30928
30929           if (node === undefined) return;
30930           if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
30931           if (typeof node !== 'object') return JSON.stringify(node);
30932
30933           var i, out;
30934           if (Array.isArray(node)) {
30935               out = '[';
30936               for (i = 0; i < node.length; i++) {
30937                   if (i) out += ',';
30938                   out += stringify(node[i]) || 'null';
30939               }
30940               return out + ']';
30941           }
30942
30943           if (node === null) return 'null';
30944
30945           if (seen.indexOf(node) !== -1) {
30946               if (cycles) return JSON.stringify('__cycle__');
30947               throw new TypeError('Converting circular structure to JSON');
30948           }
30949
30950           var seenIndex = seen.push(node) - 1;
30951           var keys = Object.keys(node).sort(cmp && cmp(node));
30952           out = '';
30953           for (i = 0; i < keys.length; i++) {
30954               var key = keys[i];
30955               var value = stringify(node[key]);
30956
30957               if (!value) continue;
30958               if (out) out += ',';
30959               out += JSON.stringify(key) + ':' + value;
30960           }
30961           seen.splice(seenIndex, 1);
30962           return '{' + out + '}';
30963       })(data);
30964   };
30965
30966   var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
30967
30968   function unwrapExports (x) {
30969         return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
30970   }
30971
30972   function createCommonjsModule(fn, module) {
30973         return module = { exports: {} }, fn(module, module.exports), module.exports;
30974   }
30975
30976   //[4]         NameStartChar      ::=          ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
30977   //[4a]        NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
30978   //[5]         Name       ::=          NameStartChar (NameChar)*
30979   var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/;//\u10000-\uEFFFF
30980   var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
30981   var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
30982   //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
30983   //var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
30984
30985   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
30986   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
30987   var S_TAG = 0;//tag name offerring
30988   var S_ATTR = 1;//attr name offerring 
30989   var S_ATTR_SPACE=2;//attr name end and space offer
30990   var S_EQ = 3;//=space?
30991   var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
30992   var S_ATTR_END = 5;//attr value end and no space(quot end)
30993   var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
30994   var S_TAG_CLOSE = 7;//closed el<el />
30995
30996   function XMLReader(){
30997         
30998   }
30999
31000   XMLReader.prototype = {
31001         parse:function(source,defaultNSMap,entityMap){
31002                 var domBuilder = this.domBuilder;
31003                 domBuilder.startDocument();
31004                 _copy(defaultNSMap ,defaultNSMap = {});
31005                 parse(source,defaultNSMap,entityMap,
31006                                 domBuilder,this.errorHandler);
31007                 domBuilder.endDocument();
31008         }
31009   };
31010   function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
31011         function fixedFromCharCode(code) {
31012                 // String.prototype.fromCharCode does not supports
31013                 // > 2 bytes unicode chars directly
31014                 if (code > 0xffff) {
31015                         code -= 0x10000;
31016                         var surrogate1 = 0xd800 + (code >> 10)
31017                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
31018
31019                         return String.fromCharCode(surrogate1, surrogate2);
31020                 } else {
31021                         return String.fromCharCode(code);
31022                 }
31023         }
31024         function entityReplacer(a){
31025                 var k = a.slice(1,-1);
31026                 if(k in entityMap){
31027                         return entityMap[k]; 
31028                 }else if(k.charAt(0) === '#'){
31029                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
31030                 }else{
31031                         errorHandler.error('entity not found:'+a);
31032                         return a;
31033                 }
31034         }
31035         function appendText(end){//has some bugs
31036                 if(end>start){
31037                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
31038                         locator&&position(start);
31039                         domBuilder.characters(xt,0,end-start);
31040                         start = end;
31041                 }
31042         }
31043         function position(p,m){
31044                 while(p>=lineEnd && (m = linePattern.exec(source))){
31045                         lineStart = m.index;
31046                         lineEnd = lineStart + m[0].length;
31047                         locator.lineNumber++;
31048                         //console.log('line++:',locator,startPos,endPos)
31049                 }
31050                 locator.columnNumber = p-lineStart+1;
31051         }
31052         var lineStart = 0;
31053         var lineEnd = 0;
31054         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
31055         var locator = domBuilder.locator;
31056         
31057         var parseStack = [{currentNSMap:defaultNSMapCopy}];
31058         var closeMap = {};
31059         var start = 0;
31060         while(true){
31061                 try{
31062                         var tagStart = source.indexOf('<',start);
31063                         if(tagStart<0){
31064                                 if(!source.substr(start).match(/^\s*$/)){
31065                                         var doc = domBuilder.doc;
31066                                 var text = doc.createTextNode(source.substr(start));
31067                                 doc.appendChild(text);
31068                                 domBuilder.currentElement = text;
31069                                 }
31070                                 return;
31071                         }
31072                         if(tagStart>start){
31073                                 appendText(tagStart);
31074                         }
31075                         switch(source.charAt(tagStart+1)){
31076                         case '/':
31077                                 var end = source.indexOf('>',tagStart+3);
31078                                 var tagName = source.substring(tagStart+2,end);
31079                                 var config = parseStack.pop();
31080                                 if(end<0){
31081                                         
31082                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
31083                                 //console.error('#@@@@@@'+tagName)
31084                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
31085                                 end = tagStart+1+tagName.length;
31086                         }else if(tagName.match(/\s</)){
31087                                 tagName = tagName.replace(/[\s<].*/,'');
31088                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
31089                                 end = tagStart+1+tagName.length;
31090                                 }
31091                                 //console.error(parseStack.length,parseStack)
31092                                 //console.error(config);
31093                                 var localNSMap = config.localNSMap;
31094                                 var endMatch = config.tagName == tagName;
31095                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
31096                         if(endIgnoreCaseMach){
31097                                 domBuilder.endElement(config.uri,config.localName,tagName);
31098                                         if(localNSMap){
31099                                                 for(var prefix in localNSMap){
31100                                                         domBuilder.endPrefixMapping(prefix) ;
31101                                                 }
31102                                         }
31103                                         if(!endMatch){
31104                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
31105                                         }
31106                         }else{
31107                                 parseStack.push(config);
31108                         }
31109                                 
31110                                 end++;
31111                                 break;
31112                                 // end elment
31113                         case '?':// <?...?>
31114                                 locator&&position(tagStart);
31115                                 end = parseInstruction(source,tagStart,domBuilder);
31116                                 break;
31117                         case '!':// <!doctype,<![CDATA,<!--
31118                                 locator&&position(tagStart);
31119                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
31120                                 break;
31121                         default:
31122                                 locator&&position(tagStart);
31123                                 var el = new ElementAttributes();
31124                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
31125                                 //elStartEnd
31126                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
31127                                 var len = el.length;
31128                                 
31129                                 
31130                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
31131                                         el.closed = true;
31132                                         if(!entityMap.nbsp){
31133                                                 errorHandler.warning('unclosed xml attribute');
31134                                         }
31135                                 }
31136                                 if(locator && len){
31137                                         var locator2 = copyLocator(locator,{});
31138                                         //try{//attribute position fixed
31139                                         for(var i = 0;i<len;i++){
31140                                                 var a = el[i];
31141                                                 position(a.offset);
31142                                                 a.locator = copyLocator(locator,{});
31143                                         }
31144                                         //}catch(e){console.error('@@@@@'+e)}
31145                                         domBuilder.locator = locator2;
31146                                         if(appendElement(el,domBuilder,currentNSMap)){
31147                                                 parseStack.push(el);
31148                                         }
31149                                         domBuilder.locator = locator;
31150                                 }else{
31151                                         if(appendElement(el,domBuilder,currentNSMap)){
31152                                                 parseStack.push(el);
31153                                         }
31154                                 }
31155                                 
31156                                 
31157                                 
31158                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
31159                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
31160                                 }else{
31161                                         end++;
31162                                 }
31163                         }
31164                 }catch(e){
31165                         errorHandler.error('element parse error: '+e);
31166                         //errorHandler.error('element parse error: '+e);
31167                         end = -1;
31168                         //throw e;
31169                 }
31170                 if(end>start){
31171                         start = end;
31172                 }else{
31173                         //TODO: 这里有可能sax回退,有位置错误风险
31174                         appendText(Math.max(tagStart,start)+1);
31175                 }
31176         }
31177   }
31178   function copyLocator(f,t){
31179         t.lineNumber = f.lineNumber;
31180         t.columnNumber = f.columnNumber;
31181         return t;
31182   }
31183
31184   /**
31185    * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
31186    * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
31187    */
31188   function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
31189         var attrName;
31190         var value;
31191         var p = ++start;
31192         var s = S_TAG;//status
31193         while(true){
31194                 var c = source.charAt(p);
31195                 switch(c){
31196                 case '=':
31197                         if(s === S_ATTR){//attrName
31198                                 attrName = source.slice(start,p);
31199                                 s = S_EQ;
31200                         }else if(s === S_ATTR_SPACE){
31201                                 s = S_EQ;
31202                         }else{
31203                                 //fatalError: equal must after attrName or space after attrName
31204                                 throw new Error('attribute equal must after attrName');
31205                         }
31206                         break;
31207                 case '\'':
31208                 case '"':
31209                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
31210                                 ){//equal
31211                                 if(s === S_ATTR){
31212                                         errorHandler.warning('attribute value must after "="');
31213                                         attrName = source.slice(start,p);
31214                                 }
31215                                 start = p+1;
31216                                 p = source.indexOf(c,start);
31217                                 if(p>0){
31218                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31219                                         el.add(attrName,value,start-1);
31220                                         s = S_ATTR_END;
31221                                 }else{
31222                                         //fatalError: no end quot match
31223                                         throw new Error('attribute value no end \''+c+'\' match');
31224                                 }
31225                         }else if(s == S_ATTR_NOQUOT_VALUE){
31226                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31227                                 //console.log(attrName,value,start,p)
31228                                 el.add(attrName,value,start);
31229                                 //console.dir(el)
31230                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
31231                                 start = p+1;
31232                                 s = S_ATTR_END;
31233                         }else{
31234                                 //fatalError: no equal before
31235                                 throw new Error('attribute value must after "="');
31236                         }
31237                         break;
31238                 case '/':
31239                         switch(s){
31240                         case S_TAG:
31241                                 el.setTagName(source.slice(start,p));
31242                         case S_ATTR_END:
31243                         case S_TAG_SPACE:
31244                         case S_TAG_CLOSE:
31245                                 s =S_TAG_CLOSE;
31246                                 el.closed = true;
31247                         case S_ATTR_NOQUOT_VALUE:
31248                         case S_ATTR:
31249                         case S_ATTR_SPACE:
31250                                 break;
31251                         //case S_EQ:
31252                         default:
31253                                 throw new Error("attribute invalid close char('/')")
31254                         }
31255                         break;
31256                 case ''://end document
31257                         //throw new Error('unexpected end of input')
31258                         errorHandler.error('unexpected end of input');
31259                         if(s == S_TAG){
31260                                 el.setTagName(source.slice(start,p));
31261                         }
31262                         return p;
31263                 case '>':
31264                         switch(s){
31265                         case S_TAG:
31266                                 el.setTagName(source.slice(start,p));
31267                         case S_ATTR_END:
31268                         case S_TAG_SPACE:
31269                         case S_TAG_CLOSE:
31270                                 break;//normal
31271                         case S_ATTR_NOQUOT_VALUE://Compatible state
31272                         case S_ATTR:
31273                                 value = source.slice(start,p);
31274                                 if(value.slice(-1) === '/'){
31275                                         el.closed  = true;
31276                                         value = value.slice(0,-1);
31277                                 }
31278                         case S_ATTR_SPACE:
31279                                 if(s === S_ATTR_SPACE){
31280                                         value = attrName;
31281                                 }
31282                                 if(s == S_ATTR_NOQUOT_VALUE){
31283                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
31284                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
31285                                 }else{
31286                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
31287                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
31288                                         }
31289                                         el.add(value,value,start);
31290                                 }
31291                                 break;
31292                         case S_EQ:
31293                                 throw new Error('attribute value missed!!');
31294                         }
31295   //                    console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
31296                         return p;
31297                 /*xml space '\x20' | #x9 | #xD | #xA; */
31298                 case '\u0080':
31299                         c = ' ';
31300                 default:
31301                         if(c<= ' '){//space
31302                                 switch(s){
31303                                 case S_TAG:
31304                                         el.setTagName(source.slice(start,p));//tagName
31305                                         s = S_TAG_SPACE;
31306                                         break;
31307                                 case S_ATTR:
31308                                         attrName = source.slice(start,p);
31309                                         s = S_ATTR_SPACE;
31310                                         break;
31311                                 case S_ATTR_NOQUOT_VALUE:
31312                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31313                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
31314                                         el.add(attrName,value,start);
31315                                 case S_ATTR_END:
31316                                         s = S_TAG_SPACE;
31317                                         break;
31318                                 //case S_TAG_SPACE:
31319                                 //case S_EQ:
31320                                 //case S_ATTR_SPACE:
31321                                 //      void();break;
31322                                 //case S_TAG_CLOSE:
31323                                         //ignore warning
31324                                 }
31325                         }else{//not space
31326   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
31327   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
31328                                 switch(s){
31329                                 //case S_TAG:void();break;
31330                                 //case S_ATTR:void();break;
31331                                 //case S_ATTR_NOQUOT_VALUE:void();break;
31332                                 case S_ATTR_SPACE:
31333                                         var tagName =  el.tagName;
31334                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
31335                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
31336                                         }
31337                                         el.add(attrName,attrName,start);
31338                                         start = p;
31339                                         s = S_ATTR;
31340                                         break;
31341                                 case S_ATTR_END:
31342                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
31343                                 case S_TAG_SPACE:
31344                                         s = S_ATTR;
31345                                         start = p;
31346                                         break;
31347                                 case S_EQ:
31348                                         s = S_ATTR_NOQUOT_VALUE;
31349                                         start = p;
31350                                         break;
31351                                 case S_TAG_CLOSE:
31352                                         throw new Error("elements closed character '/' and '>' must be connected to");
31353                                 }
31354                         }
31355                 }//end outer switch
31356                 //console.log('p++',p)
31357                 p++;
31358         }
31359   }
31360   /**
31361    * @return true if has new namespace define
31362    */
31363   function appendElement(el,domBuilder,currentNSMap){
31364         var tagName = el.tagName;
31365         var localNSMap = null;
31366         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
31367         var i = el.length;
31368         while(i--){
31369                 var a = el[i];
31370                 var qName = a.qName;
31371                 var value = a.value;
31372                 var nsp = qName.indexOf(':');
31373                 if(nsp>0){
31374                         var prefix = a.prefix = qName.slice(0,nsp);
31375                         var localName = qName.slice(nsp+1);
31376                         var nsPrefix = prefix === 'xmlns' && localName;
31377                 }else{
31378                         localName = qName;
31379                         prefix = null;
31380                         nsPrefix = qName === 'xmlns' && '';
31381                 }
31382                 //can not set prefix,because prefix !== ''
31383                 a.localName = localName ;
31384                 //prefix == null for no ns prefix attribute 
31385                 if(nsPrefix !== false){//hack!!
31386                         if(localNSMap == null){
31387                                 localNSMap = {};
31388                                 //console.log(currentNSMap,0)
31389                                 _copy(currentNSMap,currentNSMap={});
31390                                 //console.log(currentNSMap,1)
31391                         }
31392                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
31393                         a.uri = 'http://www.w3.org/2000/xmlns/';
31394                         domBuilder.startPrefixMapping(nsPrefix, value); 
31395                 }
31396         }
31397         var i = el.length;
31398         while(i--){
31399                 a = el[i];
31400                 var prefix = a.prefix;
31401                 if(prefix){//no prefix attribute has no namespace
31402                         if(prefix === 'xml'){
31403                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
31404                         }if(prefix !== 'xmlns'){
31405                                 a.uri = currentNSMap[prefix || ''];
31406                                 
31407                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
31408                         }
31409                 }
31410         }
31411         var nsp = tagName.indexOf(':');
31412         if(nsp>0){
31413                 prefix = el.prefix = tagName.slice(0,nsp);
31414                 localName = el.localName = tagName.slice(nsp+1);
31415         }else{
31416                 prefix = null;//important!!
31417                 localName = el.localName = tagName;
31418         }
31419         //no prefix element has default namespace
31420         var ns = el.uri = currentNSMap[prefix || ''];
31421         domBuilder.startElement(ns,localName,tagName,el);
31422         //endPrefixMapping and startPrefixMapping have not any help for dom builder
31423         //localNSMap = null
31424         if(el.closed){
31425                 domBuilder.endElement(ns,localName,tagName);
31426                 if(localNSMap){
31427                         for(prefix in localNSMap){
31428                                 domBuilder.endPrefixMapping(prefix); 
31429                         }
31430                 }
31431         }else{
31432                 el.currentNSMap = currentNSMap;
31433                 el.localNSMap = localNSMap;
31434                 //parseStack.push(el);
31435                 return true;
31436         }
31437   }
31438   function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
31439         if(/^(?:script|textarea)$/i.test(tagName)){
31440                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
31441                 var text = source.substring(elStartEnd+1,elEndStart);
31442                 if(/[&<]/.test(text)){
31443                         if(/^script$/i.test(tagName)){
31444                                 //if(!/\]\]>/.test(text)){
31445                                         //lexHandler.startCDATA();
31446                                         domBuilder.characters(text,0,text.length);
31447                                         //lexHandler.endCDATA();
31448                                         return elEndStart;
31449                                 //}
31450                         }//}else{//text area
31451                                 text = text.replace(/&#?\w+;/g,entityReplacer);
31452                                 domBuilder.characters(text,0,text.length);
31453                                 return elEndStart;
31454                         //}
31455                         
31456                 }
31457         }
31458         return elStartEnd+1;
31459   }
31460   function fixSelfClosed(source,elStartEnd,tagName,closeMap){
31461         //if(tagName in closeMap){
31462         var pos = closeMap[tagName];
31463         if(pos == null){
31464                 //console.log(tagName)
31465                 pos =  source.lastIndexOf('</'+tagName+'>');
31466                 if(pos<elStartEnd){//忘记闭合
31467                         pos = source.lastIndexOf('</'+tagName);
31468                 }
31469                 closeMap[tagName] =pos;
31470         }
31471         return pos<elStartEnd;
31472         //} 
31473   }
31474   function _copy(source,target){
31475         for(var n in source){target[n] = source[n];}
31476   }
31477   function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
31478         var next= source.charAt(start+2);
31479         switch(next){
31480         case '-':
31481                 if(source.charAt(start + 3) === '-'){
31482                         var end = source.indexOf('-->',start+4);
31483                         //append comment source.substring(4,end)//<!--
31484                         if(end>start){
31485                                 domBuilder.comment(source,start+4,end-start-4);
31486                                 return end+3;
31487                         }else{
31488                                 errorHandler.error("Unclosed comment");
31489                                 return -1;
31490                         }
31491                 }else{
31492                         //error
31493                         return -1;
31494                 }
31495         default:
31496                 if(source.substr(start+3,6) == 'CDATA['){
31497                         var end = source.indexOf(']]>',start+9);
31498                         domBuilder.startCDATA();
31499                         domBuilder.characters(source,start+9,end-start-9);
31500                         domBuilder.endCDATA(); 
31501                         return end+3;
31502                 }
31503                 //<!DOCTYPE
31504                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
31505                 var matchs = split(source,start);
31506                 var len = matchs.length;
31507                 if(len>1 && /!doctype/i.test(matchs[0][0])){
31508                         var name = matchs[1][0];
31509                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
31510                         var sysid = len>4 && matchs[4][0];
31511                         var lastMatch = matchs[len-1];
31512                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
31513                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
31514                         domBuilder.endDTD();
31515                         
31516                         return lastMatch.index+lastMatch[0].length
31517                 }
31518         }
31519         return -1;
31520   }
31521
31522
31523
31524   function parseInstruction(source,start,domBuilder){
31525         var end = source.indexOf('?>',start);
31526         if(end){
31527                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
31528                 if(match){
31529                         var len = match[0].length;
31530                         domBuilder.processingInstruction(match[1], match[2]) ;
31531                         return end+2;
31532                 }else{//error
31533                         return -1;
31534                 }
31535         }
31536         return -1;
31537   }
31538
31539   /**
31540    * @param source
31541    */
31542   function ElementAttributes(source){
31543         
31544   }
31545   ElementAttributes.prototype = {
31546         setTagName:function(tagName){
31547                 if(!tagNamePattern.test(tagName)){
31548                         throw new Error('invalid tagName:'+tagName)
31549                 }
31550                 this.tagName = tagName;
31551         },
31552         add:function(qName,value,offset){
31553                 if(!tagNamePattern.test(qName)){
31554                         throw new Error('invalid attribute:'+qName)
31555                 }
31556                 this[this.length++] = {qName:qName,value:value,offset:offset};
31557         },
31558         length:0,
31559         getLocalName:function(i){return this[i].localName},
31560         getLocator:function(i){return this[i].locator},
31561         getQName:function(i){return this[i].qName},
31562         getURI:function(i){return this[i].uri},
31563         getValue:function(i){return this[i].value}
31564   //    ,getIndex:function(uri, localName)){
31565   //            if(localName){
31566   //                    
31567   //            }else{
31568   //                    var qName = uri
31569   //            }
31570   //    },
31571   //    getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
31572   //    getType:function(uri,localName){}
31573   //    getType:function(i){},
31574   };
31575
31576
31577
31578
31579   function _set_proto_(thiz,parent){
31580         thiz.__proto__ = parent;
31581         return thiz;
31582   }
31583   if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
31584         _set_proto_ = function(thiz,parent){
31585                 function p(){}          p.prototype = parent;
31586                 p = new p();
31587                 for(parent in thiz){
31588                         p[parent] = thiz[parent];
31589                 }
31590                 return p;
31591         };
31592   }
31593
31594   function split(source,start){
31595         var match;
31596         var buf = [];
31597         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
31598         reg.lastIndex = start;
31599         reg.exec(source);//skip <
31600         while(match = reg.exec(source)){
31601                 buf.push(match);
31602                 if(match[1])return buf;
31603         }
31604   }
31605
31606   var XMLReader_1 = XMLReader;
31607
31608   var sax = {
31609         XMLReader: XMLReader_1
31610   };
31611
31612   /*
31613    * DOM Level 2
31614    * Object DOMException
31615    * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
31616    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
31617    */
31618
31619   function copy$1(src,dest){
31620         for(var p in src){
31621                 dest[p] = src[p];
31622         }
31623   }
31624   /**
31625   ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
31626   ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
31627    */
31628   function _extends(Class,Super){
31629         var pt = Class.prototype;
31630         if(Object.create){
31631                 var ppt = Object.create(Super.prototype);
31632                 pt.__proto__ = ppt;
31633         }
31634         if(!(pt instanceof Super)){
31635                 function t(){}          t.prototype = Super.prototype;
31636                 t = new t();
31637                 copy$1(pt,t);
31638                 Class.prototype = pt = t;
31639         }
31640         if(pt.constructor != Class){
31641                 if(typeof Class != 'function'){
31642                         console.error("unknow Class:"+Class);
31643                 }
31644                 pt.constructor = Class;
31645         }
31646   }
31647   var htmlns = 'http://www.w3.org/1999/xhtml' ;
31648   // Node Types
31649   var NodeType = {};
31650   var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
31651   var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
31652   var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
31653   var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
31654   var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
31655   var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
31656   var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
31657   var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
31658   var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
31659   var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
31660   var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
31661   var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
31662
31663   // ExceptionCode
31664   var ExceptionCode = {};
31665   var ExceptionMessage = {};
31666   var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
31667   var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
31668   var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
31669   var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
31670   var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
31671   var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
31672   var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
31673   var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
31674   var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
31675   var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
31676   //level2
31677   var INVALID_STATE_ERR         = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
31678   var SYNTAX_ERR                = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
31679   var INVALID_MODIFICATION_ERR  = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
31680   var NAMESPACE_ERR             = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
31681   var INVALID_ACCESS_ERR        = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
31682
31683
31684   function DOMException(code, message) {
31685         if(message instanceof Error){
31686                 var error = message;
31687         }else{
31688                 error = this;
31689                 Error.call(this, ExceptionMessage[code]);
31690                 this.message = ExceptionMessage[code];
31691                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
31692         }
31693         error.code = code;
31694         if(message) this.message = this.message + ": " + message;
31695         return error;
31696   }DOMException.prototype = Error.prototype;
31697   copy$1(ExceptionCode,DOMException);
31698   /**
31699    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
31700    * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
31701    * The items in the NodeList are accessible via an integral index, starting from 0.
31702    */
31703   function NodeList() {
31704   }NodeList.prototype = {
31705         /**
31706          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
31707          * @standard level1
31708          */
31709         length:0, 
31710         /**
31711          * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
31712          * @standard level1
31713          * @param index  unsigned long 
31714          *   Index into the collection.
31715          * @return Node
31716          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
31717          */
31718         item: function(index) {
31719                 return this[index] || null;
31720         },
31721         toString:function(isHTML,nodeFilter){
31722                 for(var buf = [], i = 0;i<this.length;i++){
31723                         serializeToString(this[i],buf,isHTML,nodeFilter);
31724                 }
31725                 return buf.join('');
31726         }
31727   };
31728   function LiveNodeList(node,refresh){
31729         this._node = node;
31730         this._refresh = refresh;
31731         _updateLiveList(this);
31732   }
31733   function _updateLiveList(list){
31734         var inc = list._node._inc || list._node.ownerDocument._inc;
31735         if(list._inc != inc){
31736                 var ls = list._refresh(list._node);
31737                 //console.log(ls.length)
31738                 __set__(list,'length',ls.length);
31739                 copy$1(ls,list);
31740                 list._inc = inc;
31741         }
31742   }
31743   LiveNodeList.prototype.item = function(i){
31744         _updateLiveList(this);
31745         return this[i];
31746   };
31747
31748   _extends(LiveNodeList,NodeList);
31749   /**
31750    * 
31751    * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
31752    * NamedNodeMap objects in the DOM are live.
31753    * used for attributes or DocumentType entities 
31754    */
31755   function NamedNodeMap() {
31756   }
31757   function _findNodeIndex(list,node){
31758         var i = list.length;
31759         while(i--){
31760                 if(list[i] === node){return i}
31761         }
31762   }
31763
31764   function _addNamedNode(el,list,newAttr,oldAttr){
31765         if(oldAttr){
31766                 list[_findNodeIndex(list,oldAttr)] = newAttr;
31767         }else{
31768                 list[list.length++] = newAttr;
31769         }
31770         if(el){
31771                 newAttr.ownerElement = el;
31772                 var doc = el.ownerDocument;
31773                 if(doc){
31774                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
31775                         _onAddAttribute(doc,el,newAttr);
31776                 }
31777         }
31778   }
31779   function _removeNamedNode(el,list,attr){
31780         //console.log('remove attr:'+attr)
31781         var i = _findNodeIndex(list,attr);
31782         if(i>=0){
31783                 var lastIndex = list.length-1;
31784                 while(i<lastIndex){
31785                         list[i] = list[++i];
31786                 }
31787                 list.length = lastIndex;
31788                 if(el){
31789                         var doc = el.ownerDocument;
31790                         if(doc){
31791                                 _onRemoveAttribute(doc,el,attr);
31792                                 attr.ownerElement = null;
31793                         }
31794                 }
31795         }else{
31796                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
31797         }
31798   }
31799   NamedNodeMap.prototype = {
31800         length:0,
31801         item:NodeList.prototype.item,
31802         getNamedItem: function(key) {
31803   //            if(key.indexOf(':')>0 || key == 'xmlns'){
31804   //                    return null;
31805   //            }
31806                 //console.log()
31807                 var i = this.length;
31808                 while(i--){
31809                         var attr = this[i];
31810                         //console.log(attr.nodeName,key)
31811                         if(attr.nodeName == key){
31812                                 return attr;
31813                         }
31814                 }
31815         },
31816         setNamedItem: function(attr) {
31817                 var el = attr.ownerElement;
31818                 if(el && el!=this._ownerElement){
31819                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
31820                 }
31821                 var oldAttr = this.getNamedItem(attr.nodeName);
31822                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
31823                 return oldAttr;
31824         },
31825         /* returns Node */
31826         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
31827                 var el = attr.ownerElement, oldAttr;
31828                 if(el && el!=this._ownerElement){
31829                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
31830                 }
31831                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
31832                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
31833                 return oldAttr;
31834         },
31835
31836         /* returns Node */
31837         removeNamedItem: function(key) {
31838                 var attr = this.getNamedItem(key);
31839                 _removeNamedNode(this._ownerElement,this,attr);
31840                 return attr;
31841                 
31842                 
31843         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
31844         
31845         //for level2
31846         removeNamedItemNS:function(namespaceURI,localName){
31847                 var attr = this.getNamedItemNS(namespaceURI,localName);
31848                 _removeNamedNode(this._ownerElement,this,attr);
31849                 return attr;
31850         },
31851         getNamedItemNS: function(namespaceURI, localName) {
31852                 var i = this.length;
31853                 while(i--){
31854                         var node = this[i];
31855                         if(node.localName == localName && node.namespaceURI == namespaceURI){
31856                                 return node;
31857                         }
31858                 }
31859                 return null;
31860         }
31861   };
31862   /**
31863    * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
31864    */
31865   function DOMImplementation(/* Object */ features) {
31866         this._features = {};
31867         if (features) {
31868                 for (var feature in features) {
31869                          this._features = features[feature];
31870                 }
31871         }
31872   }
31873   DOMImplementation.prototype = {
31874         hasFeature: function(/* string */ feature, /* string */ version) {
31875                 var versions = this._features[feature.toLowerCase()];
31876                 if (versions && (!version || version in versions)) {
31877                         return true;
31878                 } else {
31879                         return false;
31880                 }
31881         },
31882         // Introduced in DOM Level 2:
31883         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
31884                 var doc = new Document();
31885                 doc.implementation = this;
31886                 doc.childNodes = new NodeList();
31887                 doc.doctype = doctype;
31888                 if(doctype){
31889                         doc.appendChild(doctype);
31890                 }
31891                 if(qualifiedName){
31892                         var root = doc.createElementNS(namespaceURI,qualifiedName);
31893                         doc.appendChild(root);
31894                 }
31895                 return doc;
31896         },
31897         // Introduced in DOM Level 2:
31898         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
31899                 var node = new DocumentType();
31900                 node.name = qualifiedName;
31901                 node.nodeName = qualifiedName;
31902                 node.publicId = publicId;
31903                 node.systemId = systemId;
31904                 // Introduced in DOM Level 2:
31905                 //readonly attribute DOMString        internalSubset;
31906                 
31907                 //TODO:..
31908                 //  readonly attribute NamedNodeMap     entities;
31909                 //  readonly attribute NamedNodeMap     notations;
31910                 return node;
31911         }
31912   };
31913
31914
31915   /**
31916    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
31917    */
31918
31919   function Node$2() {
31920   }
31921   Node$2.prototype = {
31922         firstChild : null,
31923         lastChild : null,
31924         previousSibling : null,
31925         nextSibling : null,
31926         attributes : null,
31927         parentNode : null,
31928         childNodes : null,
31929         ownerDocument : null,
31930         nodeValue : null,
31931         namespaceURI : null,
31932         prefix : null,
31933         localName : null,
31934         // Modified in DOM Level 2:
31935         insertBefore:function(newChild, refChild){//raises 
31936                 return _insertBefore(this,newChild,refChild);
31937         },
31938         replaceChild:function(newChild, oldChild){//raises 
31939                 this.insertBefore(newChild,oldChild);
31940                 if(oldChild){
31941                         this.removeChild(oldChild);
31942                 }
31943         },
31944         removeChild:function(oldChild){
31945                 return _removeChild(this,oldChild);
31946         },
31947         appendChild:function(newChild){
31948                 return this.insertBefore(newChild,null);
31949         },
31950         hasChildNodes:function(){
31951                 return this.firstChild != null;
31952         },
31953         cloneNode:function(deep){
31954                 return cloneNode(this.ownerDocument||this,this,deep);
31955         },
31956         // Modified in DOM Level 2:
31957         normalize:function(){
31958                 var child = this.firstChild;
31959                 while(child){
31960                         var next = child.nextSibling;
31961                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
31962                                 this.removeChild(next);
31963                                 child.appendData(next.data);
31964                         }else{
31965                                 child.normalize();
31966                                 child = next;
31967                         }
31968                 }
31969         },
31970         // Introduced in DOM Level 2:
31971         isSupported:function(feature, version){
31972                 return this.ownerDocument.implementation.hasFeature(feature,version);
31973         },
31974       // Introduced in DOM Level 2:
31975       hasAttributes:function(){
31976         return this.attributes.length>0;
31977       },
31978       lookupPrefix:function(namespaceURI){
31979         var el = this;
31980         while(el){
31981                 var map = el._nsMap;
31982                 //console.dir(map)
31983                 if(map){
31984                         for(var n in map){
31985                                 if(map[n] == namespaceURI){
31986                                         return n;
31987                                 }
31988                         }
31989                 }
31990                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
31991         }
31992         return null;
31993       },
31994       // Introduced in DOM Level 3:
31995       lookupNamespaceURI:function(prefix){
31996         var el = this;
31997         while(el){
31998                 var map = el._nsMap;
31999                 //console.dir(map)
32000                 if(map){
32001                         if(prefix in map){
32002                                 return map[prefix] ;
32003                         }
32004                 }
32005                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
32006         }
32007         return null;
32008       },
32009       // Introduced in DOM Level 3:
32010       isDefaultNamespace:function(namespaceURI){
32011         var prefix = this.lookupPrefix(namespaceURI);
32012         return prefix == null;
32013       }
32014   };
32015
32016
32017   function _xmlEncoder(c){
32018         return c == '<' && '&lt;' ||
32019            c == '>' && '&gt;' ||
32020            c == '&' && '&amp;' ||
32021            c == '"' && '&quot;' ||
32022            '&#'+c.charCodeAt()+';'
32023   }
32024
32025
32026   copy$1(NodeType,Node$2);
32027   copy$1(NodeType,Node$2.prototype);
32028
32029   /**
32030    * @param callback return true for continue,false for break
32031    * @return boolean true: break visit;
32032    */
32033   function _visitNode(node,callback){
32034         if(callback(node)){
32035                 return true;
32036         }
32037         if(node = node.firstChild){
32038                 do{
32039                         if(_visitNode(node,callback)){return true}
32040           }while(node=node.nextSibling)
32041       }
32042   }
32043
32044
32045
32046   function Document(){
32047   }
32048   function _onAddAttribute(doc,el,newAttr){
32049         doc && doc._inc++;
32050         var ns = newAttr.namespaceURI ;
32051         if(ns == 'http://www.w3.org/2000/xmlns/'){
32052                 //update namespace
32053                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
32054         }
32055   }
32056   function _onRemoveAttribute(doc,el,newAttr,remove){
32057         doc && doc._inc++;
32058         var ns = newAttr.namespaceURI ;
32059         if(ns == 'http://www.w3.org/2000/xmlns/'){
32060                 //update namespace
32061                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
32062         }
32063   }
32064   function _onUpdateChild(doc,el,newChild){
32065         if(doc && doc._inc){
32066                 doc._inc++;
32067                 //update childNodes
32068                 var cs = el.childNodes;
32069                 if(newChild){
32070                         cs[cs.length++] = newChild;
32071                 }else{
32072                         //console.log(1)
32073                         var child = el.firstChild;
32074                         var i = 0;
32075                         while(child){
32076                                 cs[i++] = child;
32077                                 child =child.nextSibling;
32078                         }
32079                         cs.length = i;
32080                 }
32081         }
32082   }
32083
32084   /**
32085    * attributes;
32086    * children;
32087    * 
32088    * writeable properties:
32089    * nodeValue,Attr:value,CharacterData:data
32090    * prefix
32091    */
32092   function _removeChild(parentNode,child){
32093         var previous = child.previousSibling;
32094         var next = child.nextSibling;
32095         if(previous){
32096                 previous.nextSibling = next;
32097         }else{
32098                 parentNode.firstChild = next;
32099         }
32100         if(next){
32101                 next.previousSibling = previous;
32102         }else{
32103                 parentNode.lastChild = previous;
32104         }
32105         _onUpdateChild(parentNode.ownerDocument,parentNode);
32106         return child;
32107   }
32108   /**
32109    * preformance key(refChild == null)
32110    */
32111   function _insertBefore(parentNode,newChild,nextChild){
32112         var cp = newChild.parentNode;
32113         if(cp){
32114                 cp.removeChild(newChild);//remove and update
32115         }
32116         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
32117                 var newFirst = newChild.firstChild;
32118                 if (newFirst == null) {
32119                         return newChild;
32120                 }
32121                 var newLast = newChild.lastChild;
32122         }else{
32123                 newFirst = newLast = newChild;
32124         }
32125         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
32126
32127         newFirst.previousSibling = pre;
32128         newLast.nextSibling = nextChild;
32129         
32130         
32131         if(pre){
32132                 pre.nextSibling = newFirst;
32133         }else{
32134                 parentNode.firstChild = newFirst;
32135         }
32136         if(nextChild == null){
32137                 parentNode.lastChild = newLast;
32138         }else{
32139                 nextChild.previousSibling = newLast;
32140         }
32141         do{
32142                 newFirst.parentNode = parentNode;
32143         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
32144         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
32145         //console.log(parentNode.lastChild.nextSibling == null)
32146         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
32147                 newChild.firstChild = newChild.lastChild = null;
32148         }
32149         return newChild;
32150   }
32151   function _appendSingleChild(parentNode,newChild){
32152         var cp = newChild.parentNode;
32153         if(cp){
32154                 var pre = parentNode.lastChild;
32155                 cp.removeChild(newChild);//remove and update
32156                 var pre = parentNode.lastChild;
32157         }
32158         var pre = parentNode.lastChild;
32159         newChild.parentNode = parentNode;
32160         newChild.previousSibling = pre;
32161         newChild.nextSibling = null;
32162         if(pre){
32163                 pre.nextSibling = newChild;
32164         }else{
32165                 parentNode.firstChild = newChild;
32166         }
32167         parentNode.lastChild = newChild;
32168         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
32169         return newChild;
32170         //console.log("__aa",parentNode.lastChild.nextSibling == null)
32171   }
32172   Document.prototype = {
32173         //implementation : null,
32174         nodeName :  '#document',
32175         nodeType :  DOCUMENT_NODE,
32176         doctype :  null,
32177         documentElement :  null,
32178         _inc : 1,
32179         
32180         insertBefore :  function(newChild, refChild){//raises 
32181                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
32182                         var child = newChild.firstChild;
32183                         while(child){
32184                                 var next = child.nextSibling;
32185                                 this.insertBefore(child,refChild);
32186                                 child = next;
32187                         }
32188                         return newChild;
32189                 }
32190                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
32191                         this.documentElement = newChild;
32192                 }
32193                 
32194                 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
32195         },
32196         removeChild :  function(oldChild){
32197                 if(this.documentElement == oldChild){
32198                         this.documentElement = null;
32199                 }
32200                 return _removeChild(this,oldChild);
32201         },
32202         // Introduced in DOM Level 2:
32203         importNode : function(importedNode,deep){
32204                 return importNode(this,importedNode,deep);
32205         },
32206         // Introduced in DOM Level 2:
32207         getElementById :        function(id){
32208                 var rtv = null;
32209                 _visitNode(this.documentElement,function(node){
32210                         if(node.nodeType == ELEMENT_NODE){
32211                                 if(node.getAttribute('id') == id){
32212                                         rtv = node;
32213                                         return true;
32214                                 }
32215                         }
32216                 });
32217                 return rtv;
32218         },
32219         
32220         //document factory method:
32221         createElement : function(tagName){
32222                 var node = new Element();
32223                 node.ownerDocument = this;
32224                 node.nodeName = tagName;
32225                 node.tagName = tagName;
32226                 node.childNodes = new NodeList();
32227                 var attrs       = node.attributes = new NamedNodeMap();
32228                 attrs._ownerElement = node;
32229                 return node;
32230         },
32231         createDocumentFragment :        function(){
32232                 var node = new DocumentFragment();
32233                 node.ownerDocument = this;
32234                 node.childNodes = new NodeList();
32235                 return node;
32236         },
32237         createTextNode :        function(data){
32238                 var node = new Text();
32239                 node.ownerDocument = this;
32240                 node.appendData(data);
32241                 return node;
32242         },
32243         createComment : function(data){
32244                 var node = new Comment();
32245                 node.ownerDocument = this;
32246                 node.appendData(data);
32247                 return node;
32248         },
32249         createCDATASection :    function(data){
32250                 var node = new CDATASection();
32251                 node.ownerDocument = this;
32252                 node.appendData(data);
32253                 return node;
32254         },
32255         createProcessingInstruction :   function(target,data){
32256                 var node = new ProcessingInstruction();
32257                 node.ownerDocument = this;
32258                 node.tagName = node.target = target;
32259                 node.nodeValue= node.data = data;
32260                 return node;
32261         },
32262         createAttribute :       function(name){
32263                 var node = new Attr();
32264                 node.ownerDocument      = this;
32265                 node.name = name;
32266                 node.nodeName   = name;
32267                 node.localName = name;
32268                 node.specified = true;
32269                 return node;
32270         },
32271         createEntityReference : function(name){
32272                 var node = new EntityReference();
32273                 node.ownerDocument      = this;
32274                 node.nodeName   = name;
32275                 return node;
32276         },
32277         // Introduced in DOM Level 2:
32278         createElementNS :       function(namespaceURI,qualifiedName){
32279                 var node = new Element();
32280                 var pl = qualifiedName.split(':');
32281                 var attrs       = node.attributes = new NamedNodeMap();
32282                 node.childNodes = new NodeList();
32283                 node.ownerDocument = this;
32284                 node.nodeName = qualifiedName;
32285                 node.tagName = qualifiedName;
32286                 node.namespaceURI = namespaceURI;
32287                 if(pl.length == 2){
32288                         node.prefix = pl[0];
32289                         node.localName = pl[1];
32290                 }else{
32291                         //el.prefix = null;
32292                         node.localName = qualifiedName;
32293                 }
32294                 attrs._ownerElement = node;
32295                 return node;
32296         },
32297         // Introduced in DOM Level 2:
32298         createAttributeNS :     function(namespaceURI,qualifiedName){
32299                 var node = new Attr();
32300                 var pl = qualifiedName.split(':');
32301                 node.ownerDocument = this;
32302                 node.nodeName = qualifiedName;
32303                 node.name = qualifiedName;
32304                 node.namespaceURI = namespaceURI;
32305                 node.specified = true;
32306                 if(pl.length == 2){
32307                         node.prefix = pl[0];
32308                         node.localName = pl[1];
32309                 }else{
32310                         //el.prefix = null;
32311                         node.localName = qualifiedName;
32312                 }
32313                 return node;
32314         }
32315   };
32316   _extends(Document,Node$2);
32317
32318
32319   function Element() {
32320         this._nsMap = {};
32321   }Element.prototype = {
32322         nodeType : ELEMENT_NODE,
32323         hasAttribute : function(name){
32324                 return this.getAttributeNode(name)!=null;
32325         },
32326         getAttribute : function(name){
32327                 var attr = this.getAttributeNode(name);
32328                 return attr && attr.value || '';
32329         },
32330         getAttributeNode : function(name){
32331                 return this.attributes.getNamedItem(name);
32332         },
32333         setAttribute : function(name, value){
32334                 var attr = this.ownerDocument.createAttribute(name);
32335                 attr.value = attr.nodeValue = "" + value;
32336                 this.setAttributeNode(attr);
32337         },
32338         removeAttribute : function(name){
32339                 var attr = this.getAttributeNode(name);
32340                 attr && this.removeAttributeNode(attr);
32341         },
32342         
32343         //four real opeartion method
32344         appendChild:function(newChild){
32345                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
32346                         return this.insertBefore(newChild,null);
32347                 }else{
32348                         return _appendSingleChild(this,newChild);
32349                 }
32350         },
32351         setAttributeNode : function(newAttr){
32352                 return this.attributes.setNamedItem(newAttr);
32353         },
32354         setAttributeNodeNS : function(newAttr){
32355                 return this.attributes.setNamedItemNS(newAttr);
32356         },
32357         removeAttributeNode : function(oldAttr){
32358                 //console.log(this == oldAttr.ownerElement)
32359                 return this.attributes.removeNamedItem(oldAttr.nodeName);
32360         },
32361         //get real attribute name,and remove it by removeAttributeNode
32362         removeAttributeNS : function(namespaceURI, localName){
32363                 var old = this.getAttributeNodeNS(namespaceURI, localName);
32364                 old && this.removeAttributeNode(old);
32365         },
32366         
32367         hasAttributeNS : function(namespaceURI, localName){
32368                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
32369         },
32370         getAttributeNS : function(namespaceURI, localName){
32371                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
32372                 return attr && attr.value || '';
32373         },
32374         setAttributeNS : function(namespaceURI, qualifiedName, value){
32375                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
32376                 attr.value = attr.nodeValue = "" + value;
32377                 this.setAttributeNode(attr);
32378         },
32379         getAttributeNodeNS : function(namespaceURI, localName){
32380                 return this.attributes.getNamedItemNS(namespaceURI, localName);
32381         },
32382         
32383         getElementsByTagName : function(tagName){
32384                 return new LiveNodeList(this,function(base){
32385                         var ls = [];
32386                         _visitNode(base,function(node){
32387                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
32388                                         ls.push(node);
32389                                 }
32390                         });
32391                         return ls;
32392                 });
32393         },
32394         getElementsByTagNameNS : function(namespaceURI, localName){
32395                 return new LiveNodeList(this,function(base){
32396                         var ls = [];
32397                         _visitNode(base,function(node){
32398                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
32399                                         ls.push(node);
32400                                 }
32401                         });
32402                         return ls;
32403                         
32404                 });
32405         }
32406   };
32407   Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
32408   Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
32409
32410
32411   _extends(Element,Node$2);
32412   function Attr() {
32413   }Attr.prototype.nodeType = ATTRIBUTE_NODE;
32414   _extends(Attr,Node$2);
32415
32416
32417   function CharacterData() {
32418   }CharacterData.prototype = {
32419         data : '',
32420         substringData : function(offset, count) {
32421                 return this.data.substring(offset, offset+count);
32422         },
32423         appendData: function(text) {
32424                 text = this.data+text;
32425                 this.nodeValue = this.data = text;
32426                 this.length = text.length;
32427         },
32428         insertData: function(offset,text) {
32429                 this.replaceData(offset,0,text);
32430         
32431         },
32432         appendChild:function(newChild){
32433                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
32434         },
32435         deleteData: function(offset, count) {
32436                 this.replaceData(offset,count,"");
32437         },
32438         replaceData: function(offset, count, text) {
32439                 var start = this.data.substring(0,offset);
32440                 var end = this.data.substring(offset+count);
32441                 text = start + text + end;
32442                 this.nodeValue = this.data = text;
32443                 this.length = text.length;
32444         }
32445   };
32446   _extends(CharacterData,Node$2);
32447   function Text() {
32448   }Text.prototype = {
32449         nodeName : "#text",
32450         nodeType : TEXT_NODE,
32451         splitText : function(offset) {
32452                 var text = this.data;
32453                 var newText = text.substring(offset);
32454                 text = text.substring(0, offset);
32455                 this.data = this.nodeValue = text;
32456                 this.length = text.length;
32457                 var newNode = this.ownerDocument.createTextNode(newText);
32458                 if(this.parentNode){
32459                         this.parentNode.insertBefore(newNode, this.nextSibling);
32460                 }
32461                 return newNode;
32462         }
32463   };
32464   _extends(Text,CharacterData);
32465   function Comment() {
32466   }Comment.prototype = {
32467         nodeName : "#comment",
32468         nodeType : COMMENT_NODE
32469   };
32470   _extends(Comment,CharacterData);
32471
32472   function CDATASection() {
32473   }CDATASection.prototype = {
32474         nodeName : "#cdata-section",
32475         nodeType : CDATA_SECTION_NODE
32476   };
32477   _extends(CDATASection,CharacterData);
32478
32479
32480   function DocumentType() {
32481   }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
32482   _extends(DocumentType,Node$2);
32483
32484   function Notation() {
32485   }Notation.prototype.nodeType = NOTATION_NODE;
32486   _extends(Notation,Node$2);
32487
32488   function Entity() {
32489   }Entity.prototype.nodeType = ENTITY_NODE;
32490   _extends(Entity,Node$2);
32491
32492   function EntityReference() {
32493   }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
32494   _extends(EntityReference,Node$2);
32495
32496   function DocumentFragment() {
32497   }DocumentFragment.prototype.nodeName =        "#document-fragment";
32498   DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
32499   _extends(DocumentFragment,Node$2);
32500
32501
32502   function ProcessingInstruction() {
32503   }
32504   ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
32505   _extends(ProcessingInstruction,Node$2);
32506   function XMLSerializer$1(){}
32507   XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
32508         return nodeSerializeToString.call(node,isHtml,nodeFilter);
32509   };
32510   Node$2.prototype.toString = nodeSerializeToString;
32511   function nodeSerializeToString(isHtml,nodeFilter){
32512         var buf = [];
32513         var refNode = this.nodeType == 9?this.documentElement:this;
32514         var prefix = refNode.prefix;
32515         var uri = refNode.namespaceURI;
32516         
32517         if(uri && prefix == null){
32518                 //console.log(prefix)
32519                 var prefix = refNode.lookupPrefix(uri);
32520                 if(prefix == null){
32521                         //isHTML = true;
32522                         var visibleNamespaces=[
32523                         {namespace:uri,prefix:null}
32524                         //{namespace:uri,prefix:''}
32525                         ];
32526                 }
32527         }
32528         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
32529         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
32530         return buf.join('');
32531   }
32532   function needNamespaceDefine(node,isHTML, visibleNamespaces) {
32533         var prefix = node.prefix||'';
32534         var uri = node.namespaceURI;
32535         if (!prefix && !uri){
32536                 return false;
32537         }
32538         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
32539                 || uri == 'http://www.w3.org/2000/xmlns/'){
32540                 return false;
32541         }
32542         
32543         var i = visibleNamespaces.length; 
32544         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
32545         while (i--) {
32546                 var ns = visibleNamespaces[i];
32547                 // get namespace prefix
32548                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
32549                 if (ns.prefix == prefix){
32550                         return ns.namespace != uri;
32551                 }
32552         }
32553         //console.log(isHTML,uri,prefix=='')
32554         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
32555         //      return false;
32556         //}
32557         //node.flag = '11111'
32558         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
32559         return true;
32560   }
32561   function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
32562         if(nodeFilter){
32563                 node = nodeFilter(node);
32564                 if(node){
32565                         if(typeof node == 'string'){
32566                                 buf.push(node);
32567                                 return;
32568                         }
32569                 }else{
32570                         return;
32571                 }
32572                 //buf.sort.apply(attrs, attributeSorter);
32573         }
32574         switch(node.nodeType){
32575         case ELEMENT_NODE:
32576                 if (!visibleNamespaces) visibleNamespaces = [];
32577                 var startVisibleNamespaces = visibleNamespaces.length;
32578                 var attrs = node.attributes;
32579                 var len = attrs.length;
32580                 var child = node.firstChild;
32581                 var nodeName = node.tagName;
32582                 
32583                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
32584                 buf.push('<',nodeName);
32585                 
32586                 
32587                 
32588                 for(var i=0;i<len;i++){
32589                         // add namespaces for attributes
32590                         var attr = attrs.item(i);
32591                         if (attr.prefix == 'xmlns') {
32592                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
32593                         }else if(attr.nodeName == 'xmlns'){
32594                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
32595                         }
32596                 }
32597                 for(var i=0;i<len;i++){
32598                         var attr = attrs.item(i);
32599                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
32600                                 var prefix = attr.prefix||'';
32601                                 var uri = attr.namespaceURI;
32602                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
32603                                 buf.push(ns, '="' , uri , '"');
32604                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
32605                         }
32606                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
32607                 }
32608                 // add namespace for current node               
32609                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
32610                         var prefix = node.prefix||'';
32611                         var uri = node.namespaceURI;
32612                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
32613                         buf.push(ns, '="' , uri , '"');
32614                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
32615                 }
32616                 
32617                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
32618                         buf.push('>');
32619                         //if is cdata child node
32620                         if(isHTML && /^script$/i.test(nodeName)){
32621                                 while(child){
32622                                         if(child.data){
32623                                                 buf.push(child.data);
32624                                         }else{
32625                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32626                                         }
32627                                         child = child.nextSibling;
32628                                 }
32629                         }else
32630                         {
32631                                 while(child){
32632                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32633                                         child = child.nextSibling;
32634                                 }
32635                         }
32636                         buf.push('</',nodeName,'>');
32637                 }else{
32638                         buf.push('/>');
32639                 }
32640                 // remove added visible namespaces
32641                 //visibleNamespaces.length = startVisibleNamespaces;
32642                 return;
32643         case DOCUMENT_NODE:
32644         case DOCUMENT_FRAGMENT_NODE:
32645                 var child = node.firstChild;
32646                 while(child){
32647                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32648                         child = child.nextSibling;
32649                 }
32650                 return;
32651         case ATTRIBUTE_NODE:
32652                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
32653         case TEXT_NODE:
32654                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
32655         case CDATA_SECTION_NODE:
32656                 return buf.push( '<![CDATA[',node.data,']]>');
32657         case COMMENT_NODE:
32658                 return buf.push( "<!--",node.data,"-->");
32659         case DOCUMENT_TYPE_NODE:
32660                 var pubid = node.publicId;
32661                 var sysid = node.systemId;
32662                 buf.push('<!DOCTYPE ',node.name);
32663                 if(pubid){
32664                         buf.push(' PUBLIC "',pubid);
32665                         if (sysid && sysid!='.') {
32666                                 buf.push( '" "',sysid);
32667                         }
32668                         buf.push('">');
32669                 }else if(sysid && sysid!='.'){
32670                         buf.push(' SYSTEM "',sysid,'">');
32671                 }else{
32672                         var sub = node.internalSubset;
32673                         if(sub){
32674                                 buf.push(" [",sub,"]");
32675                         }
32676                         buf.push(">");
32677                 }
32678                 return;
32679         case PROCESSING_INSTRUCTION_NODE:
32680                 return buf.push( "<?",node.target," ",node.data,"?>");
32681         case ENTITY_REFERENCE_NODE:
32682                 return buf.push( '&',node.nodeName,';');
32683         //case ENTITY_NODE:
32684         //case NOTATION_NODE:
32685         default:
32686                 buf.push('??',node.nodeName);
32687         }
32688   }
32689   function importNode(doc,node,deep){
32690         var node2;
32691         switch (node.nodeType) {
32692         case ELEMENT_NODE:
32693                 node2 = node.cloneNode(false);
32694                 node2.ownerDocument = doc;
32695                 //var attrs = node2.attributes;
32696                 //var len = attrs.length;
32697                 //for(var i=0;i<len;i++){
32698                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
32699                 //}
32700         case DOCUMENT_FRAGMENT_NODE:
32701                 break;
32702         case ATTRIBUTE_NODE:
32703                 deep = true;
32704                 break;
32705         //case ENTITY_REFERENCE_NODE:
32706         //case PROCESSING_INSTRUCTION_NODE:
32707         ////case TEXT_NODE:
32708         //case CDATA_SECTION_NODE:
32709         //case COMMENT_NODE:
32710         //      deep = false;
32711         //      break;
32712         //case DOCUMENT_NODE:
32713         //case DOCUMENT_TYPE_NODE:
32714         //cannot be imported.
32715         //case ENTITY_NODE:
32716         //case NOTATION_NODE:
32717         //can not hit in level3
32718         //default:throw e;
32719         }
32720         if(!node2){
32721                 node2 = node.cloneNode(false);//false
32722         }
32723         node2.ownerDocument = doc;
32724         node2.parentNode = null;
32725         if(deep){
32726                 var child = node.firstChild;
32727                 while(child){
32728                         node2.appendChild(importNode(doc,child,deep));
32729                         child = child.nextSibling;
32730                 }
32731         }
32732         return node2;
32733   }
32734   //
32735   //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
32736   //                                    attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
32737   function cloneNode(doc,node,deep){
32738         var node2 = new node.constructor();
32739         for(var n in node){
32740                 var v = node[n];
32741                 if(typeof v != 'object' ){
32742                         if(v != node2[n]){
32743                                 node2[n] = v;
32744                         }
32745                 }
32746         }
32747         if(node.childNodes){
32748                 node2.childNodes = new NodeList();
32749         }
32750         node2.ownerDocument = doc;
32751         switch (node2.nodeType) {
32752         case ELEMENT_NODE:
32753                 var attrs       = node.attributes;
32754                 var attrs2      = node2.attributes = new NamedNodeMap();
32755                 var len = attrs.length;
32756                 attrs2._ownerElement = node2;
32757                 for(var i=0;i<len;i++){
32758                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
32759                 }
32760                 break;
32761         case ATTRIBUTE_NODE:
32762                 deep = true;
32763         }
32764         if(deep){
32765                 var child = node.firstChild;
32766                 while(child){
32767                         node2.appendChild(cloneNode(doc,child,deep));
32768                         child = child.nextSibling;
32769                 }
32770         }
32771         return node2;
32772   }
32773
32774   function __set__(object,key,value){
32775         object[key] = value;
32776   }
32777   //do dynamic
32778   try{
32779         if(Object.defineProperty){
32780                 Object.defineProperty(LiveNodeList.prototype,'length',{
32781                         get:function(){
32782                                 _updateLiveList(this);
32783                                 return this.$$length;
32784                         }
32785                 });
32786                 Object.defineProperty(Node$2.prototype,'textContent',{
32787                         get:function(){
32788                                 return getTextContent(this);
32789                         },
32790                         set:function(data){
32791                                 switch(this.nodeType){
32792                                 case ELEMENT_NODE:
32793                                 case DOCUMENT_FRAGMENT_NODE:
32794                                         while(this.firstChild){
32795                                                 this.removeChild(this.firstChild);
32796                                         }
32797                                         if(data || String(data)){
32798                                                 this.appendChild(this.ownerDocument.createTextNode(data));
32799                                         }
32800                                         break;
32801                                 default:
32802                                         //TODO:
32803                                         this.data = data;
32804                                         this.value = data;
32805                                         this.nodeValue = data;
32806                                 }
32807                         }
32808                 });
32809                 
32810                 function getTextContent(node){
32811                         switch(node.nodeType){
32812                         case ELEMENT_NODE:
32813                         case DOCUMENT_FRAGMENT_NODE:
32814                                 var buf = [];
32815                                 node = node.firstChild;
32816                                 while(node){
32817                                         if(node.nodeType!==7 && node.nodeType !==8){
32818                                                 buf.push(getTextContent(node));
32819                                         }
32820                                         node = node.nextSibling;
32821                                 }
32822                                 return buf.join('');
32823                         default:
32824                                 return node.nodeValue;
32825                         }
32826                 }
32827                 __set__ = function(object,key,value){
32828                         //console.log(value)
32829                         object['$$'+key] = value;
32830                 };
32831         }
32832   }catch(e){//ie8
32833   }
32834
32835   //if(typeof require == 'function'){
32836         var DOMImplementation_1 = DOMImplementation;
32837         var XMLSerializer_1 = XMLSerializer$1;
32838   //}
32839
32840   var dom = {
32841         DOMImplementation: DOMImplementation_1,
32842         XMLSerializer: XMLSerializer_1
32843   };
32844
32845   var domParser = createCommonjsModule(function (module, exports) {
32846   function DOMParser(options){
32847         this.options = options ||{locator:{}};
32848         
32849   }
32850   DOMParser.prototype.parseFromString = function(source,mimeType){
32851         var options = this.options;
32852         var sax$$1 =  new XMLReader();
32853         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
32854         var errorHandler = options.errorHandler;
32855         var locator = options.locator;
32856         var defaultNSMap = options.xmlns||{};
32857         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
32858         if(locator){
32859                 domBuilder.setDocumentLocator(locator);
32860         }
32861         
32862         sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
32863         sax$$1.domBuilder = options.domBuilder || domBuilder;
32864         if(/\/x?html?$/.test(mimeType)){
32865                 entityMap.nbsp = '\xa0';
32866                 entityMap.copy = '\xa9';
32867                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
32868         }
32869         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
32870         if(source){
32871                 sax$$1.parse(source,defaultNSMap,entityMap);
32872         }else{
32873                 sax$$1.errorHandler.error("invalid doc source");
32874         }
32875         return domBuilder.doc;
32876   };
32877   function buildErrorHandler(errorImpl,domBuilder,locator){
32878         if(!errorImpl){
32879                 if(domBuilder instanceof DOMHandler){
32880                         return domBuilder;
32881                 }
32882                 errorImpl = domBuilder ;
32883         }
32884         var errorHandler = {};
32885         var isCallback = errorImpl instanceof Function;
32886         locator = locator||{};
32887         function build(key){
32888                 var fn = errorImpl[key];
32889                 if(!fn && isCallback){
32890                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
32891                 }
32892                 errorHandler[key] = fn && function(msg){
32893                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
32894                 }||function(){};
32895         }
32896         build('warning');
32897         build('error');
32898         build('fatalError');
32899         return errorHandler;
32900   }
32901
32902   //console.log('#\n\n\n\n\n\n\n####')
32903   /**
32904    * +ContentHandler+ErrorHandler
32905    * +LexicalHandler+EntityResolver2
32906    * -DeclHandler-DTDHandler 
32907    * 
32908    * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
32909    * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
32910    * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
32911    */
32912   function DOMHandler() {
32913       this.cdata = false;
32914   }
32915   function position(locator,node){
32916         node.lineNumber = locator.lineNumber;
32917         node.columnNumber = locator.columnNumber;
32918   }
32919   /**
32920    * @see org.xml.sax.ContentHandler#startDocument
32921    * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
32922    */ 
32923   DOMHandler.prototype = {
32924         startDocument : function() {
32925         this.doc = new DOMImplementation().createDocument(null, null, null);
32926         if (this.locator) {
32927                 this.doc.documentURI = this.locator.systemId;
32928         }
32929         },
32930         startElement:function(namespaceURI, localName, qName, attrs) {
32931                 var doc = this.doc;
32932             var el = doc.createElementNS(namespaceURI, qName||localName);
32933             var len = attrs.length;
32934             appendElement(this, el);
32935             this.currentElement = el;
32936             
32937                 this.locator && position(this.locator,el);
32938             for (var i = 0 ; i < len; i++) {
32939                 var namespaceURI = attrs.getURI(i);
32940                 var value = attrs.getValue(i);
32941                 var qName = attrs.getQName(i);
32942                         var attr = doc.createAttributeNS(namespaceURI, qName);
32943                         this.locator &&position(attrs.getLocator(i),attr);
32944                         attr.value = attr.nodeValue = value;
32945                         el.setAttributeNode(attr);
32946             }
32947         },
32948         endElement:function(namespaceURI, localName, qName) {
32949                 var current = this.currentElement;
32950                 var tagName = current.tagName;
32951                 this.currentElement = current.parentNode;
32952         },
32953         startPrefixMapping:function(prefix, uri) {
32954         },
32955         endPrefixMapping:function(prefix) {
32956         },
32957         processingInstruction:function(target, data) {
32958             var ins = this.doc.createProcessingInstruction(target, data);
32959             this.locator && position(this.locator,ins);
32960             appendElement(this, ins);
32961         },
32962         ignorableWhitespace:function(ch, start, length) {
32963         },
32964         characters:function(chars, start, length) {
32965                 chars = _toString.apply(this,arguments);
32966                 //console.log(chars)
32967                 if(chars){
32968                         if (this.cdata) {
32969                                 var charNode = this.doc.createCDATASection(chars);
32970                         } else {
32971                                 var charNode = this.doc.createTextNode(chars);
32972                         }
32973                         if(this.currentElement){
32974                                 this.currentElement.appendChild(charNode);
32975                         }else if(/^\s*$/.test(chars)){
32976                                 this.doc.appendChild(charNode);
32977                                 //process xml
32978                         }
32979                         this.locator && position(this.locator,charNode);
32980                 }
32981         },
32982         skippedEntity:function(name) {
32983         },
32984         endDocument:function() {
32985                 this.doc.normalize();
32986         },
32987         setDocumentLocator:function (locator) {
32988             if(this.locator = locator){// && !('lineNumber' in locator)){
32989                 locator.lineNumber = 0;
32990             }
32991         },
32992         //LexicalHandler
32993         comment:function(chars, start, length) {
32994                 chars = _toString.apply(this,arguments);
32995             var comm = this.doc.createComment(chars);
32996             this.locator && position(this.locator,comm);
32997             appendElement(this, comm);
32998         },
32999         
33000         startCDATA:function() {
33001             //used in characters() methods
33002             this.cdata = true;
33003         },
33004         endCDATA:function() {
33005             this.cdata = false;
33006         },
33007         
33008         startDTD:function(name, publicId, systemId) {
33009                 var impl = this.doc.implementation;
33010             if (impl && impl.createDocumentType) {
33011                 var dt = impl.createDocumentType(name, publicId, systemId);
33012                 this.locator && position(this.locator,dt);
33013                 appendElement(this, dt);
33014             }
33015         },
33016         /**
33017          * @see org.xml.sax.ErrorHandler
33018          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
33019          */
33020         warning:function(error) {
33021                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
33022         },
33023         error:function(error) {
33024                 console.error('[xmldom error]\t'+error,_locator(this.locator));
33025         },
33026         fatalError:function(error) {
33027                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
33028             throw error;
33029         }
33030   };
33031   function _locator(l){
33032         if(l){
33033                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
33034         }
33035   }
33036   function _toString(chars,start,length){
33037         if(typeof chars == 'string'){
33038                 return chars.substr(start,length)
33039         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
33040                 if(chars.length >= start+length || start){
33041                         return new java.lang.String(chars,start,length)+'';
33042                 }
33043                 return chars;
33044         }
33045   }
33046
33047   /*
33048    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
33049    * used method of org.xml.sax.ext.LexicalHandler:
33050    *  #comment(chars, start, length)
33051    *  #startCDATA()
33052    *  #endCDATA()
33053    *  #startDTD(name, publicId, systemId)
33054    *
33055    *
33056    * IGNORED method of org.xml.sax.ext.LexicalHandler:
33057    *  #endDTD()
33058    *  #startEntity(name)
33059    *  #endEntity(name)
33060    *
33061    *
33062    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
33063    * IGNORED method of org.xml.sax.ext.DeclHandler
33064    *    #attributeDecl(eName, aName, type, mode, value)
33065    *  #elementDecl(name, model)
33066    *  #externalEntityDecl(name, publicId, systemId)
33067    *  #internalEntityDecl(name, value)
33068    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
33069    * IGNORED method of org.xml.sax.EntityResolver2
33070    *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
33071    *  #resolveEntity(publicId, systemId)
33072    *  #getExternalSubset(name, baseURI)
33073    * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
33074    * IGNORED method of org.xml.sax.DTDHandler
33075    *  #notationDecl(name, publicId, systemId) {};
33076    *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
33077    */
33078   "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
33079         DOMHandler.prototype[key] = function(){return null};
33080   });
33081
33082   /* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
33083   function appendElement (hander,node) {
33084       if (!hander.currentElement) {
33085           hander.doc.appendChild(node);
33086       } else {
33087           hander.currentElement.appendChild(node);
33088       }
33089   }//appendChild and setAttributeNS are preformance key
33090
33091   //if(typeof require == 'function'){
33092         var XMLReader = sax.XMLReader;
33093         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
33094         exports.XMLSerializer = dom.XMLSerializer ;
33095         exports.DOMParser = DOMParser;
33096   //}
33097   });
33098   var domParser_1 = domParser.DOMImplementation;
33099   var domParser_2 = domParser.XMLSerializer;
33100   var domParser_3 = domParser.DOMParser;
33101
33102   var domParser$1 = /*#__PURE__*/Object.freeze({
33103     default: domParser,
33104     __moduleExports: domParser,
33105     DOMImplementation: domParser_1,
33106     XMLSerializer: domParser_2,
33107     DOMParser: domParser_3
33108   });
33109
33110   var require$$0$1 = ( domParser$1 && domParser ) || domParser$1;
33111
33112   var togeojson = createCommonjsModule(function (module, exports) {
33113   var toGeoJSON = (function() {
33114
33115       var removeSpace = /\s*/g,
33116           trimSpace = /^\s*|\s*$/g,
33117           splitSpace = /\s+/;
33118       // generate a short, numeric hash of a string
33119       function okhash(x) {
33120           if (!x || !x.length) return 0;
33121           for (var i = 0, h = 0; i < x.length; i++) {
33122               h = ((h << 5) - h) + x.charCodeAt(i) | 0;
33123           } return h;
33124       }
33125       // all Y children of X
33126       function get(x, y) { return x.getElementsByTagName(y); }
33127       function attr(x, y) { return x.getAttribute(y); }
33128       function attrf(x, y) { return parseFloat(attr(x, y)); }
33129       // one Y child of X, if any, otherwise null
33130       function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
33131       // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
33132       function norm(el) { if (el.normalize) { el.normalize(); } return el; }
33133       // cast array x into numbers
33134       function numarray(x) {
33135           for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
33136           return o;
33137       }
33138       // get the content of a text node, if any
33139       function nodeVal(x) {
33140           if (x) { norm(x); }
33141           return (x && x.textContent) || '';
33142       }
33143       // get the contents of multiple text nodes, if present
33144       function getMulti(x, ys) {
33145           var o = {}, n, k;
33146           for (k = 0; k < ys.length; k++) {
33147               n = get1(x, ys[k]);
33148               if (n) o[ys[k]] = nodeVal(n);
33149           }
33150           return o;
33151       }
33152       // add properties of Y to X, overwriting if present in both
33153       function extend(x, y) { for (var k in y) x[k] = y[k]; }
33154       // get one coordinate from a coordinate array, if any
33155       function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
33156       // get all coordinates from a coordinate array as [[],[]]
33157       function coord(v) {
33158           var coords = v.replace(trimSpace, '').split(splitSpace),
33159               o = [];
33160           for (var i = 0; i < coords.length; i++) {
33161               o.push(coord1(coords[i]));
33162           }
33163           return o;
33164       }
33165       function coordPair(x) {
33166           var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
33167               ele = get1(x, 'ele'),
33168               // handle namespaced attribute in browser
33169               heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
33170               time = get1(x, 'time'),
33171               e;
33172           if (ele) {
33173               e = parseFloat(nodeVal(ele));
33174               if (!isNaN(e)) {
33175                   ll.push(e);
33176               }
33177           }
33178           return {
33179               coordinates: ll,
33180               time: time ? nodeVal(time) : null,
33181               heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
33182           };
33183       }
33184
33185       // create a new feature collection parent object
33186       function fc() {
33187           return {
33188               type: 'FeatureCollection',
33189               features: []
33190           };
33191       }
33192
33193       var serializer;
33194       if (typeof XMLSerializer !== 'undefined') {
33195           /* istanbul ignore next */
33196           serializer = new XMLSerializer();
33197       // only require xmldom in a node environment
33198       } else if (typeof process === 'object' && !process.browser) {
33199           serializer = new (require$$0$1.XMLSerializer)();
33200       }
33201       function xml2str(str) {
33202           // IE9 will create a new XMLSerializer but it'll crash immediately.
33203           // This line is ignored because we don't run coverage tests in IE9
33204           /* istanbul ignore next */
33205           if (str.xml !== undefined) return str.xml;
33206           return serializer.serializeToString(str);
33207       }
33208
33209       var t = {
33210           kml: function(doc) {
33211
33212               var gj = fc(),
33213                   // styleindex keeps track of hashed styles in order to match features
33214                   styleIndex = {}, styleByHash = {},
33215                   // stylemapindex keeps track of style maps to expose in properties
33216                   styleMapIndex = {},
33217                   // atomic geospatial types supported by KML - MultiGeometry is
33218                   // handled separately
33219                   geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
33220                   // all root placemarks in the file
33221                   placemarks = get(doc, 'Placemark'),
33222                   styles = get(doc, 'Style'),
33223                   styleMaps = get(doc, 'StyleMap');
33224
33225               for (var k = 0; k < styles.length; k++) {
33226                   var hash = okhash(xml2str(styles[k])).toString(16);
33227                   styleIndex['#' + attr(styles[k], 'id')] = hash;
33228                   styleByHash[hash] = styles[k];
33229               }
33230               for (var l = 0; l < styleMaps.length; l++) {
33231                   styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
33232                   var pairs = get(styleMaps[l], 'Pair');
33233                   var pairsMap = {};
33234                   for (var m = 0; m < pairs.length; m++) {
33235                       pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
33236                   }
33237                   styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
33238
33239               }
33240               for (var j = 0; j < placemarks.length; j++) {
33241                   gj.features = gj.features.concat(getPlacemark(placemarks[j]));
33242               }
33243               function kmlColor(v) {
33244                   var color, opacity;
33245                   v = v || '';
33246                   if (v.substr(0, 1) === '#') { v = v.substr(1); }
33247                   if (v.length === 6 || v.length === 3) { color = v; }
33248                   if (v.length === 8) {
33249                       opacity = parseInt(v.substr(0, 2), 16) / 255;
33250                       color = '#' + v.substr(6, 2) +
33251                           v.substr(4, 2) +
33252                           v.substr(2, 2);
33253                   }
33254                   return [color, isNaN(opacity) ? undefined : opacity];
33255               }
33256               function gxCoord(v) { return numarray(v.split(' ')); }
33257               function gxCoords(root) {
33258                   var elems = get(root, 'coord', 'gx'), coords = [], times = [];
33259                   if (elems.length === 0) elems = get(root, 'gx:coord');
33260                   for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
33261                   var timeElems = get(root, 'when');
33262                   for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
33263                   return {
33264                       coords: coords,
33265                       times: times
33266                   };
33267               }
33268               function getGeometry(root) {
33269                   var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
33270                   if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
33271                   if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
33272                   if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
33273                   for (i = 0; i < geotypes.length; i++) {
33274                       geomNodes = get(root, geotypes[i]);
33275                       if (geomNodes) {
33276                           for (j = 0; j < geomNodes.length; j++) {
33277                               geomNode = geomNodes[j];
33278                               if (geotypes[i] === 'Point') {
33279                                   geoms.push({
33280                                       type: 'Point',
33281                                       coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
33282                                   });
33283                               } else if (geotypes[i] === 'LineString') {
33284                                   geoms.push({
33285                                       type: 'LineString',
33286                                       coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
33287                                   });
33288                               } else if (geotypes[i] === 'Polygon') {
33289                                   var rings = get(geomNode, 'LinearRing'),
33290                                       coords = [];
33291                                   for (k = 0; k < rings.length; k++) {
33292                                       coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
33293                                   }
33294                                   geoms.push({
33295                                       type: 'Polygon',
33296                                       coordinates: coords
33297                                   });
33298                               } else if (geotypes[i] === 'Track' ||
33299                                   geotypes[i] === 'gx:Track') {
33300                                   var track = gxCoords(geomNode);
33301                                   geoms.push({
33302                                       type: 'LineString',
33303                                       coordinates: track.coords
33304                                   });
33305                                   if (track.times.length) coordTimes.push(track.times);
33306                               }
33307                           }
33308                       }
33309                   }
33310                   return {
33311                       geoms: geoms,
33312                       coordTimes: coordTimes
33313                   };
33314               }
33315               function getPlacemark(root) {
33316                   var geomsAndTimes = getGeometry(root), i, properties = {},
33317                       name = nodeVal(get1(root, 'name')),
33318                       address = nodeVal(get1(root, 'address')),
33319                       styleUrl = nodeVal(get1(root, 'styleUrl')),
33320                       description = nodeVal(get1(root, 'description')),
33321                       timeSpan = get1(root, 'TimeSpan'),
33322                       timeStamp = get1(root, 'TimeStamp'),
33323                       extendedData = get1(root, 'ExtendedData'),
33324                       lineStyle = get1(root, 'LineStyle'),
33325                       polyStyle = get1(root, 'PolyStyle'),
33326                       visibility = get1(root, 'visibility');
33327
33328                   if (!geomsAndTimes.geoms.length) return [];
33329                   if (name) properties.name = name;
33330                   if (address) properties.address = address;
33331                   if (styleUrl) {
33332                       if (styleUrl[0] !== '#') {
33333                           styleUrl = '#' + styleUrl;
33334                       }
33335
33336                       properties.styleUrl = styleUrl;
33337                       if (styleIndex[styleUrl]) {
33338                           properties.styleHash = styleIndex[styleUrl];
33339                       }
33340                       if (styleMapIndex[styleUrl]) {
33341                           properties.styleMapHash = styleMapIndex[styleUrl];
33342                           properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
33343                       }
33344                       // Try to populate the lineStyle or polyStyle since we got the style hash
33345                       var style = styleByHash[properties.styleHash];
33346                       if (style) {
33347                           if (!lineStyle) lineStyle = get1(style, 'LineStyle');
33348                           if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
33349                       }
33350                   }
33351                   if (description) properties.description = description;
33352                   if (timeSpan) {
33353                       var begin = nodeVal(get1(timeSpan, 'begin'));
33354                       var end = nodeVal(get1(timeSpan, 'end'));
33355                       properties.timespan = { begin: begin, end: end };
33356                   }
33357                   if (timeStamp) {
33358                       properties.timestamp = nodeVal(get1(timeStamp, 'when'));
33359                   }
33360                   if (lineStyle) {
33361                       var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
33362                           color = linestyles[0],
33363                           opacity = linestyles[1],
33364                           width = parseFloat(nodeVal(get1(lineStyle, 'width')));
33365                       if (color) properties.stroke = color;
33366                       if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
33367                       if (!isNaN(width)) properties['stroke-width'] = width;
33368                   }
33369                   if (polyStyle) {
33370                       var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
33371                           pcolor = polystyles[0],
33372                           popacity = polystyles[1],
33373                           fill = nodeVal(get1(polyStyle, 'fill')),
33374                           outline = nodeVal(get1(polyStyle, 'outline'));
33375                       if (pcolor) properties.fill = pcolor;
33376                       if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
33377                       if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
33378                       if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
33379                   }
33380                   if (extendedData) {
33381                       var datas = get(extendedData, 'Data'),
33382                           simpleDatas = get(extendedData, 'SimpleData');
33383
33384                       for (i = 0; i < datas.length; i++) {
33385                           properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
33386                       }
33387                       for (i = 0; i < simpleDatas.length; i++) {
33388                           properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
33389                       }
33390                   }
33391                   if (visibility) {
33392                       properties.visibility = nodeVal(visibility);
33393                   }
33394                   if (geomsAndTimes.coordTimes.length) {
33395                       properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
33396                           geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
33397                   }
33398                   var feature = {
33399                       type: 'Feature',
33400                       geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
33401                           type: 'GeometryCollection',
33402                           geometries: geomsAndTimes.geoms
33403                       },
33404                       properties: properties
33405                   };
33406                   if (attr(root, 'id')) feature.id = attr(root, 'id');
33407                   return [feature];
33408               }
33409               return gj;
33410           },
33411           gpx: function(doc) {
33412               var i,
33413                   tracks = get(doc, 'trk'),
33414                   routes = get(doc, 'rte'),
33415                   waypoints = get(doc, 'wpt'),
33416                   // a feature collection
33417                   gj = fc(),
33418                   feature;
33419               for (i = 0; i < tracks.length; i++) {
33420                   feature = getTrack(tracks[i]);
33421                   if (feature) gj.features.push(feature);
33422               }
33423               for (i = 0; i < routes.length; i++) {
33424                   feature = getRoute(routes[i]);
33425                   if (feature) gj.features.push(feature);
33426               }
33427               for (i = 0; i < waypoints.length; i++) {
33428                   gj.features.push(getPoint(waypoints[i]));
33429               }
33430               function getPoints(node, pointname) {
33431                   var pts = get(node, pointname),
33432                       line = [],
33433                       times = [],
33434                       heartRates = [],
33435                       l = pts.length;
33436                   if (l < 2) return {};  // Invalid line in GeoJSON
33437                   for (var i = 0; i < l; i++) {
33438                       var c = coordPair(pts[i]);
33439                       line.push(c.coordinates);
33440                       if (c.time) times.push(c.time);
33441                       if (c.heartRate) heartRates.push(c.heartRate);
33442                   }
33443                   return {
33444                       line: line,
33445                       times: times,
33446                       heartRates: heartRates
33447                   };
33448               }
33449               function getTrack(node) {
33450                   var segments = get(node, 'trkseg'),
33451                       track = [],
33452                       times = [],
33453                       heartRates = [],
33454                       line;
33455                   for (var i = 0; i < segments.length; i++) {
33456                       line = getPoints(segments[i], 'trkpt');
33457                       if (line) {
33458                           if (line.line) track.push(line.line);
33459                           if (line.times && line.times.length) times.push(line.times);
33460                           if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
33461                       }
33462                   }
33463                   if (track.length === 0) return;
33464                   var properties = getProperties(node);
33465                   extend(properties, getLineStyle(get1(node, 'extensions')));
33466                   if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
33467                   if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
33468                   return {
33469                       type: 'Feature',
33470                       properties: properties,
33471                       geometry: {
33472                           type: track.length === 1 ? 'LineString' : 'MultiLineString',
33473                           coordinates: track.length === 1 ? track[0] : track
33474                       }
33475                   };
33476               }
33477               function getRoute(node) {
33478                   var line = getPoints(node, 'rtept');
33479                   if (!line.line) return;
33480                   var prop = getProperties(node);
33481                   extend(prop, getLineStyle(get1(node, 'extensions')));
33482                   var routeObj = {
33483                       type: 'Feature',
33484                       properties: prop,
33485                       geometry: {
33486                           type: 'LineString',
33487                           coordinates: line.line
33488                       }
33489                   };
33490                   return routeObj;
33491               }
33492               function getPoint(node) {
33493                   var prop = getProperties(node);
33494                   extend(prop, getMulti(node, ['sym']));
33495                   return {
33496                       type: 'Feature',
33497                       properties: prop,
33498                       geometry: {
33499                           type: 'Point',
33500                           coordinates: coordPair(node).coordinates
33501                       }
33502                   };
33503               }
33504               function getLineStyle(extensions) {
33505                   var style = {};
33506                   if (extensions) {
33507                       var lineStyle = get1(extensions, 'line');
33508                       if (lineStyle) {
33509                           var color = nodeVal(get1(lineStyle, 'color')),
33510                               opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
33511                               width = parseFloat(nodeVal(get1(lineStyle, 'width')));
33512                           if (color) style.stroke = color;
33513                           if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
33514                           // GPX width is in mm, convert to px with 96 px per inch
33515                           if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
33516                       }
33517                   }
33518                   return style;
33519               }
33520               function getProperties(node) {
33521                   var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
33522                       links = get(node, 'link');
33523                   if (links.length) prop.links = [];
33524                   for (var i = 0, link; i < links.length; i++) {
33525                       link = { href: attr(links[i], 'href') };
33526                       extend(link, getMulti(links[i], ['text', 'type']));
33527                       prop.links.push(link);
33528                   }
33529                   return prop;
33530               }
33531               return gj;
33532           }
33533       };
33534       return t;
33535   })();
33536
33537   module.exports = toGeoJSON;
33538   });
33539
33540   var _initialized = false;
33541   var _enabled = false;
33542   var _geojson;
33543
33544
33545   function svgData$$1(projection$$1, context, dispatch) {
33546       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
33547       var _showLabels = true;
33548       var detected = utilDetect();
33549       var layer = select(null);
33550       var _vtService;
33551       var _fileList;
33552       var _template;
33553       var _src;
33554
33555
33556       function init() {
33557           if (_initialized) return;  // run once
33558
33559           _geojson = {};
33560           _enabled = true;
33561
33562           function over() {
33563               event.stopPropagation();
33564               event.preventDefault();
33565               event.dataTransfer.dropEffect = 'copy';
33566           }
33567
33568           select('body')
33569               .attr('dropzone', 'copy')
33570               .on('drop.svgData', function() {
33571                   event.stopPropagation();
33572                   event.preventDefault();
33573                   if (!detected.filedrop) return;
33574                   drawData.fileList(event.dataTransfer.files);
33575               })
33576               .on('dragenter.svgData', over)
33577               .on('dragexit.svgData', over)
33578               .on('dragover.svgData', over);
33579
33580           _initialized = true;
33581       }
33582
33583
33584       function getService() {
33585           if (services.vectorTile && !_vtService) {
33586               _vtService = services.vectorTile;
33587               _vtService.event.on('loadedData', throttledRedraw);
33588           } else if (!services.vectorTile && _vtService) {
33589               _vtService = null;
33590           }
33591
33592           return _vtService;
33593       }
33594
33595
33596       function showLayer() {
33597           layerOn();
33598
33599           layer
33600               .style('opacity', 0)
33601               .transition()
33602               .duration(250)
33603               .style('opacity', 1)
33604               .on('end', function () { dispatch.call('change'); });
33605       }
33606
33607
33608       function hideLayer() {
33609           throttledRedraw.cancel();
33610
33611           layer
33612               .transition()
33613               .duration(250)
33614               .style('opacity', 0)
33615               .on('end', layerOff);
33616       }
33617
33618
33619       function layerOn() {
33620           layer.style('display', 'block');
33621       }
33622
33623
33624       function layerOff() {
33625           layer.selectAll('.viewfield-group').remove();
33626           layer.style('display', 'none');
33627       }
33628
33629
33630       // ensure that all geojson features in a collection have IDs
33631       function ensureIDs(gj) {
33632           if (!gj) return null;
33633
33634           if (gj.type === 'FeatureCollection') {
33635               for (var i = 0; i < gj.features.length; i++) {
33636                   ensureFeatureID(gj.features[i]);
33637               }
33638           } else {
33639               ensureFeatureID(gj);
33640           }
33641           return gj;
33642       }
33643
33644
33645       // ensure that each single Feature object has a unique ID
33646       function ensureFeatureID(feature) {
33647           if (!feature) return;
33648           feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
33649           return feature;
33650       }
33651
33652
33653       // Prefer an array of Features instead of a FeatureCollection
33654       function getFeatures(gj) {
33655           if (!gj) return [];
33656
33657           if (gj.type === 'FeatureCollection') {
33658               return gj.features;
33659           } else {
33660               return [gj];
33661           }
33662       }
33663
33664
33665       function featureKey(d) {
33666           return d.__featurehash__;
33667       }
33668
33669
33670       function isPolygon(d) {
33671           return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
33672       }
33673
33674
33675       function clipPathID(d) {
33676           return 'data-' + d.__featurehash__ + '-clippath';
33677       }
33678
33679
33680       function featureClasses(d) {
33681           return [
33682               'data' + d.__featurehash__,
33683               d.geometry.type,
33684               isPolygon(d) ? 'area' : '',
33685               d.__layerID__ || ''
33686           ].filter(Boolean).join(' ');
33687       }
33688
33689
33690       function drawData(selection$$1) {
33691           var vtService = getService();
33692           var getPath = svgPath(projection$$1).geojson;
33693           var getAreaPath = svgPath(projection$$1, null, true).geojson;
33694           var hasData = drawData.hasData();
33695
33696           layer = selection$$1.selectAll('.layer-mapdata')
33697               .data(_enabled && hasData ? [0] : []);
33698
33699           layer.exit()
33700               .remove();
33701
33702           layer = layer.enter()
33703               .append('g')
33704               .attr('class', 'layer-mapdata')
33705               .merge(layer);
33706
33707           var surface = context.surface();
33708           if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
33709
33710
33711           // Gather data
33712           var geoData, polygonData;
33713           if (_template && vtService) {   // fetch data from vector tile service
33714               var sourceID = _template;
33715               vtService.loadTiles(sourceID, _template, projection$$1);
33716               geoData = vtService.data(sourceID, projection$$1);
33717           } else {
33718               geoData = getFeatures(_geojson);
33719           }
33720           geoData = geoData.filter(getPath);
33721           polygonData = geoData.filter(isPolygon);
33722
33723
33724           // Draw clip paths for polygons
33725           var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
33726              .data(polygonData, featureKey);
33727
33728           clipPaths.exit()
33729              .remove();
33730
33731           var clipPathsEnter = clipPaths.enter()
33732              .append('clipPath')
33733              .attr('class', 'clipPath-data')
33734              .attr('id', clipPathID);
33735
33736           clipPathsEnter
33737              .append('path');
33738
33739           clipPaths.merge(clipPathsEnter)
33740              .selectAll('path')
33741              .attr('d', getAreaPath);
33742
33743
33744           // Draw fill, shadow, stroke layers
33745           var datagroups = layer
33746               .selectAll('g.datagroup')
33747               .data(['fill', 'shadow', 'stroke']);
33748
33749           datagroups = datagroups.enter()
33750               .append('g')
33751               .attr('class', function(d) { return 'datagroup datagroup-' + d; })
33752               .merge(datagroups);
33753
33754
33755           // Draw paths
33756           var pathData = {
33757               fill: polygonData,
33758               shadow: geoData,
33759               stroke: geoData
33760           };
33761
33762           var paths = datagroups
33763               .selectAll('path')
33764               .data(function(layer) { return pathData[layer]; }, featureKey);
33765
33766           // exit
33767           paths.exit()
33768               .remove();
33769
33770           // enter/update
33771           paths = paths.enter()
33772               .append('path')
33773               .attr('class', function(d) {
33774                   var datagroup = this.parentNode.__data__;
33775                   return 'pathdata ' + datagroup + ' ' + featureClasses(d);
33776               })
33777               .attr('clip-path', function(d) {
33778                   var datagroup = this.parentNode.__data__;
33779                   return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
33780               })
33781               .merge(paths)
33782               .attr('d', function(d) {
33783                   var datagroup = this.parentNode.__data__;
33784                   return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
33785               });
33786
33787
33788           // Draw labels
33789           layer
33790               .call(drawLabels, 'label-halo', geoData)
33791               .call(drawLabels, 'label', geoData);
33792
33793
33794           function drawLabels(selection$$1, textClass, data) {
33795               var labelPath = d3_geoPath(projection$$1);
33796               var labelData = data.filter(function(d) {
33797                   return _showLabels && d.properties && (d.properties.desc || d.properties.name);
33798               });
33799
33800               var labels = selection$$1.selectAll('text.' + textClass)
33801                   .data(labelData, featureKey);
33802
33803               // exit
33804               labels.exit()
33805                   .remove();
33806
33807               // enter/update
33808               labels = labels.enter()
33809                   .append('text')
33810                   .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
33811                   .merge(labels)
33812                   .text(function(d) {
33813                       return d.properties.desc || d.properties.name;
33814                   })
33815                   .attr('x', function(d) {
33816                       var centroid = labelPath.centroid(d);
33817                       return centroid[0] + 11;
33818                   })
33819                   .attr('y', function(d) {
33820                       var centroid = labelPath.centroid(d);
33821                       return centroid[1];
33822                   });
33823           }
33824       }
33825
33826
33827       function getExtension(fileName) {
33828           if (!fileName) return;
33829
33830           var re = /\.(gpx|kml|(geo)?json)$/i;
33831           var match = fileName.match(re);
33832           return match && match.length && match[0];
33833       }
33834
33835
33836       function xmlToDom(textdata) {
33837           return (new DOMParser()).parseFromString(textdata, 'text/xml');
33838       }
33839
33840
33841       drawData.setFile = function(extension, data) {
33842           _template = null;
33843           _fileList = null;
33844           _geojson = null;
33845           _src = null;
33846
33847           var gj;
33848           switch (extension) {
33849               case '.gpx':
33850                   gj = togeojson.gpx(xmlToDom(data));
33851                   break;
33852               case '.kml':
33853                   gj = togeojson.kml(xmlToDom(data));
33854                   break;
33855               case '.geojson':
33856               case '.json':
33857                   gj = JSON.parse(data);
33858                   break;
33859           }
33860
33861           if (!isEmpty(gj)) {
33862               _geojson = ensureIDs(gj);
33863               _src = extension + ' data file';
33864               this.fitZoom();
33865           }
33866
33867           dispatch.call('change');
33868           return this;
33869       };
33870
33871
33872       drawData.showLabels = function(val) {
33873           if (!arguments.length) return _showLabels;
33874
33875           _showLabels = val;
33876           return this;
33877       };
33878
33879
33880       drawData.enabled = function(val) {
33881           if (!arguments.length) return _enabled;
33882
33883           _enabled = val;
33884           if (_enabled) {
33885               showLayer();
33886           } else {
33887               hideLayer();
33888           }
33889
33890           dispatch.call('change');
33891           return this;
33892       };
33893
33894
33895       drawData.hasData = function() {
33896           return !!(_template || !isEmpty(_geojson));
33897       };
33898
33899
33900       drawData.template = function(val, src) {
33901           if (!arguments.length) return _template;
33902
33903           // test source against OSM imagery blacklists..
33904           var osm = context.connection();
33905           if (osm) {
33906               var blacklists = osm.imageryBlacklists();
33907               var fail = false;
33908               var tested = 0;
33909               var regex;
33910
33911               for (var i = 0; i < blacklists.length; i++) {
33912                   try {
33913                       regex = new RegExp(blacklists[i]);
33914                       fail = regex.test(val);
33915                       tested++;
33916                       if (fail) break;
33917                   } catch (e) {
33918                       /* noop */
33919                   }
33920               }
33921
33922               // ensure at least one test was run.
33923               if (!tested) {
33924                   regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
33925                   fail = regex.test(val);
33926               }
33927           }
33928
33929           _template = val;
33930           _fileList = null;
33931           _geojson = null;
33932
33933           // strip off the querystring/hash from the template,
33934           // it often includes the access token
33935           _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
33936
33937           dispatch.call('change');
33938           return this;
33939       };
33940
33941
33942       drawData.geojson = function(gj, src) {
33943           if (!arguments.length) return _geojson;
33944
33945           _template = null;
33946           _fileList = null;
33947           _geojson = null;
33948           _src = null;
33949
33950           if (!isEmpty(gj)) {
33951               _geojson = ensureIDs(gj);
33952               _src = src || 'unknown.geojson';
33953           }
33954
33955           dispatch.call('change');
33956           return this;
33957       };
33958
33959
33960       drawData.fileList = function(fileList) {
33961           if (!arguments.length) return _fileList;
33962
33963           _template = null;
33964           _fileList = fileList;
33965           _geojson = null;
33966           _src = null;
33967
33968           if (!fileList || !fileList.length) return this;
33969           var f = fileList[0];
33970           var extension = getExtension(f.name);
33971           var reader = new FileReader();
33972           reader.onload = (function() {
33973               return function(e) {
33974                   drawData.setFile(extension, e.target.result);
33975               };
33976           })(f);
33977
33978           reader.readAsText(f);
33979
33980           return this;
33981       };
33982
33983
33984       drawData.url = function(url, defaultExtension) {
33985           _template = null;
33986           _fileList = null;
33987           _geojson = null;
33988           _src = null;
33989
33990           // strip off any querystring/hash from the url before checking extension
33991           var testUrl = url.split(/[?#]/)[0];
33992           var extension = getExtension(testUrl) || defaultExtension;
33993           if (extension) {
33994               _template = null;
33995               d3_text(url, function(err, data) {
33996                   if (err) return;
33997                   drawData.setFile(extension, data);
33998               });
33999           } else {
34000               drawData.template(url);
34001           }
34002
34003           return this;
34004       };
34005
34006
34007       drawData.getSrc = function() {
34008           return _src || '';
34009       };
34010
34011
34012       drawData.fitZoom = function() {
34013           var features = getFeatures(_geojson);
34014           if (!features.length) return;
34015
34016           var map = context.map();
34017           var viewport = map.trimmedExtent().polygon();
34018           var coords = reduce(features, function(coords, feature) {
34019               var c = feature.geometry.coordinates;
34020
34021               /* eslint-disable no-fallthrough */
34022               switch (feature.geometry.type) {
34023                   case 'Point':
34024                       c = [c];
34025                   case 'MultiPoint':
34026                   case 'LineString':
34027                       break;
34028
34029                   case 'MultiPolygon':
34030                       c = flatten(c);
34031                   case 'Polygon':
34032                   case 'MultiLineString':
34033                       c = flatten(c);
34034                       break;
34035               }
34036               /* eslint-enable no-fallthrough */
34037
34038               return union(coords, c);
34039           }, []);
34040
34041           if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
34042               var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
34043               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
34044           }
34045
34046           return this;
34047       };
34048
34049
34050       init();
34051       return drawData;
34052   }
34053
34054   function svgDebug$$1(projection, context) {
34055
34056       function drawDebug(selection$$1) {
34057           var showsTile = context.getDebug('tile');
34058           var showsCollision = context.getDebug('collision');
34059           var showsImagery = context.getDebug('imagery');
34060           var showsCommunity = context.getDebug('community');
34061           var showsImperial = context.getDebug('imperial');
34062           var showsDriveLeft = context.getDebug('driveLeft');
34063           var showsTouchTargets = context.getDebug('target');
34064
34065           var debugData = [];
34066           if (showsTile) {
34067               debugData.push({ class: 'red', label: 'tile' });
34068           }
34069           if (showsCollision) {
34070               debugData.push({ class: 'yellow', label: 'collision' });
34071           }
34072           if (showsImagery) {
34073               debugData.push({ class: 'orange', label: 'imagery' });
34074           }
34075           if (showsCommunity) {
34076               debugData.push({ class: 'blue', label: 'community' });
34077           }
34078           if (showsImperial) {
34079               debugData.push({ class: 'cyan', label: 'imperial' });
34080           }
34081           if (showsDriveLeft) {
34082               debugData.push({ class: 'green', label: 'driveLeft' });
34083           }
34084           if (showsTouchTargets) {
34085               debugData.push({ class: 'pink', label: 'touchTargets' });
34086           }
34087
34088
34089           var legend = select('#content')
34090               .selectAll('.debug-legend')
34091               .data(debugData.length ? [0] : []);
34092
34093           legend.exit()
34094               .remove();
34095
34096           legend = legend.enter()
34097               .append('div')
34098               .attr('class', 'fillD debug-legend')
34099               .merge(legend);
34100
34101
34102           var legendItems = legend.selectAll('.debug-legend-item')
34103               .data(debugData, function(d) { return d.label; });
34104
34105           legendItems.exit()
34106               .remove();
34107
34108           legendItems.enter()
34109               .append('span')
34110               .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
34111               .text(function(d) { return d.label; });
34112
34113
34114           var layer = selection$$1.selectAll('.layer-debug')
34115               .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
34116
34117           layer.exit()
34118               .remove();
34119
34120           layer = layer.enter()
34121               .append('g')
34122               .attr('class', 'layer-debug')
34123               .merge(layer);
34124
34125
34126           var extent = context.map().extent();
34127           var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
34128           var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
34129
34130           var imagery = layer.selectAll('path.debug-imagery')
34131               .data(features);
34132
34133           imagery.exit()
34134               .remove();
34135
34136           imagery.enter()
34137               .append('path')
34138               .attr('class', 'debug-imagery debug orange');
34139
34140
34141           var community = layer.selectAll('path.debug-community')
34142               .data(showsCommunity ? values$1(data.community.features) : []);
34143
34144           community.exit()
34145               .remove();
34146
34147           community.enter()
34148               .append('path')
34149               .attr('class', 'debug-community debug blue');
34150
34151
34152           var imperial = layer
34153               .selectAll('path.debug-imperial')
34154               .data(showsImperial ? [dataImperial] : []);
34155
34156           imperial.exit()
34157               .remove();
34158
34159           imperial.enter()
34160               .append('path')
34161               .attr('class', 'debug-imperial debug cyan');
34162
34163
34164           var driveLeft = layer
34165               .selectAll('path.debug-drive-left')
34166               .data(showsDriveLeft ? [dataDriveLeft] : []);
34167
34168           driveLeft.exit()
34169               .remove();
34170
34171           driveLeft.enter()
34172               .append('path')
34173               .attr('class', 'debug-drive-left debug green');
34174
34175
34176           // update
34177           layer.selectAll('path')
34178               .attr('d', svgPath(projection).geojson);
34179       }
34180
34181
34182       // This looks strange because `enabled` methods on other layers are
34183       // chainable getter/setters, and this one is just a getter.
34184       drawDebug.enabled = function() {
34185           if (!arguments.length) {
34186               return context.getDebug('tile') ||
34187                   context.getDebug('collision') ||
34188                   context.getDebug('imagery') ||
34189                   context.getDebug('imperial') ||
34190                   context.getDebug('driveLeft') ||
34191                   context.getDebug('target');
34192           } else {
34193               return this;
34194           }
34195       };
34196
34197
34198       return drawDebug;
34199   }
34200
34201   /*
34202       A standalone SVG element that contains only a `defs` sub-element. To be
34203       used once globally, since defs IDs must be unique within a document.
34204   */
34205   function svgDefs(context) {
34206
34207       function drawDefs(selection$$1) {
34208           var defs = selection$$1.append('defs');
34209
34210           // add markers
34211           defs
34212               .append('marker')
34213               .attr('id', 'oneway-marker')
34214               .attr('viewBox', '0 0 10 5')
34215               .attr('refX', 2.5)
34216               .attr('refY', 2.5)
34217               .attr('markerWidth', 2)
34218               .attr('markerHeight', 2)
34219               .attr('markerUnits', 'strokeWidth')
34220               .attr('orient', 'auto')
34221               .append('path')
34222               .attr('class', 'oneway-marker-path')
34223               .attr('d', 'M 5,3 L 0,3 L 0,2 L 5,2 L 5,0 L 10,2.5 L 5,5 z')
34224               .attr('stroke', 'none')
34225               .attr('fill', '#000')
34226               .attr('opacity', '0.75');
34227
34228           defs
34229               .append('marker')
34230               .attr('id', 'viewfield-marker')
34231               .attr('viewBox', '0 0 16 16')
34232               .attr('refX', 8)
34233               .attr('refY', 16)
34234               .attr('markerWidth', 4)
34235               .attr('markerHeight', 4)
34236               .attr('markerUnits', 'strokeWidth')
34237               .attr('orient', 'auto')
34238               .append('path')
34239               .attr('class', 'viewfield-marker-path')
34240               .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
34241               .attr('fill', '#333')
34242               .attr('fill-opacity', '0.75')
34243               .attr('stroke', '#fff')
34244               .attr('stroke-width', '0.5px')
34245               .attr('stroke-opacity', '0.75');
34246
34247           defs
34248               .append('marker')
34249               .attr('id', 'viewfield-marker-wireframe')
34250               .attr('viewBox', '0 0 16 16')
34251               .attr('refX', 8)
34252               .attr('refY', 16)
34253               .attr('markerWidth', 4)
34254               .attr('markerHeight', 4)
34255               .attr('markerUnits', 'strokeWidth')
34256               .attr('orient', 'auto')
34257               .append('path')
34258               .attr('class', 'viewfield-marker-path')
34259               .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
34260               .attr('fill', 'none')
34261               .attr('stroke', '#fff')
34262               .attr('stroke-width', '0.5px')
34263               .attr('stroke-opacity', '0.75');
34264
34265           // add patterns
34266           var patterns = defs.selectAll('pattern')
34267               .data([
34268                   // pattern name, pattern image name
34269                   ['wetland', 'wetland'],
34270                   ['construction', 'construction'],
34271                   ['cemetery', 'cemetery'],
34272                   ['orchard', 'orchard'],
34273                   ['farmland', 'farmland'],
34274                   ['beach', 'dots'],
34275                   ['scrub', 'dots'],
34276                   ['meadow', 'dots']
34277               ])
34278               .enter()
34279               .append('pattern')
34280               .attr('id', function (d) { return 'pattern-' + d[0]; })
34281               .attr('width', 32)
34282               .attr('height', 32)
34283               .attr('patternUnits', 'userSpaceOnUse');
34284
34285           patterns
34286               .append('rect')
34287               .attr('x', 0)
34288               .attr('y', 0)
34289               .attr('width', 32)
34290               .attr('height', 32)
34291               .attr('class', function (d) { return 'pattern-color-' + d[0]; });
34292
34293           patterns
34294               .append('image')
34295               .attr('x', 0)
34296               .attr('y', 0)
34297               .attr('width', 32)
34298               .attr('height', 32)
34299               .attr('xlink:href', function (d) {
34300                   return context.imagePath('pattern/' + d[1] + '.png');
34301               });
34302
34303           // add clip paths
34304           defs.selectAll('clipPath')
34305               .data([12, 18, 20, 32, 45])
34306               .enter()
34307               .append('clipPath')
34308               .attr('id', function (d) { return 'clip-square-' + d; })
34309               .append('rect')
34310               .attr('x', 0)
34311               .attr('y', 0)
34312               .attr('width', function (d) { return d; })
34313               .attr('height', function (d) { return d; });
34314
34315           // add symbol spritesheets
34316           defs
34317               .call(drawDefs.addSprites, [
34318                   'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'
34319               ]);
34320       }
34321
34322
34323       drawDefs.addSprites = function(selection$$1, ids) {
34324           var spritesheets = selection$$1.selectAll('.spritesheet');
34325           var currData = spritesheets.data();
34326           var data = uniq(currData.concat(ids));
34327
34328           spritesheets
34329               .data(data)
34330               .enter()
34331               .append('g')
34332               .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
34333               .each(function(d) {
34334                   var url = context.imagePath(d + '.svg');
34335                   var node = select(this).node();
34336                   request(url)
34337                       .mimeType('image/svg+xml')
34338                       .response(function(xhr) { return xhr.responseXML; })
34339                       .get(function(err, svg) {
34340                           if (err) return;
34341                           node.appendChild(
34342                               select(svg.documentElement).attr('id', d).node()
34343                           );
34344                       });
34345               });
34346       };
34347
34348
34349       return drawDefs;
34350   }
34351
34352   function svgIcon(name, svgklass, useklass) {
34353       return function drawIcon(selection) {
34354           selection.selectAll('svg')
34355               .data([0])
34356               .enter()
34357               .append('svg')
34358               .attr('class', 'icon ' + (svgklass || ''))
34359               .append('use')
34360               .attr('xlink:href', name)
34361               .attr('class', useklass);
34362       };
34363   }
34364
34365   function svgLabels(projection$$1, context) {
34366       var path = d3_geoPath(projection$$1);
34367       var detected = utilDetect();
34368       var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
34369       var _rdrawn = rbush_1();
34370       var _rskipped = rbush_1();
34371       var _textWidthCache = {};
34372       var _entitybboxes = {};
34373
34374       // Listed from highest to lowest priority
34375       var labelStack = [
34376           ['line', 'aeroway', '*', 12],
34377           ['line', 'highway', 'motorway', 12],
34378           ['line', 'highway', 'trunk', 12],
34379           ['line', 'highway', 'primary', 12],
34380           ['line', 'highway', 'secondary', 12],
34381           ['line', 'highway', 'tertiary', 12],
34382           ['line', 'highway', '*', 12],
34383           ['line', 'railway', '*', 12],
34384           ['line', 'waterway', '*', 12],
34385           ['area', 'aeroway', '*', 12],
34386           ['area', 'amenity', '*', 12],
34387           ['area', 'building', '*', 12],
34388           ['area', 'historic', '*', 12],
34389           ['area', 'leisure', '*', 12],
34390           ['area', 'man_made', '*', 12],
34391           ['area', 'natural', '*', 12],
34392           ['area', 'shop', '*', 12],
34393           ['area', 'tourism', '*', 12],
34394           ['area', 'camp_site', '*', 12],
34395           ['point', 'aeroway', '*', 10],
34396           ['point', 'amenity', '*', 10],
34397           ['point', 'building', '*', 10],
34398           ['point', 'historic', '*', 10],
34399           ['point', 'leisure', '*', 10],
34400           ['point', 'man_made', '*', 10],
34401           ['point', 'natural', '*', 10],
34402           ['point', 'shop', '*', 10],
34403           ['point', 'tourism', '*', 10],
34404           ['point', 'camp_site', '*', 10],
34405           ['line', 'name', '*', 12],
34406           ['area', 'name', '*', 12],
34407           ['point', 'name', '*', 10]
34408       ];
34409
34410
34411       function blacklisted(preset) {
34412           var noIcons = ['building', 'landuse', 'natural'];
34413           return some(noIcons, function(s) {
34414               return preset.id.indexOf(s) >= 0;
34415           });
34416       }
34417
34418
34419       function get(array, prop) {
34420           return function(d, i) { return array[i][prop]; };
34421       }
34422
34423
34424       function textWidth(text, size, elem) {
34425           var c = _textWidthCache[size];
34426           if (!c) c = _textWidthCache[size] = {};
34427
34428           if (c[text]) {
34429               return c[text];
34430
34431           } else if (elem) {
34432               c[text] = elem.getComputedTextLength();
34433               return c[text];
34434
34435           } else {
34436               var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
34437               if (str === null) {
34438                   return size / 3 * 2 * text.length;
34439               } else {
34440                   return size / 3 * (2 * text.length + str.length);
34441               }
34442           }
34443       }
34444
34445
34446       function drawLinePaths(selection, entities, filter, classes, labels) {
34447           var paths = selection.selectAll('path')
34448               .filter(filter)
34449               .data(entities, osmEntity$$1.key);
34450
34451           // exit
34452           paths.exit()
34453               .remove();
34454
34455           // enter/update
34456           paths.enter()
34457               .append('path')
34458               .style('stroke-width', get(labels, 'font-size'))
34459               .attr('id', function(d) { return 'labelpath-' + d.id; })
34460               .attr('class', classes)
34461               .merge(paths)
34462               .attr('d', get(labels, 'lineString'));
34463       }
34464
34465
34466       function drawLineLabels(selection, entities, filter, classes, labels) {
34467           var texts = selection.selectAll('text.' + classes)
34468               .filter(filter)
34469               .data(entities, osmEntity$$1.key);
34470
34471           // exit
34472           texts.exit()
34473               .remove();
34474
34475           // enter
34476           texts.enter()
34477               .append('text')
34478               .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
34479               .attr('dy', baselineHack ? '0.35em' : null)
34480               .append('textPath')
34481               .attr('class', 'textpath');
34482
34483           // update
34484           selection.selectAll('text.' + classes).selectAll('.textpath')
34485               .filter(filter)
34486               .data(entities, osmEntity$$1.key)
34487               .attr('startOffset', '50%')
34488               .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
34489               .text(utilDisplayNameForPath);
34490       }
34491
34492
34493       function drawPointLabels(selection, entities, filter, classes, labels) {
34494           var texts = selection.selectAll('text.' + classes)
34495               .filter(filter)
34496               .data(entities, osmEntity$$1.key);
34497
34498           // exit
34499           texts.exit()
34500               .remove();
34501
34502           // enter/update
34503           texts.enter()
34504               .append('text')
34505               .attr('class', function(d, i) {
34506                   return classes + ' ' + labels[i].classes + ' ' + d.id;
34507               })
34508               .merge(texts)
34509               .attr('x', get(labels, 'x'))
34510               .attr('y', get(labels, 'y'))
34511               .style('text-anchor', get(labels, 'textAnchor'))
34512               .text(utilDisplayName)
34513               .each(function(d, i) {
34514                   textWidth(utilDisplayName(d), labels[i].height, this);
34515               });
34516       }
34517
34518
34519       function drawAreaLabels(selection, entities, filter, classes, labels) {
34520           entities = entities.filter(hasText);
34521           labels = labels.filter(hasText);
34522           drawPointLabels(selection, entities, filter, classes, labels);
34523
34524           function hasText(d, i) {
34525               return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
34526           }
34527       }
34528
34529
34530       function drawAreaIcons(selection, entities, filter, classes, labels) {
34531           var icons = selection.selectAll('use.' + classes)
34532               .filter(filter)
34533               .data(entities, osmEntity$$1.key);
34534
34535           // exit
34536           icons.exit()
34537               .remove();
34538
34539           // enter/update
34540           icons.enter()
34541               .append('use')
34542               .attr('class', 'icon ' + classes)
34543               .attr('width', '17px')
34544               .attr('height', '17px')
34545               .merge(icons)
34546               .attr('transform', get(labels, 'transform'))
34547               .attr('xlink:href', function(d) {
34548                   var preset = context.presets().match(d, context.graph());
34549                   var picon = preset && preset.icon;
34550
34551                   if (!picon) {
34552                       return '';
34553                   } else {
34554                       var isMaki = /^maki-/.test(picon);
34555                       return '#' + picon + (isMaki ? '-15' : '');
34556                   }
34557               });
34558       }
34559
34560
34561       function drawCollisionBoxes(selection, rtree, which) {
34562           var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
34563
34564           var gj = [];
34565           if (context.getDebug('collision')) {
34566               gj = rtree.all().map(function(d) {
34567                   return { type: 'Polygon', coordinates: [[
34568                       [d.minX, d.minY],
34569                       [d.maxX, d.minY],
34570                       [d.maxX, d.maxY],
34571                       [d.minX, d.maxY],
34572                       [d.minX, d.minY]
34573                   ]]};
34574               });
34575           }
34576
34577           var boxes = selection.selectAll('.' + which)
34578               .data(gj);
34579
34580           // exit
34581           boxes.exit()
34582               .remove();
34583
34584           // enter/update
34585           boxes.enter()
34586               .append('path')
34587               .attr('class', classes)
34588               .merge(boxes)
34589               .attr('d', d3_geoPath());
34590       }
34591
34592
34593       function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
34594           var wireframe = context.surface().classed('fill-wireframe');
34595           var zoom = geoScaleToZoom(projection$$1.scale());
34596
34597           var labelable = [];
34598           var renderNodeAs = {};
34599           var i, j, k, entity, geometry;
34600
34601           for (i = 0; i < labelStack.length; i++) {
34602               labelable.push([]);
34603           }
34604
34605           if (fullRedraw) {
34606               _rdrawn.clear();
34607               _rskipped.clear();
34608               _entitybboxes = {};
34609
34610           } else {
34611               for (i = 0; i < entities.length; i++) {
34612                   entity = entities[i];
34613                   var toRemove = []
34614                       .concat(_entitybboxes[entity.id] || [])
34615                       .concat(_entitybboxes[entity.id + 'I'] || []);
34616
34617                   for (j = 0; j < toRemove.length; j++) {
34618                       _rdrawn.remove(toRemove[j]);
34619                       _rskipped.remove(toRemove[j]);
34620                   }
34621               }
34622           }
34623
34624           // Loop through all the entities to do some preprocessing
34625           for (i = 0; i < entities.length; i++) {
34626               entity = entities[i];
34627               geometry = entity.geometry(graph);
34628
34629               // Insert collision boxes around interesting points/vertices
34630               if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
34631                   var hasDirections = entity.directions(graph, projection$$1).length;
34632                   var markerPadding;
34633
34634                   if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
34635                       renderNodeAs[entity.id] = 'point';
34636                       markerPadding = 20;   // extra y for marker height
34637                   } else {
34638                       renderNodeAs[entity.id] = 'vertex';
34639                       markerPadding = 0;
34640                   }
34641
34642                   var coord = projection$$1(entity.loc);
34643                   var nodePadding = 10;
34644                   var bbox = {
34645                       minX: coord[0] - nodePadding,
34646                       minY: coord[1] - nodePadding - markerPadding,
34647                       maxX: coord[0] + nodePadding,
34648                       maxY: coord[1] + nodePadding
34649                   };
34650
34651                   doInsert(bbox, entity.id + 'P');
34652               }
34653
34654               // From here on, treat vertices like points
34655               if (geometry === 'vertex') {
34656                   geometry = 'point';
34657               }
34658
34659               // Determine which entities are label-able
34660               var preset = geometry === 'area' && context.presets().match(entity, graph);
34661               var icon = preset && !blacklisted(preset) && preset.icon;
34662
34663               if (!icon && !utilDisplayName(entity))
34664                   continue;
34665
34666               for (k = 0; k < labelStack.length; k++) {
34667                   var matchGeom = labelStack[k][0];
34668                   var matchKey = labelStack[k][1];
34669                   var matchVal = labelStack[k][2];
34670                   var hasVal = entity.tags[matchKey];
34671
34672                   if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
34673                       labelable[k].push(entity);
34674                       break;
34675                   }
34676               }
34677           }
34678
34679           var positions = {
34680               point: [],
34681               line: [],
34682               area: []
34683           };
34684
34685           var labelled = {
34686               point: [],
34687               line: [],
34688               area: []
34689           };
34690
34691           // Try and find a valid label for labellable entities
34692           for (k = 0; k < labelable.length; k++) {
34693               var fontSize = labelStack[k][3];
34694
34695               for (i = 0; i < labelable[k].length; i++) {
34696                   entity = labelable[k][i];
34697                   geometry = entity.geometry(graph);
34698
34699                   var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
34700                   var name = getName(entity);
34701                   var width = name && textWidth(name, fontSize);
34702                   var p = null;
34703
34704                   if (geometry === 'point' || geometry === 'vertex') {
34705                       // no point or vertex labels in wireframe mode
34706                       // no vertex labels at low zooms (vertices have no icons)
34707                       if (wireframe) continue;
34708                       var renderAs = renderNodeAs[entity.id];
34709                       if (renderAs === 'vertex' && zoom < 17) continue;
34710
34711                       p = getPointLabel(entity, width, fontSize, renderAs);
34712
34713                   } else if (geometry === 'line') {
34714                       p = getLineLabel(entity, width, fontSize);
34715
34716                   } else if (geometry === 'area') {
34717                       p = getAreaLabel(entity, width, fontSize);
34718                   }
34719
34720                   if (p) {
34721                       if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
34722                       p.classes = geometry + ' tag-' + labelStack[k][1];
34723                       positions[geometry].push(p);
34724                       labelled[geometry].push(entity);
34725                   }
34726               }
34727           }
34728
34729
34730           function isInterestingVertex(entity) {
34731               var selectedIDs = context.selectedIDs();
34732
34733               return entity.hasInterestingTags() ||
34734                   entity.isEndpoint(graph) ||
34735                   entity.isConnected(graph) ||
34736                   selectedIDs.indexOf(entity.id) !== -1 ||
34737                   some(graph.parentWays(entity), function(parent) {
34738                       return selectedIDs.indexOf(parent.id) !== -1;
34739                   });
34740           }
34741
34742
34743           function getPointLabel(entity, width, height, geometry) {
34744               var y = (geometry === 'point' ? -12 : 0);
34745               var pointOffsets = {
34746                   ltr: [15, y, 'start'],
34747                   rtl: [-15, y, 'end']
34748               };
34749
34750               var coord = projection$$1(entity.loc);
34751               var textPadding = 2;
34752               var offset = pointOffsets[textDirection];
34753               var p = {
34754                   height: height,
34755                   width: width,
34756                   x: coord[0] + offset[0],
34757                   y: coord[1] + offset[1],
34758                   textAnchor: offset[2]
34759               };
34760
34761               // insert a collision box for the text label..
34762               var bbox;
34763               if (textDirection === 'rtl') {
34764                   bbox = {
34765                       minX: p.x - width - textPadding,
34766                       minY: p.y - (height / 2) - textPadding,
34767                       maxX: p.x + textPadding,
34768                       maxY: p.y + (height / 2) + textPadding
34769                   };
34770               } else {
34771                   bbox = {
34772                       minX: p.x - textPadding,
34773                       minY: p.y - (height / 2) - textPadding,
34774                       maxX: p.x + width + textPadding,
34775                       maxY: p.y + (height / 2) + textPadding
34776                   };
34777               }
34778
34779               if (tryInsert([bbox], entity.id, true)) {
34780                   return p;
34781               }
34782           }
34783
34784
34785           function getLineLabel(entity, width, height) {
34786               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
34787               var points = map$3(graph.childNodes(entity), 'loc').map(projection$$1);
34788               var length = geoPathLength(points);
34789
34790               if (length < width + 20) return;
34791
34792               // todo: properly clip points to viewport
34793
34794               // % along the line to attempt to place the label
34795               var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
34796                                  25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
34797               var padding = 3;
34798
34799               for (var i = 0; i < lineOffsets.length; i++) {
34800                   var offset = lineOffsets[i];
34801                   var middle = offset / 100 * length;
34802                   var start = middle - width / 2;
34803
34804                   if (start < 0 || start + width > length) continue;
34805
34806                   // generate subpath and ignore paths that are invalid or don't cross viewport.
34807                   var sub = subpath(points, start, start + width);
34808                   if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
34809                       continue;
34810                   }
34811
34812                   var isReverse = reverse(sub);
34813                   if (isReverse) {
34814                       sub = sub.reverse();
34815                   }
34816
34817                   var bboxes = [];
34818                   var boxsize = (height + 2) / 2;
34819
34820                   for (var j = 0; j < sub.length - 1; j++) {
34821                       var a = sub[j];
34822                       var b = sub[j + 1];
34823
34824                       // split up the text into small collision boxes
34825                       var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
34826
34827                       for (var box = 0; box < num; box++) {
34828                           var p = geoVecInterp(a, b, box / num);
34829                           var x0 = p[0] - boxsize - padding;
34830                           var y0 = p[1] - boxsize - padding;
34831                           var x1 = p[0] + boxsize + padding;
34832                           var y1 = p[1] + boxsize + padding;
34833
34834                           bboxes.push({
34835                               minX: Math.min(x0, x1),
34836                               minY: Math.min(y0, y1),
34837                               maxX: Math.max(x0, x1),
34838                               maxY: Math.max(y0, y1)
34839                           });
34840                       }
34841                   }
34842
34843                   if (tryInsert(bboxes, entity.id, false)) {   // accept this one
34844                       return {
34845                           'font-size': height + 2,
34846                           lineString: lineString(sub),
34847                           startOffset: offset + '%'
34848                       };
34849                   }
34850               }
34851
34852               function reverse(p) {
34853                   var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
34854                   return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
34855               }
34856
34857               function lineString(points) {
34858                   return 'M' + points.join('L');
34859               }
34860
34861               function subpath(points, from, to) {
34862                   var sofar = 0;
34863                   var start, end, i0, i1;
34864
34865                   for (var i = 0; i < points.length - 1; i++) {
34866                       var a = points[i];
34867                       var b = points[i + 1];
34868                       var current = geoVecLength(a, b);
34869                       var portion;
34870                       if (!start && sofar + current >= from) {
34871                           portion = (from - sofar) / current;
34872                           start = [
34873                               a[0] + portion * (b[0] - a[0]),
34874                               a[1] + portion * (b[1] - a[1])
34875                           ];
34876                           i0 = i + 1;
34877                       }
34878                       if (!end && sofar + current >= to) {
34879                           portion = (to - sofar) / current;
34880                           end = [
34881                               a[0] + portion * (b[0] - a[0]),
34882                               a[1] + portion * (b[1] - a[1])
34883                           ];
34884                           i1 = i + 1;
34885                       }
34886                       sofar += current;
34887                   }
34888
34889                   var result = points.slice(i0, i1);
34890                   result.unshift(start);
34891                   result.push(end);
34892                   return result;
34893               }
34894           }
34895
34896
34897           function getAreaLabel(entity, width, height) {
34898               var centroid = path.centroid(entity.asGeoJSON(graph, true));
34899               var extent = entity.extent(graph);
34900               var areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
34901
34902               if (isNaN(centroid[0]) || areaWidth < 20) return;
34903
34904               var preset = context.presets().match(entity, context.graph());
34905               var picon = preset && preset.icon;
34906               var iconSize = 17;
34907               var padding = 2;
34908               var p = {};
34909
34910               if (picon) {  // icon and label..
34911                   if (addIcon()) {
34912                       addLabel(iconSize + padding);
34913                       return p;
34914                   }
34915               } else {   // label only..
34916                   if (addLabel(0)) {
34917                       return p;
34918                   }
34919               }
34920
34921
34922               function addIcon() {
34923                   var iconX = centroid[0] - (iconSize / 2);
34924                   var iconY = centroid[1] - (iconSize / 2);
34925                   var bbox = {
34926                       minX: iconX,
34927                       minY: iconY,
34928                       maxX: iconX + iconSize,
34929                       maxY: iconY + iconSize
34930                   };
34931
34932                   if (tryInsert([bbox], entity.id + 'I', true)) {
34933                       p.transform = 'translate(' + iconX + ',' + iconY + ')';
34934                       return true;
34935                   }
34936                   return false;
34937               }
34938
34939               function addLabel(yOffset) {
34940                   if (width && areaWidth >= width + 20) {
34941                       var labelX = centroid[0];
34942                       var labelY = centroid[1] + yOffset;
34943                       var bbox = {
34944                           minX: labelX - (width / 2) - padding,
34945                           minY: labelY - (height / 2) - padding,
34946                           maxX: labelX + (width / 2) + padding,
34947                           maxY: labelY + (height / 2) + padding
34948                       };
34949
34950                       if (tryInsert([bbox], entity.id, true)) {
34951                           p.x = labelX;
34952                           p.y = labelY;
34953                           p.textAnchor = 'middle';
34954                           p.height = height;
34955                           return true;
34956                       }
34957                   }
34958                   return false;
34959               }
34960           }
34961
34962
34963           // force insert a singular bounding box
34964           // singular box only, no array, id better be unique
34965           function doInsert(bbox, id) {
34966               bbox.id = id;
34967
34968               var oldbox = _entitybboxes[id];
34969               if (oldbox) {
34970                   _rdrawn.remove(oldbox);
34971               }
34972               _entitybboxes[id] = bbox;
34973               _rdrawn.insert(bbox);
34974           }
34975
34976
34977           function tryInsert(bboxes, id, saveSkipped) {
34978               var skipped = false;
34979
34980               for (var i = 0; i < bboxes.length; i++) {
34981                   var bbox = bboxes[i];
34982                   bbox.id = id;
34983
34984                   // Check that label is visible
34985                   if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
34986                       skipped = true;
34987                       break;
34988                   }
34989                   if (_rdrawn.collides(bbox)) {
34990                       skipped = true;
34991                       break;
34992                   }
34993               }
34994
34995               _entitybboxes[id] = bboxes;
34996
34997               if (skipped) {
34998                   if (saveSkipped) {
34999                       _rskipped.load(bboxes);
35000                   }
35001               } else {
35002                   _rdrawn.load(bboxes);
35003               }
35004
35005               return !skipped;
35006           }
35007
35008
35009           var layer = selection.selectAll('.layer-labels');
35010           var halo = layer.selectAll('.layer-labels-halo');
35011           var label = layer.selectAll('.layer-labels-label');
35012           var debug = layer.selectAll('.layer-labels-debug');
35013
35014           // points
35015           drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
35016           drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
35017
35018           // lines
35019           drawLinePaths(halo, labelled.line, filter, '', positions.line);
35020           drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
35021           drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
35022
35023           // areas
35024           drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
35025           drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
35026           drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
35027           drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
35028
35029           // debug
35030           drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
35031           drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
35032
35033           layer.call(filterLabels);
35034       }
35035
35036
35037       function filterLabels(selection) {
35038           var layers = selection
35039               .selectAll('.layer-labels-label, .layer-labels-halo');
35040
35041           layers.selectAll('.nolabel')
35042               .classed('nolabel', false);
35043
35044           var mouse = context.mouse();
35045           var graph = context.graph();
35046           var selectedIDs = context.selectedIDs();
35047           var ids = [];
35048           var pad, bbox;
35049
35050           // hide labels near the mouse
35051           if (mouse) {
35052               pad = 20;
35053               bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
35054               ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
35055           }
35056
35057           // hide labels on selected nodes (they look weird when dragging / haloed)
35058           for (var i = 0; i < selectedIDs.length; i++) {
35059               var entity = graph.hasEntity(selectedIDs[i]);
35060               if (entity && entity.type === 'node') {
35061                   ids.push(selectedIDs[i]);
35062               }
35063           }
35064
35065           layers.selectAll(utilEntitySelector(ids))
35066               .classed('nolabel', true);
35067
35068
35069           // draw the mouse bbox if debugging is on..
35070           var debug = selection.selectAll('.layer-labels-debug');
35071           var gj = [];
35072           if (context.getDebug('collision')) {
35073               gj = bbox ? [{
35074                   type: 'Polygon',
35075                   coordinates: [[
35076                       [bbox.minX, bbox.minY],
35077                       [bbox.maxX, bbox.minY],
35078                       [bbox.maxX, bbox.maxY],
35079                       [bbox.minX, bbox.maxY],
35080                       [bbox.minX, bbox.minY]
35081                   ]]
35082               }] : [];
35083           }
35084
35085           var box = debug.selectAll('.debug-mouse')
35086               .data(gj);
35087
35088           // exit
35089           box.exit()
35090               .remove();
35091
35092           // enter/update
35093           box.enter()
35094               .append('path')
35095               .attr('class', 'debug debug-mouse yellow')
35096               .merge(box)
35097               .attr('d', d3_geoPath());
35098       }
35099
35100
35101       var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
35102
35103
35104       drawLabels.observe = function(selection) {
35105           var listener = function() { throttleFilterLabels(selection); };
35106           selection.on('mousemove.hidelabels', listener);
35107           context.on('enter.hidelabels', listener);
35108       };
35109
35110
35111       drawLabels.off = function(selection) {
35112           throttleFilterLabels.cancel();
35113           selection.on('mousemove.hidelabels', null);
35114           context.on('enter.hidelabels', null);
35115       };
35116
35117
35118       return drawLabels;
35119   }
35120
35121   function svgStreetside$$1(projection, context, dispatch) {
35122       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35123       var minZoom = 14;
35124       var minMarkerZoom = 16;
35125       var minViewfieldZoom = 18;
35126       var layer = select(null);
35127       var _viewerYaw = 0;
35128       var _selectedSequence = null;
35129       var _hoveredBubble = null;
35130       var _streetside;
35131
35132       /**
35133        * init().
35134        */
35135       function init() {
35136           if (svgStreetside$$1.initialized) return;  // run once
35137           svgStreetside$$1.enabled = false;
35138           svgStreetside$$1.initialized = true;
35139       }
35140
35141       /**
35142        * getService().
35143        */
35144       function getService() {
35145           if (services.streetside && !_streetside) {
35146               _streetside = services.streetside;
35147               _streetside.event
35148                   .on('viewerChanged', viewerChanged)
35149                   .on('loadedBubbles', throttledRedraw);
35150           } else if (!services.streetside && _streetside) {
35151               _streetside = null;
35152           }
35153
35154           return _streetside;
35155       }
35156
35157       /**
35158        * showLayer().
35159        */
35160       function showLayer() {
35161           var service = getService();
35162           if (!service) return;
35163
35164           service.loadViewer(context);
35165           editOn();
35166
35167           layer
35168               .style('opacity', 0)
35169               .transition()
35170               .duration(250)
35171               .style('opacity', 1)
35172               .on('end', function () { dispatch.call('change'); });
35173       }
35174
35175       /**
35176        * hideLayer().
35177        */
35178       function hideLayer() {
35179           var service = getService();
35180           if (service) {
35181               service.hideViewer();
35182           }
35183
35184           throttledRedraw.cancel();
35185
35186           layer
35187               .transition()
35188               .duration(250)
35189               .style('opacity', 0)
35190               .on('end', editOff);
35191       }
35192
35193       /**
35194        * editOn().
35195        */
35196       function editOn() {
35197           layer.style('display', 'block');
35198       }
35199
35200       /**
35201        * editOff().
35202        */
35203       function editOff() {
35204           layer.selectAll('.viewfield-group').remove();
35205           layer.style('display', 'none');
35206       }
35207
35208       /**
35209        * click() Handles 'bubble' point click event.
35210        */
35211       function click(d) {
35212           var service = getService();
35213           if (!service) return;
35214
35215           // try to preserve the viewer rotation when staying on the same sequence
35216           if (d.sequenceKey !== _selectedSequence) {
35217               _viewerYaw = 0;  // reset
35218           }
35219           _selectedSequence = d.sequenceKey;
35220
35221           service
35222               .selectImage(d)
35223               .then(function(r) {
35224                   if (r.status === 'ok'){
35225                       service.showViewer(_viewerYaw);
35226                   }
35227               });
35228
35229
35230           context.map().centerEase(d.loc);
35231       }
35232
35233       /**
35234        * mouseover().
35235        */
35236       function mouseover(d) {
35237           var service = getService();
35238           _hoveredBubble = d;
35239           if (service) service.setStyles(d, true);
35240       }
35241
35242       /**
35243        * mouseout().
35244        */
35245       function mouseout() {
35246           var service = getService();
35247           _hoveredBubble = null;
35248           if (service) service.setStyles(null, true);
35249       }
35250
35251       /**
35252        * transform().
35253        */
35254       function transform(d) {
35255           var t = svgPointTransform(projection)(d);
35256           var rot = d.ca + _viewerYaw;
35257           if (rot) {
35258               t += ' rotate(' + Math.floor(rot) + ',0,0)';
35259           }
35260           return t;
35261       }
35262
35263
35264       function viewerChanged() {
35265           var service = getService();
35266           if (!service) return;
35267
35268           var viewer = service.viewer();
35269           if (!viewer) return;
35270
35271           // update viewfield rotation
35272           _viewerYaw = viewer.getYaw();
35273
35274           // avoid updating if the map is currently transformed
35275           // e.g. during drags or easing.
35276           if (context.map().isTransformed()) return;
35277
35278           layer.selectAll('.viewfield-group.selected')
35279               .attr('transform', transform);
35280       }
35281
35282
35283       /**
35284        * update().
35285        */
35286       function update() {
35287           var viewer = select('#photoviewer');
35288           var selected = viewer.empty() ? undefined : viewer.datum();
35289           var z = ~~context.map().zoom();
35290           var showMarkers = (z >= minMarkerZoom);
35291           var showViewfields = (z >= minViewfieldZoom);
35292           var service = getService();
35293
35294           var sequences = (service ? service.sequences(projection) : []);
35295           var bubbles = (service && showMarkers ? service.bubbles(projection) : []);
35296
35297           var traces = layer.selectAll('.sequences').selectAll('.sequence')
35298               .data(sequences, function(d) { return d.properties.key; });
35299
35300           // exit
35301           traces.exit()
35302               .remove();
35303
35304           // enter/update
35305           traces = traces.enter()
35306               .append('path')
35307               .attr('class', 'sequence')
35308               .merge(traces)
35309               .attr('d', svgPath(projection).geojson);
35310
35311
35312           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
35313               .data(bubbles, function(d) {
35314                   // force reenter once bubbles are attached to a sequence
35315                   return d.key + (d.sequenceKey ? 'v1' : 'v0');
35316               });
35317
35318           // exit
35319           groups.exit()
35320               .remove();
35321
35322           // enter
35323           var groupsEnter = groups.enter()
35324               .append('g')
35325               .attr('class', 'viewfield-group')
35326               .on('mouseover', mouseover)
35327               .on('mouseout', mouseout)
35328               .on('click', click);
35329
35330           groupsEnter
35331               .append('g')
35332               .attr('class', 'viewfield-scale');
35333
35334           // update
35335           var markers = groups
35336               .merge(groupsEnter)
35337               .sort(function(a, b) {
35338                   return (a === selected) ? 1
35339                       : (b === selected) ? -1
35340                       : b.loc[1] - a.loc[1];
35341               })
35342               .attr('transform', transform)
35343               .select('.viewfield-scale');
35344
35345
35346           markers.selectAll('circle')
35347               .data([0])
35348               .enter()
35349               .append('circle')
35350               .attr('dx', '0')
35351               .attr('dy', '0')
35352               .attr('r', '6');
35353
35354           var viewfields = markers.selectAll('.viewfield')
35355               .data(showViewfields ? [0] : []);
35356
35357           viewfields.exit()
35358               .remove();
35359
35360           // viewfields may or may not be drawn...
35361           // but if they are, draw below the circles
35362           viewfields.enter()
35363               .insert('path', 'circle')
35364               .attr('class', 'viewfield')
35365               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
35366               .attr('d', viewfieldPath);
35367
35368
35369           if (service) {
35370               service.setStyles(_hoveredBubble, true);
35371           }
35372
35373
35374           function viewfieldPath() {
35375               var d = this.parentNode.__data__;
35376               if (d.pano) {
35377                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
35378               } else {
35379                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
35380               }
35381           }
35382
35383       }
35384
35385       /**
35386        * drawImages()
35387        * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
35388        * 'svgStreetside()' is called from index.js
35389        */
35390       function drawImages(selection$$1) {
35391           var enabled = svgStreetside$$1.enabled;
35392           var service = getService();
35393
35394           layer = selection$$1.selectAll('.layer-streetside-images')
35395               .data(service ? [0] : []);
35396
35397           layer.exit()
35398               .remove();
35399
35400           var layerEnter = layer.enter()
35401               .append('g')
35402               .attr('class', 'layer-streetside-images')
35403               .style('display', enabled ? 'block' : 'none');
35404
35405           layerEnter
35406               .append('g')
35407               .attr('class', 'sequences');
35408
35409           layerEnter
35410               .append('g')
35411               .attr('class', 'markers');
35412
35413           layer = layerEnter
35414               .merge(layer);
35415
35416           if (enabled) {
35417               if (service && ~~context.map().zoom() >= minZoom) {
35418                   editOn();
35419                   update();
35420                   service.loadBubbles(projection);
35421               } else {
35422                   editOff();
35423               }
35424           }
35425       }
35426
35427
35428       /**
35429        * drawImages.enabled().
35430        */
35431       drawImages.enabled = function(_) {
35432           if (!arguments.length) return svgStreetside$$1.enabled;
35433           svgStreetside$$1.enabled = _;
35434           if (svgStreetside$$1.enabled) {
35435               showLayer();
35436           } else {
35437               hideLayer();
35438           }
35439           dispatch.call('change');
35440           return this;
35441       };
35442
35443       /**
35444        * drawImages.supported().
35445        */
35446       drawImages.supported = function() {
35447           return !!getService();
35448       };
35449
35450       init();
35451
35452       return drawImages;
35453   }
35454
35455   function svgMapillaryImages$$1(projection, context, dispatch) {
35456       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35457       var minZoom = 12;
35458       var minMarkerZoom = 16;
35459       var minViewfieldZoom = 18;
35460       var layer = select(null);
35461       var _mapillary;
35462       var viewerCompassAngle;
35463
35464
35465       function init() {
35466           if (svgMapillaryImages$$1.initialized) return;  // run once
35467           svgMapillaryImages$$1.enabled = false;
35468           svgMapillaryImages$$1.initialized = true;
35469       }
35470
35471
35472       function getService() {
35473           if (services.mapillary && !_mapillary) {
35474               _mapillary = services.mapillary;
35475               _mapillary.event.on('loadedImages', throttledRedraw);
35476               _mapillary.event.on('bearingChanged', function(e) {
35477                   viewerCompassAngle = e;
35478
35479                   // avoid updating if the map is currently transformed
35480                   // e.g. during drags or easing.
35481                   if (context.map().isTransformed()) return;
35482
35483                   layer.selectAll('.viewfield-group.selected')
35484                       .filter(function(d) {
35485                           return d.pano;
35486                       })
35487                       .attr('transform', transform);
35488               });
35489           } else if (!services.mapillary && _mapillary) {
35490               _mapillary = null;
35491           }
35492
35493           return _mapillary;
35494       }
35495
35496
35497       function showLayer() {
35498           var service = getService();
35499           if (!service) return;
35500
35501           service.loadViewer(context);
35502           editOn();
35503
35504           layer
35505               .style('opacity', 0)
35506               .transition()
35507               .duration(250)
35508               .style('opacity', 1)
35509               .on('end', function () { dispatch.call('change'); });
35510       }
35511
35512
35513       function hideLayer() {
35514           var service = getService();
35515           if (service) {
35516               service.hideViewer();
35517           }
35518
35519           throttledRedraw.cancel();
35520
35521           layer
35522               .transition()
35523               .duration(250)
35524               .style('opacity', 0)
35525               .on('end', editOff);
35526       }
35527
35528
35529       function editOn() {
35530           layer.style('display', 'block');
35531       }
35532
35533
35534       function editOff() {
35535           layer.selectAll('.viewfield-group').remove();
35536           layer.style('display', 'none');
35537       }
35538
35539
35540       function click(d) {
35541           var service = getService();
35542           if (!service) return;
35543
35544           service
35545               .selectImage(d)
35546               .updateViewer(d.key, context)
35547               .showViewer();
35548
35549           context.map().centerEase(d.loc);
35550       }
35551
35552
35553       function mouseover(d) {
35554           var service = getService();
35555           if (service) service.setStyles(d);
35556       }
35557
35558
35559       function mouseout() {
35560           var service = getService();
35561           if (service) service.setStyles(null);
35562       }
35563
35564
35565       function transform(d) {
35566           var t = svgPointTransform(projection)(d);
35567           if (d.pano && isNumber(viewerCompassAngle)) {
35568               t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
35569           } else if (d.ca) {
35570               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
35571           }
35572           return t;
35573       }
35574
35575
35576       function update() {
35577           var viewer = select('#photoviewer');
35578           var selected = viewer.empty() ? undefined : viewer.datum();
35579
35580           var z = ~~context.map().zoom();
35581           var showMarkers = (z >= minMarkerZoom);
35582           var showViewfields = (z >= minViewfieldZoom);
35583
35584           var service = getService();
35585           var sequences = (service ? service.sequences(projection) : []);
35586           var images = (service && showMarkers ? service.images(projection) : []);
35587
35588           var traces = layer.selectAll('.sequences').selectAll('.sequence')
35589               .data(sequences, function(d) { return d.properties.key; });
35590
35591           // exit
35592           traces.exit()
35593               .remove();
35594
35595           // enter/update
35596           traces = traces.enter()
35597               .append('path')
35598               .attr('class', 'sequence')
35599               .merge(traces)
35600               .attr('d', svgPath(projection).geojson);
35601
35602
35603           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
35604               .data(images, function(d) { return d.key; });
35605
35606           // exit
35607           groups.exit()
35608               .remove();
35609
35610           // enter
35611           var groupsEnter = groups.enter()
35612               .append('g')
35613               .attr('class', 'viewfield-group')
35614               .on('mouseover', mouseover)
35615               .on('mouseout', mouseout)
35616               .on('click', click);
35617
35618           groupsEnter
35619               .append('g')
35620               .attr('class', 'viewfield-scale');
35621
35622           // update
35623           var markers = groups
35624               .merge(groupsEnter)
35625               .sort(function(a, b) {
35626                   return (a === selected) ? 1
35627                       : (b === selected) ? -1
35628                       : b.loc[1] - a.loc[1];  // sort Y
35629               })
35630               .attr('transform', transform)
35631               .select('.viewfield-scale');
35632
35633
35634           markers.selectAll('circle')
35635               .data([0])
35636               .enter()
35637               .append('circle')
35638               .attr('dx', '0')
35639               .attr('dy', '0')
35640               .attr('r', '6');
35641
35642           var viewfields = markers.selectAll('.viewfield')
35643               .data(showViewfields ? [0] : []);
35644
35645           viewfields.exit()
35646               .remove();
35647
35648           viewfields.enter()               // viewfields may or may not be drawn...
35649               .insert('path', 'circle')    // but if they are, draw below the circles
35650               .attr('class', 'viewfield')
35651               .classed('pano', function() { return this.parentNode.__data__.pano; })
35652               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
35653               .attr('d', viewfieldPath);
35654
35655           function viewfieldPath() {
35656               var d = this.parentNode.__data__;
35657               if (d.pano) {
35658                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
35659               } else {
35660                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
35661               }
35662           }
35663       }
35664
35665
35666       function drawImages(selection$$1) {
35667           var enabled = svgMapillaryImages$$1.enabled,
35668               service = getService();
35669
35670           layer = selection$$1.selectAll('.layer-mapillary-images')
35671               .data(service ? [0] : []);
35672
35673           layer.exit()
35674               .remove();
35675
35676           var layerEnter = layer.enter()
35677               .append('g')
35678               .attr('class', 'layer-mapillary-images')
35679               .style('display', enabled ? 'block' : 'none');
35680
35681           layerEnter
35682               .append('g')
35683               .attr('class', 'sequences');
35684
35685           layerEnter
35686               .append('g')
35687               .attr('class', 'markers');
35688
35689           layer = layerEnter
35690               .merge(layer);
35691
35692           if (enabled) {
35693               if (service && ~~context.map().zoom() >= minZoom) {
35694                   editOn();
35695                   update();
35696                   service.loadImages(projection);
35697               } else {
35698                   editOff();
35699               }
35700           }
35701       }
35702
35703
35704       drawImages.enabled = function(_) {
35705           if (!arguments.length) return svgMapillaryImages$$1.enabled;
35706           svgMapillaryImages$$1.enabled = _;
35707           if (svgMapillaryImages$$1.enabled) {
35708               showLayer();
35709           } else {
35710               hideLayer();
35711           }
35712           dispatch.call('change');
35713           return this;
35714       };
35715
35716
35717       drawImages.supported = function() {
35718           return !!getService();
35719       };
35720
35721
35722       init();
35723       return drawImages;
35724   }
35725
35726   function svgMapillarySigns$$1(projection, context, dispatch) {
35727       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35728       var minZoom = 12;
35729       var layer = select(null);
35730       var _mapillary;
35731
35732
35733       function init() {
35734           if (svgMapillarySigns$$1.initialized) return;  // run once
35735           svgMapillarySigns$$1.enabled = false;
35736           svgMapillarySigns$$1.initialized = true;
35737       }
35738
35739
35740       function getService() {
35741           if (services.mapillary && !_mapillary) {
35742               _mapillary = services.mapillary;
35743               _mapillary.event.on('loadedSigns', throttledRedraw);
35744           } else if (!services.mapillary && _mapillary) {
35745               _mapillary = null;
35746           }
35747           return _mapillary;
35748       }
35749
35750
35751       function showLayer() {
35752           var service = getService();
35753           if (!service) return;
35754
35755           service.loadViewer(context);
35756           editOn();
35757       }
35758
35759
35760       function hideLayer() {
35761           throttledRedraw.cancel();
35762           editOff();
35763       }
35764
35765
35766       function editOn() {
35767           layer.style('display', 'block');
35768       }
35769
35770
35771       function editOff() {
35772           layer.selectAll('.icon-sign').remove();
35773           layer.style('display', 'none');
35774       }
35775
35776
35777       function click(d) {
35778           var service = getService();
35779           if (!service) return;
35780
35781           context.map().centerEase(d.loc);
35782
35783           var selected = service.getSelectedImage();
35784           var selectedImageKey = selected && selected.key;
35785           var imageKey;
35786
35787           // Pick one of the images the sign was detected in,
35788           // preference given to an image already selected.
35789           d.detections.forEach(function(detection) {
35790               if (!imageKey || selectedImageKey === detection.image_key) {
35791                   imageKey = detection.image_key;
35792               }
35793           });
35794
35795           service
35796               .selectImage(null, imageKey)
35797               .updateViewer(imageKey, context)
35798               .showViewer();
35799       }
35800
35801
35802       function update() {
35803           var service = getService();
35804           var data = (service ? service.signs(projection) : []);
35805           var viewer = select('#photoviewer');
35806           var selected = viewer.empty() ? undefined : viewer.datum();
35807           var selectedImageKey = selected && selected.key;
35808           var transform = svgPointTransform(projection);
35809
35810           var signs = layer.selectAll('.icon-sign')
35811               .data(data, function(d) { return d.key; });
35812
35813           // exit
35814           signs.exit()
35815               .remove();
35816
35817           // enter
35818           var enter = signs.enter()
35819               .append('use')
35820               .attr('class', 'icon-sign')
35821               .attr('width', '24px')
35822               .attr('height', '24px')
35823               .attr('x', '-12px')
35824               .attr('y', '-12px')
35825               .attr('xlink:href', function(d) { return '#' + d.value; })
35826               .classed('selected', function(d) {
35827                   return some(d.detections, function(detection) {
35828                       return detection.image_key === selectedImageKey;
35829                   });
35830               })
35831               .on('click', click);
35832
35833           // update
35834           signs
35835               .merge(enter)
35836               .sort(function(a, b) {
35837                   return (a === selected) ? 1
35838                       : (b === selected) ? -1
35839                       : b.loc[1] - a.loc[1];  // sort Y
35840               })
35841               .attr('transform', transform);
35842       }
35843
35844
35845       function drawSigns(selection$$1) {
35846           var enabled = svgMapillarySigns$$1.enabled;
35847           var service = getService();
35848
35849           layer = selection$$1.selectAll('.layer-mapillary-signs')
35850               .data(service ? [0] : []);
35851
35852           layer.exit()
35853               .remove();
35854
35855           layer = layer.enter()
35856               .append('g')
35857               .attr('class', 'layer-mapillary-signs')
35858               .style('display', enabled ? 'block' : 'none')
35859               .merge(layer);
35860
35861           if (enabled) {
35862               if (service && ~~context.map().zoom() >= minZoom) {
35863                   editOn();
35864                   update();
35865                   service.loadSigns(context, projection);
35866               } else {
35867                   editOff();
35868               }
35869           }
35870       }
35871
35872
35873       drawSigns.enabled = function(_) {
35874           if (!arguments.length) return svgMapillarySigns$$1.enabled;
35875           svgMapillarySigns$$1.enabled = _;
35876           if (svgMapillarySigns$$1.enabled) {
35877               showLayer();
35878           } else {
35879               hideLayer();
35880           }
35881           dispatch.call('change');
35882           return this;
35883       };
35884
35885
35886       drawSigns.supported = function() {
35887           return !!getService();
35888       };
35889
35890
35891       init();
35892       return drawSigns;
35893   }
35894
35895   function svgOpenstreetcamImages$$1(projection, context, dispatch) {
35896       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35897       var minZoom = 12;
35898       var minMarkerZoom = 16;
35899       var minViewfieldZoom = 18;
35900       var layer = select(null);
35901       var _openstreetcam;
35902
35903
35904       function init() {
35905           if (svgOpenstreetcamImages$$1.initialized) return;  // run once
35906           svgOpenstreetcamImages$$1.enabled = false;
35907           svgOpenstreetcamImages$$1.initialized = true;
35908       }
35909
35910
35911       function getService() {
35912           if (services.openstreetcam && !_openstreetcam) {
35913               _openstreetcam = services.openstreetcam;
35914               _openstreetcam.event.on('loadedImages', throttledRedraw);
35915           } else if (!services.openstreetcam && _openstreetcam) {
35916               _openstreetcam = null;
35917           }
35918
35919           return _openstreetcam;
35920       }
35921
35922
35923       function showLayer() {
35924           var service = getService();
35925           if (!service) return;
35926
35927           service.loadViewer(context);
35928           editOn();
35929
35930           layer
35931               .style('opacity', 0)
35932               .transition()
35933               .duration(250)
35934               .style('opacity', 1)
35935               .on('end', function () { dispatch.call('change'); });
35936       }
35937
35938
35939       function hideLayer() {
35940           var service = getService();
35941           if (service) {
35942               service.hideViewer();
35943           }
35944
35945           throttledRedraw.cancel();
35946
35947           layer
35948               .transition()
35949               .duration(250)
35950               .style('opacity', 0)
35951               .on('end', editOff);
35952       }
35953
35954
35955       function editOn() {
35956           layer.style('display', 'block');
35957       }
35958
35959
35960       function editOff() {
35961           layer.selectAll('.viewfield-group').remove();
35962           layer.style('display', 'none');
35963       }
35964
35965
35966       function click(d) {
35967           var service = getService();
35968           if (!service) return;
35969
35970           service
35971               .selectImage(d)
35972               .updateViewer(d)
35973               .showViewer();
35974
35975           context.map().centerEase(d.loc);
35976       }
35977
35978
35979       function mouseover(d) {
35980           var service = getService();
35981           if (service) service.setStyles(d);
35982       }
35983
35984
35985       function mouseout() {
35986           var service = getService();
35987           if (service) service.setStyles(null);
35988       }
35989
35990
35991       function transform(d) {
35992           var t = svgPointTransform(projection)(d);
35993           if (d.ca) {
35994               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
35995           }
35996           return t;
35997       }
35998
35999
36000       function update() {
36001           var viewer = select('#photoviewer');
36002           var selected = viewer.empty() ? undefined : viewer.datum();
36003
36004           var z = ~~context.map().zoom();
36005           var showMarkers = (z >= minMarkerZoom);
36006           var showViewfields = (z >= minViewfieldZoom);
36007
36008           var service = getService();
36009           var sequences = (service ? service.sequences(projection) : []);
36010           var images = (service && showMarkers ? service.images(projection) : []);
36011
36012           var traces = layer.selectAll('.sequences').selectAll('.sequence')
36013               .data(sequences, function(d) { return d.properties.key; });
36014
36015           // exit
36016           traces.exit()
36017               .remove();
36018
36019           // enter/update
36020           traces = traces.enter()
36021               .append('path')
36022               .attr('class', 'sequence')
36023               .merge(traces)
36024               .attr('d', svgPath(projection).geojson);
36025
36026
36027           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
36028               .data(images, function(d) { return d.key; });
36029
36030           // exit
36031           groups.exit()
36032               .remove();
36033
36034           // enter
36035           var groupsEnter = groups.enter()
36036               .append('g')
36037               .attr('class', 'viewfield-group')
36038               .on('mouseover', mouseover)
36039               .on('mouseout', mouseout)
36040               .on('click', click);
36041
36042           groupsEnter
36043               .append('g')
36044               .attr('class', 'viewfield-scale');
36045
36046           // update
36047           var markers = groups
36048               .merge(groupsEnter)
36049               .sort(function(a, b) {
36050                   return (a === selected) ? 1
36051                       : (b === selected) ? -1
36052                       : b.loc[1] - a.loc[1];  // sort Y
36053               })
36054               .attr('transform', transform)
36055               .select('.viewfield-scale');
36056
36057
36058           markers.selectAll('circle')
36059               .data([0])
36060               .enter()
36061               .append('circle')
36062               .attr('dx', '0')
36063               .attr('dy', '0')
36064               .attr('r', '6');
36065
36066           var viewfields = markers.selectAll('.viewfield')
36067               .data(showViewfields ? [0] : []);
36068
36069           viewfields.exit()
36070               .remove();
36071
36072           viewfields.enter()               // viewfields may or may not be drawn...
36073               .insert('path', 'circle')    // but if they are, draw below the circles
36074               .attr('class', 'viewfield')
36075               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
36076               .attr('d', 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z');
36077       }
36078
36079
36080       function drawImages(selection$$1) {
36081           var enabled = svgOpenstreetcamImages$$1.enabled,
36082               service = getService();
36083
36084           layer = selection$$1.selectAll('.layer-openstreetcam-images')
36085               .data(service ? [0] : []);
36086
36087           layer.exit()
36088               .remove();
36089
36090           var layerEnter = layer.enter()
36091               .append('g')
36092               .attr('class', 'layer-openstreetcam-images')
36093               .style('display', enabled ? 'block' : 'none');
36094
36095           layerEnter
36096               .append('g')
36097               .attr('class', 'sequences');
36098
36099           layerEnter
36100               .append('g')
36101               .attr('class', 'markers');
36102
36103           layer = layerEnter
36104               .merge(layer);
36105
36106           if (enabled) {
36107               if (service && ~~context.map().zoom() >= minZoom) {
36108                   editOn();
36109                   update();
36110                   service.loadImages(projection);
36111               } else {
36112                   editOff();
36113               }
36114           }
36115       }
36116
36117
36118       drawImages.enabled = function(_) {
36119           if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
36120           svgOpenstreetcamImages$$1.enabled = _;
36121           if (svgOpenstreetcamImages$$1.enabled) {
36122               showLayer();
36123           } else {
36124               hideLayer();
36125           }
36126           dispatch.call('change');
36127           return this;
36128       };
36129
36130
36131       drawImages.supported = function() {
36132           return !!getService();
36133       };
36134
36135
36136       init();
36137       return drawImages;
36138   }
36139
36140   function svgOsm(projection, context, dispatch) {
36141       var enabled = true;
36142
36143
36144       function drawOsm(selection) {
36145           selection.selectAll('.layer-osm')
36146               .data(['covered', 'areas', 'lines', 'points', 'labels'])
36147               .enter()
36148               .append('g')
36149               .attr('class', function(d) { return 'layer-osm layer-' + d; });
36150
36151           selection.selectAll('.layer-areas').selectAll('.layer-areas-group')
36152               .data(['areas', 'targets'])
36153               .enter()
36154               .append('g')
36155               .attr('class', function(d) { return 'layer-areas-group layer-areas-' + d; });
36156
36157           selection.selectAll('.layer-lines').selectAll('.layer-lines-group')
36158               .data(['lines', 'targets'])
36159               .enter()
36160               .append('g')
36161               .attr('class', function(d) { return 'layer-lines-group layer-lines-' + d; });
36162
36163           selection.selectAll('.layer-points').selectAll('.layer-points-group')
36164               .data(['points', 'midpoints', 'vertices', 'turns', 'targets'])
36165               .enter()
36166               .append('g')
36167               .attr('class', function(d) { return 'layer-points-group layer-points-' + d; });
36168
36169           selection.selectAll('.layer-labels').selectAll('.layer-labels-group')
36170               .data(['halo', 'label', 'debug'])
36171               .enter()
36172               .append('g')
36173               .attr('class', function(d) { return 'layer-labels-group layer-labels-' + d; });
36174       }
36175
36176
36177       function showLayer() {
36178           var layer = context.surface().selectAll('.data-layer-osm');
36179           layer.interrupt();
36180
36181           layer
36182               .classed('disabled', false)
36183               .style('opacity', 0)
36184               .transition()
36185               .duration(250)
36186               .style('opacity', 1)
36187               .on('end interrupt', function () {
36188                   dispatch.call('change');
36189               });
36190       }
36191
36192
36193       function hideLayer() {
36194           var layer = context.surface().selectAll('.data-layer-osm');
36195           layer.interrupt();
36196
36197           layer
36198               .transition()
36199               .duration(250)
36200               .style('opacity', 0)
36201               .on('end interrupt', function () {
36202                   layer.classed('disabled', true);
36203                   dispatch.call('change');
36204               });
36205       }
36206
36207
36208       drawOsm.enabled = function(_) {
36209           if (!arguments.length) return enabled;
36210           enabled = _;
36211
36212           if (enabled) {
36213               showLayer();
36214           } else {
36215               hideLayer();
36216           }
36217
36218           dispatch.call('change');
36219           return this;
36220       };
36221
36222
36223       return drawOsm;
36224   }
36225
36226   function svgNotes$$1(projection, context, dispatch$$1) {
36227       if (!dispatch$$1) { dispatch$$1 = dispatch('change'); }
36228       var throttledRedraw = throttle(function () { dispatch$$1.call('change'); }, 1000);
36229       var minZoom = 12;
36230       var layer = select(null);
36231       var _notes;
36232
36233       function markerPath(selection$$1, klass) {
36234           selection$$1
36235               .attr('class', klass)
36236               .attr('transform', 'translate(-8, -22)')
36237               .attr('d', 'm17.5,0l-15,0c-1.37,0 -2.5,1.12 -2.5,2.5l0,11.25c0,1.37 1.12,2.5 2.5,2.5l3.75,0l0,3.28c0,0.38 0.43,0.6 0.75,0.37l4.87,-3.65l5.62,0c1.37,0 2.5,-1.12 2.5,-2.5l0,-11.25c0,-1.37 -1.12,-2.5 -2.5,-2.5z');
36238       }
36239
36240       function init() {
36241           if (svgNotes$$1.initialized) return;  // run once
36242           svgNotes$$1.enabled = false;
36243           svgNotes$$1.initialized = true;
36244       }
36245
36246       function editOn() {
36247           layer.style('display', 'block');
36248       }
36249
36250
36251       function editOff() {
36252           layer.selectAll('.note').remove();
36253           layer.style('display', 'none');
36254       }
36255
36256
36257       function getService() {
36258           if (services.osm && !_notes) {
36259               _notes = services.osm;
36260               _notes.on('loadedNotes', throttledRedraw);
36261           } else if (!services.osm && _notes) {
36262               _notes = null;
36263           }
36264
36265           return _notes;
36266       }
36267
36268
36269       function showLayer() {
36270           editOn();
36271
36272           layer
36273               .classed('disabled', false)
36274               .style('opacity', 0)
36275               .transition()
36276               .duration(250)
36277               .style('opacity', 1)
36278               .on('end interrupt', function () {
36279                   dispatch$$1.call('change');
36280               });
36281       }
36282
36283
36284       function hideLayer() {
36285           editOff();
36286
36287           throttledRedraw.cancel();
36288           layer.interrupt();
36289
36290           layer
36291               .transition()
36292               .duration(250)
36293               .style('opacity', 0)
36294               .on('end interrupt', function () {
36295                   layer.classed('disabled', true);
36296                   dispatch$$1.call('change');
36297               });
36298
36299       }
36300
36301
36302       function update() {
36303           var service = getService();
36304           var selectedID = context.selectedNoteID();
36305           var data = (service ? service.notes(projection) : []);
36306           var transform = svgPointTransform(projection);
36307           var notes = layer.selectAll('.note')
36308               .data(data, function(d) { return d.status + d.id; });
36309
36310           // exit
36311           notes.exit()
36312               .remove();
36313
36314           // enter
36315           var notesEnter = notes.enter()
36316               .append('g')
36317               .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
36318               .classed('new', function(d) { return d.id < 0; });
36319
36320           notesEnter
36321               .append('ellipse')
36322               .attr('cx', 0.5)
36323               .attr('cy', 1)
36324               .attr('rx', 6.5)
36325               .attr('ry', 3)
36326               .attr('class', 'stroke');
36327
36328           notesEnter
36329               .append('path')
36330               .call(markerPath, 'shadow');
36331
36332           notesEnter
36333               .append('use')
36334               .attr('class', 'note-fill')
36335               .attr('width', '20px')
36336               .attr('height', '20px')
36337               .attr('x', '-8px')
36338               .attr('y', '-22px')
36339               .attr('xlink:href', '#iD-icon-note');
36340
36341           notesEnter.selectAll('.note-annotation')
36342               .data(function(d) { return [d]; })
36343               .enter()
36344               .append('use')
36345               .attr('class', 'note-annotation')
36346               .attr('width', '10px')
36347               .attr('height', '10px')
36348               .attr('x', '-3px')
36349               .attr('y', '-19px')
36350               .attr('xlink:href', function(d) {
36351                   return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
36352               });
36353
36354           // update
36355           notes
36356               .merge(notesEnter)
36357               .sort(function(a, b) {
36358                   return (a.id === selectedID) ? 1
36359                       : (b.id === selectedID) ? -1
36360                       : b.loc[1] - a.loc[1];  // sort Y
36361               })
36362               .classed('selected', function(d) { return d.id === selectedID; })
36363               .attr('transform', transform);
36364       }
36365
36366
36367       function drawNotes(selection$$1) {
36368           var enabled = svgNotes$$1.enabled;
36369           var service = getService();
36370
36371           layer = selection$$1.selectAll('.layer-notes')
36372               .data(service ? [0] : []);
36373
36374           layer.exit()
36375               .remove();
36376
36377           layer.enter()
36378               .append('g')
36379               .attr('class', 'layer-notes')
36380               .style('display', enabled ? 'block' : 'none')
36381               .merge(layer);
36382
36383           function dimensions() {
36384               return [window.innerWidth, window.innerHeight];
36385           }
36386
36387           if (enabled) {
36388               if (service && ~~context.map().zoom() >= minZoom) {
36389                   editOn();
36390                   service.loadNotes(projection, dimensions());
36391                   update();
36392               } else {
36393                   editOff();
36394               }
36395           }
36396       }
36397
36398       drawNotes.enabled = function(val) {
36399           if (!arguments.length) return svgNotes$$1.enabled;
36400
36401           svgNotes$$1.enabled = val;
36402           if (svgNotes$$1.enabled) {
36403               showLayer();
36404           } else {
36405               hideLayer();
36406               if (context.selectedNoteID()) {
36407                   context.enter(modeBrowse(context));
36408               }
36409           }
36410
36411           dispatch$$1.call('change');
36412           return this;
36413       };
36414
36415       init();
36416       return drawNotes;
36417   }
36418
36419   function svgLayers(projection, context) {
36420       var dispatch$$1 = dispatch('change');
36421       var svg = select(null);
36422       var layers = [
36423           { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
36424           { id: 'notes', layer: svgNotes$$1(projection, context, dispatch$$1) },
36425           { id: 'data', layer: svgData$$1(projection, context, dispatch$$1) },
36426           { id: 'streetside', layer: svgStreetside$$1(projection, context, dispatch$$1)},
36427           { id: 'mapillary-images', layer: svgMapillaryImages$$1(projection, context, dispatch$$1) },
36428           { id: 'mapillary-signs',  layer: svgMapillarySigns$$1(projection, context, dispatch$$1) },
36429           { id: 'openstreetcam-images', layer: svgOpenstreetcamImages$$1(projection, context, dispatch$$1) },
36430           { id: 'debug', layer: svgDebug$$1(projection, context, dispatch$$1) }
36431       ];
36432
36433
36434       function drawLayers(selection$$1) {
36435           svg = selection$$1.selectAll('.surface')
36436               .data([0]);
36437
36438           svg = svg.enter()
36439               .append('svg')
36440               .attr('class', 'surface')
36441               .merge(svg);
36442
36443           var defs = svg.selectAll('.surface-defs')
36444               .data([0]);
36445
36446           defs.enter()
36447               .append('defs')
36448               .attr('class', 'surface-defs');
36449
36450           var groups = svg.selectAll('.data-layer')
36451               .data(layers);
36452
36453           groups.exit()
36454               .remove();
36455
36456           groups.enter()
36457               .append('g')
36458               .attr('class', function(d) { return 'data-layer data-layer-' + d.id; })
36459               .merge(groups)
36460               .each(function(d) { select(this).call(d.layer); });
36461       }
36462
36463
36464       drawLayers.all = function() {
36465           return layers;
36466       };
36467
36468
36469       drawLayers.layer = function(id) {
36470           var obj = find$1(layers, function(o) {return o.id === id;});
36471           return obj && obj.layer;
36472       };
36473
36474
36475       drawLayers.only = function(what) {
36476           var arr = [].concat(what);
36477           drawLayers.remove(difference(map$3(layers, 'id'), arr));
36478           return this;
36479       };
36480
36481
36482       drawLayers.remove = function(what) {
36483           var arr = [].concat(what);
36484           arr.forEach(function(id) {
36485               layers = reject(layers, function(o) {return o.id === id;});
36486           });
36487           dispatch$$1.call('change');
36488           return this;
36489       };
36490
36491
36492       drawLayers.add = function(what) {
36493           var arr = [].concat(what);
36494           arr.forEach(function(obj) {
36495               if ('id' in obj && 'layer' in obj) {
36496                   layers.push(obj);
36497               }
36498           });
36499           dispatch$$1.call('change');
36500           return this;
36501       };
36502
36503
36504       drawLayers.dimensions = function(_) {
36505           if (!arguments.length) return utilGetDimensions(svg);
36506           utilSetDimensions(svg, _);
36507           return this;
36508       };
36509
36510
36511       return utilRebind(drawLayers, dispatch$$1, 'on');
36512   }
36513
36514   function svgLines$$1(projection, context) {
36515       var detected = utilDetect();
36516
36517       var highway_stack = {
36518           motorway: 0,
36519           motorway_link: 1,
36520           trunk: 2,
36521           trunk_link: 3,
36522           primary: 4,
36523           primary_link: 5,
36524           secondary: 6,
36525           tertiary: 7,
36526           unclassified: 8,
36527           residential: 9,
36528           service: 10,
36529           footway: 11
36530       };
36531
36532
36533       function drawTargets(selection, graph, entities, filter$$1) {
36534           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
36535           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
36536           var getPath = svgPath(projection).geojson;
36537           var activeID = context.activeID();
36538
36539           // The targets and nopes will be MultiLineString sub-segments of the ways
36540           var data = { targets: [], nopes: [] };
36541
36542           entities.forEach(function(way) {
36543               var features = svgSegmentWay(way, graph, activeID);
36544               data.targets.push.apply(data.targets, features.passive);
36545               data.nopes.push.apply(data.nopes, features.active);
36546           });
36547
36548
36549           // Targets allow hover and vertex snapping
36550           var targetData = data.targets.filter(getPath);
36551           var targets = selection.selectAll('.line.target-allowed')
36552               .filter(function(d) { return filter$$1(d.properties.entity); })
36553               .data(targetData, function key(d) { return d.id; });
36554
36555           // exit
36556           targets.exit()
36557               .remove();
36558
36559           // enter/update
36560           targets.enter()
36561               .append('path')
36562               .merge(targets)
36563               .attr('d', getPath)
36564               .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
36565
36566
36567           // NOPE
36568           var nopeData = data.nopes.filter(getPath);
36569           var nopes = selection.selectAll('.line.target-nope')
36570               .filter(function(d) { return filter$$1(d.properties.entity); })
36571               .data(nopeData, function key(d) { return d.id; });
36572
36573           // exit
36574           nopes.exit()
36575               .remove();
36576
36577           // enter/update
36578           nopes.enter()
36579               .append('path')
36580               .merge(nopes)
36581               .attr('d', getPath)
36582               .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
36583       }
36584
36585
36586       function drawLines(selection, graph, entities, filter$$1) {
36587
36588           function waystack(a, b) {
36589               var selected = context.selectedIDs();
36590               var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
36591               var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
36592
36593               if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
36594               if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
36595               return scoreA - scoreB;
36596           }
36597
36598
36599           function drawLineGroup(selection, klass, isSelected) {
36600               // Note: Don't add `.selected` class in draw modes
36601               var mode = context.mode();
36602               var isDrawing = mode && /^draw/.test(mode.id);
36603               var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
36604
36605               var lines = selection
36606                   .selectAll('path')
36607                   .filter(filter$$1)
36608                   .data(getPathData(isSelected), osmEntity$$1.key);
36609
36610               lines.exit()
36611                   .remove();
36612
36613               // Optimization: Call expensive TagClasses only on enter selection. This
36614               // works because osmEntity.key is defined to include the entity v attribute.
36615               lines.enter()
36616                   .append('path')
36617                   .attr('class', function(d) {
36618                       var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
36619                       return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
36620                   })
36621                   .call(svgTagClasses())
36622                   .merge(lines)
36623                   .sort(waystack)
36624                   .attr('d', getPath)
36625                   .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
36626
36627               return selection;
36628           }
36629
36630
36631           function getPathData(isSelected) {
36632               return function() {
36633                   var layer = this.parentNode.__data__;
36634                   var data = pathdata[layer] || [];
36635                   return data.filter(function(d) {
36636                       if (isSelected)
36637                           return context.selectedIDs().indexOf(d.id) !== -1;
36638                       else
36639                           return context.selectedIDs().indexOf(d.id) === -1;
36640                   });
36641               };
36642           }
36643
36644
36645           var getPath = svgPath(projection, graph);
36646           var ways = [];
36647           var pathdata = {};
36648           var onewaydata = {};
36649           var oldMultiPolygonOuters = {};
36650
36651           for (var i = 0; i < entities.length; i++) {
36652               var entity = entities[i];
36653               var outer = osmSimpleMultipolygonOuterMember(entity, graph);
36654               if (outer) {
36655                   ways.push(entity.mergeTags(outer.tags));
36656                   oldMultiPolygonOuters[outer.id] = true;
36657               } else if (entity.geometry(graph) === 'line') {
36658                   ways.push(entity);
36659               }
36660           }
36661
36662           ways = ways.filter(getPath);
36663           pathdata = groupBy(ways, function(way) { return way.layer(); });
36664
36665           forOwn(pathdata, function(v, k) {
36666               var arr = filter(v, function(d) { return d.isOneWay(); });
36667               onewaydata[k] = flatten(map$3(arr, svgOneWaySegments(projection, graph, 35)));
36668           });
36669
36670
36671           var covered = selection.selectAll('.layer-covered');                      // under areas
36672           var uncovered = selection.selectAll('.layer-lines .layer-lines-lines');   // over areas
36673
36674           [covered, uncovered].forEach(function(selection) {
36675               var range$$1 = (selection === covered ? range(-10,0) : range(0,11));
36676               var layergroup = selection
36677                   .selectAll('g.layergroup')
36678                   .data(range$$1);
36679
36680               layergroup = layergroup.enter()
36681                   .append('g')
36682                   .attr('class', function(d) { return 'layergroup layer' + String(d); })
36683                   .merge(layergroup);
36684
36685               layergroup
36686                   .selectAll('g.linegroup')
36687                   .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
36688                   .enter()
36689                   .append('g')
36690                   .attr('class', function(d) { return 'linegroup line-' + d; });
36691
36692               layergroup.selectAll('g.line-shadow')
36693                   .call(drawLineGroup, 'shadow', false);
36694               layergroup.selectAll('g.line-casing')
36695                   .call(drawLineGroup, 'casing', false);
36696               layergroup.selectAll('g.line-stroke')
36697                   .call(drawLineGroup, 'stroke', false);
36698
36699               layergroup.selectAll('g.line-shadow-highlighted')
36700                   .call(drawLineGroup, 'shadow', true);
36701               layergroup.selectAll('g.line-casing-highlighted')
36702                   .call(drawLineGroup, 'casing', true);
36703               layergroup.selectAll('g.line-stroke-highlighted')
36704                   .call(drawLineGroup, 'stroke', true);
36705
36706
36707               var onewaygroup = layergroup
36708                   .selectAll('g.onewaygroup')
36709                   .data(['oneway']);
36710
36711               onewaygroup = onewaygroup.enter()
36712                   .append('g')
36713                   .attr('class', 'onewaygroup')
36714                   .merge(onewaygroup);
36715
36716               var oneways = onewaygroup
36717                   .selectAll('path')
36718                   .filter(filter$$1)
36719                   .data(
36720                       function data() { return onewaydata[this.parentNode.__data__] || []; },
36721                       function key(d) { return [d.id, d.index]; }
36722                   );
36723
36724               oneways.exit()
36725                   .remove();
36726
36727               oneways = oneways.enter()
36728                   .append('path')
36729                   .attr('class', 'oneway')
36730                   .attr('marker-mid', 'url(#oneway-marker)')
36731                   .merge(oneways)
36732                   .attr('d', function(d) { return d.d; });
36733
36734               if (detected.ie) {
36735                   oneways.each(function() { this.parentNode.insertBefore(this, this); });
36736               }
36737           });
36738
36739           // touch targets
36740           selection.selectAll('.layer-lines .layer-lines-targets')
36741               .call(drawTargets, graph, ways, filter$$1);
36742       }
36743
36744
36745       return drawLines;
36746   }
36747
36748   function svgMidpoints$$1(projection, context) {
36749       var targetRadius = 8;
36750
36751       function drawTargets(selection, graph, entities, filter) {
36752           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
36753           var getTransform = svgPointTransform(projection).geojson;
36754
36755           var data = entities.map(function(midpoint) {
36756               return {
36757                   type: 'Feature',
36758                   id: midpoint.id,
36759                   properties: {
36760                       target: true,
36761                       entity: midpoint
36762                   },
36763                   geometry: {
36764                       type: 'Point',
36765                       coordinates: midpoint.loc
36766                   }
36767               };
36768           });
36769
36770           var targets = selection.selectAll('.midpoint.target')
36771               .filter(function(d) { return filter(d.properties.entity); })
36772               .data(data, function key(d) { return d.id; });
36773
36774           // exit
36775           targets.exit()
36776               .remove();
36777
36778           // enter/update
36779           targets.enter()
36780               .append('circle')
36781               .attr('r', targetRadius)
36782               .merge(targets)
36783               .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
36784               .attr('transform', getTransform);
36785       }
36786
36787
36788       function drawMidpoints(selection, graph, entities, filter, extent) {
36789           var layer = selection.selectAll('.layer-points .layer-points-midpoints');
36790
36791           var mode = context.mode();
36792           if (mode && mode.id !== 'select') {
36793               layer.selectAll('g.midpoint')
36794                   .remove();
36795
36796               selection.selectAll('.layer-points .layer-points-targets .midpoint.target')
36797                   .remove();
36798
36799               return;
36800           }
36801
36802           var poly = extent.polygon();
36803           var midpoints = {};
36804
36805           for (var i = 0; i < entities.length; i++) {
36806               var entity = entities[i];
36807
36808               if (entity.type !== 'way')
36809                   continue;
36810               if (!filter(entity))
36811                   continue;
36812               if (context.selectedIDs().indexOf(entity.id) < 0)
36813                   continue;
36814
36815               var nodes = graph.childNodes(entity);
36816               for (var j = 0; j < nodes.length - 1; j++) {
36817
36818                   var a = nodes[j];
36819                   var b = nodes[j + 1];
36820                   var id = [a.id, b.id].sort().join('-');
36821
36822                   if (midpoints[id]) {
36823                       midpoints[id].parents.push(entity);
36824                   } else {
36825                       if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
36826                           var point = geoVecInterp(a.loc, b.loc, 0.5);
36827                           var loc = null;
36828
36829                           if (extent.intersects(point)) {
36830                               loc = point;
36831                           } else {
36832                               for (var k = 0; k < 4; k++) {
36833                                   point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
36834                                   if (point &&
36835                                       geoVecLength(projection(a.loc), projection(point)) > 20 &&
36836                                       geoVecLength(projection(b.loc), projection(point)) > 20)
36837                                   {
36838                                       loc = point;
36839                                       break;
36840                                   }
36841                               }
36842                           }
36843
36844                           if (loc) {
36845                               midpoints[id] = {
36846                                   type: 'midpoint',
36847                                   id: id,
36848                                   loc: loc,
36849                                   edge: [a.id, b.id],
36850                                   parents: [entity]
36851                               };
36852                           }
36853                       }
36854                   }
36855               }
36856           }
36857
36858
36859           function midpointFilter(d) {
36860               if (midpoints[d.id])
36861                   return true;
36862
36863               for (var i = 0; i < d.parents.length; i++) {
36864                   if (filter(d.parents[i])) {
36865                       return true;
36866                   }
36867               }
36868
36869               return false;
36870           }
36871
36872
36873           var groups = layer
36874               .selectAll('g.midpoint')
36875               .filter(midpointFilter)
36876               .data(values$1(midpoints), function(d) { return d.id; });
36877
36878           groups.exit()
36879               .remove();
36880
36881           var enter = groups.enter()
36882               .insert('g', ':first-child')
36883               .attr('class', 'midpoint');
36884
36885           enter
36886               .append('polygon')
36887               .attr('points', '-6,8 10,0 -6,-8')
36888               .attr('class', 'shadow');
36889
36890           enter
36891               .append('polygon')
36892               .attr('points', '-3,4 5,0 -3,-4')
36893               .attr('class', 'fill');
36894
36895           groups = groups
36896               .merge(enter)
36897               .attr('transform', function(d) {
36898                   var translate = svgPointTransform(projection);
36899                   var a = graph.entity(d.edge[0]);
36900                   var b = graph.entity(d.edge[1]);
36901                   var angle = geoAngle(a, b, projection) * (180 / Math.PI);
36902                   return translate(d) + ' rotate(' + angle + ')';
36903               })
36904               .call(svgTagClasses().tags(
36905                   function(d) { return d.parents[0].tags; }
36906               ));
36907
36908           // Propagate data bindings.
36909           groups.select('polygon.shadow');
36910           groups.select('polygon.fill');
36911
36912
36913           // Draw touch targets..
36914           selection.selectAll('.layer-points .layer-points-targets')
36915               .call(drawTargets, graph, values$1(midpoints), midpointFilter);
36916       }
36917
36918       return drawMidpoints;
36919   }
36920
36921   // Touch targets control which other vertices we can drag a vertex onto.
36922   //
36923   // - the activeID - nope
36924   // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
36925   // - 2 away from the activeID - nope (would create a self intersecting segment)
36926   // - all others on a linear way - yes
36927   // - all others on a closed way - nope (would create a self intersecting polygon)
36928   //
36929   // returns
36930   // 0 = active vertex - no touch/connect
36931   // 1 = passive vertex - yes touch/connect
36932   // 2 = adjacent vertex - yes but pay attention segmenting a line here
36933   //
36934   function svgPassiveVertex(node, graph, activeID) {
36935       if (!activeID) return 1;
36936       if (activeID === node.id) return 0;
36937
36938       var parents = graph.parentWays(node);
36939
36940       for (var i = 0; i < parents.length; i++) {
36941           var nodes = parents[i].nodes;
36942           var isClosed = parents[i].isClosed();
36943           for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
36944               if (nodes[j] === node.id) {
36945                   var ix1 = j - 2;
36946                   var ix2 = j - 1;
36947                   var ix3 = j + 1;
36948                   var ix4 = j + 2;
36949
36950                   if (isClosed) {  // wraparound if needed
36951                       var max = nodes.length - 1;
36952                       if (ix1 < 0)   ix1 = max + ix1;
36953                       if (ix2 < 0)   ix2 = max + ix2;
36954                       if (ix3 > max) ix3 = ix3 - max;
36955                       if (ix4 > max) ix4 = ix4 - max;
36956                   }
36957
36958                   if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
36959                   else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
36960                   else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
36961                   else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
36962                   else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
36963               }
36964           }
36965       }
36966
36967       return 1;   // ok
36968   }
36969
36970
36971   function svgOneWaySegments(projection$$1, graph, dt) {
36972       return function(entity) {
36973           var i = 0;
36974           var offset = dt;
36975           var segments = [];
36976           var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
36977           var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
36978           var a, b;
36979
36980           if (entity.tags.oneway === '-1') {
36981               coordinates.reverse();
36982           }
36983
36984           var isReversible = (entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating');
36985
36986           geoStream({
36987               type: 'LineString',
36988               coordinates: coordinates
36989           }, projection$$1.stream(clip({
36990               lineStart: function() {},
36991               lineEnd: function() { a = null; },
36992               point: function(x, y) {
36993                   b = [x, y];
36994
36995                   if (a) {
36996                       var span = geoVecLength(a, b) - offset;
36997
36998                       if (span >= 0) {
36999                           var heading = geoVecAngle(a, b);
37000                           var dx = dt * Math.cos(heading);
37001                           var dy = dt * Math.sin(heading);
37002                           var p = [
37003                               a[0] + offset * Math.cos(heading),
37004                               a[1] + offset * Math.sin(heading)
37005                           ];
37006
37007                           // gather coordinates
37008                           var coord = [a, p];
37009                           for (span -= dt; span >= 0; span -= dt) {
37010                               p = geoVecAdd(p, [dx, dy]);
37011                               coord.push(p);
37012                           }
37013                           coord.push(b);
37014
37015                           // generate svg paths
37016                           var segment = '';
37017                           var j;
37018
37019                           for (j = 0; j < coord.length; j++) {
37020                               segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37021                           }
37022                           segments.push({ id: entity.id, index: i++, d: segment });
37023
37024                           if (isReversible) {
37025                               segment = '';
37026                               for (j = coord.length - 1; j >= 0; j--) {
37027                                   segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37028                               }
37029                               segments.push({ id: entity.id, index: i++, d: segment });
37030                           }
37031                       }
37032
37033                       offset = -span;
37034                   }
37035
37036                   a = b;
37037               }
37038           })));
37039
37040           return segments;
37041       };
37042   }
37043
37044
37045   function svgPath(projection$$1, graph, isArea) {
37046
37047       // Explanation of magic numbers:
37048       // "padding" here allows space for strokes to extend beyond the viewport,
37049       // so that the stroke isn't drawn along the edge of the viewport when
37050       // the shape is clipped.
37051       //
37052       // When drawing lines, pad viewport by 5px.
37053       // When drawing areas, pad viewport by 65px in each direction to allow
37054       // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
37055
37056       var cache = {};
37057       var padding = isArea ? 65 : 5;
37058       var viewport = projection$$1.clipExtent();
37059       var paddedExtent = [
37060           [viewport[0][0] - padding, viewport[0][1] - padding],
37061           [viewport[1][0] + padding, viewport[1][1] + padding]
37062       ];
37063       var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
37064       var project = projection$$1.stream;
37065       var path = d3_geoPath()
37066           .projection({stream: function(output) { return project(clip(output)); }});
37067
37068       var svgpath = function(entity) {
37069           if (entity.id in cache) {
37070               return cache[entity.id];
37071           } else {
37072               return cache[entity.id] = path(entity.asGeoJSON(graph));
37073           }
37074       };
37075
37076       svgpath.geojson = function(d) {
37077           if (d.__featurehash__ !== undefined) {
37078               if (d.__featurehash__ in cache) {
37079                   return cache[d.__featurehash__];
37080               } else {
37081                   return cache[d.__featurehash__] = path(d);
37082               }
37083           } else {
37084               return path(d);
37085           }
37086       };
37087
37088       return svgpath;
37089   }
37090
37091
37092   function svgPointTransform(projection$$1) {
37093       var svgpoint = function(entity) {
37094           // http://jsperf.com/short-array-join
37095           var pt = projection$$1(entity.loc);
37096           return 'translate(' + pt[0] + ',' + pt[1] + ')';
37097       };
37098
37099       svgpoint.geojson = function(d) {
37100           return svgpoint(d.properties.entity);
37101       };
37102
37103       return svgpoint;
37104   }
37105
37106
37107   function svgRelationMemberTags(graph) {
37108       return function(entity) {
37109           var tags = entity.tags;
37110           graph.parentRelations(entity).forEach(function(relation) {
37111               var type = relation.tags.type;
37112               if (type === 'multipolygon' || type === 'boundary') {
37113                   tags = assignIn({}, relation.tags, tags);
37114               }
37115           });
37116           return tags;
37117       };
37118   }
37119
37120
37121   function svgSegmentWay(way, graph, activeID) {
37122       var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
37123       var features = { passive: [], active: [] };
37124       var start = {};
37125       var end = {};
37126       var node, type;
37127
37128       for (var i = 0; i < way.nodes.length; i++) {
37129           node = graph.entity(way.nodes[i]);
37130           type = svgPassiveVertex(node, graph, activeID);
37131           end = { node: node, type: type };
37132
37133           if (start.type !== undefined) {
37134               if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
37135                   pushActive(start, end, i);
37136               } else if (start.type === 0 && end.type === 0) {   // both active vertices
37137                   pushActive(start, end, i);
37138               } else {
37139                   pushPassive(start, end, i);
37140               }
37141           }
37142
37143           start = end;
37144       }
37145
37146       return features;
37147
37148
37149       function pushActive(start, end, index) {
37150           features.active.push({
37151               type: 'Feature',
37152               id: way.id + '-' + index + '-nope',
37153               properties: {
37154                   nope: true,
37155                   target: true,
37156                   entity: way,
37157                   nodes: [start.node, end.node],
37158                   index: index
37159               },
37160               geometry: {
37161                   type: 'LineString',
37162                   coordinates: [start.node.loc, end.node.loc]
37163               }
37164           });
37165       }
37166
37167       function pushPassive(start, end, index) {
37168           features.passive.push({
37169               type: 'Feature',
37170               id: way.id + '-' + index,
37171               properties: {
37172                   target: true,
37173                   entity: way,
37174                   nodes: [start.node, end.node],
37175                   index: index
37176               },
37177               geometry: {
37178                   type: 'LineString',
37179                   coordinates: [start.node.loc, end.node.loc]
37180               }
37181           });
37182       }
37183   }
37184
37185   function svgPoints$$1(projection, context) {
37186
37187       function markerPath(selection, klass) {
37188           selection
37189               .attr('class', klass)
37190               .attr('transform', 'translate(-8, -23)')
37191               .attr('d', 'M 17,8 C 17,13 11,21 8.5,23.5 C 6,21 0,13 0,8 C 0,4 4,-0.5 8.5,-0.5 C 13,-0.5 17,4 17,8 z');
37192       }
37193
37194       function sortY(a, b) {
37195           return b.loc[1] - a.loc[1];
37196       }
37197
37198
37199       // Avoid exit/enter if we're just moving stuff around.
37200       // The node will get a new version but we only need to run the update selection.
37201       function fastEntityKey(d) {
37202           var mode = context.mode();
37203           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
37204           return isMoving ? d.id : osmEntity$$1.key(d);
37205       }
37206
37207
37208       function drawTargets(selection, graph, entities, filter) {
37209           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37210           var getTransform = svgPointTransform(projection).geojson;
37211           var activeID = context.activeID();
37212           var data = [];
37213
37214           entities.forEach(function(node) {
37215               if (activeID === node.id) return;   // draw no target on the activeID
37216
37217               data.push({
37218                   type: 'Feature',
37219                   id: node.id,
37220                   properties: {
37221                       target: true,
37222                       entity: node
37223                   },
37224                   geometry: node.asGeoJSON()
37225               });
37226           });
37227
37228           var targets = selection.selectAll('.point.target')
37229               .filter(function(d) { return filter(d.properties.entity); })
37230               .data(data, function key(d) { return d.id; });
37231
37232           // exit
37233           targets.exit()
37234               .remove();
37235
37236           // enter/update
37237           targets.enter()
37238               .append('rect')
37239               .attr('x', -10)
37240               .attr('y', -26)
37241               .attr('width', 20)
37242               .attr('height', 30)
37243               .merge(targets)
37244               .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
37245               .attr('transform', getTransform);
37246       }
37247
37248
37249       function drawPoints(selection, graph, entities, filter) {
37250           var wireframe = context.surface().classed('fill-wireframe');
37251           var zoom = geoScaleToZoom(projection.scale());
37252
37253           // points with a direction will render as vertices at higher zooms
37254           function renderAsPoint(entity) {
37255               return entity.geometry(graph) === 'point' &&
37256                   !(zoom >= 18 && entity.directions(graph, projection).length);
37257           }
37258
37259           // all points will render as vertices in wireframe mode too
37260           var points = wireframe ? [] : entities.filter(renderAsPoint);
37261
37262           points.sort(sortY);
37263
37264
37265           var layer = selection.selectAll('.layer-points .layer-points-points');
37266
37267           var groups = layer.selectAll('g.point')
37268               .filter(filter)
37269               .data(points, fastEntityKey);
37270
37271           groups.exit()
37272               .remove();
37273
37274           var enter = groups.enter()
37275               .append('g')
37276               .attr('class', function(d) { return 'node point ' + d.id; })
37277               .order();
37278
37279           enter
37280               .append('path')
37281               .call(markerPath, 'shadow');
37282
37283           enter
37284               .append('ellipse')
37285               .attr('cx', 0.5)
37286               .attr('cy', 1)
37287               .attr('rx', 6.5)
37288               .attr('ry', 3)
37289               .attr('class', 'stroke');
37290
37291           enter
37292               .append('path')
37293               .call(markerPath, 'stroke');
37294
37295           enter
37296               .append('use')
37297               .attr('transform', 'translate(-5, -19)')
37298               .attr('class', 'icon')
37299               .attr('width', '11px')
37300               .attr('height', '11px');
37301
37302           groups = groups
37303               .merge(enter)
37304               .attr('transform', svgPointTransform(projection))
37305               .call(svgTagClasses());
37306
37307           // Selecting the following implicitly
37308           // sets the data (point entity) on the element
37309           groups.select('.shadow');
37310           groups.select('.stroke');
37311           groups.select('.icon')
37312               .attr('xlink:href', function(entity) {
37313                   var preset = context.presets().match(entity, graph);
37314                   var picon = preset && preset.icon;
37315
37316                   if (!picon)
37317                       return '';
37318                   else {
37319                       var isMaki = /^maki-/.test(picon);
37320                       return '#' + picon + (isMaki ? '-11' : '');
37321                   }
37322               });
37323
37324
37325           // touch targets
37326           selection.selectAll('.layer-points .layer-points-targets')
37327               .call(drawTargets, graph, points, filter);
37328       }
37329
37330
37331       return drawPoints;
37332   }
37333
37334   function svgTagClasses() {
37335       var primaries = [
37336           'building', 'highway', 'railway', 'waterway', 'aeroway',
37337           'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
37338           'leisure', 'military', 'place', 'man_made'
37339       ];
37340       var statuses = [
37341           'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
37342           'razed', 'demolished', 'obliterated', 'intermittent'
37343       ];
37344       var secondaries = [
37345           'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
37346           'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
37347           'public_transport'
37348       ];
37349       var tagClassRe = /^tag-/;
37350       var _tags = function(entity) { return entity.tags; };
37351
37352
37353       var tagClasses = function(selection$$1) {
37354           selection$$1.each(function tagClassesEach(entity) {
37355               var value = this.className;
37356               var classes, primary, status;
37357
37358               if (value.baseVal !== undefined) value = value.baseVal;
37359
37360               classes = value.trim().split(/\s+/).filter(function(name) {
37361                   return name.length && !tagClassRe.test(name);
37362               }).join(' ');
37363
37364               var t = _tags(entity), i, k, v;
37365
37366               // pick at most one primary classification tag..
37367               for (i = 0; i < primaries.length; i++) {
37368                   k = primaries[i];
37369                   v = t[k];
37370                   if (!v || v === 'no') continue;
37371
37372                   primary = k;
37373                   if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
37374                       status = v;
37375                       classes += ' tag-' + k;
37376                   } else {
37377                       classes += ' tag-' + k + ' tag-' + k + '-' + v;
37378                   }
37379
37380                   break;
37381               }
37382
37383               // add at most one status tag, only if relates to primary tag..
37384               if (!status) {
37385                   for (i = 0; i < statuses.length; i++) {
37386                       k = statuses[i];
37387                       v = t[k];
37388                       if (!v || v === 'no') continue;
37389
37390                       if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
37391                           status = k;
37392                       }
37393                       else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
37394                           status = k;
37395                       } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
37396                           status = k;
37397                           primary = v;
37398                           classes += ' tag-' + v;
37399                       }  // else ignore e.g.  `highway=path + abandoned=railway`
37400
37401                       if (status) break;
37402                   }
37403               }
37404
37405               if (status) {
37406                   classes += ' tag-status tag-status-' + status;
37407               }
37408
37409               // add any secondary (structure) tags
37410               for (i = 0; i < secondaries.length; i++) {
37411                   k = secondaries[i];
37412                   v = t[k];
37413                   if (!v || v === 'no') continue;
37414                   classes += ' tag-' + k + ' tag-' + k + '-' + v;
37415               }
37416
37417               // For highways, look for surface tagging..
37418               if (primary === 'highway') {
37419                   var paved = (t.highway !== 'track');
37420                   for (k in t) {
37421                       v = t[k];
37422                       if (k in osmPavedTags) {
37423                           paved = !!osmPavedTags[k][v];
37424                           break;
37425                       }
37426                   }
37427                   if (!paved) {
37428                       classes += ' tag-unpaved';
37429                   }
37430               }
37431
37432               classes = classes.trim();
37433
37434               if (classes !== value) {
37435                   select(this).attr('class', classes);
37436               }
37437           });
37438       };
37439
37440
37441       tagClasses.tags = function(_) {
37442           if (!arguments.length) return _tags;
37443           _tags = _;
37444           return tagClasses;
37445       };
37446
37447       return tagClasses;
37448   }
37449
37450   function svgTurns(projection) {
37451
37452       return function drawTurns(selection, graph, turns) {
37453
37454           function icon(turn) {
37455               var u = turn.u ? '-u' : '';
37456               if (turn.no) return '#iD-turn-no' + u;
37457               if (turn.only) return '#iD-turn-only' + u;
37458               return '#iD-turn-yes' + u;
37459           }
37460
37461           var layer = selection.selectAll('.data-layer-osm').selectAll('.layer-turns')
37462               .data([0]);
37463
37464           layer = layer.enter()
37465               .append('g')
37466               .attr('class', 'layer-osm layer-turns')
37467               .merge(layer);
37468
37469
37470           var groups = layer.selectAll('g.turn')
37471               .data(turns, function(d) { return d.key; });
37472
37473           groups.exit()
37474               .remove();
37475
37476
37477           var enter = groups.enter()
37478               .append('g')
37479               .attr('class', function(d) { return 'turn ' + d.key; });
37480
37481           var nEnter = enter
37482               .filter(function(d) { return !d.u; });
37483
37484           nEnter.append('rect')
37485               .attr('transform', 'translate(-22, -12)')
37486               .attr('width', '44')
37487               .attr('height', '24');
37488
37489           nEnter.append('use')
37490               .attr('transform', 'translate(-22, -12)')
37491               .attr('width', '44')
37492               .attr('height', '24');
37493
37494
37495           var uEnter = enter
37496               .filter(function(d) { return d.u; });
37497
37498           uEnter.append('circle')
37499               .attr('r', '16');
37500
37501           uEnter.append('use')
37502               .attr('transform', 'translate(-16, -16)')
37503               .attr('width', '32')
37504               .attr('height', '32');
37505
37506
37507           groups = groups
37508               .merge(enter);
37509
37510           groups
37511               .attr('opacity', function(d) {
37512                   return d.direct === false ? '0.7' : null;
37513               })
37514               .attr('transform', function(d) {
37515                   var pxRadius = 50;
37516                   var toWay = graph.entity(d.to.way);
37517                   var toPoints = graph.childNodes(toWay)
37518                       .map(function (n) { return n.loc; })
37519                       .map(projection);
37520                   var toLength = geoPathLength(toPoints);
37521                   var mid = toLength / 2;    // midpoint of destination way
37522
37523                   var toNode = graph.entity(d.to.node);
37524                   var toVertex = graph.entity(d.to.vertex);
37525                   var a = geoAngle(toVertex, toNode, projection);
37526                   var o = projection(toVertex.loc);
37527                   var r = d.u ? 0                  // u-turn: no radius
37528                       : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
37529                       : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
37530
37531                   return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
37532                       'rotate(' + a * 180 / Math.PI + ')';
37533               });
37534
37535           groups.select('use')
37536               .attr('xlink:href', icon);
37537
37538           groups.select('rect');
37539           groups.select('circle');
37540
37541           return this;
37542       };
37543   }
37544
37545   function svgVertices$$1(projection, context) {
37546       var radiuses = {
37547           //       z16-, z17,   z18+,  w/icon
37548           shadow: [6,    7.5,   7.5,   12],
37549           stroke: [2.5,  3.5,   3.5,   8],
37550           fill:   [1,    1.5,   1.5,   1.5]
37551       };
37552
37553       var _currHoverTarget;
37554       var _currPersistent = {};
37555       var _currHover = {};
37556       var _prevHover = {};
37557       var _currSelected = {};
37558       var _prevSelected = {};
37559       var _radii = {};
37560
37561
37562       function sortY(a, b) {
37563           return b.loc[1] - a.loc[1];
37564       }
37565
37566       // Avoid exit/enter if we're just moving stuff around.
37567       // The node will get a new version but we only need to run the update selection.
37568       function fastEntityKey(d) {
37569           var mode = context.mode();
37570           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
37571           return isMoving ? d.id : osmEntity$$1.key(d);
37572       }
37573
37574
37575       function draw(selection$$1, graph, vertices, sets, filter) {
37576           sets = sets || { selected: {}, important: {}, hovered: {} };
37577
37578           var icons = {};
37579           var directions = {};
37580           var wireframe = context.surface().classed('fill-wireframe');
37581           var zoom = geoScaleToZoom(projection.scale());
37582           var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
37583
37584
37585           function getIcon(d) {
37586               // always check latest entity, as fastEntityKey avoids enter/exit now
37587               var entity = graph.entity(d.id);
37588               if (entity.id in icons) return icons[entity.id];
37589
37590               icons[entity.id] =
37591                   entity.hasInterestingTags() &&
37592                   context.presets().match(entity, graph).icon;
37593               return icons[entity.id];
37594           }
37595
37596
37597           // memoize directions results, return false for empty arrays (for use in filter)
37598           function getDirections(entity) {
37599               if (entity.id in directions) return directions[entity.id];
37600
37601               var angles = entity.directions(graph, projection);
37602               directions[entity.id] = angles.length ? angles : false;
37603               return angles;
37604           }
37605
37606
37607           function updateAttributes(selection$$1) {
37608               ['shadow', 'stroke', 'fill'].forEach(function(klass) {
37609                   var rads = radiuses[klass];
37610                   selection$$1.selectAll('.' + klass)
37611                       .each(function(entity) {
37612                           var i = z && getIcon(entity);
37613                           var r = rads[i ? 3 : z];
37614
37615                           // slightly increase the size of unconnected endpoints #3775
37616                           if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
37617                               r += 1.5;
37618                           }
37619
37620                           if (klass === 'shadow') {   // remember this value, so we don't need to
37621                               _radii[entity.id] = r;  // recompute it when we draw the touch targets
37622                           }
37623
37624                           select(this)
37625                               .attr('r', r)
37626                               .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
37627                       });
37628               });
37629           }
37630
37631           vertices.sort(sortY);
37632
37633           var groups = selection$$1.selectAll('g.vertex')
37634               .filter(filter)
37635               .data(vertices, fastEntityKey);
37636
37637           // exit
37638           groups.exit()
37639               .remove();
37640
37641           // enter
37642           var enter = groups.enter()
37643               .append('g')
37644               .attr('class', function(d) { return 'node vertex ' + d.id; })
37645               .order();
37646
37647           enter
37648               .append('circle')
37649               .attr('class', 'shadow');
37650
37651           enter
37652               .append('circle')
37653               .attr('class', 'stroke');
37654
37655           // Vertices with tags get a fill.
37656           enter.filter(function(d) { return d.hasInterestingTags(); })
37657               .append('circle')
37658               .attr('class', 'fill');
37659
37660           // update
37661           groups = groups
37662               .merge(enter)
37663               .attr('transform', svgPointTransform(projection))
37664               .classed('sibling', function(d) { return d.id in sets.selected; })
37665               .classed('shared', function(d) { return graph.isShared(d); })
37666               .classed('endpoint', function(d) { return d.isEndpoint(graph); })
37667               .call(updateAttributes);
37668
37669
37670           // Vertices with icons get a `use`.
37671           var iconUse = groups
37672               .selectAll('.icon')
37673               .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
37674
37675           // exit
37676           iconUse.exit()
37677               .remove();
37678
37679           // enter
37680           iconUse.enter()
37681               .append('use')
37682               .attr('class', 'icon')
37683               .attr('width', '11px')
37684               .attr('height', '11px')
37685               .attr('transform', 'translate(-5.5, -5.5)')
37686               .attr('xlink:href', function(d) {
37687                   var picon = getIcon(d);
37688                   var isMaki = /^maki-/.test(picon);
37689                   return '#' + picon + (isMaki ? '-11' : '');
37690               });
37691
37692
37693           // Vertices with directions get viewfields
37694           var dgroups = groups
37695               .selectAll('.viewfieldgroup')
37696               .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
37697
37698           // exit
37699           dgroups.exit()
37700               .remove();
37701
37702           // enter/update
37703           dgroups = dgroups.enter()
37704               .insert('g', '.shadow')
37705               .attr('class', 'viewfieldgroup')
37706               .merge(dgroups);
37707
37708           var viewfields = dgroups.selectAll('.viewfield')
37709               .data(getDirections, function key(d) { return osmEntity$$1.key(d); });
37710
37711           // exit
37712           viewfields.exit()
37713               .remove();
37714
37715           // enter/update
37716           viewfields.enter()
37717               .append('path')
37718               .attr('class', 'viewfield')
37719               .attr('d', 'M0,0H0')
37720               .merge(viewfields)
37721               .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
37722               .attr('transform', function(d) { return 'rotate(' + d + ')'; });
37723       }
37724
37725
37726       function drawTargets(selection$$1, graph, entities, filter) {
37727           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37728           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
37729           var getTransform = svgPointTransform(projection).geojson;
37730           var activeID = context.activeID();
37731           var data = { targets: [], nopes: [] };
37732
37733           entities.forEach(function(node) {
37734               if (activeID === node.id) return;   // draw no target on the activeID
37735
37736               var vertexType = svgPassiveVertex(node, graph, activeID);
37737               if (vertexType !== 0) {     // passive or adjacent - allow to connect
37738                   data.targets.push({
37739                       type: 'Feature',
37740                       id: node.id,
37741                       properties: {
37742                           target: true,
37743                           entity: node
37744                       },
37745                       geometry: node.asGeoJSON()
37746                   });
37747               } else {
37748                   data.nopes.push({
37749                       type: 'Feature',
37750                       id: node.id + '-nope',
37751                       properties: {
37752                           nope: true,
37753                           target: true,
37754                           entity: node
37755                       },
37756                       geometry: node.asGeoJSON()
37757                   });
37758               }
37759           });
37760
37761
37762           // Targets allow hover and vertex snapping
37763           var targets = selection$$1.selectAll('.vertex.target-allowed')
37764               .filter(function(d) { return filter(d.properties.entity); })
37765               .data(data.targets, function key(d) { return d.id; });
37766
37767           // exit
37768           targets.exit()
37769               .remove();
37770
37771           // enter/update
37772           targets.enter()
37773               .append('circle')
37774               .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
37775               .merge(targets)
37776               .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
37777               .attr('transform', getTransform);
37778
37779
37780           // NOPE
37781           var nopes = selection$$1.selectAll('.vertex.target-nope')
37782               .filter(function(d) { return filter(d.properties.entity); })
37783               .data(data.nopes, function key(d) { return d.id; });
37784
37785           // exit
37786           nopes.exit()
37787               .remove();
37788
37789           // enter/update
37790           nopes.enter()
37791               .append('circle')
37792               .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
37793               .merge(nopes)
37794               .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
37795               .attr('transform', getTransform);
37796       }
37797
37798
37799       // Points can also render as vertices:
37800       // 1. in wireframe mode or
37801       // 2. at higher zooms if they have a direction
37802       function renderAsVertex(entity, graph, wireframe, zoom) {
37803           var geometry = entity.geometry(graph);
37804           return geometry === 'vertex' || (geometry === 'point' && (
37805               wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
37806           ));
37807       }
37808
37809
37810       function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
37811           var results = {};
37812
37813           function addChildVertices(entity) {
37814               var geometry = entity.geometry(graph);
37815               if (!context.features().isHiddenFeature(entity, graph, geometry)) {
37816                   var i;
37817                   if (entity.type === 'way') {
37818                       for (i = 0; i < entity.nodes.length; i++) {
37819                           var child = graph.hasEntity(entity.nodes[i]);
37820                           if (child) {
37821                               addChildVertices(child);
37822                           }
37823                       }
37824                   } else if (entity.type === 'relation') {
37825                       for (i = 0; i < entity.members.length; i++) {
37826                           var member = graph.hasEntity(entity.members[i].id);
37827                           if (member) {
37828                               addChildVertices(member);
37829                           }
37830                       }
37831                   } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
37832                       results[entity.id] = entity;
37833                   }
37834               }
37835           }
37836
37837           ids.forEach(function(id) {
37838               var entity = graph.hasEntity(id);
37839               if (!entity) return;
37840
37841               if (entity.type === 'node') {
37842                   if (renderAsVertex(entity, graph, wireframe, zoom)) {
37843                       results[entity.id] = entity;
37844                       graph.parentWays(entity).forEach(function(entity) {
37845                           addChildVertices(entity);
37846                       });
37847                   }
37848               } else {  // way, relation
37849                   addChildVertices(entity);
37850               }
37851           });
37852
37853           return results;
37854       }
37855
37856
37857       function drawVertices(selection$$1, graph, entities, filter, extent, fullRedraw) {
37858           var wireframe = context.surface().classed('fill-wireframe');
37859           var zoom = geoScaleToZoom(projection.scale());
37860           var mode = context.mode();
37861           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
37862
37863           if (fullRedraw) {
37864               _currPersistent = {};
37865               _radii = {};
37866           }
37867
37868           // Collect important vertices from the `entities` list..
37869           // (during a paritial redraw, it will not contain everything)
37870           for (var i = 0; i < entities.length; i++) {
37871               var entity = entities[i];
37872               var geometry = entity.geometry(graph);
37873               var keep = false;
37874
37875               // a point that looks like a vertex..
37876               if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
37877                   _currPersistent[entity.id] = entity;
37878                   keep = true;
37879
37880               // a vertex of some importance..
37881               } else if (geometry === 'vertex' &&
37882                   (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
37883                   _currPersistent[entity.id] = entity;
37884                   keep = true;
37885               }
37886
37887               // whatever this is, it's not a persistent vertex..
37888               if (!keep && !fullRedraw) {
37889                   delete _currPersistent[entity.id];
37890               }
37891           }
37892
37893           // 3 sets of vertices to consider:
37894           var sets = {
37895               persistent: _currPersistent,  // persistent = important vertices (render always)
37896               selected: _currSelected,      // selected + siblings of selected (render always)
37897               hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
37898           };
37899
37900           var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
37901
37902           // Draw the vertices..
37903           // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
37904           // Adjust the filter function to expand the scope beyond whatever entities were passed in.
37905           var filterRendered = function(d) {
37906               return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
37907           };
37908           selection$$1.selectAll('.layer-points .layer-points-vertices')
37909               .call(draw, graph, currentVisible(all), sets, filterRendered);
37910
37911           // Draw touch targets..
37912           // When drawing, render all targets (not just those affected by a partial redraw)
37913           var filterTouch = function(d) {
37914               return isMoving ? true : filterRendered(d);
37915           };
37916           selection$$1.selectAll('.layer-points .layer-points-targets')
37917               .call(drawTargets, graph, currentVisible(all), filterTouch);
37918
37919
37920           function currentVisible(which) {
37921               return Object.keys(which)
37922                   .map(graph.hasEntity, graph)     // the current version of this entity
37923                   .filter(function (entity) { return entity && entity.intersects(extent, graph); });
37924           }
37925       }
37926
37927
37928       // partial redraw - only update the selected items..
37929       drawVertices.drawSelected = function(selection$$1, graph, extent) {
37930           var wireframe = context.surface().classed('fill-wireframe');
37931           var zoom = geoScaleToZoom(projection.scale());
37932
37933           _prevSelected = _currSelected || {};
37934           _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
37935
37936           // note that drawVertices will add `_currSelected` automatically if needed..
37937           var filter = function(d) { return d.id in _prevSelected; };
37938           drawVertices(selection$$1, graph, values$1(_prevSelected), filter, extent, false);
37939       };
37940
37941
37942       // partial redraw - only update the hovered items..
37943       drawVertices.drawHover = function(selection$$1, graph, target, extent) {
37944           if (target === _currHoverTarget) return;  // continue only if something changed
37945
37946           var wireframe = context.surface().classed('fill-wireframe');
37947           var zoom = geoScaleToZoom(projection.scale());
37948
37949           _prevHover = _currHover || {};
37950           _currHoverTarget = target;
37951           var entity = target && target.properties && target.properties.entity;
37952
37953           if (entity) {
37954               _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
37955           } else {
37956               _currHover = {};
37957           }
37958
37959           // note that drawVertices will add `_currHover` automatically if needed..
37960           var filter = function(d) { return d.id in _prevHover; };
37961           drawVertices(selection$$1, graph, values$1(_prevHover), filter, extent, false);
37962       };
37963
37964       return drawVertices;
37965   }
37966
37967   /* global Mapillary:false */
37968
37969
37970   var apibase = 'https://a.mapillary.com/v3/';
37971   var viewercss = 'mapillary-js/mapillary.min.css';
37972   var viewerjs = 'mapillary-js/mapillary.min.js';
37973   var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
37974   var maxResults = 1000;
37975   var tileZoom = 14;
37976   var tiler = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
37977   var dispatch$1 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
37978   var _mlyFallback = false;
37979   var _mlyCache;
37980   var _mlyClicks;
37981   var _mlySelectedImage;
37982   var _mlyViewer;
37983
37984
37985   function abortRequest(i) {
37986       i.abort();
37987   }
37988
37989
37990   function maxPageAtZoom(z) {
37991       if (z < 15)   return 2;
37992       if (z === 15) return 5;
37993       if (z === 16) return 10;
37994       if (z === 17) return 20;
37995       if (z === 18) return 40;
37996       if (z > 18)   return 80;
37997   }
37998
37999
38000   function loadTiles(which, url, projection) {
38001       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
38002       var tiles = tiler.getTiles(projection);
38003
38004       // abort inflight requests that are no longer needed
38005       var cache = _mlyCache[which];
38006       forEach(cache.inflight, function(v, k) {
38007           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
38008
38009           if (!wanted) {
38010               abortRequest(v);
38011               delete cache.inflight[k];
38012           }
38013       });
38014
38015       tiles.forEach(function(tile) {
38016           loadNextTilePage(which, currZoom, url, tile);
38017       });
38018   }
38019
38020
38021   function loadNextTilePage(which, currZoom, url, tile) {
38022       var cache = _mlyCache[which];
38023       var rect = tile.extent.rectangle();
38024       var maxPages = maxPageAtZoom(currZoom);
38025       var nextPage = cache.nextPage[tile.id] || 0;
38026       var nextURL = cache.nextURL[tile.id] || url +
38027           utilQsString({
38028               per_page: maxResults,
38029               page: nextPage,
38030               client_id: clientId,
38031               bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
38032           });
38033
38034       if (nextPage > maxPages) return;
38035
38036       var id = tile.id + ',' + String(nextPage);
38037       if (cache.loaded[id] || cache.inflight[id]) return;
38038       cache.inflight[id] = request(nextURL)
38039           .mimeType('application/json')
38040           .response(function(xhr) {
38041               var linkHeader = xhr.getResponseHeader('Link');
38042               if (linkHeader) {
38043                   var pagination = parsePagination(xhr.getResponseHeader('Link'));
38044                   if (pagination.next) {
38045                       cache.nextURL[tile.id] = pagination.next;
38046                   }
38047               }
38048               return JSON.parse(xhr.responseText);
38049           })
38050           .get(function(err, data) {
38051               cache.loaded[id] = true;
38052               delete cache.inflight[id];
38053               if (err || !data.features || !data.features.length) return;
38054
38055               var features = data.features.map(function(feature) {
38056                   var loc = feature.geometry.coordinates;
38057                   var d;
38058
38059                   if (which === 'images') {
38060                       d = {
38061                           loc: loc,
38062                           key: feature.properties.key,
38063                           ca: feature.properties.ca,
38064                           captured_at: feature.properties.captured_at,
38065                           captured_by: feature.properties.username,
38066                           pano: feature.properties.pano
38067                       };
38068                       cache.forImageKey[d.key] = d;     // cache imageKey -> image
38069
38070                   } else if (which === 'sequences') {
38071                       var sequenceKey = feature.properties.key;
38072                       cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
38073                       feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
38074                           cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
38075                       });
38076                       return false;  // because no `d` data worth loading into an rbush
38077
38078                   } else if (which === 'objects') {
38079                       d = {
38080                           loc: loc,
38081                           key: feature.properties.key,
38082                           value: feature.properties.value,
38083                           package: feature.properties.package,
38084                           detections: feature.properties.detections
38085                       };
38086
38087                       // cache imageKey -> detectionKey
38088                       feature.properties.detections.forEach(function(detection) {
38089                           var imageKey = detection.image_key;
38090                           var detectionKey = detection.detection_key;
38091                           if (!_mlyCache.detections[imageKey]) {
38092                               _mlyCache.detections[imageKey] = {};
38093                           }
38094                           if (!_mlyCache.detections[imageKey][detectionKey]) {
38095                               _mlyCache.detections[imageKey][detectionKey] = {};
38096                           }
38097                       });
38098                   }
38099
38100                   return {
38101                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
38102                   };
38103
38104               }).filter(Boolean);
38105
38106               cache.rtree.load(features);
38107
38108               if (which === 'images' || which === 'sequences') {
38109                   dispatch$1.call('loadedImages');
38110               } else if (which === 'objects') {
38111                   dispatch$1.call('loadedSigns');
38112               }
38113
38114               if (data.features.length === maxResults) {  // more pages to load
38115                   cache.nextPage[tile.id] = nextPage + 1;
38116                   loadNextTilePage(which, currZoom, url, tile);
38117               } else {
38118                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
38119               }
38120           });
38121   }
38122
38123   // extract links to pages of API results
38124   function parsePagination(links) {
38125       return links.split(',').map(function(rel) {
38126           var elements = rel.split(';');
38127           if (elements.length === 2) {
38128               return [
38129                   /<(.+)>/.exec(elements[0])[1],
38130                   /rel="(.+)"/.exec(elements[1])[1]
38131               ];
38132           } else {
38133               return ['',''];
38134           }
38135       }).reduce(function(pagination, val) {
38136           pagination[val[1]] = val[0];
38137           return pagination;
38138       }, {});
38139   }
38140
38141
38142   // partition viewport into `psize` x `psize` regions
38143   function partitionViewport(psize, projection) {
38144       var dimensions = projection.clipExtent()[1];
38145       psize = psize || 16;
38146       var cols = range(0, dimensions[0], psize);
38147       var rows = range(0, dimensions[1], psize);
38148       var partitions = [];
38149
38150       rows.forEach(function(y) {
38151           cols.forEach(function(x) {
38152               var min$$1 = [x, y + psize];
38153               var max$$1 = [x + psize, y];
38154               partitions.push(
38155                   geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
38156           });
38157       });
38158
38159       return partitions;
38160   }
38161
38162
38163   // no more than `limit` results per partition.
38164   function searchLimited(psize, limit, projection, rtree) {
38165       limit = limit || 3;
38166
38167       var partitions = partitionViewport(psize, projection);
38168       var results;
38169
38170       // console.time('previous');
38171       results =  flatten(map$3(partitions, function(extent$$1) {
38172           return rtree.search(extent$$1.bbox())
38173               .slice(0, limit)
38174               .map(function(d) { return d.data; });
38175       }));
38176       // console.timeEnd('previous');
38177
38178       // console.time('new');
38179       // results = partitions.reduce(function(result, extent) {
38180       //     var found = rtree.search(extent.bbox())
38181       //         .map(function(d) { return d.data; })
38182       //         .sort(function(a, b) {
38183       //             return a.loc[1] - b.loc[1];
38184       //             // return a.key.localeCompare(b.key);
38185       //         })
38186       //         .slice(0, limit);
38187
38188       //     return (found.length ? result.concat(found) : result);
38189       // }, []);
38190       // console.timeEnd('new');
38191
38192       return results;
38193   }
38194
38195
38196
38197   var serviceMapillary = {
38198
38199       init: function() {
38200           if (!_mlyCache) {
38201               this.reset();
38202           }
38203
38204           this.event = utilRebind(this, dispatch$1, 'on');
38205       },
38206
38207       reset: function() {
38208           var cache = _mlyCache;
38209
38210           if (cache) {
38211               if (cache.images && cache.images.inflight) {
38212                   forEach(cache.images.inflight, abortRequest);
38213               }
38214               if (cache.objects && cache.objects.inflight) {
38215                   forEach(cache.objects.inflight, abortRequest);
38216               }
38217               if (cache.sequences && cache.sequences.inflight) {
38218                   forEach(cache.sequences.inflight, abortRequest);
38219               }
38220           }
38221
38222           _mlyCache = {
38223               images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
38224               objects: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
38225               sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} },
38226               detections: {}
38227           };
38228
38229           _mlySelectedImage = null;
38230           _mlyClicks = [];
38231       },
38232
38233
38234       images: function(projection) {
38235           var psize = 16, limit = 3;
38236           return searchLimited(psize, limit, projection, _mlyCache.images.rtree);
38237       },
38238
38239
38240       signs: function(projection) {
38241           var psize = 32, limit = 3;
38242           return searchLimited(psize, limit, projection, _mlyCache.objects.rtree);
38243       },
38244
38245
38246       sequences: function(projection) {
38247           var viewport = projection.clipExtent();
38248           var min$$1 = [viewport[0][0], viewport[1][1]];
38249           var max$$1 = [viewport[1][0], viewport[0][1]];
38250           var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
38251           var sequenceKeys = {};
38252
38253           // all sequences for images in viewport
38254           _mlyCache.images.rtree.search(bbox)
38255               .forEach(function(d) {
38256                   var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
38257                   if (sequenceKey) {
38258                       sequenceKeys[sequenceKey] = true;
38259                   }
38260               });
38261
38262           // Return lineStrings for the sequences
38263           return Object.keys(sequenceKeys).map(function(sequenceKey) {
38264               return _mlyCache.sequences.lineString[sequenceKey];
38265           });
38266       },
38267
38268
38269       signsSupported: function() {
38270           return true;
38271       },
38272
38273
38274       loadImages: function(projection) {
38275           loadTiles('images', apibase + 'images?', projection);
38276           loadTiles('sequences', apibase + 'sequences?', projection);
38277       },
38278
38279
38280       loadSigns: function(context, projection) {
38281           // if we are looking at signs, we'll actually need to fetch images too
38282           loadTiles('images', apibase + 'images?', projection);
38283           loadTiles('objects', apibase + 'objects?', projection);
38284       },
38285
38286
38287       loadViewer: function(context) {
38288           // add mly-wrapper
38289           var wrap = select('#photoviewer').selectAll('.mly-wrapper')
38290               .data([0]);
38291
38292           wrap.enter()
38293               .append('div')
38294               .attr('id', 'mly')
38295               .attr('class', 'photo-wrapper mly-wrapper')
38296               .classed('hide', true);
38297
38298           // load mapillary-viewercss
38299           select('head').selectAll('#mapillary-viewercss')
38300               .data([0])
38301               .enter()
38302               .append('link')
38303               .attr('id', 'mapillary-viewercss')
38304               .attr('rel', 'stylesheet')
38305               .attr('href', context.asset(viewercss));
38306
38307           // load mapillary-viewerjs
38308           select('head').selectAll('#mapillary-viewerjs')
38309               .data([0])
38310               .enter()
38311               .append('script')
38312               .attr('id', 'mapillary-viewerjs')
38313               .attr('src', context.asset(viewerjs));
38314
38315           // load mapillary signs sprite
38316           var defs = context.container().select('defs');
38317           defs.call(svgDefs(context).addSprites, ['mapillary-sprite']);
38318
38319           // Register viewer resize handler
38320           context.ui().on('photoviewerResize', function() {
38321               if (_mlyViewer) {
38322                   _mlyViewer.resize();
38323               }
38324           });
38325       },
38326
38327
38328       showViewer: function() {
38329           var wrap = select('#photoviewer')
38330               .classed('hide', false);
38331
38332           var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
38333
38334           if (isHidden && _mlyViewer) {
38335               wrap
38336                   .selectAll('.photo-wrapper:not(.mly-wrapper)')
38337                   .classed('hide', true);
38338
38339               wrap
38340                   .selectAll('.photo-wrapper.mly-wrapper')
38341                   .classed('hide', false);
38342
38343               _mlyViewer.resize();
38344           }
38345
38346           return this;
38347       },
38348
38349
38350       hideViewer: function() {
38351           _mlySelectedImage = null;
38352
38353           if (!_mlyFallback && _mlyViewer) {
38354               _mlyViewer.getComponent('sequence').stop();
38355           }
38356
38357           var viewer = select('#photoviewer');
38358           if (!viewer.empty()) viewer.datum(null);
38359
38360           viewer
38361               .classed('hide', true)
38362               .selectAll('.photo-wrapper')
38363               .classed('hide', true);
38364
38365           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
38366               .classed('selected', false);
38367
38368           return this.setStyles(null, true);
38369       },
38370
38371
38372       parsePagination: parsePagination,
38373
38374
38375       updateViewer: function(imageKey, context) {
38376           if (!imageKey) return this;
38377
38378           if (!_mlyViewer) {
38379               this.initViewer(imageKey, context);
38380           } else {
38381               _mlyViewer.moveToKey(imageKey)
38382                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
38383           }
38384
38385           return this;
38386       },
38387
38388
38389       initViewer: function(imageKey, context) {
38390           var that = this;
38391           if (window.Mapillary && imageKey) {
38392               var opts = {
38393                   baseImageSize: 320,
38394                   component: {
38395                       cover: false,
38396                       keyboard: false,
38397                       tag: true
38398                   }
38399               };
38400
38401               // Disable components requiring WebGL support
38402               if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
38403                   _mlyFallback = true;
38404                   opts.component = {
38405                       cover: false,
38406                       direction: false,
38407                       imagePlane: false,
38408                       keyboard: false,
38409                       mouse: false,
38410                       sequence: false,
38411                       tag: false,
38412                       image: true,        // fallback
38413                       navigation: true    // fallback
38414                   };
38415               }
38416
38417               _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
38418               _mlyViewer.on('nodechanged', nodeChanged);
38419               _mlyViewer.on('bearingchanged', bearingChanged);
38420               _mlyViewer.moveToKey(imageKey)
38421                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
38422           }
38423
38424           // nodeChanged: called after the viewer has changed images and is ready.
38425           //
38426           // There is some logic here to batch up clicks into a _mlyClicks array
38427           // because the user might click on a lot of markers quickly and nodechanged
38428           // may be called out of order asychronously.
38429           //
38430           // Clicks are added to the array in `selectedImage` and removed here.
38431           //
38432           function nodeChanged(node) {
38433               if (!_mlyFallback) {
38434                   _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
38435               }
38436
38437               var clicks = _mlyClicks;
38438               var index = clicks.indexOf(node.key);
38439               var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
38440
38441               if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
38442                   clicks.splice(index, 1);   // remove the click
38443                   // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
38444                   // one more time to update the detections and attribution..
38445                   if (node.key === selectedKey) {
38446                       that.selectImage(_mlySelectedImage, node.key, true);
38447                   }
38448               } else {             // `nodechanged` initiated from the Mapillary viewer controls..
38449                   var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
38450                   context.map().centerEase(loc);
38451                   that.selectImage(undefined, node.key, true);
38452               }
38453           }
38454
38455           function bearingChanged(e) {
38456               dispatch$1.call('bearingChanged', undefined, e);
38457           }
38458       },
38459
38460
38461       // Pass the image datum itself in `d` or the `imageKey` string.
38462       // This allows images to be selected from places that dont have access
38463       // to the full image datum (like the street signs layer or the js viewer)
38464       selectImage: function(d, imageKey, fromViewer) {
38465           if (!d && imageKey) {
38466               // If the user clicked on something that's not an image marker, we
38467               // might get in here.. Cache lookup can fail, e.g. if the user
38468               // clicked a streetsign, but images are loading slowly asynchronously.
38469               // We'll try to carry on anyway if there is no datum.  There just
38470               // might be a delay before user sees detections, captured_at, etc.
38471               d = _mlyCache.images.forImageKey[imageKey];
38472           }
38473
38474           _mlySelectedImage = d;
38475           var viewer = select('#photoviewer');
38476           if (!viewer.empty()) viewer.datum(d);
38477
38478           imageKey = (d && d.key) || imageKey;
38479           if (!fromViewer && imageKey) {
38480               _mlyClicks.push(imageKey);
38481           }
38482
38483           this.setStyles(null, true);
38484
38485           d3_selectAll('.layer-mapillary-signs .icon-sign')
38486               .classed('selected', function(d) {
38487                   return some(d.detections, function(detection) {
38488                       return detection.image_key === imageKey;
38489                   });
38490               });
38491
38492           if (d) {
38493               this.updateDetections(d);
38494           }
38495
38496           return this;
38497       },
38498
38499
38500       getSelectedImage: function() {
38501           return _mlySelectedImage;
38502       },
38503
38504
38505       getSequenceKeyForImage: function(d) {
38506           var imageKey = d && d.key;
38507           return imageKey && _mlyCache.sequences.forImageKey[imageKey];
38508       },
38509
38510
38511       setStyles: function(hovered, reset) {
38512           if (reset) {  // reset all layers
38513               d3_selectAll('.viewfield-group')
38514                   .classed('highlighted', false)
38515                   .classed('hovered', false)
38516                   .classed('selected', false);
38517
38518               d3_selectAll('.sequence')
38519                   .classed('highlighted', false)
38520                   .classed('selected', false);
38521           }
38522
38523           var hoveredImageKey = hovered && hovered.key;
38524           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
38525           var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
38526           var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
38527
38528           var viewer = select('#photoviewer');
38529           var selected = viewer.empty() ? undefined : viewer.datum();
38530           var selectedImageKey = selected && selected.key;
38531           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
38532           var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
38533           var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
38534
38535           // highlight sibling viewfields on either the selected or the hovered sequences
38536           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
38537
38538           d3_selectAll('.layer-mapillary-images .viewfield-group')
38539               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
38540               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
38541               .classed('selected', function(d) { return d.key === selectedImageKey; });
38542
38543           d3_selectAll('.layer-mapillary-images .sequence')
38544               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
38545               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
38546
38547           // update viewfields if needed
38548           d3_selectAll('.viewfield-group .viewfield')
38549               .attr('d', viewfieldPath);
38550
38551           function viewfieldPath() {
38552               var d = this.parentNode.__data__;
38553               if (d.pano && d.key !== selectedImageKey) {
38554                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
38555               } else {
38556                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
38557               }
38558           }
38559
38560           return this;
38561       },
38562
38563
38564       updateDetections: function(d) {
38565           if (!_mlyViewer || _mlyFallback) return;
38566
38567           var imageKey = d && d.key;
38568           var detections = (imageKey && _mlyCache.detections[imageKey]) || [];
38569
38570           forEach(detections, function(data, k) {
38571               if (isEmpty(data)) {
38572                   loadDetection(k);
38573               } else {
38574                   var tag = makeTag(data);
38575                   if (tag) {
38576                       var tagComponent = _mlyViewer.getComponent('tag');
38577                       tagComponent.add([tag]);
38578                   }
38579               }
38580           });
38581
38582
38583           function loadDetection(detectionKey) {
38584               var url = apibase + 'detections/' +
38585                       detectionKey + '?' + utilQsString({ client_id: clientId });
38586
38587               request(url)
38588                   .mimeType('application/json')
38589                   .response(function(xhr) {
38590                       return JSON.parse(xhr.responseText);
38591                   })
38592                   .get(function(err, data) {
38593                       if (!data || !data.properties) return;
38594
38595                       var imageKey = data.properties.image_key;
38596                       _mlyCache.detections[imageKey][detectionKey] = data;
38597
38598                       var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
38599                       if (imageKey === selectedKey) {
38600                           var tag = makeTag(data);
38601                           if (tag) {
38602                               var tagComponent = _mlyViewer.getComponent('tag');
38603                               tagComponent.add([tag]);
38604                           }
38605                       }
38606                   });
38607           }
38608
38609
38610           function makeTag(data) {
38611               var valueParts = data.properties.value.split('--');
38612               if (valueParts.length !== 3) return;
38613
38614               var text = valueParts[1].replace(/-/g, ' ');
38615               var tag;
38616
38617               // Currently only two shapes <Polygon|Point>
38618               if (data.properties.shape.type === 'Polygon') {
38619                   var polygonGeometry = new Mapillary
38620                       .TagComponent
38621                       .PolygonGeometry(data.properties.shape.coordinates[0]);
38622
38623                   tag = new Mapillary.TagComponent.OutlineTag(
38624                       data.properties.key,
38625                       polygonGeometry,
38626                       {
38627                           text: text,
38628                           textColor: 0xffff00,
38629                           lineColor: 0xffff00,
38630                           lineWidth: 2,
38631                           fillColor: 0xffff00,
38632                           fillOpacity: 0.3,
38633                       }
38634                   );
38635
38636               } else if (data.properties.shape.type === 'Point') {
38637                   var pointGeometry = new Mapillary
38638                       .TagComponent
38639                       .PointGeometry(data.properties.shape.coordinates[0]);
38640
38641                   tag = new Mapillary.TagComponent.SpotTag(
38642                       data.properties.key,
38643                       pointGeometry,
38644                       {
38645                           text: text,
38646                           color: 0xffff00,
38647                           textColor: 0xffff00
38648                       }
38649                   );
38650               }
38651
38652               return tag;
38653           }
38654       },
38655
38656
38657       cache: function() {
38658           return _mlyCache;
38659       }
38660
38661   };
38662
38663   var apibase$1 = 'https://nominatim.openstreetmap.org/',
38664       inflight = {},
38665       nominatimCache;
38666
38667
38668   var serviceNominatim = {
38669
38670       init: function() {
38671           inflight = {};
38672           nominatimCache = rbush_1();
38673       },
38674
38675       reset: function() {
38676           forEach(inflight, function(req) { req.abort(); });
38677           inflight = {};
38678           nominatimCache = rbush_1();
38679       },
38680
38681
38682       countryCode: function (location, callback) {
38683           this.reverse(location, function(err, result) {
38684               if (err) {
38685                   return callback(err);
38686               } else if (result.address) {
38687                   return callback(null, result.address.country_code);
38688               } else {
38689                   return callback('Unable to geocode', null);
38690               }
38691           });
38692       },
38693
38694
38695       reverse: function (location, callback) {
38696           var cached = nominatimCache.search(
38697               { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
38698           );
38699
38700           if (cached.length > 0) {
38701               return callback(null, cached[0].data);
38702           }
38703
38704           var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
38705           var url = apibase$1 + 'reverse?' + utilQsString(params);
38706           if (inflight[url]) return;
38707
38708           inflight[url] = d3_json(url, function(err, result) {
38709               delete inflight[url];
38710
38711               if (err) {
38712                   return callback(err);
38713               } else if (result && result.error) {
38714                   return callback(result.error);
38715               }
38716
38717               var extent = geoExtent$$1(location).padByMeters(200);
38718               nominatimCache.insert(assign(extent.bbox(), {data: result}));
38719
38720               callback(null, result);
38721           });
38722       },
38723
38724
38725       search: function (val, callback) {
38726           var searchVal = encodeURIComponent(val);
38727           var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
38728           if (inflight[url]) return;
38729
38730           inflight[url] = d3_json(url, function(err, result) {
38731               delete inflight[url];
38732               callback(err, result);
38733           });
38734       }
38735
38736   };
38737
38738   var apibase$2 = 'https://openstreetcam.org';
38739   var maxResults$1 = 1000;
38740   var tileZoom$1 = 14;
38741   var tiler$1 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
38742   var dispatch$2 = dispatch('loadedImages');
38743   var imgZoom = d3_zoom()
38744       .extent([[0, 0], [320, 240]])
38745       .translateExtent([[0, 0], [320, 240]])
38746       .scaleExtent([1, 15])
38747       .on('zoom', zoomPan);
38748   var _oscCache;
38749   var _oscSelectedImage;
38750
38751
38752   function abortRequest$1(i) {
38753       i.abort();
38754   }
38755
38756
38757   function maxPageAtZoom$1(z) {
38758       if (z < 15)   return 2;
38759       if (z === 15) return 5;
38760       if (z === 16) return 10;
38761       if (z === 17) return 20;
38762       if (z === 18) return 40;
38763       if (z > 18)   return 80;
38764   }
38765
38766
38767   function loadTiles$1(which, url, projection) {
38768       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
38769       var tiles = tiler$1.getTiles(projection);
38770
38771       // abort inflight requests that are no longer needed
38772       var cache = _oscCache[which];
38773       forEach(cache.inflight, function(v, k) {
38774           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
38775
38776           if (!wanted) {
38777               abortRequest$1(v);
38778               delete cache.inflight[k];
38779           }
38780       });
38781
38782       tiles.forEach(function(tile) {
38783           loadNextTilePage$1(which, currZoom, url, tile);
38784       });
38785   }
38786
38787
38788   function loadNextTilePage$1(which, currZoom, url, tile) {
38789       var cache = _oscCache[which];
38790       var bbox = tile.extent.bbox();
38791       var maxPages = maxPageAtZoom$1(currZoom);
38792       var nextPage = cache.nextPage[tile.id] || 1;
38793       var params = utilQsString({
38794           ipp: maxResults$1,
38795           page: nextPage,
38796           // client_id: clientId,
38797           bbTopLeft: [bbox.maxY, bbox.minX].join(','),
38798           bbBottomRight: [bbox.minY, bbox.maxX].join(',')
38799       }, true);
38800
38801       if (nextPage > maxPages) return;
38802
38803       var id = tile.id + ',' + String(nextPage);
38804       if (cache.loaded[id] || cache.inflight[id]) return;
38805
38806       cache.inflight[id] = request(url)
38807           .mimeType('application/json')
38808           .header('Content-type', 'application/x-www-form-urlencoded')
38809           .response(function(xhr) { return JSON.parse(xhr.responseText); })
38810           .post(params, function(err, data) {
38811               cache.loaded[id] = true;
38812               delete cache.inflight[id];
38813               if (err || !data.currentPageItems || !data.currentPageItems.length) return;
38814
38815               function localeDateString(s) {
38816                   if (!s) return null;
38817                   var detected = utilDetect();
38818                   var options = { day: 'numeric', month: 'short', year: 'numeric' };
38819                   var d = new Date(s);
38820                   if (isNaN(d.getTime())) return null;
38821                   return d.toLocaleDateString(detected.locale, options);
38822               }
38823
38824               var features = data.currentPageItems.map(function(item) {
38825                   var loc = [+item.lng, +item.lat];
38826                   var d;
38827
38828                   if (which === 'images') {
38829                       d = {
38830                           loc: loc,
38831                           key: item.id,
38832                           ca: +item.heading,
38833                           captured_at: localeDateString(item.shot_date || item.date_added),
38834                           captured_by: item.username,
38835                           imagePath: item.lth_name,
38836                           sequence_id: item.sequence_id,
38837                           sequence_index: +item.sequence_index
38838                       };
38839
38840                       // cache sequence info
38841                       var seq = _oscCache.sequences[d.sequence_id];
38842                       if (!seq) {
38843                           seq = { rotation: 0, images: [] };
38844                           _oscCache.sequences[d.sequence_id] = seq;
38845                       }
38846                       seq.images[d.sequence_index] = d;
38847                   }
38848
38849                   return {
38850                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
38851                   };
38852               });
38853
38854               cache.rtree.load(features);
38855
38856               if (which === 'images') {
38857                   dispatch$2.call('loadedImages');
38858               }
38859
38860               if (data.currentPageItems.length === maxResults$1) {  // more pages to load
38861                   cache.nextPage[tile.id] = nextPage + 1;
38862                   loadNextTilePage$1(which, currZoom, url, tile);
38863               } else {
38864                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
38865               }
38866           });
38867   }
38868
38869
38870   // partition viewport into `psize` x `psize` regions
38871   function partitionViewport$1(psize, projection) {
38872       var dimensions = projection.clipExtent()[1];
38873       psize = psize || 16;
38874       var cols = range(0, dimensions[0], psize);
38875       var rows = range(0, dimensions[1], psize);
38876       var partitions = [];
38877
38878       rows.forEach(function(y) {
38879           cols.forEach(function(x) {
38880               var min$$1 = [x, y + psize];
38881               var max$$1 = [x + psize, y];
38882               partitions.push(
38883                   geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
38884           });
38885       });
38886
38887       return partitions;
38888   }
38889
38890
38891   // no more than `limit` results per partition.
38892   function searchLimited$1(psize, limit, projection, rtree) {
38893       limit = limit || 3;
38894
38895       var partitions = partitionViewport$1(psize, projection);
38896       var results;
38897
38898       results = flatten(map$3(partitions, function(extent$$1) {
38899           return rtree.search(extent$$1.bbox())
38900               .slice(0, limit)
38901               .map(function(d) { return d.data; });
38902       }));
38903       return results;
38904   }
38905
38906
38907   function zoomPan() {
38908       var t = event.transform;
38909       select('#photoviewer .osc-image-wrap')
38910           .call(utilSetTransform, t.x, t.y, t.k);
38911   }
38912
38913
38914   var serviceOpenstreetcam = {
38915
38916       init: function() {
38917           if (!_oscCache) {
38918               this.reset();
38919           }
38920
38921           this.event = utilRebind(this, dispatch$2, 'on');
38922       },
38923
38924       reset: function() {
38925           var cache = _oscCache;
38926
38927           if (cache) {
38928               if (cache.images && cache.images.inflight) {
38929                   forEach(cache.images.inflight, abortRequest$1);
38930               }
38931           }
38932
38933           _oscCache = {
38934               images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
38935               sequences: {}
38936           };
38937
38938           _oscSelectedImage = null;
38939       },
38940
38941
38942       images: function(projection) {
38943           var psize = 16, limit = 3;
38944           return searchLimited$1(psize, limit, projection, _oscCache.images.rtree);
38945       },
38946
38947
38948       sequences: function(projection) {
38949           var viewport = projection.clipExtent();
38950           var min$$1 = [viewport[0][0], viewport[1][1]];
38951           var max$$1 = [viewport[1][0], viewport[0][1]];
38952           var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
38953           var sequenceKeys = {};
38954
38955           // all sequences for images in viewport
38956           _oscCache.images.rtree.search(bbox)
38957               .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
38958
38959           // make linestrings from those sequences
38960           var lineStrings = [];
38961           Object.keys(sequenceKeys)
38962               .forEach(function(sequenceKey) {
38963                   var seq = _oscCache.sequences[sequenceKey];
38964                   var images = seq && seq.images;
38965                   if (images) {
38966                       lineStrings.push({
38967                           type: 'LineString',
38968                           coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
38969                           properties: { key: sequenceKey }
38970                       });
38971                   }
38972               });
38973           return lineStrings;
38974       },
38975
38976
38977       loadImages: function(projection) {
38978           var url = apibase$2 + '/1.0/list/nearby-photos/';
38979           loadTiles$1('images', url, projection);
38980       },
38981
38982
38983       loadViewer: function(context) {
38984           var that = this;
38985
38986           // add osc-wrapper
38987           var wrap = select('#photoviewer').selectAll('.osc-wrapper')
38988               .data([0]);
38989
38990           var wrapEnter = wrap.enter()
38991               .append('div')
38992               .attr('class', 'photo-wrapper osc-wrapper')
38993               .classed('hide', true)
38994               .call(imgZoom)
38995               .on('dblclick.zoom', null);
38996
38997           wrapEnter
38998               .append('div')
38999               .attr('class', 'photo-attribution fillD');
39000
39001           var controlsEnter = wrapEnter
39002               .append('div')
39003               .attr('class', 'photo-controls-wrap')
39004               .append('div')
39005               .attr('class', 'photo-controls');
39006
39007           controlsEnter
39008               .append('button')
39009               .on('click.back', step(-1))
39010               .text('◄');
39011
39012           controlsEnter
39013               .append('button')
39014               .on('click.rotate-ccw', rotate(-90))
39015               .text('⤿');
39016
39017           controlsEnter
39018               .append('button')
39019               .on('click.rotate-cw', rotate(90))
39020               .text('⤾');
39021
39022           controlsEnter
39023               .append('button')
39024               .on('click.forward', step(1))
39025               .text('►');
39026
39027           wrapEnter
39028               .append('div')
39029               .attr('class', 'osc-image-wrap');
39030
39031
39032           // Register viewer resize handler
39033           context.ui().on('photoviewerResize', function(dimensions) {
39034               imgZoom = d3_zoom()
39035                   .extent([[0, 0], dimensions])
39036                   .translateExtent([[0, 0], dimensions])
39037                   .scaleExtent([1, 15])
39038                   .on('zoom', zoomPan);
39039           });
39040
39041
39042           function rotate(deg) {
39043               return function() {
39044                   if (!_oscSelectedImage) return;
39045                   var sequenceKey = _oscSelectedImage.sequence_id;
39046                   var sequence = _oscCache.sequences[sequenceKey];
39047                   if (!sequence) return;
39048
39049                   var r = sequence.rotation || 0;
39050                   r += deg;
39051
39052                   if (r > 180) r -= 360;
39053                   if (r < -180) r += 360;
39054                   sequence.rotation = r;
39055
39056                   var wrap = select('#photoviewer .osc-wrapper');
39057
39058                   wrap
39059                       .transition()
39060                       .duration(100)
39061                       .call(imgZoom.transform, identity$7);
39062
39063                   wrap.selectAll('.osc-image')
39064                       .transition()
39065                       .duration(100)
39066                       .style('transform', 'rotate(' + r + 'deg)');
39067               };
39068           }
39069
39070           function step(stepBy) {
39071               return function() {
39072                   if (!_oscSelectedImage) return;
39073                   var sequenceKey = _oscSelectedImage.sequence_id;
39074                   var sequence = _oscCache.sequences[sequenceKey];
39075                   if (!sequence) return;
39076
39077                   var nextIndex = _oscSelectedImage.sequence_index + stepBy;
39078                   var nextImage = sequence.images[nextIndex];
39079                   if (!nextImage) return;
39080
39081                   context.map().centerEase(nextImage.loc);
39082
39083                   that
39084                       .selectImage(nextImage)
39085                       .updateViewer(nextImage);
39086               };
39087           }
39088       },
39089
39090
39091       showViewer: function() {
39092           var viewer = select('#photoviewer')
39093               .classed('hide', false);
39094
39095           var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
39096
39097           if (isHidden) {
39098               viewer
39099                   .selectAll('.photo-wrapper:not(.osc-wrapper)')
39100                   .classed('hide', true);
39101
39102               viewer
39103                   .selectAll('.photo-wrapper.osc-wrapper')
39104                   .classed('hide', false);
39105           }
39106
39107           return this;
39108       },
39109
39110
39111       hideViewer: function() {
39112           _oscSelectedImage = null;
39113
39114           var viewer = select('#photoviewer');
39115           if (!viewer.empty()) viewer.datum(null);
39116
39117           viewer
39118               .classed('hide', true)
39119               .selectAll('.photo-wrapper')
39120               .classed('hide', true);
39121
39122           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
39123               .classed('selected', false);
39124
39125           return this.setStyles(null, true);
39126       },
39127
39128
39129       updateViewer: function(d) {
39130           var wrap = select('#photoviewer .osc-wrapper');
39131           var imageWrap = wrap.selectAll('.osc-image-wrap');
39132           var attribution = wrap.selectAll('.photo-attribution').html('');
39133
39134           wrap
39135               .transition()
39136               .duration(100)
39137               .call(imgZoom.transform, identity$7);
39138
39139           imageWrap
39140               .selectAll('.osc-image')
39141               .remove();
39142
39143           if (d) {
39144               var sequence = _oscCache.sequences[d.sequence_id];
39145               var r = (sequence && sequence.rotation) || 0;
39146
39147               imageWrap
39148                   .append('img')
39149                   .attr('class', 'osc-image')
39150                   .attr('src', apibase$2 + '/' + d.imagePath)
39151                   .style('transform', 'rotate(' + r + 'deg)');
39152
39153               if (d.captured_by) {
39154                   attribution
39155                       .append('a')
39156                       .attr('class', 'captured_by')
39157                       .attr('target', '_blank')
39158                       .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
39159                       .text('@' + d.captured_by);
39160
39161                   attribution
39162                       .append('span')
39163                       .text('|');
39164               }
39165
39166               if (d.captured_at) {
39167                   attribution
39168                       .append('span')
39169                       .attr('class', 'captured_at')
39170                       .text(d.captured_at);
39171
39172                   attribution
39173                       .append('span')
39174                       .text('|');
39175               }
39176
39177               attribution
39178                   .append('a')
39179                   .attr('class', 'image-link')
39180                   .attr('target', '_blank')
39181                   .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
39182                   .text('openstreetcam.org');
39183           }
39184           return this;
39185       },
39186
39187
39188       selectImage: function(d) {
39189           _oscSelectedImage = d;
39190           var viewer = select('#photoviewer');
39191           if (!viewer.empty()) viewer.datum(d);
39192
39193           this.setStyles(null, true);
39194
39195           d3_selectAll('.icon-sign')
39196               .classed('selected', false);
39197
39198           return this;
39199       },
39200
39201
39202       getSelectedImage: function() {
39203           return _oscSelectedImage;
39204       },
39205
39206
39207       getSequenceKeyForImage: function(d) {
39208           return d && d.sequence_id;
39209       },
39210
39211
39212       setStyles: function(hovered, reset) {
39213           if (reset) {  // reset all layers
39214               d3_selectAll('.viewfield-group')
39215                   .classed('highlighted', false)
39216                   .classed('hovered', false)
39217                   .classed('selected', false);
39218
39219               d3_selectAll('.sequence')
39220                   .classed('highlighted', false)
39221                   .classed('selected', false);
39222           }
39223
39224           var hoveredImageKey = hovered && hovered.key;
39225           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
39226           var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
39227           var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
39228
39229           var viewer = select('#photoviewer');
39230           var selected = viewer.empty() ? undefined : viewer.datum();
39231           var selectedImageKey = selected && selected.key;
39232           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
39233           var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
39234           var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
39235
39236           // highlight sibling viewfields on either the selected or the hovered sequences
39237           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
39238
39239           d3_selectAll('.layer-openstreetcam-images .viewfield-group')
39240               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
39241               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
39242               .classed('selected', function(d) { return d.key === selectedImageKey; });
39243
39244           d3_selectAll('.layer-openstreetcam-images .sequence')
39245               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
39246               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
39247
39248           // update viewfields if needed
39249           d3_selectAll('.viewfield-group .viewfield')
39250               .attr('d', viewfieldPath);
39251
39252           function viewfieldPath() {
39253               var d = this.parentNode.__data__;
39254               if (d.pano && d.key !== selectedImageKey) {
39255                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
39256               } else {
39257                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
39258               }
39259           }
39260
39261           return this;
39262       },
39263
39264
39265       cache: function() {
39266           return _oscCache;
39267       }
39268
39269   };
39270
39271   /* Built-in method references for those with the same name as other `lodash` methods. */
39272   var nativeCeil = Math.ceil,
39273       nativeMax$4 = Math.max;
39274
39275   /**
39276    * Creates an array of elements split into groups the length of `size`.
39277    * If `array` can't be split evenly, the final chunk will be the remaining
39278    * elements.
39279    *
39280    * @static
39281    * @memberOf _
39282    * @since 3.0.0
39283    * @category Array
39284    * @param {Array} array The array to process.
39285    * @param {number} [size=1] The length of each chunk
39286    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
39287    * @returns {Array} Returns the new array of chunks.
39288    * @example
39289    *
39290    * _.chunk(['a', 'b', 'c', 'd'], 2);
39291    * // => [['a', 'b'], ['c', 'd']]
39292    *
39293    * _.chunk(['a', 'b', 'c', 'd'], 3);
39294    * // => [['a', 'b', 'c'], ['d']]
39295    */
39296   function chunk(array, size, guard) {
39297     if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
39298       size = 1;
39299     } else {
39300       size = nativeMax$4(toInteger(size), 0);
39301     }
39302     var length = array == null ? 0 : array.length;
39303     if (!length || size < 1) {
39304       return [];
39305     }
39306     var index = 0,
39307         resIndex = 0,
39308         result = Array(nativeCeil(length / size));
39309
39310     while (index < length) {
39311       result[resIndex++] = baseSlice(array, index, (index += size));
39312     }
39313     return result;
39314   }
39315
39316   var hashes = createCommonjsModule(function (module, exports) {
39317   /**
39318    * jshashes - https://github.com/h2non/jshashes
39319    * Released under the "New BSD" license
39320    *
39321    * Algorithms specification:
39322    *
39323    * MD5 - http://www.ietf.org/rfc/rfc1321.txt
39324    * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
39325    * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39326    * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39327    * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39328    * HMAC - http://www.ietf.org/rfc/rfc2104.txt
39329    */
39330   (function() {
39331     var Hashes;
39332
39333     function utf8Encode(str) {
39334       var x, y, output = '',
39335         i = -1,
39336         l;
39337
39338       if (str && str.length) {
39339         l = str.length;
39340         while ((i += 1) < l) {
39341           /* Decode utf-16 surrogate pairs */
39342           x = str.charCodeAt(i);
39343           y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
39344           if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
39345             x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
39346             i += 1;
39347           }
39348           /* Encode output as utf-8 */
39349           if (x <= 0x7F) {
39350             output += String.fromCharCode(x);
39351           } else if (x <= 0x7FF) {
39352             output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
39353               0x80 | (x & 0x3F));
39354           } else if (x <= 0xFFFF) {
39355             output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
39356               0x80 | ((x >>> 6) & 0x3F),
39357               0x80 | (x & 0x3F));
39358           } else if (x <= 0x1FFFFF) {
39359             output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
39360               0x80 | ((x >>> 12) & 0x3F),
39361               0x80 | ((x >>> 6) & 0x3F),
39362               0x80 | (x & 0x3F));
39363           }
39364         }
39365       }
39366       return output;
39367     }
39368
39369     function utf8Decode(str) {
39370       var i, ac, c1, c2, c3, arr = [],
39371         l;
39372       i = ac = c1 = c2 = c3 = 0;
39373
39374       if (str && str.length) {
39375         l = str.length;
39376         str += '';
39377
39378         while (i < l) {
39379           c1 = str.charCodeAt(i);
39380           ac += 1;
39381           if (c1 < 128) {
39382             arr[ac] = String.fromCharCode(c1);
39383             i += 1;
39384           } else if (c1 > 191 && c1 < 224) {
39385             c2 = str.charCodeAt(i + 1);
39386             arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
39387             i += 2;
39388           } else {
39389             c2 = str.charCodeAt(i + 1);
39390             c3 = str.charCodeAt(i + 2);
39391             arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
39392             i += 3;
39393           }
39394         }
39395       }
39396       return arr.join('');
39397     }
39398
39399     /**
39400      * Add integers, wrapping at 2^32. This uses 16-bit operations internally
39401      * to work around bugs in some JS interpreters.
39402      */
39403
39404     function safe_add(x, y) {
39405       var lsw = (x & 0xFFFF) + (y & 0xFFFF),
39406         msw = (x >> 16) + (y >> 16) + (lsw >> 16);
39407       return (msw << 16) | (lsw & 0xFFFF);
39408     }
39409
39410     /**
39411      * Bitwise rotate a 32-bit number to the left.
39412      */
39413
39414     function bit_rol(num, cnt) {
39415       return (num << cnt) | (num >>> (32 - cnt));
39416     }
39417
39418     /**
39419      * Convert a raw string to a hex string
39420      */
39421
39422     function rstr2hex(input, hexcase) {
39423       var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
39424         output = '',
39425         x, i = 0,
39426         l = input.length;
39427       for (; i < l; i += 1) {
39428         x = input.charCodeAt(i);
39429         output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
39430       }
39431       return output;
39432     }
39433
39434     /**
39435      * Convert an array of big-endian words to a string
39436      */
39437
39438     function binb2rstr(input) {
39439       var i, l = input.length * 32,
39440         output = '';
39441       for (i = 0; i < l; i += 8) {
39442         output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
39443       }
39444       return output;
39445     }
39446
39447     /**
39448      * Convert an array of little-endian words to a string
39449      */
39450
39451     function binl2rstr(input) {
39452       var i, l = input.length * 32,
39453         output = '';
39454       for (i = 0; i < l; i += 8) {
39455         output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
39456       }
39457       return output;
39458     }
39459
39460     /**
39461      * Convert a raw string to an array of little-endian words
39462      * Characters >255 have their high-byte silently ignored.
39463      */
39464
39465     function rstr2binl(input) {
39466       var i, l = input.length * 8,
39467         output = Array(input.length >> 2),
39468         lo = output.length;
39469       for (i = 0; i < lo; i += 1) {
39470         output[i] = 0;
39471       }
39472       for (i = 0; i < l; i += 8) {
39473         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
39474       }
39475       return output;
39476     }
39477
39478     /**
39479      * Convert a raw string to an array of big-endian words
39480      * Characters >255 have their high-byte silently ignored.
39481      */
39482
39483     function rstr2binb(input) {
39484       var i, l = input.length * 8,
39485         output = Array(input.length >> 2),
39486         lo = output.length;
39487       for (i = 0; i < lo; i += 1) {
39488         output[i] = 0;
39489       }
39490       for (i = 0; i < l; i += 8) {
39491         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
39492       }
39493       return output;
39494     }
39495
39496     /**
39497      * Convert a raw string to an arbitrary string encoding
39498      */
39499
39500     function rstr2any(input, encoding) {
39501       var divisor = encoding.length,
39502         remainders = Array(),
39503         i, q, x, ld, quotient, dividend, output, full_length;
39504
39505       /* Convert to an array of 16-bit big-endian values, forming the dividend */
39506       dividend = Array(Math.ceil(input.length / 2));
39507       ld = dividend.length;
39508       for (i = 0; i < ld; i += 1) {
39509         dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
39510       }
39511
39512       /**
39513        * Repeatedly perform a long division. The binary array forms the dividend,
39514        * the length of the encoding is the divisor. Once computed, the quotient
39515        * forms the dividend for the next step. We stop when the dividend is zerHashes.
39516        * All remainders are stored for later use.
39517        */
39518       while (dividend.length > 0) {
39519         quotient = Array();
39520         x = 0;
39521         for (i = 0; i < dividend.length; i += 1) {
39522           x = (x << 16) + dividend[i];
39523           q = Math.floor(x / divisor);
39524           x -= q * divisor;
39525           if (quotient.length > 0 || q > 0) {
39526             quotient[quotient.length] = q;
39527           }
39528         }
39529         remainders[remainders.length] = x;
39530         dividend = quotient;
39531       }
39532
39533       /* Convert the remainders to the output string */
39534       output = '';
39535       for (i = remainders.length - 1; i >= 0; i--) {
39536         output += encoding.charAt(remainders[i]);
39537       }
39538
39539       /* Append leading zero equivalents */
39540       full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
39541       for (i = output.length; i < full_length; i += 1) {
39542         output = encoding[0] + output;
39543       }
39544       return output;
39545     }
39546
39547     /**
39548      * Convert a raw string to a base-64 string
39549      */
39550
39551     function rstr2b64(input, b64pad) {
39552       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
39553         output = '',
39554         len = input.length,
39555         i, j, triplet;
39556       b64pad = b64pad || '=';
39557       for (i = 0; i < len; i += 3) {
39558         triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
39559         for (j = 0; j < 4; j += 1) {
39560           if (i * 8 + j * 6 > input.length * 8) {
39561             output += b64pad;
39562           } else {
39563             output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
39564           }
39565         }
39566       }
39567       return output;
39568     }
39569
39570     Hashes = {
39571       /**
39572        * @property {String} version
39573        * @readonly
39574        */
39575       VERSION: '1.0.6',
39576       /**
39577        * @member Hashes
39578        * @class Base64
39579        * @constructor
39580        */
39581       Base64: function() {
39582         // private properties
39583         var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
39584           pad = '=', // default pad according with the RFC standard
39585           utf8 = true; // by default enable UTF-8 support encoding
39586
39587         // public method for encoding
39588         this.encode = function(input) {
39589           var i, j, triplet,
39590             output = '',
39591             len = input.length;
39592
39593           pad = pad || '=';
39594           input = (utf8) ? utf8Encode(input) : input;
39595
39596           for (i = 0; i < len; i += 3) {
39597             triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
39598             for (j = 0; j < 4; j += 1) {
39599               if (i * 8 + j * 6 > len * 8) {
39600                 output += pad;
39601               } else {
39602                 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
39603               }
39604             }
39605           }
39606           return output;
39607         };
39608
39609         // public method for decoding
39610         this.decode = function(input) {
39611           // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
39612           var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
39613             dec = '',
39614             arr = [];
39615           if (!input) {
39616             return input;
39617           }
39618
39619           i = ac = 0;
39620           input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
39621           //input += '';
39622
39623           do { // unpack four hexets into three octets using index points in b64
39624             h1 = tab.indexOf(input.charAt(i += 1));
39625             h2 = tab.indexOf(input.charAt(i += 1));
39626             h3 = tab.indexOf(input.charAt(i += 1));
39627             h4 = tab.indexOf(input.charAt(i += 1));
39628
39629             bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
39630
39631             o1 = bits >> 16 & 0xff;
39632             o2 = bits >> 8 & 0xff;
39633             o3 = bits & 0xff;
39634             ac += 1;
39635
39636             if (h3 === 64) {
39637               arr[ac] = String.fromCharCode(o1);
39638             } else if (h4 === 64) {
39639               arr[ac] = String.fromCharCode(o1, o2);
39640             } else {
39641               arr[ac] = String.fromCharCode(o1, o2, o3);
39642             }
39643           } while (i < input.length);
39644
39645           dec = arr.join('');
39646           dec = (utf8) ? utf8Decode(dec) : dec;
39647
39648           return dec;
39649         };
39650
39651         // set custom pad string
39652         this.setPad = function(str) {
39653           pad = str || pad;
39654           return this;
39655         };
39656         // set custom tab string characters
39657         this.setTab = function(str) {
39658           tab = str || tab;
39659           return this;
39660         };
39661         this.setUTF8 = function(bool) {
39662           if (typeof bool === 'boolean') {
39663             utf8 = bool;
39664           }
39665           return this;
39666         };
39667       },
39668
39669       /**
39670        * CRC-32 calculation
39671        * @member Hashes
39672        * @method CRC32
39673        * @static
39674        * @param {String} str Input String
39675        * @return {String}
39676        */
39677       CRC32: function(str) {
39678         var crc = 0,
39679           x = 0,
39680           y = 0,
39681           table, i, iTop;
39682         str = utf8Encode(str);
39683
39684         table = [
39685           '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
39686           '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
39687           '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
39688           '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
39689           'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
39690           '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
39691           'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
39692           '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
39693           'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
39694           '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
39695           'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
39696           '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
39697           'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
39698           '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
39699           '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
39700           '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
39701           '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
39702           'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
39703           '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
39704           'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
39705           '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
39706           'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
39707           '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
39708           'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
39709           '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
39710           'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
39711         ].join('');
39712
39713         crc = crc ^ (-1);
39714         for (i = 0, iTop = str.length; i < iTop; i += 1) {
39715           y = (crc ^ str.charCodeAt(i)) & 0xFF;
39716           x = '0x' + table.substr(y * 9, 8);
39717           crc = (crc >>> 8) ^ x;
39718         }
39719         // always return a positive number (that's what >>> 0 does)
39720         return (crc ^ (-1)) >>> 0;
39721       },
39722       /**
39723        * @member Hashes
39724        * @class MD5
39725        * @constructor
39726        * @param {Object} [config]
39727        *
39728        * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
39729        * Digest Algorithm, as defined in RFC 1321.
39730        * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
39731        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
39732        * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
39733        */
39734       MD5: function(options) {
39735         /**
39736          * Private config properties. You may need to tweak these to be compatible with
39737          * the server-side, but the defaults work in most cases.
39738          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
39739          */
39740         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
39741           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
39742           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
39743
39744         // privileged (public) methods
39745         this.hex = function(s) {
39746           return rstr2hex(rstr(s, utf8), hexcase);
39747         };
39748         this.b64 = function(s) {
39749           return rstr2b64(rstr(s), b64pad);
39750         };
39751         this.any = function(s, e) {
39752           return rstr2any(rstr(s, utf8), e);
39753         };
39754         this.raw = function(s) {
39755           return rstr(s, utf8);
39756         };
39757         this.hex_hmac = function(k, d) {
39758           return rstr2hex(rstr_hmac(k, d), hexcase);
39759         };
39760         this.b64_hmac = function(k, d) {
39761           return rstr2b64(rstr_hmac(k, d), b64pad);
39762         };
39763         this.any_hmac = function(k, d, e) {
39764           return rstr2any(rstr_hmac(k, d), e);
39765         };
39766         /**
39767          * Perform a simple self-test to see if the VM is working
39768          * @return {String} Hexadecimal hash sample
39769          */
39770         this.vm_test = function() {
39771           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
39772         };
39773         /**
39774          * Enable/disable uppercase hexadecimal returned string
39775          * @param {Boolean}
39776          * @return {Object} this
39777          */
39778         this.setUpperCase = function(a) {
39779           if (typeof a === 'boolean') {
39780             hexcase = a;
39781           }
39782           return this;
39783         };
39784         /**
39785          * Defines a base64 pad string
39786          * @param {String} Pad
39787          * @return {Object} this
39788          */
39789         this.setPad = function(a) {
39790           b64pad = a || b64pad;
39791           return this;
39792         };
39793         /**
39794          * Defines a base64 pad string
39795          * @param {Boolean}
39796          * @return {Object} [this]
39797          */
39798         this.setUTF8 = function(a) {
39799           if (typeof a === 'boolean') {
39800             utf8 = a;
39801           }
39802           return this;
39803         };
39804
39805         // private methods
39806
39807         /**
39808          * Calculate the MD5 of a raw string
39809          */
39810
39811         function rstr(s) {
39812           s = (utf8) ? utf8Encode(s) : s;
39813           return binl2rstr(binl(rstr2binl(s), s.length * 8));
39814         }
39815
39816         /**
39817          * Calculate the HMAC-MD5, of a key and some data (raw strings)
39818          */
39819
39820         function rstr_hmac(key, data) {
39821           var bkey, ipad, opad, hash, i;
39822
39823           key = (utf8) ? utf8Encode(key) : key;
39824           data = (utf8) ? utf8Encode(data) : data;
39825           bkey = rstr2binl(key);
39826           if (bkey.length > 16) {
39827             bkey = binl(bkey, key.length * 8);
39828           }
39829
39830           ipad = Array(16), opad = Array(16);
39831           for (i = 0; i < 16; i += 1) {
39832             ipad[i] = bkey[i] ^ 0x36363636;
39833             opad[i] = bkey[i] ^ 0x5C5C5C5C;
39834           }
39835           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
39836           return binl2rstr(binl(opad.concat(hash), 512 + 128));
39837         }
39838
39839         /**
39840          * Calculate the MD5 of an array of little-endian words, and a bit length.
39841          */
39842
39843         function binl(x, len) {
39844           var i, olda, oldb, oldc, oldd,
39845             a = 1732584193,
39846             b = -271733879,
39847             c = -1732584194,
39848             d = 271733878;
39849
39850           /* append padding */
39851           x[len >> 5] |= 0x80 << ((len) % 32);
39852           x[(((len + 64) >>> 9) << 4) + 14] = len;
39853
39854           for (i = 0; i < x.length; i += 16) {
39855             olda = a;
39856             oldb = b;
39857             oldc = c;
39858             oldd = d;
39859
39860             a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
39861             d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
39862             c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
39863             b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
39864             a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
39865             d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
39866             c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
39867             b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
39868             a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
39869             d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
39870             c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
39871             b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
39872             a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
39873             d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
39874             c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
39875             b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
39876
39877             a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
39878             d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
39879             c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
39880             b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
39881             a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
39882             d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
39883             c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
39884             b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
39885             a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
39886             d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
39887             c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
39888             b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
39889             a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
39890             d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
39891             c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
39892             b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
39893
39894             a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
39895             d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
39896             c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
39897             b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
39898             a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
39899             d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
39900             c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
39901             b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
39902             a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
39903             d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
39904             c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
39905             b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
39906             a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
39907             d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
39908             c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
39909             b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
39910
39911             a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
39912             d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
39913             c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
39914             b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
39915             a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
39916             d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
39917             c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
39918             b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
39919             a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
39920             d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
39921             c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
39922             b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
39923             a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
39924             d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
39925             c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
39926             b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
39927
39928             a = safe_add(a, olda);
39929             b = safe_add(b, oldb);
39930             c = safe_add(c, oldc);
39931             d = safe_add(d, oldd);
39932           }
39933           return Array(a, b, c, d);
39934         }
39935
39936         /**
39937          * These functions implement the four basic operations the algorithm uses.
39938          */
39939
39940         function md5_cmn(q, a, b, x, s, t) {
39941           return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
39942         }
39943
39944         function md5_ff(a, b, c, d, x, s, t) {
39945           return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
39946         }
39947
39948         function md5_gg(a, b, c, d, x, s, t) {
39949           return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
39950         }
39951
39952         function md5_hh(a, b, c, d, x, s, t) {
39953           return md5_cmn(b ^ c ^ d, a, b, x, s, t);
39954         }
39955
39956         function md5_ii(a, b, c, d, x, s, t) {
39957           return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
39958         }
39959       },
39960       /**
39961        * @member Hashes
39962        * @class Hashes.SHA1
39963        * @param {Object} [config]
39964        * @constructor
39965        *
39966        * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
39967        * Version 2.2 Copyright Paul Johnston 2000 - 2009.
39968        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
39969        * See http://pajhome.org.uk/crypt/md5 for details.
39970        */
39971       SHA1: function(options) {
39972         /**
39973          * Private config properties. You may need to tweak these to be compatible with
39974          * the server-side, but the defaults work in most cases.
39975          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
39976          */
39977         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
39978           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
39979           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
39980
39981         // public methods
39982         this.hex = function(s) {
39983           return rstr2hex(rstr(s, utf8), hexcase);
39984         };
39985         this.b64 = function(s) {
39986           return rstr2b64(rstr(s, utf8), b64pad);
39987         };
39988         this.any = function(s, e) {
39989           return rstr2any(rstr(s, utf8), e);
39990         };
39991         this.raw = function(s) {
39992           return rstr(s, utf8);
39993         };
39994         this.hex_hmac = function(k, d) {
39995           return rstr2hex(rstr_hmac(k, d));
39996         };
39997         this.b64_hmac = function(k, d) {
39998           return rstr2b64(rstr_hmac(k, d), b64pad);
39999         };
40000         this.any_hmac = function(k, d, e) {
40001           return rstr2any(rstr_hmac(k, d), e);
40002         };
40003         /**
40004          * Perform a simple self-test to see if the VM is working
40005          * @return {String} Hexadecimal hash sample
40006          * @public
40007          */
40008         this.vm_test = function() {
40009           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40010         };
40011         /**
40012          * @description Enable/disable uppercase hexadecimal returned string
40013          * @param {boolean}
40014          * @return {Object} this
40015          * @public
40016          */
40017         this.setUpperCase = function(a) {
40018           if (typeof a === 'boolean') {
40019             hexcase = a;
40020           }
40021           return this;
40022         };
40023         /**
40024          * @description Defines a base64 pad string
40025          * @param {string} Pad
40026          * @return {Object} this
40027          * @public
40028          */
40029         this.setPad = function(a) {
40030           b64pad = a || b64pad;
40031           return this;
40032         };
40033         /**
40034          * @description Defines a base64 pad string
40035          * @param {boolean}
40036          * @return {Object} this
40037          * @public
40038          */
40039         this.setUTF8 = function(a) {
40040           if (typeof a === 'boolean') {
40041             utf8 = a;
40042           }
40043           return this;
40044         };
40045
40046         // private methods
40047
40048         /**
40049          * Calculate the SHA-512 of a raw string
40050          */
40051
40052         function rstr(s) {
40053           s = (utf8) ? utf8Encode(s) : s;
40054           return binb2rstr(binb(rstr2binb(s), s.length * 8));
40055         }
40056
40057         /**
40058          * Calculate the HMAC-SHA1 of a key and some data (raw strings)
40059          */
40060
40061         function rstr_hmac(key, data) {
40062           var bkey, ipad, opad, i, hash;
40063           key = (utf8) ? utf8Encode(key) : key;
40064           data = (utf8) ? utf8Encode(data) : data;
40065           bkey = rstr2binb(key);
40066
40067           if (bkey.length > 16) {
40068             bkey = binb(bkey, key.length * 8);
40069           }
40070           ipad = Array(16), opad = Array(16);
40071           for (i = 0; i < 16; i += 1) {
40072             ipad[i] = bkey[i] ^ 0x36363636;
40073             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40074           }
40075           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
40076           return binb2rstr(binb(opad.concat(hash), 512 + 160));
40077         }
40078
40079         /**
40080          * Calculate the SHA-1 of an array of big-endian words, and a bit length
40081          */
40082
40083         function binb(x, len) {
40084           var i, j, t, olda, oldb, oldc, oldd, olde,
40085             w = Array(80),
40086             a = 1732584193,
40087             b = -271733879,
40088             c = -1732584194,
40089             d = 271733878,
40090             e = -1009589776;
40091
40092           /* append padding */
40093           x[len >> 5] |= 0x80 << (24 - len % 32);
40094           x[((len + 64 >> 9) << 4) + 15] = len;
40095
40096           for (i = 0; i < x.length; i += 16) {
40097             olda = a;
40098             oldb = b;
40099             oldc = c;
40100             oldd = d;
40101             olde = e;
40102
40103             for (j = 0; j < 80; j += 1) {
40104               if (j < 16) {
40105                 w[j] = x[i + j];
40106               } else {
40107                 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
40108               }
40109               t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
40110                 safe_add(safe_add(e, w[j]), sha1_kt(j)));
40111               e = d;
40112               d = c;
40113               c = bit_rol(b, 30);
40114               b = a;
40115               a = t;
40116             }
40117
40118             a = safe_add(a, olda);
40119             b = safe_add(b, oldb);
40120             c = safe_add(c, oldc);
40121             d = safe_add(d, oldd);
40122             e = safe_add(e, olde);
40123           }
40124           return Array(a, b, c, d, e);
40125         }
40126
40127         /**
40128          * Perform the appropriate triplet combination function for the current
40129          * iteration
40130          */
40131
40132         function sha1_ft(t, b, c, d) {
40133           if (t < 20) {
40134             return (b & c) | ((~b) & d);
40135           }
40136           if (t < 40) {
40137             return b ^ c ^ d;
40138           }
40139           if (t < 60) {
40140             return (b & c) | (b & d) | (c & d);
40141           }
40142           return b ^ c ^ d;
40143         }
40144
40145         /**
40146          * Determine the appropriate additive constant for the current iteration
40147          */
40148
40149         function sha1_kt(t) {
40150           return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
40151             (t < 60) ? -1894007588 : -899497514;
40152         }
40153       },
40154       /**
40155        * @class Hashes.SHA256
40156        * @param {config}
40157        *
40158        * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
40159        * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
40160        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40161        * See http://pajhome.org.uk/crypt/md5 for details.
40162        * Also http://anmar.eu.org/projects/jssha2/
40163        */
40164       SHA256: function(options) {
40165         /**
40166          * Private properties configuration variables. You may need to tweak these to be compatible with
40167          * the server-side, but the defaults work in most cases.
40168          * @see this.setUpperCase() method
40169          * @see this.setPad() method
40170          */
40171         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
40172           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
40173           /* base-64 pad character. Default '=' for strict RFC compliance   */
40174           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40175           /* enable/disable utf8 encoding */
40176           sha256_K;
40177
40178         /* privileged (public) methods */
40179         this.hex = function(s) {
40180           return rstr2hex(rstr(s, utf8));
40181         };
40182         this.b64 = function(s) {
40183           return rstr2b64(rstr(s, utf8), b64pad);
40184         };
40185         this.any = function(s, e) {
40186           return rstr2any(rstr(s, utf8), e);
40187         };
40188         this.raw = function(s) {
40189           return rstr(s, utf8);
40190         };
40191         this.hex_hmac = function(k, d) {
40192           return rstr2hex(rstr_hmac(k, d));
40193         };
40194         this.b64_hmac = function(k, d) {
40195           return rstr2b64(rstr_hmac(k, d), b64pad);
40196         };
40197         this.any_hmac = function(k, d, e) {
40198           return rstr2any(rstr_hmac(k, d), e);
40199         };
40200         /**
40201          * Perform a simple self-test to see if the VM is working
40202          * @return {String} Hexadecimal hash sample
40203          * @public
40204          */
40205         this.vm_test = function() {
40206           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40207         };
40208         /**
40209          * Enable/disable uppercase hexadecimal returned string
40210          * @param {boolean}
40211          * @return {Object} this
40212          * @public
40213          */
40214         this.setUpperCase = function(a) {
40215           if (typeof a === 'boolean') {
40216             hexcase = a;
40217           }
40218           return this;
40219         };
40220         /**
40221          * @description Defines a base64 pad string
40222          * @param {string} Pad
40223          * @return {Object} this
40224          * @public
40225          */
40226         this.setPad = function(a) {
40227           b64pad = a || b64pad;
40228           return this;
40229         };
40230         /**
40231          * Defines a base64 pad string
40232          * @param {boolean}
40233          * @return {Object} this
40234          * @public
40235          */
40236         this.setUTF8 = function(a) {
40237           if (typeof a === 'boolean') {
40238             utf8 = a;
40239           }
40240           return this;
40241         };
40242
40243         // private methods
40244
40245         /**
40246          * Calculate the SHA-512 of a raw string
40247          */
40248
40249         function rstr(s, utf8) {
40250           s = (utf8) ? utf8Encode(s) : s;
40251           return binb2rstr(binb(rstr2binb(s), s.length * 8));
40252         }
40253
40254         /**
40255          * Calculate the HMAC-sha256 of a key and some data (raw strings)
40256          */
40257
40258         function rstr_hmac(key, data) {
40259           key = (utf8) ? utf8Encode(key) : key;
40260           data = (utf8) ? utf8Encode(data) : data;
40261           var hash, i = 0,
40262             bkey = rstr2binb(key),
40263             ipad = Array(16),
40264             opad = Array(16);
40265
40266           if (bkey.length > 16) {
40267             bkey = binb(bkey, key.length * 8);
40268           }
40269
40270           for (; i < 16; i += 1) {
40271             ipad[i] = bkey[i] ^ 0x36363636;
40272             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40273           }
40274
40275           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
40276           return binb2rstr(binb(opad.concat(hash), 512 + 256));
40277         }
40278
40279         /*
40280          * Main sha256 function, with its support functions
40281          */
40282
40283         function sha256_S(X, n) {
40284           return (X >>> n) | (X << (32 - n));
40285         }
40286
40287         function sha256_R(X, n) {
40288           return (X >>> n);
40289         }
40290
40291         function sha256_Ch(x, y, z) {
40292           return ((x & y) ^ ((~x) & z));
40293         }
40294
40295         function sha256_Maj(x, y, z) {
40296           return ((x & y) ^ (x & z) ^ (y & z));
40297         }
40298
40299         function sha256_Sigma0256(x) {
40300           return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
40301         }
40302
40303         function sha256_Sigma1256(x) {
40304           return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
40305         }
40306
40307         function sha256_Gamma0256(x) {
40308           return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
40309         }
40310
40311         function sha256_Gamma1256(x) {
40312           return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
40313         }
40314
40315         sha256_K = [
40316           1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
40317           1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
40318           264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
40319           113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
40320           1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
40321           430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
40322           1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
40323         ];
40324
40325         function binb(m, l) {
40326           var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
40327             1359893119, -1694144372, 528734635, 1541459225
40328           ];
40329           var W = new Array(64);
40330           var a, b, c, d, e, f, g, h;
40331           var i, j, T1, T2;
40332
40333           /* append padding */
40334           m[l >> 5] |= 0x80 << (24 - l % 32);
40335           m[((l + 64 >> 9) << 4) + 15] = l;
40336
40337           for (i = 0; i < m.length; i += 16) {
40338             a = HASH[0];
40339             b = HASH[1];
40340             c = HASH[2];
40341             d = HASH[3];
40342             e = HASH[4];
40343             f = HASH[5];
40344             g = HASH[6];
40345             h = HASH[7];
40346
40347             for (j = 0; j < 64; j += 1) {
40348               if (j < 16) {
40349                 W[j] = m[j + i];
40350               } else {
40351                 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
40352                   sha256_Gamma0256(W[j - 15])), W[j - 16]);
40353               }
40354
40355               T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
40356                 sha256_K[j]), W[j]);
40357               T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
40358               h = g;
40359               g = f;
40360               f = e;
40361               e = safe_add(d, T1);
40362               d = c;
40363               c = b;
40364               b = a;
40365               a = safe_add(T1, T2);
40366             }
40367
40368             HASH[0] = safe_add(a, HASH[0]);
40369             HASH[1] = safe_add(b, HASH[1]);
40370             HASH[2] = safe_add(c, HASH[2]);
40371             HASH[3] = safe_add(d, HASH[3]);
40372             HASH[4] = safe_add(e, HASH[4]);
40373             HASH[5] = safe_add(f, HASH[5]);
40374             HASH[6] = safe_add(g, HASH[6]);
40375             HASH[7] = safe_add(h, HASH[7]);
40376           }
40377           return HASH;
40378         }
40379
40380       },
40381
40382       /**
40383        * @class Hashes.SHA512
40384        * @param {config}
40385        *
40386        * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
40387        * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
40388        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40389        * See http://pajhome.org.uk/crypt/md5 for details.
40390        */
40391       SHA512: function(options) {
40392         /**
40393          * Private properties configuration variables. You may need to tweak these to be compatible with
40394          * the server-side, but the defaults work in most cases.
40395          * @see this.setUpperCase() method
40396          * @see this.setPad() method
40397          */
40398         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
40399           /* hexadecimal output case format. false - lowercase; true - uppercase  */
40400           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
40401           /* base-64 pad character. Default '=' for strict RFC compliance   */
40402           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40403           /* enable/disable utf8 encoding */
40404           sha512_k;
40405
40406         /* privileged (public) methods */
40407         this.hex = function(s) {
40408           return rstr2hex(rstr(s));
40409         };
40410         this.b64 = function(s) {
40411           return rstr2b64(rstr(s), b64pad);
40412         };
40413         this.any = function(s, e) {
40414           return rstr2any(rstr(s), e);
40415         };
40416         this.raw = function(s) {
40417           return rstr(s, utf8);
40418         };
40419         this.hex_hmac = function(k, d) {
40420           return rstr2hex(rstr_hmac(k, d));
40421         };
40422         this.b64_hmac = function(k, d) {
40423           return rstr2b64(rstr_hmac(k, d), b64pad);
40424         };
40425         this.any_hmac = function(k, d, e) {
40426           return rstr2any(rstr_hmac(k, d), e);
40427         };
40428         /**
40429          * Perform a simple self-test to see if the VM is working
40430          * @return {String} Hexadecimal hash sample
40431          * @public
40432          */
40433         this.vm_test = function() {
40434           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40435         };
40436         /**
40437          * @description Enable/disable uppercase hexadecimal returned string
40438          * @param {boolean}
40439          * @return {Object} this
40440          * @public
40441          */
40442         this.setUpperCase = function(a) {
40443           if (typeof a === 'boolean') {
40444             hexcase = a;
40445           }
40446           return this;
40447         };
40448         /**
40449          * @description Defines a base64 pad string
40450          * @param {string} Pad
40451          * @return {Object} this
40452          * @public
40453          */
40454         this.setPad = function(a) {
40455           b64pad = a || b64pad;
40456           return this;
40457         };
40458         /**
40459          * @description Defines a base64 pad string
40460          * @param {boolean}
40461          * @return {Object} this
40462          * @public
40463          */
40464         this.setUTF8 = function(a) {
40465           if (typeof a === 'boolean') {
40466             utf8 = a;
40467           }
40468           return this;
40469         };
40470
40471         /* private methods */
40472
40473         /**
40474          * Calculate the SHA-512 of a raw string
40475          */
40476
40477         function rstr(s) {
40478           s = (utf8) ? utf8Encode(s) : s;
40479           return binb2rstr(binb(rstr2binb(s), s.length * 8));
40480         }
40481         /*
40482          * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
40483          */
40484
40485         function rstr_hmac(key, data) {
40486           key = (utf8) ? utf8Encode(key) : key;
40487           data = (utf8) ? utf8Encode(data) : data;
40488
40489           var hash, i = 0,
40490             bkey = rstr2binb(key),
40491             ipad = Array(32),
40492             opad = Array(32);
40493
40494           if (bkey.length > 32) {
40495             bkey = binb(bkey, key.length * 8);
40496           }
40497
40498           for (; i < 32; i += 1) {
40499             ipad[i] = bkey[i] ^ 0x36363636;
40500             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40501           }
40502
40503           hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
40504           return binb2rstr(binb(opad.concat(hash), 1024 + 512));
40505         }
40506
40507         /**
40508          * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
40509          */
40510
40511         function binb(x, len) {
40512           var j, i, l,
40513             W = new Array(80),
40514             hash = new Array(16),
40515             //Initial hash values
40516             H = [
40517               new int64(0x6a09e667, -205731576),
40518               new int64(-1150833019, -2067093701),
40519               new int64(0x3c6ef372, -23791573),
40520               new int64(-1521486534, 0x5f1d36f1),
40521               new int64(0x510e527f, -1377402159),
40522               new int64(-1694144372, 0x2b3e6c1f),
40523               new int64(0x1f83d9ab, -79577749),
40524               new int64(0x5be0cd19, 0x137e2179)
40525             ],
40526             T1 = new int64(0, 0),
40527             T2 = new int64(0, 0),
40528             a = new int64(0, 0),
40529             b = new int64(0, 0),
40530             c = new int64(0, 0),
40531             d = new int64(0, 0),
40532             e = new int64(0, 0),
40533             f = new int64(0, 0),
40534             g = new int64(0, 0),
40535             h = new int64(0, 0),
40536             //Temporary variables not specified by the document
40537             s0 = new int64(0, 0),
40538             s1 = new int64(0, 0),
40539             Ch = new int64(0, 0),
40540             Maj = new int64(0, 0),
40541             r1 = new int64(0, 0),
40542             r2 = new int64(0, 0),
40543             r3 = new int64(0, 0);
40544
40545           if (sha512_k === undefined) {
40546             //SHA512 constants
40547             sha512_k = [
40548               new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
40549               new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
40550               new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
40551               new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
40552               new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
40553               new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
40554               new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
40555               new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
40556               new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
40557               new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
40558               new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
40559               new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
40560               new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
40561               new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
40562               new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
40563               new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
40564               new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
40565               new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
40566               new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
40567               new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
40568               new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
40569               new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
40570               new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
40571               new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
40572               new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
40573               new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
40574               new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
40575               new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
40576               new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
40577               new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
40578               new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
40579               new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
40580               new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
40581               new int64(-354779690, -840897762), new int64(-176337025, -294727304),
40582               new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
40583               new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
40584               new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
40585               new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
40586               new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
40587               new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
40588             ];
40589           }
40590
40591           for (i = 0; i < 80; i += 1) {
40592             W[i] = new int64(0, 0);
40593           }
40594
40595           // append padding to the source string. The format is described in the FIPS.
40596           x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
40597           x[((len + 128 >> 10) << 5) + 31] = len;
40598           l = x.length;
40599           for (i = 0; i < l; i += 32) { //32 dwords is the block size
40600             int64copy(a, H[0]);
40601             int64copy(b, H[1]);
40602             int64copy(c, H[2]);
40603             int64copy(d, H[3]);
40604             int64copy(e, H[4]);
40605             int64copy(f, H[5]);
40606             int64copy(g, H[6]);
40607             int64copy(h, H[7]);
40608
40609             for (j = 0; j < 16; j += 1) {
40610               W[j].h = x[i + 2 * j];
40611               W[j].l = x[i + 2 * j + 1];
40612             }
40613
40614             for (j = 16; j < 80; j += 1) {
40615               //sigma1
40616               int64rrot(r1, W[j - 2], 19);
40617               int64revrrot(r2, W[j - 2], 29);
40618               int64shr(r3, W[j - 2], 6);
40619               s1.l = r1.l ^ r2.l ^ r3.l;
40620               s1.h = r1.h ^ r2.h ^ r3.h;
40621               //sigma0
40622               int64rrot(r1, W[j - 15], 1);
40623               int64rrot(r2, W[j - 15], 8);
40624               int64shr(r3, W[j - 15], 7);
40625               s0.l = r1.l ^ r2.l ^ r3.l;
40626               s0.h = r1.h ^ r2.h ^ r3.h;
40627
40628               int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
40629             }
40630
40631             for (j = 0; j < 80; j += 1) {
40632               //Ch
40633               Ch.l = (e.l & f.l) ^ (~e.l & g.l);
40634               Ch.h = (e.h & f.h) ^ (~e.h & g.h);
40635
40636               //Sigma1
40637               int64rrot(r1, e, 14);
40638               int64rrot(r2, e, 18);
40639               int64revrrot(r3, e, 9);
40640               s1.l = r1.l ^ r2.l ^ r3.l;
40641               s1.h = r1.h ^ r2.h ^ r3.h;
40642
40643               //Sigma0
40644               int64rrot(r1, a, 28);
40645               int64revrrot(r2, a, 2);
40646               int64revrrot(r3, a, 7);
40647               s0.l = r1.l ^ r2.l ^ r3.l;
40648               s0.h = r1.h ^ r2.h ^ r3.h;
40649
40650               //Maj
40651               Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
40652               Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
40653
40654               int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
40655               int64add(T2, s0, Maj);
40656
40657               int64copy(h, g);
40658               int64copy(g, f);
40659               int64copy(f, e);
40660               int64add(e, d, T1);
40661               int64copy(d, c);
40662               int64copy(c, b);
40663               int64copy(b, a);
40664               int64add(a, T1, T2);
40665             }
40666             int64add(H[0], H[0], a);
40667             int64add(H[1], H[1], b);
40668             int64add(H[2], H[2], c);
40669             int64add(H[3], H[3], d);
40670             int64add(H[4], H[4], e);
40671             int64add(H[5], H[5], f);
40672             int64add(H[6], H[6], g);
40673             int64add(H[7], H[7], h);
40674           }
40675
40676           //represent the hash as an array of 32-bit dwords
40677           for (i = 0; i < 8; i += 1) {
40678             hash[2 * i] = H[i].h;
40679             hash[2 * i + 1] = H[i].l;
40680           }
40681           return hash;
40682         }
40683
40684         //A constructor for 64-bit numbers
40685
40686         function int64(h, l) {
40687           this.h = h;
40688           this.l = l;
40689           //this.toString = int64toString;
40690         }
40691
40692         //Copies src into dst, assuming both are 64-bit numbers
40693
40694         function int64copy(dst, src) {
40695           dst.h = src.h;
40696           dst.l = src.l;
40697         }
40698
40699         //Right-rotates a 64-bit number by shift
40700         //Won't handle cases of shift>=32
40701         //The function revrrot() is for that
40702
40703         function int64rrot(dst, x, shift) {
40704           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
40705           dst.h = (x.h >>> shift) | (x.l << (32 - shift));
40706         }
40707
40708         //Reverses the dwords of the source and then rotates right by shift.
40709         //This is equivalent to rotation by 32+shift
40710
40711         function int64revrrot(dst, x, shift) {
40712           dst.l = (x.h >>> shift) | (x.l << (32 - shift));
40713           dst.h = (x.l >>> shift) | (x.h << (32 - shift));
40714         }
40715
40716         //Bitwise-shifts right a 64-bit number by shift
40717         //Won't handle shift>=32, but it's never needed in SHA512
40718
40719         function int64shr(dst, x, shift) {
40720           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
40721           dst.h = (x.h >>> shift);
40722         }
40723
40724         //Adds two 64-bit numbers
40725         //Like the original implementation, does not rely on 32-bit operations
40726
40727         function int64add(dst, x, y) {
40728           var w0 = (x.l & 0xffff) + (y.l & 0xffff);
40729           var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
40730           var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
40731           var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
40732           dst.l = (w0 & 0xffff) | (w1 << 16);
40733           dst.h = (w2 & 0xffff) | (w3 << 16);
40734         }
40735
40736         //Same, except with 4 addends. Works faster than adding them one by one.
40737
40738         function int64add4(dst, a, b, c, d) {
40739           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
40740           var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
40741           var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
40742           var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
40743           dst.l = (w0 & 0xffff) | (w1 << 16);
40744           dst.h = (w2 & 0xffff) | (w3 << 16);
40745         }
40746
40747         //Same, except with 5 addends
40748
40749         function int64add5(dst, a, b, c, d, e) {
40750           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
40751             w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
40752             w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
40753             w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
40754           dst.l = (w0 & 0xffff) | (w1 << 16);
40755           dst.h = (w2 & 0xffff) | (w3 << 16);
40756         }
40757       },
40758       /**
40759        * @class Hashes.RMD160
40760        * @constructor
40761        * @param {Object} [config]
40762        *
40763        * A JavaScript implementation of the RIPEMD-160 Algorithm
40764        * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
40765        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40766        * See http://pajhome.org.uk/crypt/md5 for details.
40767        * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
40768        */
40769       RMD160: function(options) {
40770         /**
40771          * Private properties configuration variables. You may need to tweak these to be compatible with
40772          * the server-side, but the defaults work in most cases.
40773          * @see this.setUpperCase() method
40774          * @see this.setPad() method
40775          */
40776         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
40777           /* hexadecimal output case format. false - lowercase; true - uppercase  */
40778           b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
40779           /* base-64 pad character. Default '=' for strict RFC compliance   */
40780           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40781           /* enable/disable utf8 encoding */
40782           rmd160_r1 = [
40783             0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
40784             7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
40785             3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
40786             1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
40787             4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
40788           ],
40789           rmd160_r2 = [
40790             5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
40791             6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
40792             15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
40793             8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
40794             12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
40795           ],
40796           rmd160_s1 = [
40797             11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
40798             7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
40799             11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
40800             11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
40801             9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
40802           ],
40803           rmd160_s2 = [
40804             8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
40805             9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
40806             9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
40807             15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
40808             8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
40809           ];
40810
40811         /* privileged (public) methods */
40812         this.hex = function(s) {
40813           return rstr2hex(rstr(s, utf8));
40814         };
40815         this.b64 = function(s) {
40816           return rstr2b64(rstr(s, utf8), b64pad);
40817         };
40818         this.any = function(s, e) {
40819           return rstr2any(rstr(s, utf8), e);
40820         };
40821         this.raw = function(s) {
40822           return rstr(s, utf8);
40823         };
40824         this.hex_hmac = function(k, d) {
40825           return rstr2hex(rstr_hmac(k, d));
40826         };
40827         this.b64_hmac = function(k, d) {
40828           return rstr2b64(rstr_hmac(k, d), b64pad);
40829         };
40830         this.any_hmac = function(k, d, e) {
40831           return rstr2any(rstr_hmac(k, d), e);
40832         };
40833         /**
40834          * Perform a simple self-test to see if the VM is working
40835          * @return {String} Hexadecimal hash sample
40836          * @public
40837          */
40838         this.vm_test = function() {
40839           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40840         };
40841         /**
40842          * @description Enable/disable uppercase hexadecimal returned string
40843          * @param {boolean}
40844          * @return {Object} this
40845          * @public
40846          */
40847         this.setUpperCase = function(a) {
40848           if (typeof a === 'boolean') {
40849             hexcase = a;
40850           }
40851           return this;
40852         };
40853         /**
40854          * @description Defines a base64 pad string
40855          * @param {string} Pad
40856          * @return {Object} this
40857          * @public
40858          */
40859         this.setPad = function(a) {
40860           if (typeof a !== 'undefined') {
40861             b64pad = a;
40862           }
40863           return this;
40864         };
40865         /**
40866          * @description Defines a base64 pad string
40867          * @param {boolean}
40868          * @return {Object} this
40869          * @public
40870          */
40871         this.setUTF8 = function(a) {
40872           if (typeof a === 'boolean') {
40873             utf8 = a;
40874           }
40875           return this;
40876         };
40877
40878         /* private methods */
40879
40880         /**
40881          * Calculate the rmd160 of a raw string
40882          */
40883
40884         function rstr(s) {
40885           s = (utf8) ? utf8Encode(s) : s;
40886           return binl2rstr(binl(rstr2binl(s), s.length * 8));
40887         }
40888
40889         /**
40890          * Calculate the HMAC-rmd160 of a key and some data (raw strings)
40891          */
40892
40893         function rstr_hmac(key, data) {
40894           key = (utf8) ? utf8Encode(key) : key;
40895           data = (utf8) ? utf8Encode(data) : data;
40896           var i, hash,
40897             bkey = rstr2binl(key),
40898             ipad = Array(16),
40899             opad = Array(16);
40900
40901           if (bkey.length > 16) {
40902             bkey = binl(bkey, key.length * 8);
40903           }
40904
40905           for (i = 0; i < 16; i += 1) {
40906             ipad[i] = bkey[i] ^ 0x36363636;
40907             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40908           }
40909           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
40910           return binl2rstr(binl(opad.concat(hash), 512 + 160));
40911         }
40912
40913         /**
40914          * Convert an array of little-endian words to a string
40915          */
40916
40917         function binl2rstr(input) {
40918           var i, output = '',
40919             l = input.length * 32;
40920           for (i = 0; i < l; i += 8) {
40921             output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
40922           }
40923           return output;
40924         }
40925
40926         /**
40927          * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
40928          */
40929
40930         function binl(x, len) {
40931           var T, j, i, l,
40932             h0 = 0x67452301,
40933             h1 = 0xefcdab89,
40934             h2 = 0x98badcfe,
40935             h3 = 0x10325476,
40936             h4 = 0xc3d2e1f0,
40937             A1, B1, C1, D1, E1,
40938             A2, B2, C2, D2, E2;
40939
40940           /* append padding */
40941           x[len >> 5] |= 0x80 << (len % 32);
40942           x[(((len + 64) >>> 9) << 4) + 14] = len;
40943           l = x.length;
40944
40945           for (i = 0; i < l; i += 16) {
40946             A1 = A2 = h0;
40947             B1 = B2 = h1;
40948             C1 = C2 = h2;
40949             D1 = D2 = h3;
40950             E1 = E2 = h4;
40951             for (j = 0; j <= 79; j += 1) {
40952               T = safe_add(A1, rmd160_f(j, B1, C1, D1));
40953               T = safe_add(T, x[i + rmd160_r1[j]]);
40954               T = safe_add(T, rmd160_K1(j));
40955               T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
40956               A1 = E1;
40957               E1 = D1;
40958               D1 = bit_rol(C1, 10);
40959               C1 = B1;
40960               B1 = T;
40961               T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
40962               T = safe_add(T, x[i + rmd160_r2[j]]);
40963               T = safe_add(T, rmd160_K2(j));
40964               T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
40965               A2 = E2;
40966               E2 = D2;
40967               D2 = bit_rol(C2, 10);
40968               C2 = B2;
40969               B2 = T;
40970             }
40971
40972             T = safe_add(h1, safe_add(C1, D2));
40973             h1 = safe_add(h2, safe_add(D1, E2));
40974             h2 = safe_add(h3, safe_add(E1, A2));
40975             h3 = safe_add(h4, safe_add(A1, B2));
40976             h4 = safe_add(h0, safe_add(B1, C2));
40977             h0 = T;
40978           }
40979           return [h0, h1, h2, h3, h4];
40980         }
40981
40982         // specific algorithm methods
40983
40984         function rmd160_f(j, x, y, z) {
40985           return (0 <= j && j <= 15) ? (x ^ y ^ z) :
40986             (16 <= j && j <= 31) ? (x & y) | (~x & z) :
40987             (32 <= j && j <= 47) ? (x | ~y) ^ z :
40988             (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
40989             (64 <= j && j <= 79) ? x ^ (y | ~z) :
40990             'rmd160_f: j out of range';
40991         }
40992
40993         function rmd160_K1(j) {
40994           return (0 <= j && j <= 15) ? 0x00000000 :
40995             (16 <= j && j <= 31) ? 0x5a827999 :
40996             (32 <= j && j <= 47) ? 0x6ed9eba1 :
40997             (48 <= j && j <= 63) ? 0x8f1bbcdc :
40998             (64 <= j && j <= 79) ? 0xa953fd4e :
40999             'rmd160_K1: j out of range';
41000         }
41001
41002         function rmd160_K2(j) {
41003           return (0 <= j && j <= 15) ? 0x50a28be6 :
41004             (16 <= j && j <= 31) ? 0x5c4dd124 :
41005             (32 <= j && j <= 47) ? 0x6d703ef3 :
41006             (48 <= j && j <= 63) ? 0x7a6d76e9 :
41007             (64 <= j && j <= 79) ? 0x00000000 :
41008             'rmd160_K2: j out of range';
41009         }
41010       }
41011     };
41012
41013     // exposes Hashes
41014     (function(window, undefined) {
41015       var freeExports = false;
41016       {
41017         freeExports = exports;
41018         if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
41019           window = commonjsGlobal;
41020         }
41021       }
41022
41023       if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
41024         // define as an anonymous module, so, through path mapping, it can be aliased
41025         undefined(function() {
41026           return Hashes;
41027         });
41028       } else if (freeExports) {
41029         // in Node.js or RingoJS v0.8.0+
41030         if (module && module.exports === freeExports) {
41031           module.exports = Hashes;
41032         }
41033         // in Narwhal or RingoJS v0.7.0-
41034         else {
41035           freeExports.Hashes = Hashes;
41036         }
41037       } else {
41038         // in a browser or Rhino
41039         window.Hashes = Hashes;
41040       }
41041     }(this));
41042   }()); // IIFE
41043   });
41044
41045   var hashes$1 = /*#__PURE__*/Object.freeze({
41046     default: hashes,
41047     __moduleExports: hashes
41048   });
41049
41050   var immutable = extend$2;
41051
41052   var hasOwnProperty$g = Object.prototype.hasOwnProperty;
41053
41054   function extend$2() {
41055       var target = {};
41056
41057       for (var i = 0; i < arguments.length; i++) {
41058           var source = arguments[i];
41059
41060           for (var key in source) {
41061               if (hasOwnProperty$g.call(source, key)) {
41062                   target[key] = source[key];
41063               }
41064           }
41065       }
41066
41067       return target
41068   }
41069
41070   var immutable$1 = /*#__PURE__*/Object.freeze({
41071     default: immutable,
41072     __moduleExports: immutable
41073   });
41074
41075   var hashes$2 = ( hashes$1 && hashes ) || hashes$1;
41076
41077   var xtend = ( immutable$1 && immutable ) || immutable$1;
41078
41079   var sha1 = new hashes$2.SHA1();
41080
41081   var ohauth = {};
41082
41083   ohauth.qsString = function(obj) {
41084       return Object.keys(obj).sort().map(function(key) {
41085           return ohauth.percentEncode(key) + '=' +
41086               ohauth.percentEncode(obj[key]);
41087       }).join('&');
41088   };
41089
41090   ohauth.stringQs = function(str) {
41091       return str.split('&').filter(function (pair) {
41092           return pair !== '';
41093       }).reduce(function(obj, pair){
41094           var parts = pair.split('=');
41095           obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
41096               '' : decodeURIComponent(parts[1]);
41097           return obj;
41098       }, {});
41099   };
41100
41101   ohauth.rawxhr = function(method, url, data, headers, callback) {
41102       var xhr = new XMLHttpRequest(),
41103           twoHundred = /^20\d$/;
41104       xhr.onreadystatechange = function() {
41105           if (4 === xhr.readyState && 0 !== xhr.status) {
41106               if (twoHundred.test(xhr.status)) callback(null, xhr);
41107               else return callback(xhr, null);
41108           }
41109       };
41110       xhr.onerror = function(e) { return callback(e, null); };
41111       xhr.open(method, url, true);
41112       for (var h in headers) xhr.setRequestHeader(h, headers[h]);
41113       xhr.send(data);
41114       return xhr;
41115   };
41116
41117   ohauth.xhr = function(method, url, auth, data, options, callback) {
41118       var headers = (options && options.header) || {
41119           'Content-Type': 'application/x-www-form-urlencoded'
41120       };
41121       headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
41122       return ohauth.rawxhr(method, url, data, headers, callback);
41123   };
41124
41125   ohauth.nonce = function() {
41126       for (var o = ''; o.length < 6;) {
41127           o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
41128       }
41129       return o;
41130   };
41131
41132   ohauth.authHeader = function(obj) {
41133       return Object.keys(obj).sort().map(function(key) {
41134           return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
41135       }).join(', ');
41136   };
41137
41138   ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
41139
41140   ohauth.percentEncode = function(s) {
41141       return encodeURIComponent(s)
41142           .replace(/\!/g, '%21').replace(/\'/g, '%27')
41143           .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
41144   };
41145
41146   ohauth.baseString = function(method, url, params) {
41147       if (params.oauth_signature) delete params.oauth_signature;
41148       return [
41149           method,
41150           ohauth.percentEncode(url),
41151           ohauth.percentEncode(ohauth.qsString(params))].join('&');
41152   };
41153
41154   ohauth.signature = function(oauth_secret, token_secret, baseString) {
41155       return sha1.b64_hmac(
41156           ohauth.percentEncode(oauth_secret) + '&' +
41157           ohauth.percentEncode(token_secret),
41158           baseString);
41159   };
41160
41161   /**
41162    * Takes an options object for configuration (consumer_key,
41163    * consumer_secret, version, signature_method, token, token_secret)
41164    * and returns a function that generates the Authorization header
41165    * for given data.
41166    *
41167    * The returned function takes these parameters:
41168    * - method: GET/POST/...
41169    * - uri: full URI with protocol, port, path and query string
41170    * - extra_params: any extra parameters (that are passed in the POST data),
41171    *   can be an object or a from-urlencoded string.
41172    *
41173    * Returned function returns full OAuth header with "OAuth" string in it.
41174    */
41175
41176   ohauth.headerGenerator = function(options) {
41177       options = options || {};
41178       var consumer_key = options.consumer_key || '',
41179           consumer_secret = options.consumer_secret || '',
41180           signature_method = options.signature_method || 'HMAC-SHA1',
41181           version = options.version || '1.0',
41182           token = options.token || '',
41183           token_secret = options.token_secret || '';
41184
41185       return function(method, uri, extra_params) {
41186           method = method.toUpperCase();
41187           if (typeof extra_params === 'string' && extra_params.length > 0) {
41188               extra_params = ohauth.stringQs(extra_params);
41189           }
41190
41191           var uri_parts = uri.split('?', 2),
41192           base_uri = uri_parts[0];
41193
41194           var query_params = uri_parts.length === 2 ?
41195               ohauth.stringQs(uri_parts[1]) : {};
41196
41197           var oauth_params = {
41198               oauth_consumer_key: consumer_key,
41199               oauth_signature_method: signature_method,
41200               oauth_version: version,
41201               oauth_timestamp: ohauth.timestamp(),
41202               oauth_nonce: ohauth.nonce()
41203           };
41204
41205           if (token) oauth_params.oauth_token = token;
41206
41207           var all_params = xtend({}, oauth_params, query_params, extra_params),
41208               base_str = ohauth.baseString(method, base_uri, all_params);
41209
41210           oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
41211
41212           return 'OAuth ' + ohauth.authHeader(oauth_params);
41213       };
41214   };
41215
41216   var ohauth_1 = ohauth;
41217
41218   var ohauth$1 = /*#__PURE__*/Object.freeze({
41219     default: ohauth_1,
41220     __moduleExports: ohauth_1
41221   });
41222
41223   var resolveUrl = createCommonjsModule(function (module, exports) {
41224   // Copyright 2014 Simon Lydell
41225   // X11 (“MIT”) Licensed. (See LICENSE.)
41226
41227   void (function(root, factory) {
41228     {
41229       module.exports = factory();
41230     }
41231   }(commonjsGlobal, function() {
41232
41233     function resolveUrl(/* ...urls */) {
41234       var numUrls = arguments.length;
41235
41236       if (numUrls === 0) {
41237         throw new Error("resolveUrl requires at least one argument; got none.")
41238       }
41239
41240       var base = document.createElement("base");
41241       base.href = arguments[0];
41242
41243       if (numUrls === 1) {
41244         return base.href
41245       }
41246
41247       var head = document.getElementsByTagName("head")[0];
41248       head.insertBefore(base, head.firstChild);
41249
41250       var a = document.createElement("a");
41251       var resolved;
41252
41253       for (var index = 1; index < numUrls; index++) {
41254         a.href = arguments[index];
41255         resolved = a.href;
41256         base.href = resolved;
41257       }
41258
41259       head.removeChild(base);
41260
41261       return resolved
41262     }
41263
41264     return resolveUrl
41265
41266   }));
41267   });
41268
41269   var resolveUrl$1 = /*#__PURE__*/Object.freeze({
41270     default: resolveUrl,
41271     __moduleExports: resolveUrl
41272   });
41273
41274   var assign$1 = make_assign();
41275   var create$2 = make_create();
41276   var trim = make_trim();
41277   var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
41278
41279   var util = {
41280         assign: assign$1,
41281         create: create$2,
41282         trim: trim,
41283         bind: bind,
41284         slice: slice$7,
41285         each: each,
41286         map: map$4,
41287         pluck: pluck,
41288         isList: isList,
41289         isFunction: isFunction$1,
41290         isObject: isObject$1,
41291         Global: Global
41292   };
41293
41294   function make_assign() {
41295         if (Object.assign) {
41296                 return Object.assign
41297         } else {
41298                 return function shimAssign(obj, props1, props2, etc) {
41299                         for (var i = 1; i < arguments.length; i++) {
41300                                 each(Object(arguments[i]), function(val, key) {
41301                                         obj[key] = val;
41302                                 });
41303                         }                       
41304                         return obj
41305                 }
41306         }
41307   }
41308
41309   function make_create() {
41310         if (Object.create) {
41311                 return function create(obj, assignProps1, assignProps2, etc) {
41312                         var assignArgsList = slice$7(arguments, 1);
41313                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
41314                 }
41315         } else {
41316                 function F() {} // eslint-disable-line no-inner-declarations
41317                 return function create(obj, assignProps1, assignProps2, etc) {
41318                         var assignArgsList = slice$7(arguments, 1);
41319                         F.prototype = obj;
41320                         return assign$1.apply(this, [new F()].concat(assignArgsList))
41321                 }
41322         }
41323   }
41324
41325   function make_trim() {
41326         if (String.prototype.trim) {
41327                 return function trim(str) {
41328                         return String.prototype.trim.call(str)
41329                 }
41330         } else {
41331                 return function trim(str) {
41332                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
41333                 }
41334         }
41335   }
41336
41337   function bind(obj, fn) {
41338         return function() {
41339                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
41340         }
41341   }
41342
41343   function slice$7(arr, index) {
41344         return Array.prototype.slice.call(arr, index || 0)
41345   }
41346
41347   function each(obj, fn) {
41348         pluck(obj, function(val, key) {
41349                 fn(val, key);
41350                 return false
41351         });
41352   }
41353
41354   function map$4(obj, fn) {
41355         var res = (isList(obj) ? [] : {});
41356         pluck(obj, function(v, k) {
41357                 res[k] = fn(v, k);
41358                 return false
41359         });
41360         return res
41361   }
41362
41363   function pluck(obj, fn) {
41364         if (isList(obj)) {
41365                 for (var i=0; i<obj.length; i++) {
41366                         if (fn(obj[i], i)) {
41367                                 return obj[i]
41368                         }
41369                 }
41370         } else {
41371                 for (var key in obj) {
41372                         if (obj.hasOwnProperty(key)) {
41373                                 if (fn(obj[key], key)) {
41374                                         return obj[key]
41375                                 }
41376                         }
41377                 }
41378         }
41379   }
41380
41381   function isList(val) {
41382         return (val != null && typeof val != 'function' && typeof val.length == 'number')
41383   }
41384
41385   function isFunction$1(val) {
41386         return val && {}.toString.call(val) === '[object Function]'
41387   }
41388
41389   function isObject$1(val) {
41390         return val && {}.toString.call(val) === '[object Object]'
41391   }
41392
41393   var slice$8 = util.slice;
41394   var pluck$1 = util.pluck;
41395   var each$1 = util.each;
41396   var bind$1 = util.bind;
41397   var create$3 = util.create;
41398   var isList$1 = util.isList;
41399   var isFunction$2 = util.isFunction;
41400   var isObject$2 = util.isObject;
41401
41402   var storeEngine = {
41403         createStore: createStore
41404   };
41405
41406   var storeAPI = {
41407         version: '2.0.12',
41408         enabled: false,
41409         
41410         // get returns the value of the given key. If that value
41411         // is undefined, it returns optionalDefaultValue instead.
41412         get: function(key, optionalDefaultValue) {
41413                 var data = this.storage.read(this._namespacePrefix + key);
41414                 return this._deserialize(data, optionalDefaultValue)
41415         },
41416
41417         // set will store the given value at key and returns value.
41418         // Calling set with value === undefined is equivalent to calling remove.
41419         set: function(key, value) {
41420                 if (value === undefined) {
41421                         return this.remove(key)
41422                 }
41423                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
41424                 return value
41425         },
41426
41427         // remove deletes the key and value stored at the given key.
41428         remove: function(key) {
41429                 this.storage.remove(this._namespacePrefix + key);
41430         },
41431
41432         // each will call the given callback once for each key-value pair
41433         // in this store.
41434         each: function(callback) {
41435                 var self = this;
41436                 this.storage.each(function(val, namespacedKey) {
41437                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
41438                 });
41439         },
41440
41441         // clearAll will remove all the stored key-value pairs in this store.
41442         clearAll: function() {
41443                 this.storage.clearAll();
41444         },
41445
41446         // additional functionality that can't live in plugins
41447         // ---------------------------------------------------
41448
41449         // hasNamespace returns true if this store instance has the given namespace.
41450         hasNamespace: function(namespace) {
41451                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
41452         },
41453
41454         // createStore creates a store.js instance with the first
41455         // functioning storage in the list of storage candidates,
41456         // and applies the the given mixins to the instance.
41457         createStore: function() {
41458                 return createStore.apply(this, arguments)
41459         },
41460         
41461         addPlugin: function(plugin) {
41462                 this._addPlugin(plugin);
41463         },
41464         
41465         namespace: function(namespace) {
41466                 return createStore(this.storage, this.plugins, namespace)
41467         }
41468   };
41469
41470   function _warn() {
41471         var _console = (typeof console == 'undefined' ? null : console);
41472         if (!_console) { return }
41473         var fn = (_console.warn ? _console.warn : _console.log);
41474         fn.apply(_console, arguments);
41475   }
41476
41477   function createStore(storages, plugins, namespace) {
41478         if (!namespace) {
41479                 namespace = '';
41480         }
41481         if (storages && !isList$1(storages)) {
41482                 storages = [storages];
41483         }
41484         if (plugins && !isList$1(plugins)) {
41485                 plugins = [plugins];
41486         }
41487
41488         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
41489         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
41490         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
41491         if (!legalNamespaces.test(namespace)) {
41492                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
41493         }
41494         
41495         var _privateStoreProps = {
41496                 _namespacePrefix: namespacePrefix,
41497                 _namespaceRegexp: namespaceRegexp,
41498
41499                 _testStorage: function(storage) {
41500                         try {
41501                                 var testStr = '__storejs__test__';
41502                                 storage.write(testStr, testStr);
41503                                 var ok = (storage.read(testStr) === testStr);
41504                                 storage.remove(testStr);
41505                                 return ok
41506                         } catch(e) {
41507                                 return false
41508                         }
41509                 },
41510
41511                 _assignPluginFnProp: function(pluginFnProp, propName) {
41512                         var oldFn = this[propName];
41513                         this[propName] = function pluginFn() {
41514                                 var args = slice$8(arguments, 0);
41515                                 var self = this;
41516
41517                                 // super_fn calls the old function which was overwritten by
41518                                 // this mixin.
41519                                 function super_fn() {
41520                                         if (!oldFn) { return }
41521                                         each$1(arguments, function(arg, i) {
41522                                                 args[i] = arg;
41523                                         });
41524                                         return oldFn.apply(self, args)
41525                                 }
41526
41527                                 // Give mixing function access to super_fn by prefixing all mixin function
41528                                 // arguments with super_fn.
41529                                 var newFnArgs = [super_fn].concat(args);
41530
41531                                 return pluginFnProp.apply(self, newFnArgs)
41532                         };
41533                 },
41534
41535                 _serialize: function(obj) {
41536                         return JSON.stringify(obj)
41537                 },
41538
41539                 _deserialize: function(strVal, defaultVal) {
41540                         if (!strVal) { return defaultVal }
41541                         // It is possible that a raw string value has been previously stored
41542                         // in a storage without using store.js, meaning it will be a raw
41543                         // string value instead of a JSON serialized string. By defaulting
41544                         // to the raw string value in case of a JSON parse error, we allow
41545                         // for past stored values to be forwards-compatible with store.js
41546                         var val = '';
41547                         try { val = JSON.parse(strVal); }
41548                         catch(e) { val = strVal; }
41549
41550                         return (val !== undefined ? val : defaultVal)
41551                 },
41552                 
41553                 _addStorage: function(storage) {
41554                         if (this.enabled) { return }
41555                         if (this._testStorage(storage)) {
41556                                 this.storage = storage;
41557                                 this.enabled = true;
41558                         }
41559                 },
41560
41561                 _addPlugin: function(plugin) {
41562                         var self = this;
41563
41564                         // If the plugin is an array, then add all plugins in the array.
41565                         // This allows for a plugin to depend on other plugins.
41566                         if (isList$1(plugin)) {
41567                                 each$1(plugin, function(plugin) {
41568                                         self._addPlugin(plugin);
41569                                 });
41570                                 return
41571                         }
41572
41573                         // Keep track of all plugins we've seen so far, so that we
41574                         // don't add any of them twice.
41575                         var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
41576                                 return (plugin === seenPlugin)
41577                         });
41578                         if (seenPlugin) {
41579                                 return
41580                         }
41581                         this.plugins.push(plugin);
41582
41583                         // Check that the plugin is properly formed
41584                         if (!isFunction$2(plugin)) {
41585                                 throw new Error('Plugins must be function values that return objects')
41586                         }
41587
41588                         var pluginProperties = plugin.call(this);
41589                         if (!isObject$2(pluginProperties)) {
41590                                 throw new Error('Plugins must return an object of function properties')
41591                         }
41592
41593                         // Add the plugin function properties to this store instance.
41594                         each$1(pluginProperties, function(pluginFnProp, propName) {
41595                                 if (!isFunction$2(pluginFnProp)) {
41596                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
41597                                 }
41598                                 self._assignPluginFnProp(pluginFnProp, propName);
41599                         });
41600                 },
41601                 
41602                 // Put deprecated properties in the private API, so as to not expose it to accidential
41603                 // discovery through inspection of the store object.
41604                 
41605                 // Deprecated: addStorage
41606                 addStorage: function(storage) {
41607                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
41608                         this._addStorage(storage);
41609                 }
41610         };
41611
41612         var store = create$3(_privateStoreProps, storeAPI, {
41613                 plugins: []
41614         });
41615         store.raw = {};
41616         each$1(store, function(prop, propName) {
41617                 if (isFunction$2(prop)) {
41618                         store.raw[propName] = bind$1(store, prop);                      
41619                 }
41620         });
41621         each$1(storages, function(storage) {
41622                 store._addStorage(storage);
41623         });
41624         each$1(plugins, function(plugin) {
41625                 store._addPlugin(plugin);
41626         });
41627         return store
41628   }
41629
41630   var Global$1 = util.Global;
41631
41632   var localStorage_1 = {
41633         name: 'localStorage',
41634         read: read,
41635         write: write,
41636         each: each$2,
41637         remove: remove$2,
41638         clearAll: clearAll,
41639   };
41640
41641   function localStorage$1() {
41642         return Global$1.localStorage
41643   }
41644
41645   function read(key) {
41646         return localStorage$1().getItem(key)
41647   }
41648
41649   function write(key, data) {
41650         return localStorage$1().setItem(key, data)
41651   }
41652
41653   function each$2(fn) {
41654         for (var i = localStorage$1().length - 1; i >= 0; i--) {
41655                 var key = localStorage$1().key(i);
41656                 fn(read(key), key);
41657         }
41658   }
41659
41660   function remove$2(key) {
41661         return localStorage$1().removeItem(key)
41662   }
41663
41664   function clearAll() {
41665         return localStorage$1().clear()
41666   }
41667
41668   // oldFF-globalStorage provides storage for Firefox
41669   // versions 6 and 7, where no localStorage, etc
41670   // is available.
41671
41672
41673   var Global$2 = util.Global;
41674
41675   var oldFFGlobalStorage = {
41676         name: 'oldFF-globalStorage',
41677         read: read$1,
41678         write: write$1,
41679         each: each$3,
41680         remove: remove$3,
41681         clearAll: clearAll$1,
41682   };
41683
41684   var globalStorage = Global$2.globalStorage;
41685
41686   function read$1(key) {
41687         return globalStorage[key]
41688   }
41689
41690   function write$1(key, data) {
41691         globalStorage[key] = data;
41692   }
41693
41694   function each$3(fn) {
41695         for (var i = globalStorage.length - 1; i >= 0; i--) {
41696                 var key = globalStorage.key(i);
41697                 fn(globalStorage[key], key);
41698         }
41699   }
41700
41701   function remove$3(key) {
41702         return globalStorage.removeItem(key)
41703   }
41704
41705   function clearAll$1() {
41706         each$3(function(key, _) {
41707                 delete globalStorage[key];
41708         });
41709   }
41710
41711   // oldIE-userDataStorage provides storage for Internet Explorer
41712   // versions 6 and 7, where no localStorage, sessionStorage, etc
41713   // is available.
41714
41715
41716   var Global$3 = util.Global;
41717
41718   var oldIEUserDataStorage = {
41719         name: 'oldIE-userDataStorage',
41720         write: write$2,
41721         read: read$2,
41722         each: each$4,
41723         remove: remove$4,
41724         clearAll: clearAll$2,
41725   };
41726
41727   var storageName = 'storejs';
41728   var doc = Global$3.document;
41729   var _withStorageEl = _makeIEStorageElFunction();
41730   var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
41731
41732   function write$2(unfixedKey, data) {
41733         if (disable) { return }
41734         var fixedKey = fixKey(unfixedKey);
41735         _withStorageEl(function(storageEl) {
41736                 storageEl.setAttribute(fixedKey, data);
41737                 storageEl.save(storageName);
41738         });
41739   }
41740
41741   function read$2(unfixedKey) {
41742         if (disable) { return }
41743         var fixedKey = fixKey(unfixedKey);
41744         var res = null;
41745         _withStorageEl(function(storageEl) {
41746                 res = storageEl.getAttribute(fixedKey);
41747         });
41748         return res
41749   }
41750
41751   function each$4(callback) {
41752         _withStorageEl(function(storageEl) {
41753                 var attributes = storageEl.XMLDocument.documentElement.attributes;
41754                 for (var i=attributes.length-1; i>=0; i--) {
41755                         var attr = attributes[i];
41756                         callback(storageEl.getAttribute(attr.name), attr.name);
41757                 }
41758         });
41759   }
41760
41761   function remove$4(unfixedKey) {
41762         var fixedKey = fixKey(unfixedKey);
41763         _withStorageEl(function(storageEl) {
41764                 storageEl.removeAttribute(fixedKey);
41765                 storageEl.save(storageName);
41766         });
41767   }
41768
41769   function clearAll$2() {
41770         _withStorageEl(function(storageEl) {
41771                 var attributes = storageEl.XMLDocument.documentElement.attributes;
41772                 storageEl.load(storageName);
41773                 for (var i=attributes.length-1; i>=0; i--) {
41774                         storageEl.removeAttribute(attributes[i].name);
41775                 }
41776                 storageEl.save(storageName);
41777         });
41778   }
41779
41780   // Helpers
41781   //////////
41782
41783   // In IE7, keys cannot start with a digit or contain certain chars.
41784   // See https://github.com/marcuswestin/store.js/issues/40
41785   // See https://github.com/marcuswestin/store.js/issues/83
41786   var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
41787   function fixKey(key) {
41788         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
41789   }
41790
41791   function _makeIEStorageElFunction() {
41792         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
41793                 return null
41794         }
41795         var scriptTag = 'script',
41796                 storageOwner,
41797                 storageContainer,
41798                 storageEl;
41799
41800         // Since #userData storage applies only to specific paths, we need to
41801         // somehow link our data to a specific path.  We choose /favicon.ico
41802         // as a pretty safe option, since all browsers already make a request to
41803         // this URL anyway and being a 404 will not hurt us here.  We wrap an
41804         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
41805         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
41806         // since the iframe access rules appear to allow direct access and
41807         // manipulation of the document element, even for a 404 page.  This
41808         // document can be used instead of the current document (which would
41809         // have been limited to the current path) to perform #userData storage.
41810         try {
41811                 /* global ActiveXObject */
41812                 storageContainer = new ActiveXObject('htmlfile');
41813                 storageContainer.open();
41814                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
41815                 storageContainer.close();
41816                 storageOwner = storageContainer.w.frames[0].document;
41817                 storageEl = storageOwner.createElement('div');
41818         } catch(e) {
41819                 // somehow ActiveXObject instantiation failed (perhaps some special
41820                 // security settings or otherwse), fall back to per-path storage
41821                 storageEl = doc.createElement('div');
41822                 storageOwner = doc.body;
41823         }
41824
41825         return function(storeFunction) {
41826                 var args = [].slice.call(arguments, 0);
41827                 args.unshift(storageEl);
41828                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
41829                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
41830                 storageOwner.appendChild(storageEl);
41831                 storageEl.addBehavior('#default#userData');
41832                 storageEl.load(storageName);
41833                 storeFunction.apply(this, args);
41834                 storageOwner.removeChild(storageEl);
41835                 return
41836         }
41837   }
41838
41839   // cookieStorage is useful Safari private browser mode, where localStorage
41840   // doesn't work but cookies do. This implementation is adopted from
41841   // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
41842
41843
41844   var Global$4 = util.Global;
41845   var trim$1 = util.trim;
41846
41847   var cookieStorage = {
41848         name: 'cookieStorage',
41849         read: read$3,
41850         write: write$3,
41851         each: each$5,
41852         remove: remove$5,
41853         clearAll: clearAll$3,
41854   };
41855
41856   var doc$1 = Global$4.document;
41857
41858   function read$3(key) {
41859         if (!key || !_has(key)) { return null }
41860         var regexpStr = "(?:^|.*;\\s*)" +
41861                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
41862                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
41863         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
41864   }
41865
41866   function each$5(callback) {
41867         var cookies = doc$1.cookie.split(/; ?/g);
41868         for (var i = cookies.length - 1; i >= 0; i--) {
41869                 if (!trim$1(cookies[i])) {
41870                         continue
41871                 }
41872                 var kvp = cookies[i].split('=');
41873                 var key = unescape(kvp[0]);
41874                 var val = unescape(kvp[1]);
41875                 callback(val, key);
41876         }
41877   }
41878
41879   function write$3(key, data) {
41880         if(!key) { return }
41881         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
41882   }
41883
41884   function remove$5(key) {
41885         if (!key || !_has(key)) {
41886                 return
41887         }
41888         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
41889   }
41890
41891   function clearAll$3() {
41892         each$5(function(_, key) {
41893                 remove$5(key);
41894         });
41895   }
41896
41897   function _has(key) {
41898         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
41899   }
41900
41901   var Global$5 = util.Global;
41902
41903   var sessionStorage_1 = {
41904         name: 'sessionStorage',
41905         read: read$4,
41906         write: write$4,
41907         each: each$6,
41908         remove: remove$6,
41909         clearAll: clearAll$4
41910   };
41911
41912   function sessionStorage() {
41913         return Global$5.sessionStorage
41914   }
41915
41916   function read$4(key) {
41917         return sessionStorage().getItem(key)
41918   }
41919
41920   function write$4(key, data) {
41921         return sessionStorage().setItem(key, data)
41922   }
41923
41924   function each$6(fn) {
41925         for (var i = sessionStorage().length - 1; i >= 0; i--) {
41926                 var key = sessionStorage().key(i);
41927                 fn(read$4(key), key);
41928         }
41929   }
41930
41931   function remove$6(key) {
41932         return sessionStorage().removeItem(key)
41933   }
41934
41935   function clearAll$4() {
41936         return sessionStorage().clear()
41937   }
41938
41939   // memoryStorage is a useful last fallback to ensure that the store
41940   // is functions (meaning store.get(), store.set(), etc will all function).
41941   // However, stored values will not persist when the browser navigates to
41942   // a new page or reloads the current page.
41943
41944   var memoryStorage_1 = {
41945         name: 'memoryStorage',
41946         read: read$5,
41947         write: write$5,
41948         each: each$7,
41949         remove: remove$7,
41950         clearAll: clearAll$5,
41951   };
41952
41953   var memoryStorage = {};
41954
41955   function read$5(key) {
41956         return memoryStorage[key]
41957   }
41958
41959   function write$5(key, data) {
41960         memoryStorage[key] = data;
41961   }
41962
41963   function each$7(callback) {
41964         for (var key in memoryStorage) {
41965                 if (memoryStorage.hasOwnProperty(key)) {
41966                         callback(memoryStorage[key], key);
41967                 }
41968         }
41969   }
41970
41971   function remove$7(key) {
41972         delete memoryStorage[key];
41973   }
41974
41975   function clearAll$5(key) {
41976         memoryStorage = {};
41977   }
41978
41979   var all = [
41980         // Listed in order of usage preference
41981         localStorage_1,
41982         oldFFGlobalStorage,
41983         oldIEUserDataStorage,
41984         cookieStorage,
41985         sessionStorage_1,
41986         memoryStorage_1
41987   ];
41988
41989   /* eslint-disable */
41990
41991   //  json2.js
41992   //  2016-10-28
41993   //  Public Domain.
41994   //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
41995   //  See http://www.JSON.org/js.html
41996   //  This code should be minified before deployment.
41997   //  See http://javascript.crockford.com/jsmin.html
41998
41999   //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
42000   //  NOT CONTROL.
42001
42002   //  This file creates a global JSON object containing two methods: stringify
42003   //  and parse. This file provides the ES5 JSON capability to ES3 systems.
42004   //  If a project might run on IE8 or earlier, then this file should be included.
42005   //  This file does nothing on ES5 systems.
42006
42007   //      JSON.stringify(value, replacer, space)
42008   //          value       any JavaScript value, usually an object or array.
42009   //          replacer    an optional parameter that determines how object
42010   //                      values are stringified for objects. It can be a
42011   //                      function or an array of strings.
42012   //          space       an optional parameter that specifies the indentation
42013   //                      of nested structures. If it is omitted, the text will
42014   //                      be packed without extra whitespace. If it is a number,
42015   //                      it will specify the number of spaces to indent at each
42016   //                      level. If it is a string (such as "\t" or "&nbsp;"),
42017   //                      it contains the characters used to indent at each level.
42018   //          This method produces a JSON text from a JavaScript value.
42019   //          When an object value is found, if the object contains a toJSON
42020   //          method, its toJSON method will be called and the result will be
42021   //          stringified. A toJSON method does not serialize: it returns the
42022   //          value represented by the name/value pair that should be serialized,
42023   //          or undefined if nothing should be serialized. The toJSON method
42024   //          will be passed the key associated with the value, and this will be
42025   //          bound to the value.
42026
42027   //          For example, this would serialize Dates as ISO strings.
42028
42029   //              Date.prototype.toJSON = function (key) {
42030   //                  function f(n) {
42031   //                      // Format integers to have at least two digits.
42032   //                      return (n < 10)
42033   //                          ? "0" + n
42034   //                          : n;
42035   //                  }
42036   //                  return this.getUTCFullYear()   + "-" +
42037   //                       f(this.getUTCMonth() + 1) + "-" +
42038   //                       f(this.getUTCDate())      + "T" +
42039   //                       f(this.getUTCHours())     + ":" +
42040   //                       f(this.getUTCMinutes())   + ":" +
42041   //                       f(this.getUTCSeconds())   + "Z";
42042   //              };
42043
42044   //          You can provide an optional replacer method. It will be passed the
42045   //          key and value of each member, with this bound to the containing
42046   //          object. The value that is returned from your method will be
42047   //          serialized. If your method returns undefined, then the member will
42048   //          be excluded from the serialization.
42049
42050   //          If the replacer parameter is an array of strings, then it will be
42051   //          used to select the members to be serialized. It filters the results
42052   //          such that only members with keys listed in the replacer array are
42053   //          stringified.
42054
42055   //          Values that do not have JSON representations, such as undefined or
42056   //          functions, will not be serialized. Such values in objects will be
42057   //          dropped; in arrays they will be replaced with null. You can use
42058   //          a replacer function to replace those with JSON values.
42059
42060   //          JSON.stringify(undefined) returns undefined.
42061
42062   //          The optional space parameter produces a stringification of the
42063   //          value that is filled with line breaks and indentation to make it
42064   //          easier to read.
42065
42066   //          If the space parameter is a non-empty string, then that string will
42067   //          be used for indentation. If the space parameter is a number, then
42068   //          the indentation will be that many spaces.
42069
42070   //          Example:
42071
42072   //          text = JSON.stringify(["e", {pluribus: "unum"}]);
42073   //          // text is '["e",{"pluribus":"unum"}]'
42074
42075   //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
42076   //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
42077
42078   //          text = JSON.stringify([new Date()], function (key, value) {
42079   //              return this[key] instanceof Date
42080   //                  ? "Date(" + this[key] + ")"
42081   //                  : value;
42082   //          });
42083   //          // text is '["Date(---current time---)"]'
42084
42085   //      JSON.parse(text, reviver)
42086   //          This method parses a JSON text to produce an object or array.
42087   //          It can throw a SyntaxError exception.
42088
42089   //          The optional reviver parameter is a function that can filter and
42090   //          transform the results. It receives each of the keys and values,
42091   //          and its return value is used instead of the original value.
42092   //          If it returns what it received, then the structure is not modified.
42093   //          If it returns undefined then the member is deleted.
42094
42095   //          Example:
42096
42097   //          // Parse the text. Values that look like ISO date strings will
42098   //          // be converted to Date objects.
42099
42100   //          myData = JSON.parse(text, function (key, value) {
42101   //              var a;
42102   //              if (typeof value === "string") {
42103   //                  a =
42104   //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
42105   //                  if (a) {
42106   //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
42107   //                          +a[5], +a[6]));
42108   //                  }
42109   //              }
42110   //              return value;
42111   //          });
42112
42113   //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
42114   //              var d;
42115   //              if (typeof value === "string" &&
42116   //                      value.slice(0, 5) === "Date(" &&
42117   //                      value.slice(-1) === ")") {
42118   //                  d = new Date(value.slice(5, -1));
42119   //                  if (d) {
42120   //                      return d;
42121   //                  }
42122   //              }
42123   //              return value;
42124   //          });
42125
42126   //  This is a reference implementation. You are free to copy, modify, or
42127   //  redistribute.
42128
42129   /*jslint
42130       eval, for, this
42131   */
42132
42133   /*property
42134       JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
42135       getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
42136       lastIndex, length, parse, prototype, push, replace, slice, stringify,
42137       test, toJSON, toString, valueOf
42138   */
42139
42140
42141   // Create a JSON object only if one does not already exist. We create the
42142   // methods in a closure to avoid creating global variables.
42143
42144   if (typeof JSON !== "object") {
42145       JSON = {};
42146   }
42147
42148   (function () {
42149
42150       var rx_one = /^[\],:{}\s]*$/;
42151       var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
42152       var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
42153       var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
42154       var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
42155       var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
42156
42157       function f(n) {
42158           // Format integers to have at least two digits.
42159           return n < 10
42160               ? "0" + n
42161               : n;
42162       }
42163
42164       function this_value() {
42165           return this.valueOf();
42166       }
42167
42168       if (typeof Date.prototype.toJSON !== "function") {
42169
42170           Date.prototype.toJSON = function () {
42171
42172               return isFinite(this.valueOf())
42173                   ? this.getUTCFullYear() + "-" +
42174                           f(this.getUTCMonth() + 1) + "-" +
42175                           f(this.getUTCDate()) + "T" +
42176                           f(this.getUTCHours()) + ":" +
42177                           f(this.getUTCMinutes()) + ":" +
42178                           f(this.getUTCSeconds()) + "Z"
42179                   : null;
42180           };
42181
42182           Boolean.prototype.toJSON = this_value;
42183           Number.prototype.toJSON = this_value;
42184           String.prototype.toJSON = this_value;
42185       }
42186
42187       var gap;
42188       var indent;
42189       var meta;
42190       var rep;
42191
42192
42193       function quote(string) {
42194
42195   // If the string contains no control characters, no quote characters, and no
42196   // backslash characters, then we can safely slap some quotes around it.
42197   // Otherwise we must also replace the offending characters with safe escape
42198   // sequences.
42199
42200           rx_escapable.lastIndex = 0;
42201           return rx_escapable.test(string)
42202               ? "\"" + string.replace(rx_escapable, function (a) {
42203                   var c = meta[a];
42204                   return typeof c === "string"
42205                       ? c
42206                       : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
42207               }) + "\""
42208               : "\"" + string + "\"";
42209       }
42210
42211
42212       function str(key, holder) {
42213
42214   // Produce a string from holder[key].
42215
42216           var i;          // The loop counter.
42217           var k;          // The member key.
42218           var v;          // The member value.
42219           var length;
42220           var mind = gap;
42221           var partial;
42222           var value = holder[key];
42223
42224   // If the value has a toJSON method, call it to obtain a replacement value.
42225
42226           if (value && typeof value === "object" &&
42227                   typeof value.toJSON === "function") {
42228               value = value.toJSON(key);
42229           }
42230
42231   // If we were called with a replacer function, then call the replacer to
42232   // obtain a replacement value.
42233
42234           if (typeof rep === "function") {
42235               value = rep.call(holder, key, value);
42236           }
42237
42238   // What happens next depends on the value's type.
42239
42240           switch (typeof value) {
42241           case "string":
42242               return quote(value);
42243
42244           case "number":
42245
42246   // JSON numbers must be finite. Encode non-finite numbers as null.
42247
42248               return isFinite(value)
42249                   ? String(value)
42250                   : "null";
42251
42252           case "boolean":
42253           case "null":
42254
42255   // If the value is a boolean or null, convert it to a string. Note:
42256   // typeof null does not produce "null". The case is included here in
42257   // the remote chance that this gets fixed someday.
42258
42259               return String(value);
42260
42261   // If the type is "object", we might be dealing with an object or an array or
42262   // null.
42263
42264           case "object":
42265
42266   // Due to a specification blunder in ECMAScript, typeof null is "object",
42267   // so watch out for that case.
42268
42269               if (!value) {
42270                   return "null";
42271               }
42272
42273   // Make an array to hold the partial results of stringifying this object value.
42274
42275               gap += indent;
42276               partial = [];
42277
42278   // Is the value an array?
42279
42280               if (Object.prototype.toString.apply(value) === "[object Array]") {
42281
42282   // The value is an array. Stringify every element. Use null as a placeholder
42283   // for non-JSON values.
42284
42285                   length = value.length;
42286                   for (i = 0; i < length; i += 1) {
42287                       partial[i] = str(i, value) || "null";
42288                   }
42289
42290   // Join all of the elements together, separated with commas, and wrap them in
42291   // brackets.
42292
42293                   v = partial.length === 0
42294                       ? "[]"
42295                       : gap
42296                           ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
42297                           : "[" + partial.join(",") + "]";
42298                   gap = mind;
42299                   return v;
42300               }
42301
42302   // If the replacer is an array, use it to select the members to be stringified.
42303
42304               if (rep && typeof rep === "object") {
42305                   length = rep.length;
42306                   for (i = 0; i < length; i += 1) {
42307                       if (typeof rep[i] === "string") {
42308                           k = rep[i];
42309                           v = str(k, value);
42310                           if (v) {
42311                               partial.push(quote(k) + (
42312                                   gap
42313                                       ? ": "
42314                                       : ":"
42315                               ) + v);
42316                           }
42317                       }
42318                   }
42319               } else {
42320
42321   // Otherwise, iterate through all of the keys in the object.
42322
42323                   for (k in value) {
42324                       if (Object.prototype.hasOwnProperty.call(value, k)) {
42325                           v = str(k, value);
42326                           if (v) {
42327                               partial.push(quote(k) + (
42328                                   gap
42329                                       ? ": "
42330                                       : ":"
42331                               ) + v);
42332                           }
42333                       }
42334                   }
42335               }
42336
42337   // Join all of the member texts together, separated with commas,
42338   // and wrap them in braces.
42339
42340               v = partial.length === 0
42341                   ? "{}"
42342                   : gap
42343                       ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
42344                       : "{" + partial.join(",") + "}";
42345               gap = mind;
42346               return v;
42347           }
42348       }
42349
42350   // If the JSON object does not yet have a stringify method, give it one.
42351
42352       if (typeof JSON.stringify !== "function") {
42353           meta = {    // table of character substitutions
42354               "\b": "\\b",
42355               "\t": "\\t",
42356               "\n": "\\n",
42357               "\f": "\\f",
42358               "\r": "\\r",
42359               "\"": "\\\"",
42360               "\\": "\\\\"
42361           };
42362           JSON.stringify = function (value, replacer, space) {
42363
42364   // The stringify method takes a value and an optional replacer, and an optional
42365   // space parameter, and returns a JSON text. The replacer can be a function
42366   // that can replace values, or an array of strings that will select the keys.
42367   // A default replacer method can be provided. Use of the space parameter can
42368   // produce text that is more easily readable.
42369
42370               var i;
42371               gap = "";
42372               indent = "";
42373
42374   // If the space parameter is a number, make an indent string containing that
42375   // many spaces.
42376
42377               if (typeof space === "number") {
42378                   for (i = 0; i < space; i += 1) {
42379                       indent += " ";
42380                   }
42381
42382   // If the space parameter is a string, it will be used as the indent string.
42383
42384               } else if (typeof space === "string") {
42385                   indent = space;
42386               }
42387
42388   // If there is a replacer, it must be a function or an array.
42389   // Otherwise, throw an error.
42390
42391               rep = replacer;
42392               if (replacer && typeof replacer !== "function" &&
42393                       (typeof replacer !== "object" ||
42394                       typeof replacer.length !== "number")) {
42395                   throw new Error("JSON.stringify");
42396               }
42397
42398   // Make a fake root object containing our value under the key of "".
42399   // Return the result of stringifying the value.
42400
42401               return str("", {"": value});
42402           };
42403       }
42404
42405
42406   // If the JSON object does not yet have a parse method, give it one.
42407
42408       if (typeof JSON.parse !== "function") {
42409           JSON.parse = function (text, reviver) {
42410
42411   // The parse method takes a text and an optional reviver function, and returns
42412   // a JavaScript value if the text is a valid JSON text.
42413
42414               var j;
42415
42416               function walk(holder, key) {
42417
42418   // The walk method is used to recursively walk the resulting structure so
42419   // that modifications can be made.
42420
42421                   var k;
42422                   var v;
42423                   var value = holder[key];
42424                   if (value && typeof value === "object") {
42425                       for (k in value) {
42426                           if (Object.prototype.hasOwnProperty.call(value, k)) {
42427                               v = walk(value, k);
42428                               if (v !== undefined) {
42429                                   value[k] = v;
42430                               } else {
42431                                   delete value[k];
42432                               }
42433                           }
42434                       }
42435                   }
42436                   return reviver.call(holder, key, value);
42437               }
42438
42439
42440   // Parsing happens in four stages. In the first stage, we replace certain
42441   // Unicode characters with escape sequences. JavaScript handles many characters
42442   // incorrectly, either silently deleting them, or treating them as line endings.
42443
42444               text = String(text);
42445               rx_dangerous.lastIndex = 0;
42446               if (rx_dangerous.test(text)) {
42447                   text = text.replace(rx_dangerous, function (a) {
42448                       return "\\u" +
42449                               ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
42450                   });
42451               }
42452
42453   // In the second stage, we run the text against regular expressions that look
42454   // for non-JSON patterns. We are especially concerned with "()" and "new"
42455   // because they can cause invocation, and "=" because it can cause mutation.
42456   // But just to be safe, we want to reject all unexpected forms.
42457
42458   // We split the second stage into 4 regexp operations in order to work around
42459   // crippling inefficiencies in IE's and Safari's regexp engines. First we
42460   // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
42461   // replace all simple value tokens with "]" characters. Third, we delete all
42462   // open brackets that follow a colon or comma or that begin the text. Finally,
42463   // we look to see that the remaining characters are only whitespace or "]" or
42464   // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
42465
42466               if (
42467                   rx_one.test(
42468                       text
42469                           .replace(rx_two, "@")
42470                           .replace(rx_three, "]")
42471                           .replace(rx_four, "")
42472                   )
42473               ) {
42474
42475   // In the third stage we use the eval function to compile the text into a
42476   // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
42477   // in JavaScript: it can begin a block or an object literal. We wrap the text
42478   // in parens to eliminate the ambiguity.
42479
42480                   j = eval("(" + text + ")");
42481
42482   // In the optional fourth stage, we recursively walk the new structure, passing
42483   // each name/value pair to a reviver function for possible transformation.
42484
42485                   return (typeof reviver === "function")
42486                       ? walk({"": j}, "")
42487                       : j;
42488               }
42489
42490   // If the text is not JSON parseable, then a SyntaxError is thrown.
42491
42492               throw new SyntaxError("JSON.parse");
42493           };
42494       }
42495   }());
42496
42497   var json2 = json2Plugin;
42498
42499   function json2Plugin() {
42500         
42501         return {}
42502   }
42503
42504   var plugins = [json2];
42505
42506   var store_legacy = storeEngine.createStore(all, plugins);
42507
42508   var store_legacy$1 = /*#__PURE__*/Object.freeze({
42509     default: store_legacy,
42510     __moduleExports: store_legacy
42511   });
42512
42513   var ohauth$2 = ( ohauth$1 && ohauth_1 ) || ohauth$1;
42514
42515   var resolveUrl$2 = ( resolveUrl$1 && resolveUrl ) || resolveUrl$1;
42516
42517   var store = ( store_legacy$1 && store_legacy ) || store_legacy$1;
42518
42519   // # osm-auth
42520   //
42521   // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
42522   // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
42523   // does not support custom headers, which this uses everywhere.
42524   var osmAuth = function(o) {
42525
42526       var oauth = {};
42527
42528       // authenticated users will also have a request token secret, but it's
42529       // not used in transactions with the server
42530       oauth.authenticated = function() {
42531           return !!(token('oauth_token') && token('oauth_token_secret'));
42532       };
42533
42534       oauth.logout = function() {
42535           token('oauth_token', '');
42536           token('oauth_token_secret', '');
42537           token('oauth_request_token_secret', '');
42538           return oauth;
42539       };
42540
42541       // TODO: detect lack of click event
42542       oauth.authenticate = function(callback) {
42543           if (oauth.authenticated()) return callback();
42544
42545           oauth.logout();
42546
42547           // ## Getting a request token
42548           var params = timenonce(getAuth(o)),
42549               url = o.url + '/oauth/request_token';
42550
42551           params.oauth_signature = ohauth$2.signature(
42552               o.oauth_secret, '',
42553               ohauth$2.baseString('POST', url, params));
42554
42555           if (!o.singlepage) {
42556               // Create a 600x550 popup window in the center of the screen
42557               var w = 600, h = 550,
42558                   settings = [
42559                       ['width', w], ['height', h],
42560                       ['left', screen.width / 2 - w / 2],
42561                       ['top', screen.height / 2 - h / 2]].map(function(x) {
42562                           return x.join('=');
42563                       }).join(','),
42564                   popup = window.open('about:blank', 'oauth_window', settings);
42565           }
42566
42567           // Request a request token. When this is complete, the popup
42568           // window is redirected to OSM's authorization page.
42569           ohauth$2.xhr('POST', url, params, null, {}, reqTokenDone);
42570           o.loading();
42571
42572           function reqTokenDone(err, xhr) {
42573               o.done();
42574               if (err) return callback(err);
42575               var resp = ohauth$2.stringQs(xhr.response);
42576               token('oauth_request_token_secret', resp.oauth_token_secret);
42577               var authorize_url = o.url + '/oauth/authorize?' + ohauth$2.qsString({
42578                   oauth_token: resp.oauth_token,
42579                   oauth_callback: resolveUrl$2(o.landing)
42580               });
42581
42582               if (o.singlepage) {
42583                   location.href = authorize_url;
42584               } else {
42585                   popup.location = authorize_url;
42586               }
42587           }
42588
42589           // Called by a function in a landing page, in the popup window. The
42590           // window closes itself.
42591           window.authComplete = function(token) {
42592               var oauth_token = ohauth$2.stringQs(token.split('?')[1]);
42593               get_access_token(oauth_token.oauth_token);
42594               delete window.authComplete;
42595           };
42596
42597           // ## Getting an request token
42598           //
42599           // At this point we have an `oauth_token`, brought in from a function
42600           // call on a landing page popup.
42601           function get_access_token(oauth_token) {
42602               var url = o.url + '/oauth/access_token',
42603                   params = timenonce(getAuth(o)),
42604                   request_token_secret = token('oauth_request_token_secret');
42605               params.oauth_token = oauth_token;
42606               params.oauth_signature = ohauth$2.signature(
42607                   o.oauth_secret,
42608                   request_token_secret,
42609                   ohauth$2.baseString('POST', url, params));
42610
42611               // ## Getting an access token
42612               //
42613               // The final token required for authentication. At this point
42614               // we have a `request token secret`
42615               ohauth$2.xhr('POST', url, params, null, {}, accessTokenDone);
42616               o.loading();
42617           }
42618
42619           function accessTokenDone(err, xhr) {
42620               o.done();
42621               if (err) return callback(err);
42622               var access_token = ohauth$2.stringQs(xhr.response);
42623               token('oauth_token', access_token.oauth_token);
42624               token('oauth_token_secret', access_token.oauth_token_secret);
42625               callback(null, oauth);
42626           }
42627       };
42628
42629       oauth.bootstrapToken = function(oauth_token, callback) {
42630           // ## Getting an request token
42631           // At this point we have an `oauth_token`, brought in from a function
42632           // call on a landing page popup.
42633           function get_access_token(oauth_token) {
42634               var url = o.url + '/oauth/access_token',
42635                   params = timenonce(getAuth(o)),
42636                   request_token_secret = token('oauth_request_token_secret');
42637               params.oauth_token = oauth_token;
42638               params.oauth_signature = ohauth$2.signature(
42639                   o.oauth_secret,
42640                   request_token_secret,
42641                   ohauth$2.baseString('POST', url, params));
42642
42643               // ## Getting an access token
42644               // The final token required for authentication. At this point
42645               // we have a `request token secret`
42646               ohauth$2.xhr('POST', url, params, null, {}, accessTokenDone);
42647               o.loading();
42648           }
42649
42650           function accessTokenDone(err, xhr) {
42651               o.done();
42652               if (err) return callback(err);
42653               var access_token = ohauth$2.stringQs(xhr.response);
42654               token('oauth_token', access_token.oauth_token);
42655               token('oauth_token_secret', access_token.oauth_token_secret);
42656               callback(null, oauth);
42657           }
42658
42659           get_access_token(oauth_token);
42660       };
42661
42662       // # xhr
42663       //
42664       // A single XMLHttpRequest wrapper that does authenticated calls if the
42665       // user has logged in.
42666       oauth.xhr = function(options, callback) {
42667           if (!oauth.authenticated()) {
42668               if (o.auto) {
42669                   return oauth.authenticate(run);
42670               } else {
42671                   callback('not authenticated', null);
42672                   return;
42673               }
42674           } else {
42675               return run();
42676           }
42677
42678           function run() {
42679               var params = timenonce(getAuth(o)),
42680                   oauth_token_secret = token('oauth_token_secret'),
42681                   url = (options.prefix !== false) ? o.url + options.path : options.path,
42682                   url_parts = url.replace(/#.*$/, '').split('?', 2),
42683                   base_url = url_parts[0],
42684                   query = (url_parts.length === 2) ? url_parts[1] : '';
42685
42686               // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
42687               if ((!options.options || !options.options.header ||
42688                   options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
42689                   options.content) {
42690                   params = xtend(params, ohauth$2.stringQs(options.content));
42691               }
42692
42693               params.oauth_token = token('oauth_token');
42694               params.oauth_signature = ohauth$2.signature(
42695                   o.oauth_secret,
42696                   oauth_token_secret,
42697                   ohauth$2.baseString(options.method, base_url, xtend(params, ohauth$2.stringQs(query)))
42698               );
42699
42700               return ohauth$2.xhr(options.method, url, params, options.content, options.options, done);
42701           }
42702
42703           function done(err, xhr) {
42704               if (err) return callback(err);
42705               else if (xhr.responseXML) return callback(err, xhr.responseXML);
42706               else return callback(err, xhr.response);
42707           }
42708       };
42709
42710       // pre-authorize this object, if we can just get a token and token_secret
42711       // from the start
42712       oauth.preauth = function(c) {
42713           if (!c) return;
42714           if (c.oauth_token) token('oauth_token', c.oauth_token);
42715           if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
42716           return oauth;
42717       };
42718
42719       oauth.options = function(_) {
42720           if (!arguments.length) return o;
42721
42722           o = _;
42723           o.url = o.url || 'https://www.openstreetmap.org';
42724           o.landing = o.landing || 'land.html';
42725           o.singlepage = o.singlepage || false;
42726
42727           // Optional loading and loading-done functions for nice UI feedback.
42728           // by default, no-ops
42729           o.loading = o.loading || function() {};
42730           o.done = o.done || function() {};
42731
42732           return oauth.preauth(o);
42733       };
42734
42735       // 'stamp' an authentication object from `getAuth()`
42736       // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
42737       // and timestamp
42738       function timenonce(o) {
42739           o.oauth_timestamp = ohauth$2.timestamp();
42740           o.oauth_nonce = ohauth$2.nonce();
42741           return o;
42742       }
42743
42744       // get/set tokens. These are prefixed with the base URL so that `osm-auth`
42745       // can be used with multiple APIs and the keys in `localStorage`
42746       // will not clash
42747       var token;
42748
42749       if (store.enabled) {
42750           token = function (x, y) {
42751               if (arguments.length === 1) return store.get(o.url + x);
42752               else if (arguments.length === 2) return store.set(o.url + x, y);
42753           };
42754       } else {
42755           var storage = {};
42756           token = function (x, y) {
42757               if (arguments.length === 1) return storage[o.url + x];
42758               else if (arguments.length === 2) return storage[o.url + x] = y;
42759           };
42760       }
42761
42762       // Get an authentication object. If you just add and remove properties
42763       // from a single object, you'll need to use `delete` to make sure that
42764       // it doesn't contain undesired properties for authentication
42765       function getAuth(o) {
42766           return {
42767               oauth_consumer_key: o.oauth_consumer_key,
42768               oauth_signature_method: 'HMAC-SHA1'
42769           };
42770       }
42771
42772       // potentially pre-authorize
42773       oauth.options(o);
42774
42775       return oauth;
42776   };
42777
42778   var JXON = new (function () {
42779     var
42780       sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
42781       aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
42782
42783     function parseText (sValue) {
42784       if (rIsNull.test(sValue)) { return null; }
42785       if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
42786       if (isFinite(sValue)) { return parseFloat(sValue); }
42787       if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
42788       return sValue;
42789     }
42790
42791     function EmptyTree () { }
42792     EmptyTree.prototype.toString = function () { return 'null'; };
42793     EmptyTree.prototype.valueOf = function () { return null; };
42794
42795     function objectify (vValue) {
42796       return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
42797     }
42798
42799     function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
42800       var
42801         nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
42802         bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
42803
42804       var
42805         sProp, vContent, nLength = 0, sCollectedTxt = '',
42806         vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
42807
42808       if (bChildren) {
42809         for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
42810           oNode = oParentNode.childNodes.item(nItem);
42811           if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
42812           else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
42813           else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
42814         }
42815       }
42816
42817       var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
42818
42819       if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
42820
42821       for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
42822         sProp = aCache[nElId].nodeName.toLowerCase();
42823         vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
42824         if (vResult.hasOwnProperty(sProp)) {
42825           if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
42826           vResult[sProp].push(vContent);
42827         } else {
42828           vResult[sProp] = vContent;
42829           nLength++;
42830         }
42831       }
42832
42833       if (bAttributes) {
42834         var
42835           nAttrLen = oParentNode.attributes.length,
42836           sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
42837
42838         for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
42839           oAttrib = oParentNode.attributes.item(nAttrib);
42840           oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
42841         }
42842
42843         if (bNesteAttr) {
42844           if (bFreeze) { Object.freeze(oAttrParent); }
42845           vResult[sAttributesProp] = oAttrParent;
42846           nLength -= nAttrLen - 1;
42847         }
42848       }
42849
42850       if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
42851         vResult[sValueProp] = vBuiltVal;
42852       } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
42853         vResult = vBuiltVal;
42854       }
42855
42856       if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
42857
42858       aCache.length = nLevelStart;
42859
42860       return vResult;
42861     }
42862
42863     function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
42864       var vValue, oChild;
42865
42866       if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
42867         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
42868       } else if (oParentObj.constructor === Date) {
42869         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
42870       }
42871
42872       for (var sName in oParentObj) {
42873         vValue = oParentObj[sName];
42874         if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
42875         if (sName === sValueProp) {
42876           if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
42877         } else if (sName === sAttributesProp) { /* verbosity level is 3 */
42878           for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
42879         } else if (sName.charAt(0) === sAttrPref) {
42880           oParentEl.setAttribute(sName.slice(1), vValue);
42881         } else if (vValue.constructor === Array) {
42882           for (var nItem = 0; nItem < vValue.length; nItem++) {
42883             oChild = oXMLDoc.createElement(sName);
42884             loadObjTree(oXMLDoc, oChild, vValue[nItem]);
42885             oParentEl.appendChild(oChild);
42886           }
42887         } else {
42888           oChild = oXMLDoc.createElement(sName);
42889           if (vValue instanceof Object) {
42890             loadObjTree(oXMLDoc, oChild, vValue);
42891           } else if (vValue !== null && vValue !== true) {
42892             oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
42893           }
42894           oParentEl.appendChild(oChild);
42895        }
42896      }
42897     }
42898
42899     this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
42900       var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
42901       return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
42902     };
42903
42904     this.unbuild = function (oObjTree) {    
42905       var oNewDoc = document.implementation.createDocument('', '', null);
42906       loadObjTree(oNewDoc, oNewDoc, oObjTree);
42907       return oNewDoc;
42908     };
42909
42910     this.stringify = function (oObjTree) {
42911       return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
42912     };
42913   })();
42914
42915   // var myObject = JXON.build(doc);
42916   // we got our javascript object! try: alert(JSON.stringify(myObject));
42917
42918   // var newDoc = JXON.unbuild(myObject);
42919   // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
42920
42921   var tiler$2 = utilTiler();
42922   var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
42923   var urlroot = 'https://www.openstreetmap.org';
42924   var oauth = osmAuth({
42925       url: urlroot,
42926       oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
42927       oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
42928       loading: authLoading,
42929       done: authDone
42930   });
42931
42932   var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
42933   var _tileCache = { loaded: {}, inflight: {}, seen: {} };
42934   var _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, rtree: rbush_1() };
42935   var _userCache = { toLoad: {}, user: {} };
42936   var _changeset = {};
42937
42938   var _connectionID = 1;
42939   var _tileZoom = 16;
42940   var _noteZoom = 12;
42941   var _rateLimitError;
42942   var _userChangesets;
42943   var _userDetails;
42944   var _off;
42945
42946
42947   function authLoading() {
42948       dispatch$3.call('authLoading');
42949   }
42950
42951
42952   function authDone() {
42953       dispatch$3.call('authDone');
42954   }
42955
42956
42957   function abortRequest$2(i) {
42958       if (i) {
42959           i.abort();
42960       }
42961   }
42962
42963
42964   function abortUnwantedRequests(cache, tiles) {
42965       forEach(cache.inflight, function(v, k) {
42966           var wanted = find$1(tiles, function(tile) { return k === tile.id; });
42967           if (!wanted) {
42968               abortRequest$2(v);
42969               delete cache.inflight[k];
42970           }
42971       });
42972   }
42973
42974
42975   function getLoc(attrs) {
42976       var lon = attrs.lon && attrs.lon.value;
42977       var lat = attrs.lat && attrs.lat.value;
42978       return [parseFloat(lon), parseFloat(lat)];
42979   }
42980
42981
42982   function getNodes(obj) {
42983       var elems = obj.getElementsByTagName('nd');
42984       var nodes = new Array(elems.length);
42985       for (var i = 0, l = elems.length; i < l; i++) {
42986           nodes[i] = 'n' + elems[i].attributes.ref.value;
42987       }
42988       return nodes;
42989   }
42990
42991
42992   function getTags(obj) {
42993       var elems = obj.getElementsByTagName('tag');
42994       var tags = {};
42995       for (var i = 0, l = elems.length; i < l; i++) {
42996           var attrs = elems[i].attributes;
42997           tags[attrs.k.value] = attrs.v.value;
42998       }
42999
43000       return tags;
43001   }
43002
43003
43004   function getMembers(obj) {
43005       var elems = obj.getElementsByTagName('member');
43006       var members = new Array(elems.length);
43007       for (var i = 0, l = elems.length; i < l; i++) {
43008           var attrs = elems[i].attributes;
43009           members[i] = {
43010               id: attrs.type.value[0] + attrs.ref.value,
43011               type: attrs.type.value,
43012               role: attrs.role.value
43013           };
43014       }
43015       return members;
43016   }
43017
43018
43019   function getVisible(attrs) {
43020       return (!attrs.visible || attrs.visible.value !== 'false');
43021   }
43022
43023
43024   function parseComments(comments) {
43025       var parsedComments = [];
43026
43027       // for each comment
43028       for (var i = 0; i < comments.length; i++) {
43029           var comment = comments[i];
43030           if (comment.nodeName === 'comment') {
43031               var childNodes = comment.childNodes;
43032               var parsedComment = {};
43033
43034               for (var j = 0; j < childNodes.length; j++) {
43035                   var node = childNodes[j];
43036                   var nodeName = node.nodeName;
43037                   if (nodeName === '#text') continue;
43038                   parsedComment[nodeName] = node.textContent;
43039
43040                   if (nodeName === 'uid') {
43041                       var uid = node.textContent;
43042                       if (uid && !_userCache.user[uid]) {
43043                           _userCache.toLoad[uid] = true;
43044                       }
43045                   }
43046               }
43047
43048               if (parsedComment) {
43049                   parsedComments.push(parsedComment);
43050               }
43051           }
43052       }
43053       return parsedComments;
43054   }
43055
43056
43057   function encodeNoteRtree(note) {
43058       return {
43059           minX: note.loc[0],
43060           minY: note.loc[1],
43061           maxX: note.loc[0],
43062           maxY: note.loc[1],
43063           data: note
43064       };
43065   }
43066
43067
43068   var parsers = {
43069       node: function nodeData(obj, uid) {
43070           var attrs = obj.attributes;
43071           return new osmNode({
43072               id: uid,
43073               visible: getVisible(attrs),
43074               version: attrs.version.value,
43075               changeset: attrs.changeset && attrs.changeset.value,
43076               timestamp: attrs.timestamp && attrs.timestamp.value,
43077               user: attrs.user && attrs.user.value,
43078               uid: attrs.uid && attrs.uid.value,
43079               loc: getLoc(attrs),
43080               tags: getTags(obj)
43081           });
43082       },
43083
43084       way: function wayData(obj, uid) {
43085           var attrs = obj.attributes;
43086           return new osmWay({
43087               id: uid,
43088               visible: getVisible(attrs),
43089               version: attrs.version.value,
43090               changeset: attrs.changeset && attrs.changeset.value,
43091               timestamp: attrs.timestamp && attrs.timestamp.value,
43092               user: attrs.user && attrs.user.value,
43093               uid: attrs.uid && attrs.uid.value,
43094               tags: getTags(obj),
43095               nodes: getNodes(obj),
43096           });
43097       },
43098
43099       relation: function relationData(obj, uid) {
43100           var attrs = obj.attributes;
43101           return new osmRelation({
43102               id: uid,
43103               visible: getVisible(attrs),
43104               version: attrs.version.value,
43105               changeset: attrs.changeset && attrs.changeset.value,
43106               timestamp: attrs.timestamp && attrs.timestamp.value,
43107               user: attrs.user && attrs.user.value,
43108               uid: attrs.uid && attrs.uid.value,
43109               tags: getTags(obj),
43110               members: getMembers(obj)
43111           });
43112       },
43113
43114       note: function parseNote(obj, uid) {
43115           var attrs = obj.attributes;
43116           var childNodes = obj.childNodes;
43117           var props = {};
43118
43119           props.id = uid;
43120           props.loc = getLoc(attrs);
43121
43122           // if notes are coincident, move them apart slightly
43123           var coincident = false;
43124           var epsilon = 0.00001;
43125           do {
43126               if (coincident) {
43127                   props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
43128               }
43129               var bbox = geoExtent$$1(props.loc).bbox();
43130               coincident = _noteCache.rtree.search(bbox).length;
43131           } while (coincident);
43132
43133           // parse note contents
43134           for (var i = 0; i < childNodes.length; i++) {
43135               var node = childNodes[i];
43136               var nodeName = node.nodeName;
43137               if (nodeName === '#text') continue;
43138
43139               // if the element is comments, parse the comments
43140               if (nodeName === 'comments') {
43141                   props[nodeName] = parseComments(node.childNodes);
43142               } else {
43143                   props[nodeName] = node.textContent;
43144               }
43145           }
43146
43147           var note = new osmNote(props);
43148           var item = encodeNoteRtree(note);
43149           _noteCache.note[note.id] = note;
43150           _noteCache.rtree.insert(item);
43151
43152           return note;
43153       },
43154
43155       user: function parseUser(obj, uid) {
43156           var attrs = obj.attributes;
43157           var user = {
43158               id: uid,
43159               display_name: attrs.display_name && attrs.display_name.value,
43160               account_created: attrs.account_created && attrs.account_created.value,
43161               changesets_count: 0
43162           };
43163
43164           var img = obj.getElementsByTagName('img');
43165           if (img && img[0] && img[0].getAttribute('href')) {
43166               user.image_url = img[0].getAttribute('href');
43167           }
43168
43169           var changesets = obj.getElementsByTagName('changesets');
43170           if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
43171               user.changesets_count = changesets[0].getAttribute('count');
43172           }
43173
43174           _userCache.user[uid] = user;
43175           delete _userCache.toLoad[uid];
43176           return user;
43177       }
43178   };
43179
43180
43181   function parseXML(xml$$1, callback, options) {
43182       options = assignIn({ skipSeen: true }, options);
43183       if (!xml$$1 || !xml$$1.childNodes) {
43184           return callback({ message: 'No XML', status: -1 });
43185       }
43186
43187       var root = xml$$1.childNodes[0];
43188       var children = root.childNodes;
43189       utilIdleWorker(children, parseChild, done);
43190
43191
43192       function done(results) {
43193           callback(null, results);
43194       }
43195
43196       function parseChild(child) {
43197           var parser = parsers[child.nodeName];
43198           if (!parser) return null;
43199
43200           var uid;
43201           if (child.nodeName === 'user') {
43202               uid = child.attributes.id.value;
43203               if (options.skipSeen && _userCache.user[uid]) {
43204                   delete _userCache.toLoad[uid];
43205                   return null;
43206               }
43207
43208           } else if (child.nodeName === 'note') {
43209               uid = child.getElementsByTagName('id')[0].textContent;
43210
43211           } else {
43212               uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
43213               if (options.skipSeen) {
43214                   if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
43215                   _tileCache.seen[uid] = true;
43216               }
43217           }
43218
43219           return parser(child, uid);
43220       }
43221   }
43222
43223
43224   // replace or remove note from rtree
43225   function updateRtree(item, replace) {
43226       _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
43227
43228       if (replace) {
43229           _noteCache.rtree.insert(item);
43230       }
43231   }
43232
43233
43234   function wrapcb(thisArg, callback, cid) {
43235       return function(err, result) {
43236           if (err) {
43237               // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
43238               if (err.status === 400 || err.status === 401 || err.status === 403) {
43239                   thisArg.logout();
43240               }
43241               return callback.call(thisArg, err);
43242
43243           } else if (thisArg.getConnectionId() !== cid) {
43244               return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
43245
43246           } else {
43247               return callback.call(thisArg, err, result);
43248           }
43249       };
43250   }
43251
43252
43253   var serviceOsm = {
43254
43255       init: function() {
43256           utilRebind(this, dispatch$3, 'on');
43257       },
43258
43259
43260       reset: function() {
43261           _connectionID++;
43262           _userChangesets = undefined;
43263           _userDetails = undefined;
43264           _rateLimitError = undefined;
43265
43266           forEach(_tileCache.inflight, abortRequest$2);
43267           forEach(_noteCache.inflight, abortRequest$2);
43268           forEach(_noteCache.inflightPost, abortRequest$2);
43269           if (_changeset.inflight) abortRequest$2(_changeset.inflight);
43270
43271           _tileCache = { loaded: {}, inflight: {}, seen: {} };
43272           _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, rtree: rbush_1() };
43273           _userCache = { toLoad: {}, user: {} };
43274           _changeset = {};
43275
43276           return this;
43277       },
43278
43279
43280       getConnectionId: function() {
43281           return _connectionID;
43282       },
43283
43284
43285       changesetURL: function(changesetID) {
43286           return urlroot + '/changeset/' + changesetID;
43287       },
43288
43289
43290       changesetsURL: function(center, zoom) {
43291           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
43292           return urlroot + '/history#map=' +
43293               Math.floor(zoom) + '/' +
43294               center[1].toFixed(precision) + '/' +
43295               center[0].toFixed(precision);
43296       },
43297
43298
43299       entityURL: function(entity) {
43300           return urlroot + '/' + entity.type + '/' + entity.osmId();
43301       },
43302
43303
43304       historyURL: function(entity) {
43305           return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
43306       },
43307
43308
43309       userURL: function(username) {
43310           return urlroot + '/user/' + username;
43311       },
43312
43313
43314       noteURL: function(note) {
43315           return urlroot + '/note/' + note.id;
43316       },
43317
43318
43319       // Generic method to load data from the OSM API
43320       // Can handle either auth or unauth calls.
43321       loadFromAPI: function(path, callback, options) {
43322           options = assignIn({ skipSeen: true }, options);
43323           var that = this;
43324           var cid = _connectionID;
43325
43326           function done(err, xml$$1) {
43327               if (that.getConnectionId() !== cid) {
43328                   if (callback) callback({ message: 'Connection Switched', status: -1 });
43329                   return;
43330               }
43331
43332               var isAuthenticated = that.authenticated();
43333
43334               // 400 Bad Request, 401 Unauthorized, 403 Forbidden
43335               // Logout and retry the request..
43336               if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
43337                   that.logout();
43338                   that.loadFromAPI(path, callback, options);
43339
43340               // else, no retry..
43341               } else {
43342                   // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
43343                   // Set the rateLimitError flag and trigger a warning..
43344                   if (!isAuthenticated && !_rateLimitError && err &&
43345                           (err.status === 509 || err.status === 429)) {
43346                       _rateLimitError = err;
43347                       dispatch$3.call('change');
43348                   }
43349
43350                   if (callback) {
43351                       if (err) {
43352                           return callback(err);
43353                       } else {
43354                           return parseXML(xml$$1, callback, options);
43355                       }
43356                   }
43357               }
43358           }
43359
43360           if (this.authenticated()) {
43361               return oauth.xhr({ method: 'GET', path: path }, done);
43362           } else {
43363               var url = urlroot + path;
43364               return d3_xml(url).get(done);
43365           }
43366       },
43367
43368
43369       // Load a single entity by id (ways and relations use the `/full` call)
43370       // GET /api/0.6/node/#id
43371       // GET /api/0.6/[way|relation]/#id/full
43372       loadEntity: function(id, callback) {
43373           var type = osmEntity$$1.id.type(id);
43374           var osmID = osmEntity$$1.id.toOSM(id);
43375           var options = { skipSeen: false };
43376
43377           this.loadFromAPI(
43378               '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
43379               function(err, entities) {
43380                   if (callback) callback(err, { data: entities });
43381               },
43382               options
43383           );
43384       },
43385
43386
43387       // Load a single entity with a specific version
43388       // GET /api/0.6/[node|way|relation]/#id/#version
43389       loadEntityVersion: function(id, version, callback) {
43390           var type = osmEntity$$1.id.type(id);
43391           var osmID = osmEntity$$1.id.toOSM(id);
43392           var options = { skipSeen: false };
43393
43394           this.loadFromAPI(
43395               '/api/0.6/' + type + '/' + osmID + '/' + version,
43396               function(err, entities) {
43397                   if (callback) callback(err, { data: entities });
43398               },
43399               options
43400           );
43401       },
43402
43403
43404       // Load multiple entities in chunks
43405       // (note: callback may be called multiple times)
43406       // GET /api/0.6/[nodes|ways|relations]?#parameters
43407       loadMultiple: function(ids, callback) {
43408           var that = this;
43409
43410           forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
43411               var type = k + 's';
43412               var osmIDs = map$3(v, osmEntity$$1.id.toOSM);
43413               var options = { skipSeen: false };
43414
43415               forEach(chunk(osmIDs, 150), function(arr) {
43416                   that.loadFromAPI(
43417                       '/api/0.6/' + type + '?' + type + '=' + arr.join(),
43418                       function(err, entities) {
43419                           if (callback) callback(err, { data: entities });
43420                       },
43421                       options
43422                   );
43423               });
43424           });
43425       },
43426
43427
43428       // Create, upload, and close a changeset
43429       // PUT /api/0.6/changeset/create
43430       // POST /api/0.6/changeset/#id/upload
43431       // PUT /api/0.6/changeset/#id/close
43432       putChangeset: function(changeset, changes, callback) {
43433           var cid = _connectionID;
43434
43435           if (_changeset.inflight) {
43436               return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
43437
43438           } else if (_changeset.open) {   // reuse existing open changeset..
43439               return createdChangeset.call(this, null, _changeset.open);
43440
43441           } else {   // Open a new changeset..
43442               var options = {
43443                   method: 'PUT',
43444                   path: '/api/0.6/changeset/create',
43445                   options: { header: { 'Content-Type': 'text/xml' } },
43446                   content: JXON.stringify(changeset.asJXON())
43447               };
43448               _changeset.inflight = oauth.xhr(
43449                   options,
43450                   wrapcb(this, createdChangeset, cid)
43451               );
43452           }
43453
43454
43455           function createdChangeset(err, changesetID) {
43456               _changeset.inflight = null;
43457               if (err) { return callback(err, changeset); }
43458
43459               _changeset.open = changesetID;
43460               changeset = changeset.update({ id: changesetID });
43461
43462               // Upload the changeset..
43463               var options = {
43464                   method: 'POST',
43465                   path: '/api/0.6/changeset/' + changesetID + '/upload',
43466                   options: { header: { 'Content-Type': 'text/xml' } },
43467                   content: JXON.stringify(changeset.osmChangeJXON(changes))
43468               };
43469               _changeset.inflight = oauth.xhr(
43470                   options,
43471                   wrapcb(this, uploadedChangeset, cid)
43472               );
43473           }
43474
43475
43476           function uploadedChangeset(err) {
43477               _changeset.inflight = null;
43478               if (err) return callback(err, changeset);
43479
43480               // Upload was successful, safe to call the callback.
43481               // Add delay to allow for postgres replication #1646 #2678
43482               window.setTimeout(function() { callback(null, changeset); }, 2500);
43483               _changeset.open = null;
43484
43485               // At this point, we don't really care if the connection was switched..
43486               // Only try to close the changeset if we're still talking to the same server.
43487               if (this.getConnectionId() === cid) {
43488                   // Still attempt to close changeset, but ignore response because #2667
43489                   oauth.xhr({
43490                       method: 'PUT',
43491                       path: '/api/0.6/changeset/' + changeset.id + '/close',
43492                       options: { header: { 'Content-Type': 'text/xml' } }
43493                   }, function() { return true; });
43494               }
43495           }
43496       },
43497
43498
43499       // Load multiple users in chunks
43500       // (note: callback may be called multiple times)
43501       // GET /api/0.6/users?users=#id1,#id2,...,#idn
43502       loadUsers: function(uids, callback) {
43503           var toLoad = [];
43504           var cached = [];
43505
43506           uniq(uids).forEach(function(uid) {
43507               if (_userCache.user[uid]) {
43508                   delete _userCache.toLoad[uid];
43509                   cached.push(_userCache.user[uid]);
43510               } else {
43511                   toLoad.push(uid);
43512               }
43513           });
43514
43515           if (cached.length || !this.authenticated()) {
43516               callback(undefined, cached);
43517               if (!this.authenticated()) return;  // require auth
43518           }
43519
43520           chunk(toLoad, 150).forEach(function(arr) {
43521               oauth.xhr(
43522                   { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
43523                   wrapcb(this, done, _connectionID)
43524               );
43525           }.bind(this));
43526
43527           function done(err, xml$$1) {
43528               if (err) { return callback(err); }
43529
43530               var options = { skipSeen: true };
43531               return parseXML(xml$$1, function(err, results) {
43532                   if (err) {
43533                       return callback(err);
43534                   } else {
43535                       return callback(undefined, results);
43536                   }
43537               }, options);
43538           }
43539       },
43540
43541
43542       // Load a given user by id
43543       // GET /api/0.6/user/#id
43544       loadUser: function(uid, callback) {
43545           if (_userCache.user[uid] || !this.authenticated()) {   // require auth
43546               delete _userCache.toLoad[uid];
43547               return callback(undefined, _userCache.user[uid]);
43548           }
43549
43550           oauth.xhr(
43551               { method: 'GET', path: '/api/0.6/user/' + uid },
43552               wrapcb(this, done, _connectionID)
43553           );
43554
43555           function done(err, xml$$1) {
43556               if (err) { return callback(err); }
43557
43558               var options = { skipSeen: true };
43559               return parseXML(xml$$1, function(err, results) {
43560                   if (err) {
43561                       return callback(err);
43562                   } else {
43563                       return callback(undefined, results[0]);
43564                   }
43565               }, options);
43566           }
43567       },
43568
43569
43570       // Load the details of the logged-in user
43571       // GET /api/0.6/user/details
43572       userDetails: function(callback) {
43573           if (_userDetails) {    // retrieve cached
43574               return callback(undefined, _userDetails);
43575           }
43576
43577           oauth.xhr(
43578               { method: 'GET', path: '/api/0.6/user/details' },
43579               wrapcb(this, done, _connectionID)
43580           );
43581
43582           function done(err, xml$$1) {
43583               if (err) { return callback(err); }
43584
43585               var options = { skipSeen: false };
43586               return parseXML(xml$$1, function(err, results) {
43587                   if (err) {
43588                       return callback(err);
43589                   } else {
43590                       _userDetails = results[0];
43591                       return callback(undefined, _userDetails);
43592                   }
43593               }, options);
43594           }
43595       },
43596
43597
43598       // Load previous changesets for the logged in user
43599       // GET /api/0.6/changesets?user=#id
43600       userChangesets: function(callback) {
43601           if (_userChangesets) {    // retrieve cached
43602               return callback(undefined, _userChangesets);
43603           }
43604
43605           this.userDetails(
43606               wrapcb(this, gotDetails, _connectionID)
43607           );
43608
43609
43610           function gotDetails(err, user) {
43611               if (err) { return callback(err); }
43612
43613               oauth.xhr(
43614                   { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
43615                   wrapcb(this, done, _connectionID)
43616               );
43617           }
43618
43619           function done(err, xml$$1) {
43620               if (err) { return callback(err); }
43621
43622               _userChangesets = Array.prototype.map.call(
43623                   xml$$1.getElementsByTagName('changeset'),
43624                   function (changeset) { return { tags: getTags(changeset) }; }
43625               ).filter(function (changeset) {
43626                   var comment = changeset.tags.comment;
43627                   return comment && comment !== '';
43628               });
43629
43630               return callback(undefined, _userChangesets);
43631           }
43632       },
43633
43634
43635       // Fetch the status of the OSM API
43636       // GET /api/capabilities
43637       status: function(callback) {
43638           d3_xml(urlroot + '/api/capabilities').get(
43639               wrapcb(this, done, _connectionID)
43640           );
43641
43642           function done(err, xml$$1) {
43643               if (err) { return callback(err); }
43644
43645               // update blacklists
43646               var elements = xml$$1.getElementsByTagName('blacklist');
43647               var regexes = [];
43648               for (var i = 0; i < elements.length; i++) {
43649                   var regex = elements[i].getAttribute('regex');  // needs unencode?
43650                   if (regex) {
43651                       regexes.push(regex);
43652                   }
43653               }
43654               if (regexes.length) {
43655                   _blacklists = regexes;
43656               }
43657
43658               if (_rateLimitError) {
43659                   return callback(_rateLimitError, 'rateLimited');
43660               } else {
43661                   var apiStatus = xml$$1.getElementsByTagName('status');
43662                   var val = apiStatus[0].getAttribute('api');
43663                   return callback(undefined, val);
43664               }
43665           }
43666       },
43667
43668
43669       // Load data (entities) from the API in tiles
43670       // GET /api/0.6/map?bbox=
43671       loadTiles: function(projection, callback) {
43672           if (_off) return;
43673
43674           var that = this;
43675           var path = '/api/0.6/map?bbox=';
43676
43677           // determine the needed tiles to cover the view
43678           var tiles = tiler$2.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
43679
43680           // abort inflight requests that are no longer needed
43681           var hadRequests = !isEmpty(_tileCache.inflight);
43682           abortUnwantedRequests(_tileCache, tiles);
43683           if (hadRequests && isEmpty(_tileCache.inflight)) {
43684               dispatch$3.call('loaded');    // stop the spinner
43685           }
43686
43687           // issue new requests..
43688           tiles.forEach(function(tile) {
43689               if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
43690               if (isEmpty(_tileCache.inflight)) {
43691                   dispatch$3.call('loading');   // start the spinner
43692               }
43693
43694               var options = { skipSeen: true };
43695               _tileCache.inflight[tile.id] = that.loadFromAPI(
43696                   path + tile.extent.toParam(),
43697                   function(err, parsed) {
43698                       delete _tileCache.inflight[tile.id];
43699                       if (!err) {
43700                           _tileCache.loaded[tile.id] = true;
43701                       }
43702                       if (callback) {
43703                           callback(err, assignIn({ data: parsed }, tile));
43704                       }
43705                       if (isEmpty(_tileCache.inflight)) {
43706                           dispatch$3.call('loaded');     // stop the spinner
43707                       }
43708                   },
43709                   options
43710               );
43711           });
43712       },
43713
43714
43715       // Load notes from the API in tiles
43716       // GET /api/0.6/notes?bbox=
43717       loadNotes: function(projection, noteOptions) {
43718           noteOptions = assignIn({ limit: 10000, closed: 7 }, noteOptions);
43719           if (_off) return;
43720
43721           var that = this;
43722           var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
43723           var throttleLoadUsers = throttle(function() {
43724               var uids = Object.keys(_userCache.toLoad);
43725               if (!uids.length) return;
43726               that.loadUsers(uids, function() {});  // eagerly load user details
43727           }, 750);
43728
43729           // determine the needed tiles to cover the view
43730           var tiles = tiler$2.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
43731
43732           // abort inflight requests that are no longer needed
43733           abortUnwantedRequests(_noteCache, tiles);
43734
43735           // issue new requests..
43736           tiles.forEach(function(tile) {
43737               if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
43738
43739               var options = { skipSeen: false };
43740               _noteCache.inflight[tile.id] = that.loadFromAPI(
43741                   path + tile.extent.toParam(),
43742                   function(err) {
43743                       delete _noteCache.inflight[tile.id];
43744                       if (!err) {
43745                           _noteCache.loaded[tile.id] = true;
43746                       }
43747                       throttleLoadUsers();
43748                       dispatch$3.call('loadedNotes');
43749                   },
43750                   options
43751               );
43752           });
43753       },
43754
43755
43756       // Create a note
43757       // POST /api/0.6/notes?params
43758       postNoteCreate: function(note, callback) {
43759           if (!this.authenticated()) {
43760               return callback({ message: 'Not Authenticated', status: -3 }, note);
43761           }
43762           if (_noteCache.inflightPost[note.id]) {
43763               return callback({ message: 'Note update already inflight', status: -2 }, note);
43764           }
43765
43766           if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
43767
43768           var comment = note.newComment;
43769           if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
43770
43771           var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
43772
43773           _noteCache.inflightPost[note.id] = oauth.xhr(
43774               { method: 'POST', path: path },
43775               wrapcb(this, done, _connectionID)
43776           );
43777
43778
43779           function done(err, xml$$1) {
43780               delete _noteCache.inflightPost[note.id];
43781               if (err) { return callback(err); }
43782
43783               // we get the updated note back, remove from caches and reparse..
43784               this.removeNote(note);
43785
43786               var options = { skipSeen: false };
43787               return parseXML(xml$$1, function(err, results) {
43788                   if (err) {
43789                       return callback(err);
43790                   } else {
43791                       return callback(undefined, results[0]);
43792                   }
43793               }, options);
43794           }
43795       },
43796
43797
43798       // Update a note
43799       // POST /api/0.6/notes/#id/comment?text=comment
43800       // POST /api/0.6/notes/#id/close?text=comment
43801       // POST /api/0.6/notes/#id/reopen?text=comment
43802       postNoteUpdate: function(note, newStatus, callback) {
43803           if (!this.authenticated()) {
43804               return callback({ message: 'Not Authenticated', status: -3 }, note);
43805           }
43806           if (_noteCache.inflightPost[note.id]) {
43807               return callback({ message: 'Note update already inflight', status: -2 }, note);
43808           }
43809
43810           var action;
43811           if (note.status !== 'closed' && newStatus === 'closed') {
43812               action = 'close';
43813           } else if (note.status !== 'open' && newStatus === 'open') {
43814               action = 'reopen';
43815           } else {
43816               action = 'comment';
43817               if (!note.newComment) return; // when commenting, comment required
43818           }
43819
43820           var path = '/api/0.6/notes/' + note.id + '/' + action;
43821           if (note.newComment) {
43822               path += '?' + utilQsString({ text: note.newComment });
43823           }
43824
43825           _noteCache.inflightPost[note.id] = oauth.xhr(
43826               { method: 'POST', path: path },
43827               wrapcb(this, done, _connectionID)
43828           );
43829
43830
43831           function done(err, xml$$1) {
43832               delete _noteCache.inflightPost[note.id];
43833               if (err) { return callback(err); }
43834
43835               // we get the updated note back, remove from caches and reparse..
43836               this.removeNote(note);
43837
43838               var options = { skipSeen: false };
43839               return parseXML(xml$$1, function(err, results) {
43840                   if (err) {
43841                       return callback(err);
43842                   } else {
43843                       return callback(undefined, results[0]);
43844                   }
43845               }, options);
43846           }
43847       },
43848
43849
43850       switch: function(options) {
43851           urlroot = options.urlroot;
43852
43853           oauth.options(assignIn({
43854               url: urlroot,
43855               loading: authLoading,
43856               done: authDone
43857           }, options));
43858
43859           this.reset();
43860           this.userChangesets(function() {});  // eagerly load user details/changesets
43861           dispatch$3.call('change');
43862           return this;
43863       },
43864
43865
43866       toggle: function(_) {
43867           _off = !_;
43868           return this;
43869       },
43870
43871
43872       isChangesetInflight: function() {
43873           return !!_changeset.inflight;
43874       },
43875
43876
43877       // get/set cached data
43878       // This is used to save/restore the state when entering/exiting the walkthrough
43879       // Also used for testing purposes.
43880       caches: function(obj) {
43881           if (!arguments.length) {
43882               return {
43883                   tile: cloneDeep(_tileCache),
43884                   note: cloneDeep(_noteCache),
43885                   user: cloneDeep(_userCache)
43886               };
43887           }
43888
43889           // access caches directly for testing (e.g., loading notes rtree)
43890           if (obj === 'get') {
43891               return {
43892                   tile: _tileCache,
43893                   note: _noteCache,
43894                   user: _userCache
43895               };
43896           }
43897
43898           if (obj.tile) {
43899               _tileCache = obj.tile;
43900               _tileCache.inflight = {};
43901           }
43902           if (obj.note) {
43903               _noteCache = obj.note;
43904               _noteCache.inflight = {};
43905               _noteCache.inflightPost = {};
43906           }
43907           if (obj.user) {
43908               _userCache = obj.user;
43909           }
43910
43911           return this;
43912       },
43913
43914
43915       logout: function() {
43916           _userChangesets = undefined;
43917           _userDetails = undefined;
43918           oauth.logout();
43919           dispatch$3.call('change');
43920           return this;
43921       },
43922
43923
43924       authenticated: function() {
43925           return oauth.authenticated();
43926       },
43927
43928
43929       authenticate: function(callback) {
43930           var that = this;
43931           var cid = _connectionID;
43932           _userChangesets = undefined;
43933           _userDetails = undefined;
43934
43935           function done(err, res) {
43936               if (err) {
43937                   if (callback) callback(err);
43938                   return;
43939               }
43940               if (that.getConnectionId() !== cid) {
43941                   if (callback) callback({ message: 'Connection Switched', status: -1 });
43942                   return;
43943               }
43944               _rateLimitError = undefined;
43945               dispatch$3.call('change');
43946               if (callback) callback(err, res);
43947               that.userChangesets(function() {});  // eagerly load user details/changesets
43948           }
43949
43950           return oauth.authenticate(done);
43951       },
43952
43953
43954       imageryBlacklists: function() {
43955           return _blacklists;
43956       },
43957
43958
43959       tileZoom: function(_) {
43960           if (!arguments.length) return _tileZoom;
43961           _tileZoom = _;
43962           return this;
43963       },
43964
43965
43966       // get all cached notes covering the viewport
43967       notes: function(projection) {
43968           var viewport = projection.clipExtent();
43969           var min = [viewport[0][0], viewport[1][1]];
43970           var max = [viewport[1][0], viewport[0][1]];
43971           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
43972
43973           return _noteCache.rtree.search(bbox)
43974               .map(function(d) { return d.data; });
43975       },
43976
43977
43978       // get a single note from the cache
43979       getNote: function(id) {
43980           return _noteCache.note[id];
43981       },
43982
43983
43984       // remove a single note from the cache
43985       removeNote: function(note) {
43986           if (!(note instanceof osmNote) || !note.id) return;
43987
43988           delete _noteCache.note[note.id];
43989           updateRtree(encodeNoteRtree(note), false);  // false = remove
43990       },
43991
43992
43993       // replace a single note in the cache
43994       replaceNote: function(note) {
43995           if (!(note instanceof osmNote) || !note.id) return;
43996
43997           _noteCache.note[note.id] = note;
43998           updateRtree(encodeNoteRtree(note), true);  // true = replace
43999           return note;
44000       }
44001
44002   };
44003
44004   var jsonpCache = {};
44005   window.jsonpCache = jsonpCache;
44006
44007   function jsonpRequest(url, callback) {
44008       var request = {
44009           abort: function() {}
44010       };
44011
44012       if (window.JSONP_FIX) {
44013           if (window.JSONP_DELAY === 0) {
44014               callback(window.JSONP_FIX);
44015           } else {
44016               var t = window.setTimeout(function() {
44017                   callback(window.JSONP_FIX);
44018               }, window.JSONP_DELAY || 0);
44019
44020               request.abort = function() { window.clearTimeout(t); };
44021           }
44022
44023           return request;
44024       }
44025
44026       function rand() {
44027           var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
44028           var c = '';
44029           var i = -1;
44030           while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
44031           return c;
44032       }
44033
44034       function create$$1(url) {
44035           var e = url.match(/callback=(\w+)/);
44036           var c = e ? e[1] : rand();
44037
44038           jsonpCache[c] = function(data) {
44039               if (jsonpCache[c]) {
44040                   callback(data);
44041               }
44042               finalize();
44043           };
44044
44045           function finalize() {
44046               delete jsonpCache[c];
44047               script.remove();
44048           }
44049
44050           request.abort = finalize;
44051           return 'jsonpCache.' + c;
44052       }
44053
44054       var cb = create$$1(url);
44055
44056       var script = select('head')
44057           .append('script')
44058           .attr('type', 'text/javascript')
44059           .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
44060
44061       return request;
44062   }
44063
44064   var q = createCommonjsModule(function (module, exports) {
44065   // vim:ts=4:sts=4:sw=4:
44066   /*!
44067    *
44068    * Copyright 2009-2017 Kris Kowal under the terms of the MIT
44069    * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
44070    *
44071    * With parts by Tyler Close
44072    * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
44073    * at http://www.opensource.org/licenses/mit-license.html
44074    * Forked at ref_send.js version: 2009-05-11
44075    *
44076    * With parts by Mark Miller
44077    * Copyright (C) 2011 Google Inc.
44078    *
44079    * Licensed under the Apache License, Version 2.0 (the "License");
44080    * you may not use this file except in compliance with the License.
44081    * You may obtain a copy of the License at
44082    *
44083    * http://www.apache.org/licenses/LICENSE-2.0
44084    *
44085    * Unless required by applicable law or agreed to in writing, software
44086    * distributed under the License is distributed on an "AS IS" BASIS,
44087    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
44088    * See the License for the specific language governing permissions and
44089    * limitations under the License.
44090    *
44091    */
44092
44093   (function (definition) {
44094
44095       // This file will function properly as a <script> tag, or a module
44096       // using CommonJS and NodeJS or RequireJS module formats.  In
44097       // Common/Node/RequireJS, the module exports the Q API and when
44098       // executed as a simple <script>, it creates a Q global instead.
44099
44100       // Montage Require
44101       if (typeof bootstrap === "function") {
44102           bootstrap("promise", definition);
44103
44104       // CommonJS
44105       } else {
44106           module.exports = definition();
44107
44108       // RequireJS
44109       }
44110
44111   })(function () {
44112
44113   var hasStacks = false;
44114   try {
44115       throw new Error();
44116   } catch (e) {
44117       hasStacks = !!e.stack;
44118   }
44119
44120   // All code after this point will be filtered from stack traces reported
44121   // by Q.
44122   var qStartingLine = captureLine();
44123   var qFileName;
44124
44125   // shims
44126
44127   // used for fallback in "allResolved"
44128   var noop = function () {};
44129
44130   // Use the fastest possible means to execute a task in a future turn
44131   // of the event loop.
44132   var nextTick =(function () {
44133       // linked list of tasks (single, with head node)
44134       var head = {task: void 0, next: null};
44135       var tail = head;
44136       var flushing = false;
44137       var requestTick = void 0;
44138       var isNodeJS = false;
44139       // queue for late tasks, used by unhandled rejection tracking
44140       var laterQueue = [];
44141
44142       function flush() {
44143           /* jshint loopfunc: true */
44144           var task, domain;
44145
44146           while (head.next) {
44147               head = head.next;
44148               task = head.task;
44149               head.task = void 0;
44150               domain = head.domain;
44151
44152               if (domain) {
44153                   head.domain = void 0;
44154                   domain.enter();
44155               }
44156               runSingle(task, domain);
44157
44158           }
44159           while (laterQueue.length) {
44160               task = laterQueue.pop();
44161               runSingle(task);
44162           }
44163           flushing = false;
44164       }
44165       // runs a single function in the async queue
44166       function runSingle(task, domain) {
44167           try {
44168               task();
44169
44170           } catch (e) {
44171               if (isNodeJS) {
44172                   // In node, uncaught exceptions are considered fatal errors.
44173                   // Re-throw them synchronously to interrupt flushing!
44174
44175                   // Ensure continuation if the uncaught exception is suppressed
44176                   // listening "uncaughtException" events (as domains does).
44177                   // Continue in next event to avoid tick recursion.
44178                   if (domain) {
44179                       domain.exit();
44180                   }
44181                   setTimeout(flush, 0);
44182                   if (domain) {
44183                       domain.enter();
44184                   }
44185
44186                   throw e;
44187
44188               } else {
44189                   // In browsers, uncaught exceptions are not fatal.
44190                   // Re-throw them asynchronously to avoid slow-downs.
44191                   setTimeout(function () {
44192                       throw e;
44193                   }, 0);
44194               }
44195           }
44196
44197           if (domain) {
44198               domain.exit();
44199           }
44200       }
44201
44202       nextTick = function (task) {
44203           tail = tail.next = {
44204               task: task,
44205               domain: isNodeJS && process.domain,
44206               next: null
44207           };
44208
44209           if (!flushing) {
44210               flushing = true;
44211               requestTick();
44212           }
44213       };
44214
44215       if (typeof process === "object" &&
44216           process.toString() === "[object process]" && process.nextTick) {
44217           // Ensure Q is in a real Node environment, with a `process.nextTick`.
44218           // To see through fake Node environments:
44219           // * Mocha test runner - exposes a `process` global without a `nextTick`
44220           // * Browserify - exposes a `process.nexTick` function that uses
44221           //   `setTimeout`. In this case `setImmediate` is preferred because
44222           //    it is faster. Browserify's `process.toString()` yields
44223           //   "[object Object]", while in a real Node environment
44224           //   `process.toString()` yields "[object process]".
44225           isNodeJS = true;
44226
44227           requestTick = function () {
44228               process.nextTick(flush);
44229           };
44230
44231       } else if (typeof setImmediate === "function") {
44232           // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
44233           if (typeof window !== "undefined") {
44234               requestTick = setImmediate.bind(window, flush);
44235           } else {
44236               requestTick = function () {
44237                   setImmediate(flush);
44238               };
44239           }
44240
44241       } else if (typeof MessageChannel !== "undefined") {
44242           // modern browsers
44243           // http://www.nonblocking.io/2011/06/windownexttick.html
44244           var channel = new MessageChannel();
44245           // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
44246           // working message ports the first time a page loads.
44247           channel.port1.onmessage = function () {
44248               requestTick = requestPortTick;
44249               channel.port1.onmessage = flush;
44250               flush();
44251           };
44252           var requestPortTick = function () {
44253               // Opera requires us to provide a message payload, regardless of
44254               // whether we use it.
44255               channel.port2.postMessage(0);
44256           };
44257           requestTick = function () {
44258               setTimeout(flush, 0);
44259               requestPortTick();
44260           };
44261
44262       } else {
44263           // old browsers
44264           requestTick = function () {
44265               setTimeout(flush, 0);
44266           };
44267       }
44268       // runs a task after all other tasks have been run
44269       // this is useful for unhandled rejection tracking that needs to happen
44270       // after all `then`d tasks have been run.
44271       nextTick.runAfter = function (task) {
44272           laterQueue.push(task);
44273           if (!flushing) {
44274               flushing = true;
44275               requestTick();
44276           }
44277       };
44278       return nextTick;
44279   })();
44280
44281   // Attempt to make generics safe in the face of downstream
44282   // modifications.
44283   // There is no situation where this is necessary.
44284   // If you need a security guarantee, these primordials need to be
44285   // deeply frozen anyway, and if you don’t need a security guarantee,
44286   // this is just plain paranoid.
44287   // However, this **might** have the nice side-effect of reducing the size of
44288   // the minified code by reducing x.call() to merely x()
44289   // See Mark Miller’s explanation of what this does.
44290   // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
44291   var call = Function.call;
44292   function uncurryThis(f) {
44293       return function () {
44294           return call.apply(f, arguments);
44295       };
44296   }
44297   // This is equivalent, but slower:
44298   // uncurryThis = Function_bind.bind(Function_bind.call);
44299   // http://jsperf.com/uncurrythis
44300
44301   var array_slice = uncurryThis(Array.prototype.slice);
44302
44303   var array_reduce = uncurryThis(
44304       Array.prototype.reduce || function (callback, basis) {
44305           var index = 0,
44306               length = this.length;
44307           // concerning the initial value, if one is not provided
44308           if (arguments.length === 1) {
44309               // seek to the first value in the array, accounting
44310               // for the possibility that is is a sparse array
44311               do {
44312                   if (index in this) {
44313                       basis = this[index++];
44314                       break;
44315                   }
44316                   if (++index >= length) {
44317                       throw new TypeError();
44318                   }
44319               } while (1);
44320           }
44321           // reduce
44322           for (; index < length; index++) {
44323               // account for the possibility that the array is sparse
44324               if (index in this) {
44325                   basis = callback(basis, this[index], index);
44326               }
44327           }
44328           return basis;
44329       }
44330   );
44331
44332   var array_indexOf = uncurryThis(
44333       Array.prototype.indexOf || function (value) {
44334           // not a very good shim, but good enough for our one use of it
44335           for (var i = 0; i < this.length; i++) {
44336               if (this[i] === value) {
44337                   return i;
44338               }
44339           }
44340           return -1;
44341       }
44342   );
44343
44344   var array_map = uncurryThis(
44345       Array.prototype.map || function (callback, thisp) {
44346           var self = this;
44347           var collect = [];
44348           array_reduce(self, function (undefined, value, index) {
44349               collect.push(callback.call(thisp, value, index, self));
44350           }, void 0);
44351           return collect;
44352       }
44353   );
44354
44355   var object_create = Object.create || function (prototype) {
44356       function Type() { }
44357       Type.prototype = prototype;
44358       return new Type();
44359   };
44360
44361   var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
44362       obj[prop] = descriptor.value;
44363       return obj;
44364   };
44365
44366   var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
44367
44368   var object_keys = Object.keys || function (object) {
44369       var keys = [];
44370       for (var key in object) {
44371           if (object_hasOwnProperty(object, key)) {
44372               keys.push(key);
44373           }
44374       }
44375       return keys;
44376   };
44377
44378   var object_toString = uncurryThis(Object.prototype.toString);
44379
44380   function isObject(value) {
44381       return value === Object(value);
44382   }
44383
44384   // generator related shims
44385
44386   // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
44387   function isStopIteration(exception) {
44388       return (
44389           object_toString(exception) === "[object StopIteration]" ||
44390           exception instanceof QReturnValue
44391       );
44392   }
44393
44394   // FIXME: Remove this helper and Q.return once ES6 generators are in
44395   // SpiderMonkey.
44396   var QReturnValue;
44397   if (typeof ReturnValue !== "undefined") {
44398       QReturnValue = ReturnValue;
44399   } else {
44400       QReturnValue = function (value) {
44401           this.value = value;
44402       };
44403   }
44404
44405   // long stack traces
44406
44407   var STACK_JUMP_SEPARATOR = "From previous event:";
44408
44409   function makeStackTraceLong(error, promise) {
44410       // If possible, transform the error stack trace by removing Node and Q
44411       // cruft, then concatenating with the stack trace of `promise`. See #57.
44412       if (hasStacks &&
44413           promise.stack &&
44414           typeof error === "object" &&
44415           error !== null &&
44416           error.stack
44417       ) {
44418           var stacks = [];
44419           for (var p = promise; !!p; p = p.source) {
44420               if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
44421                   object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
44422                   stacks.unshift(p.stack);
44423               }
44424           }
44425           stacks.unshift(error.stack);
44426
44427           var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
44428           var stack = filterStackString(concatedStacks);
44429           object_defineProperty(error, "stack", {value: stack, configurable: true});
44430       }
44431   }
44432
44433   function filterStackString(stackString) {
44434       var lines = stackString.split("\n");
44435       var desiredLines = [];
44436       for (var i = 0; i < lines.length; ++i) {
44437           var line = lines[i];
44438
44439           if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
44440               desiredLines.push(line);
44441           }
44442       }
44443       return desiredLines.join("\n");
44444   }
44445
44446   function isNodeFrame(stackLine) {
44447       return stackLine.indexOf("(module.js:") !== -1 ||
44448              stackLine.indexOf("(node.js:") !== -1;
44449   }
44450
44451   function getFileNameAndLineNumber(stackLine) {
44452       // Named functions: "at functionName (filename:lineNumber:columnNumber)"
44453       // In IE10 function name can have spaces ("Anonymous function") O_o
44454       var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
44455       if (attempt1) {
44456           return [attempt1[1], Number(attempt1[2])];
44457       }
44458
44459       // Anonymous functions: "at filename:lineNumber:columnNumber"
44460       var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
44461       if (attempt2) {
44462           return [attempt2[1], Number(attempt2[2])];
44463       }
44464
44465       // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
44466       var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
44467       if (attempt3) {
44468           return [attempt3[1], Number(attempt3[2])];
44469       }
44470   }
44471
44472   function isInternalFrame(stackLine) {
44473       var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
44474
44475       if (!fileNameAndLineNumber) {
44476           return false;
44477       }
44478
44479       var fileName = fileNameAndLineNumber[0];
44480       var lineNumber = fileNameAndLineNumber[1];
44481
44482       return fileName === qFileName &&
44483           lineNumber >= qStartingLine &&
44484           lineNumber <= qEndingLine;
44485   }
44486
44487   // discover own file name and line number range for filtering stack
44488   // traces
44489   function captureLine() {
44490       if (!hasStacks) {
44491           return;
44492       }
44493
44494       try {
44495           throw new Error();
44496       } catch (e) {
44497           var lines = e.stack.split("\n");
44498           var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
44499           var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
44500           if (!fileNameAndLineNumber) {
44501               return;
44502           }
44503
44504           qFileName = fileNameAndLineNumber[0];
44505           return fileNameAndLineNumber[1];
44506       }
44507   }
44508
44509   function deprecate(callback, name, alternative) {
44510       return function () {
44511           if (typeof console !== "undefined" &&
44512               typeof console.warn === "function") {
44513               console.warn(name + " is deprecated, use " + alternative +
44514                            " instead.", new Error("").stack);
44515           }
44516           return callback.apply(callback, arguments);
44517       };
44518   }
44519
44520   // end of shims
44521   // beginning of real work
44522
44523   /**
44524    * Constructs a promise for an immediate reference, passes promises through, or
44525    * coerces promises from different systems.
44526    * @param value immediate reference or promise
44527    */
44528   function Q(value) {
44529       // If the object is already a Promise, return it directly.  This enables
44530       // the resolve function to both be used to created references from objects,
44531       // but to tolerably coerce non-promises to promises.
44532       if (value instanceof Promise) {
44533           return value;
44534       }
44535
44536       // assimilate thenables
44537       if (isPromiseAlike(value)) {
44538           return coerce(value);
44539       } else {
44540           return fulfill(value);
44541       }
44542   }
44543   Q.resolve = Q;
44544
44545   /**
44546    * Performs a task in a future turn of the event loop.
44547    * @param {Function} task
44548    */
44549   Q.nextTick = nextTick;
44550
44551   /**
44552    * Controls whether or not long stack traces will be on
44553    */
44554   Q.longStackSupport = false;
44555
44556   /**
44557    * The counter is used to determine the stopping point for building
44558    * long stack traces. In makeStackTraceLong we walk backwards through
44559    * the linked list of promises, only stacks which were created before
44560    * the rejection are concatenated.
44561    */
44562   var longStackCounter = 1;
44563
44564   // enable long stacks if Q_DEBUG is set
44565   if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
44566       Q.longStackSupport = true;
44567   }
44568
44569   /**
44570    * Constructs a {promise, resolve, reject} object.
44571    *
44572    * `resolve` is a callback to invoke with a more resolved value for the
44573    * promise. To fulfill the promise, invoke `resolve` with any value that is
44574    * not a thenable. To reject the promise, invoke `resolve` with a rejected
44575    * thenable, or invoke `reject` with the reason directly. To resolve the
44576    * promise to another thenable, thus putting it in the same state, invoke
44577    * `resolve` with that other thenable.
44578    */
44579   Q.defer = defer;
44580   function defer() {
44581       // if "messages" is an "Array", that indicates that the promise has not yet
44582       // been resolved.  If it is "undefined", it has been resolved.  Each
44583       // element of the messages array is itself an array of complete arguments to
44584       // forward to the resolved promise.  We coerce the resolution value to a
44585       // promise using the `resolve` function because it handles both fully
44586       // non-thenable values and other thenables gracefully.
44587       var messages = [], progressListeners = [], resolvedPromise;
44588
44589       var deferred = object_create(defer.prototype);
44590       var promise = object_create(Promise.prototype);
44591
44592       promise.promiseDispatch = function (resolve, op, operands) {
44593           var args = array_slice(arguments);
44594           if (messages) {
44595               messages.push(args);
44596               if (op === "when" && operands[1]) { // progress operand
44597                   progressListeners.push(operands[1]);
44598               }
44599           } else {
44600               Q.nextTick(function () {
44601                   resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
44602               });
44603           }
44604       };
44605
44606       // XXX deprecated
44607       promise.valueOf = function () {
44608           if (messages) {
44609               return promise;
44610           }
44611           var nearerValue = nearer(resolvedPromise);
44612           if (isPromise(nearerValue)) {
44613               resolvedPromise = nearerValue; // shorten chain
44614           }
44615           return nearerValue;
44616       };
44617
44618       promise.inspect = function () {
44619           if (!resolvedPromise) {
44620               return { state: "pending" };
44621           }
44622           return resolvedPromise.inspect();
44623       };
44624
44625       if (Q.longStackSupport && hasStacks) {
44626           try {
44627               throw new Error();
44628           } catch (e) {
44629               // NOTE: don't try to use `Error.captureStackTrace` or transfer the
44630               // accessor around; that causes memory leaks as per GH-111. Just
44631               // reify the stack trace as a string ASAP.
44632               //
44633               // At the same time, cut off the first line; it's always just
44634               // "[object Promise]\n", as per the `toString`.
44635               promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
44636               promise.stackCounter = longStackCounter++;
44637           }
44638       }
44639
44640       // NOTE: we do the checks for `resolvedPromise` in each method, instead of
44641       // consolidating them into `become`, since otherwise we'd create new
44642       // promises with the lines `become(whatever(value))`. See e.g. GH-252.
44643
44644       function become(newPromise) {
44645           resolvedPromise = newPromise;
44646
44647           if (Q.longStackSupport && hasStacks) {
44648               // Only hold a reference to the new promise if long stacks
44649               // are enabled to reduce memory usage
44650               promise.source = newPromise;
44651           }
44652
44653           array_reduce(messages, function (undefined, message) {
44654               Q.nextTick(function () {
44655                   newPromise.promiseDispatch.apply(newPromise, message);
44656               });
44657           }, void 0);
44658
44659           messages = void 0;
44660           progressListeners = void 0;
44661       }
44662
44663       deferred.promise = promise;
44664       deferred.resolve = function (value) {
44665           if (resolvedPromise) {
44666               return;
44667           }
44668
44669           become(Q(value));
44670       };
44671
44672       deferred.fulfill = function (value) {
44673           if (resolvedPromise) {
44674               return;
44675           }
44676
44677           become(fulfill(value));
44678       };
44679       deferred.reject = function (reason) {
44680           if (resolvedPromise) {
44681               return;
44682           }
44683
44684           become(reject(reason));
44685       };
44686       deferred.notify = function (progress) {
44687           if (resolvedPromise) {
44688               return;
44689           }
44690
44691           array_reduce(progressListeners, function (undefined, progressListener) {
44692               Q.nextTick(function () {
44693                   progressListener(progress);
44694               });
44695           }, void 0);
44696       };
44697
44698       return deferred;
44699   }
44700
44701   /**
44702    * Creates a Node-style callback that will resolve or reject the deferred
44703    * promise.
44704    * @returns a nodeback
44705    */
44706   defer.prototype.makeNodeResolver = function () {
44707       var self = this;
44708       return function (error, value) {
44709           if (error) {
44710               self.reject(error);
44711           } else if (arguments.length > 2) {
44712               self.resolve(array_slice(arguments, 1));
44713           } else {
44714               self.resolve(value);
44715           }
44716       };
44717   };
44718
44719   /**
44720    * @param resolver {Function} a function that returns nothing and accepts
44721    * the resolve, reject, and notify functions for a deferred.
44722    * @returns a promise that may be resolved with the given resolve and reject
44723    * functions, or rejected by a thrown exception in resolver
44724    */
44725   Q.Promise = promise; // ES6
44726   Q.promise = promise;
44727   function promise(resolver) {
44728       if (typeof resolver !== "function") {
44729           throw new TypeError("resolver must be a function.");
44730       }
44731       var deferred = defer();
44732       try {
44733           resolver(deferred.resolve, deferred.reject, deferred.notify);
44734       } catch (reason) {
44735           deferred.reject(reason);
44736       }
44737       return deferred.promise;
44738   }
44739
44740   promise.race = race; // ES6
44741   promise.all = all; // ES6
44742   promise.reject = reject; // ES6
44743   promise.resolve = Q; // ES6
44744
44745   // XXX experimental.  This method is a way to denote that a local value is
44746   // serializable and should be immediately dispatched to a remote upon request,
44747   // instead of passing a reference.
44748   Q.passByCopy = function (object) {
44749       //freeze(object);
44750       //passByCopies.set(object, true);
44751       return object;
44752   };
44753
44754   Promise.prototype.passByCopy = function () {
44755       //freeze(object);
44756       //passByCopies.set(object, true);
44757       return this;
44758   };
44759
44760   /**
44761    * If two promises eventually fulfill to the same value, promises that value,
44762    * but otherwise rejects.
44763    * @param x {Any*}
44764    * @param y {Any*}
44765    * @returns {Any*} a promise for x and y if they are the same, but a rejection
44766    * otherwise.
44767    *
44768    */
44769   Q.join = function (x, y) {
44770       return Q(x).join(y);
44771   };
44772
44773   Promise.prototype.join = function (that) {
44774       return Q([this, that]).spread(function (x, y) {
44775           if (x === y) {
44776               // TODO: "===" should be Object.is or equiv
44777               return x;
44778           } else {
44779               throw new Error("Q can't join: not the same: " + x + " " + y);
44780           }
44781       });
44782   };
44783
44784   /**
44785    * Returns a promise for the first of an array of promises to become settled.
44786    * @param answers {Array[Any*]} promises to race
44787    * @returns {Any*} the first promise to be settled
44788    */
44789   Q.race = race;
44790   function race(answerPs) {
44791       return promise(function (resolve, reject) {
44792           // Switch to this once we can assume at least ES5
44793           // answerPs.forEach(function (answerP) {
44794           //     Q(answerP).then(resolve, reject);
44795           // });
44796           // Use this in the meantime
44797           for (var i = 0, len = answerPs.length; i < len; i++) {
44798               Q(answerPs[i]).then(resolve, reject);
44799           }
44800       });
44801   }
44802
44803   Promise.prototype.race = function () {
44804       return this.then(Q.race);
44805   };
44806
44807   /**
44808    * Constructs a Promise with a promise descriptor object and optional fallback
44809    * function.  The descriptor contains methods like when(rejected), get(name),
44810    * set(name, value), post(name, args), and delete(name), which all
44811    * return either a value, a promise for a value, or a rejection.  The fallback
44812    * accepts the operation name, a resolver, and any further arguments that would
44813    * have been forwarded to the appropriate method above had a method been
44814    * provided with the proper name.  The API makes no guarantees about the nature
44815    * of the returned object, apart from that it is usable whereever promises are
44816    * bought and sold.
44817    */
44818   Q.makePromise = Promise;
44819   function Promise(descriptor, fallback, inspect) {
44820       if (fallback === void 0) {
44821           fallback = function (op) {
44822               return reject(new Error(
44823                   "Promise does not support operation: " + op
44824               ));
44825           };
44826       }
44827       if (inspect === void 0) {
44828           inspect = function () {
44829               return {state: "unknown"};
44830           };
44831       }
44832
44833       var promise = object_create(Promise.prototype);
44834
44835       promise.promiseDispatch = function (resolve, op, args) {
44836           var result;
44837           try {
44838               if (descriptor[op]) {
44839                   result = descriptor[op].apply(promise, args);
44840               } else {
44841                   result = fallback.call(promise, op, args);
44842               }
44843           } catch (exception) {
44844               result = reject(exception);
44845           }
44846           if (resolve) {
44847               resolve(result);
44848           }
44849       };
44850
44851       promise.inspect = inspect;
44852
44853       // XXX deprecated `valueOf` and `exception` support
44854       if (inspect) {
44855           var inspected = inspect();
44856           if (inspected.state === "rejected") {
44857               promise.exception = inspected.reason;
44858           }
44859
44860           promise.valueOf = function () {
44861               var inspected = inspect();
44862               if (inspected.state === "pending" ||
44863                   inspected.state === "rejected") {
44864                   return promise;
44865               }
44866               return inspected.value;
44867           };
44868       }
44869
44870       return promise;
44871   }
44872
44873   Promise.prototype.toString = function () {
44874       return "[object Promise]";
44875   };
44876
44877   Promise.prototype.then = function (fulfilled, rejected, progressed) {
44878       var self = this;
44879       var deferred = defer();
44880       var done = false;   // ensure the untrusted promise makes at most a
44881                           // single call to one of the callbacks
44882
44883       function _fulfilled(value) {
44884           try {
44885               return typeof fulfilled === "function" ? fulfilled(value) : value;
44886           } catch (exception) {
44887               return reject(exception);
44888           }
44889       }
44890
44891       function _rejected(exception) {
44892           if (typeof rejected === "function") {
44893               makeStackTraceLong(exception, self);
44894               try {
44895                   return rejected(exception);
44896               } catch (newException) {
44897                   return reject(newException);
44898               }
44899           }
44900           return reject(exception);
44901       }
44902
44903       function _progressed(value) {
44904           return typeof progressed === "function" ? progressed(value) : value;
44905       }
44906
44907       Q.nextTick(function () {
44908           self.promiseDispatch(function (value) {
44909               if (done) {
44910                   return;
44911               }
44912               done = true;
44913
44914               deferred.resolve(_fulfilled(value));
44915           }, "when", [function (exception) {
44916               if (done) {
44917                   return;
44918               }
44919               done = true;
44920
44921               deferred.resolve(_rejected(exception));
44922           }]);
44923       });
44924
44925       // Progress propagator need to be attached in the current tick.
44926       self.promiseDispatch(void 0, "when", [void 0, function (value) {
44927           var newValue;
44928           var threw = false;
44929           try {
44930               newValue = _progressed(value);
44931           } catch (e) {
44932               threw = true;
44933               if (Q.onerror) {
44934                   Q.onerror(e);
44935               } else {
44936                   throw e;
44937               }
44938           }
44939
44940           if (!threw) {
44941               deferred.notify(newValue);
44942           }
44943       }]);
44944
44945       return deferred.promise;
44946   };
44947
44948   Q.tap = function (promise, callback) {
44949       return Q(promise).tap(callback);
44950   };
44951
44952   /**
44953    * Works almost like "finally", but not called for rejections.
44954    * Original resolution value is passed through callback unaffected.
44955    * Callback may return a promise that will be awaited for.
44956    * @param {Function} callback
44957    * @returns {Q.Promise}
44958    * @example
44959    * doSomething()
44960    *   .then(...)
44961    *   .tap(console.log)
44962    *   .then(...);
44963    */
44964   Promise.prototype.tap = function (callback) {
44965       callback = Q(callback);
44966
44967       return this.then(function (value) {
44968           return callback.fcall(value).thenResolve(value);
44969       });
44970   };
44971
44972   /**
44973    * Registers an observer on a promise.
44974    *
44975    * Guarantees:
44976    *
44977    * 1. that fulfilled and rejected will be called only once.
44978    * 2. that either the fulfilled callback or the rejected callback will be
44979    *    called, but not both.
44980    * 3. that fulfilled and rejected will not be called in this turn.
44981    *
44982    * @param value      promise or immediate reference to observe
44983    * @param fulfilled  function to be called with the fulfilled value
44984    * @param rejected   function to be called with the rejection exception
44985    * @param progressed function to be called on any progress notifications
44986    * @return promise for the return value from the invoked callback
44987    */
44988   Q.when = when;
44989   function when(value, fulfilled, rejected, progressed) {
44990       return Q(value).then(fulfilled, rejected, progressed);
44991   }
44992
44993   Promise.prototype.thenResolve = function (value) {
44994       return this.then(function () { return value; });
44995   };
44996
44997   Q.thenResolve = function (promise, value) {
44998       return Q(promise).thenResolve(value);
44999   };
45000
45001   Promise.prototype.thenReject = function (reason) {
45002       return this.then(function () { throw reason; });
45003   };
45004
45005   Q.thenReject = function (promise, reason) {
45006       return Q(promise).thenReject(reason);
45007   };
45008
45009   /**
45010    * If an object is not a promise, it is as "near" as possible.
45011    * If a promise is rejected, it is as "near" as possible too.
45012    * If it’s a fulfilled promise, the fulfillment value is nearer.
45013    * If it’s a deferred promise and the deferred has been resolved, the
45014    * resolution is "nearer".
45015    * @param object
45016    * @returns most resolved (nearest) form of the object
45017    */
45018
45019   // XXX should we re-do this?
45020   Q.nearer = nearer;
45021   function nearer(value) {
45022       if (isPromise(value)) {
45023           var inspected = value.inspect();
45024           if (inspected.state === "fulfilled") {
45025               return inspected.value;
45026           }
45027       }
45028       return value;
45029   }
45030
45031   /**
45032    * @returns whether the given object is a promise.
45033    * Otherwise it is a fulfilled value.
45034    */
45035   Q.isPromise = isPromise;
45036   function isPromise(object) {
45037       return object instanceof Promise;
45038   }
45039
45040   Q.isPromiseAlike = isPromiseAlike;
45041   function isPromiseAlike(object) {
45042       return isObject(object) && typeof object.then === "function";
45043   }
45044
45045   /**
45046    * @returns whether the given object is a pending promise, meaning not
45047    * fulfilled or rejected.
45048    */
45049   Q.isPending = isPending;
45050   function isPending(object) {
45051       return isPromise(object) && object.inspect().state === "pending";
45052   }
45053
45054   Promise.prototype.isPending = function () {
45055       return this.inspect().state === "pending";
45056   };
45057
45058   /**
45059    * @returns whether the given object is a value or fulfilled
45060    * promise.
45061    */
45062   Q.isFulfilled = isFulfilled;
45063   function isFulfilled(object) {
45064       return !isPromise(object) || object.inspect().state === "fulfilled";
45065   }
45066
45067   Promise.prototype.isFulfilled = function () {
45068       return this.inspect().state === "fulfilled";
45069   };
45070
45071   /**
45072    * @returns whether the given object is a rejected promise.
45073    */
45074   Q.isRejected = isRejected;
45075   function isRejected(object) {
45076       return isPromise(object) && object.inspect().state === "rejected";
45077   }
45078
45079   Promise.prototype.isRejected = function () {
45080       return this.inspect().state === "rejected";
45081   };
45082
45083   //// BEGIN UNHANDLED REJECTION TRACKING
45084
45085   // This promise library consumes exceptions thrown in handlers so they can be
45086   // handled by a subsequent promise.  The exceptions get added to this array when
45087   // they are created, and removed when they are handled.  Note that in ES6 or
45088   // shimmed environments, this would naturally be a `Set`.
45089   var unhandledReasons = [];
45090   var unhandledRejections = [];
45091   var reportedUnhandledRejections = [];
45092   var trackUnhandledRejections = true;
45093
45094   function resetUnhandledRejections() {
45095       unhandledReasons.length = 0;
45096       unhandledRejections.length = 0;
45097
45098       if (!trackUnhandledRejections) {
45099           trackUnhandledRejections = true;
45100       }
45101   }
45102
45103   function trackRejection(promise, reason) {
45104       if (!trackUnhandledRejections) {
45105           return;
45106       }
45107       if (typeof process === "object" && typeof process.emit === "function") {
45108           Q.nextTick.runAfter(function () {
45109               if (array_indexOf(unhandledRejections, promise) !== -1) {
45110                   process.emit("unhandledRejection", reason, promise);
45111                   reportedUnhandledRejections.push(promise);
45112               }
45113           });
45114       }
45115
45116       unhandledRejections.push(promise);
45117       if (reason && typeof reason.stack !== "undefined") {
45118           unhandledReasons.push(reason.stack);
45119       } else {
45120           unhandledReasons.push("(no stack) " + reason);
45121       }
45122   }
45123
45124   function untrackRejection(promise) {
45125       if (!trackUnhandledRejections) {
45126           return;
45127       }
45128
45129       var at = array_indexOf(unhandledRejections, promise);
45130       if (at !== -1) {
45131           if (typeof process === "object" && typeof process.emit === "function") {
45132               Q.nextTick.runAfter(function () {
45133                   var atReport = array_indexOf(reportedUnhandledRejections, promise);
45134                   if (atReport !== -1) {
45135                       process.emit("rejectionHandled", unhandledReasons[at], promise);
45136                       reportedUnhandledRejections.splice(atReport, 1);
45137                   }
45138               });
45139           }
45140           unhandledRejections.splice(at, 1);
45141           unhandledReasons.splice(at, 1);
45142       }
45143   }
45144
45145   Q.resetUnhandledRejections = resetUnhandledRejections;
45146
45147   Q.getUnhandledReasons = function () {
45148       // Make a copy so that consumers can't interfere with our internal state.
45149       return unhandledReasons.slice();
45150   };
45151
45152   Q.stopUnhandledRejectionTracking = function () {
45153       resetUnhandledRejections();
45154       trackUnhandledRejections = false;
45155   };
45156
45157   resetUnhandledRejections();
45158
45159   //// END UNHANDLED REJECTION TRACKING
45160
45161   /**
45162    * Constructs a rejected promise.
45163    * @param reason value describing the failure
45164    */
45165   Q.reject = reject;
45166   function reject(reason) {
45167       var rejection = Promise({
45168           "when": function (rejected) {
45169               // note that the error has been handled
45170               if (rejected) {
45171                   untrackRejection(this);
45172               }
45173               return rejected ? rejected(reason) : this;
45174           }
45175       }, function fallback() {
45176           return this;
45177       }, function inspect() {
45178           return { state: "rejected", reason: reason };
45179       });
45180
45181       // Note that the reason has not been handled.
45182       trackRejection(rejection, reason);
45183
45184       return rejection;
45185   }
45186
45187   /**
45188    * Constructs a fulfilled promise for an immediate reference.
45189    * @param value immediate reference
45190    */
45191   Q.fulfill = fulfill;
45192   function fulfill(value) {
45193       return Promise({
45194           "when": function () {
45195               return value;
45196           },
45197           "get": function (name) {
45198               return value[name];
45199           },
45200           "set": function (name, rhs) {
45201               value[name] = rhs;
45202           },
45203           "delete": function (name) {
45204               delete value[name];
45205           },
45206           "post": function (name, args) {
45207               // Mark Miller proposes that post with no name should apply a
45208               // promised function.
45209               if (name === null || name === void 0) {
45210                   return value.apply(void 0, args);
45211               } else {
45212                   return value[name].apply(value, args);
45213               }
45214           },
45215           "apply": function (thisp, args) {
45216               return value.apply(thisp, args);
45217           },
45218           "keys": function () {
45219               return object_keys(value);
45220           }
45221       }, void 0, function inspect() {
45222           return { state: "fulfilled", value: value };
45223       });
45224   }
45225
45226   /**
45227    * Converts thenables to Q promises.
45228    * @param promise thenable promise
45229    * @returns a Q promise
45230    */
45231   function coerce(promise) {
45232       var deferred = defer();
45233       Q.nextTick(function () {
45234           try {
45235               promise.then(deferred.resolve, deferred.reject, deferred.notify);
45236           } catch (exception) {
45237               deferred.reject(exception);
45238           }
45239       });
45240       return deferred.promise;
45241   }
45242
45243   /**
45244    * Annotates an object such that it will never be
45245    * transferred away from this process over any promise
45246    * communication channel.
45247    * @param object
45248    * @returns promise a wrapping of that object that
45249    * additionally responds to the "isDef" message
45250    * without a rejection.
45251    */
45252   Q.master = master;
45253   function master(object) {
45254       return Promise({
45255           "isDef": function () {}
45256       }, function fallback(op, args) {
45257           return dispatch(object, op, args);
45258       }, function () {
45259           return Q(object).inspect();
45260       });
45261   }
45262
45263   /**
45264    * Spreads the values of a promised array of arguments into the
45265    * fulfillment callback.
45266    * @param fulfilled callback that receives variadic arguments from the
45267    * promised array
45268    * @param rejected callback that receives the exception if the promise
45269    * is rejected.
45270    * @returns a promise for the return value or thrown exception of
45271    * either callback.
45272    */
45273   Q.spread = spread;
45274   function spread(value, fulfilled, rejected) {
45275       return Q(value).spread(fulfilled, rejected);
45276   }
45277
45278   Promise.prototype.spread = function (fulfilled, rejected) {
45279       return this.all().then(function (array) {
45280           return fulfilled.apply(void 0, array);
45281       }, rejected);
45282   };
45283
45284   /**
45285    * The async function is a decorator for generator functions, turning
45286    * them into asynchronous generators.  Although generators are only part
45287    * of the newest ECMAScript 6 drafts, this code does not cause syntax
45288    * errors in older engines.  This code should continue to work and will
45289    * in fact improve over time as the language improves.
45290    *
45291    * ES6 generators are currently part of V8 version 3.19 with the
45292    * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
45293    * for longer, but under an older Python-inspired form.  This function
45294    * works on both kinds of generators.
45295    *
45296    * Decorates a generator function such that:
45297    *  - it may yield promises
45298    *  - execution will continue when that promise is fulfilled
45299    *  - the value of the yield expression will be the fulfilled value
45300    *  - it returns a promise for the return value (when the generator
45301    *    stops iterating)
45302    *  - the decorated function returns a promise for the return value
45303    *    of the generator or the first rejected promise among those
45304    *    yielded.
45305    *  - if an error is thrown in the generator, it propagates through
45306    *    every following yield until it is caught, or until it escapes
45307    *    the generator function altogether, and is translated into a
45308    *    rejection for the promise returned by the decorated generator.
45309    */
45310   Q.async = async;
45311   function async(makeGenerator) {
45312       return function () {
45313           // when verb is "send", arg is a value
45314           // when verb is "throw", arg is an exception
45315           function continuer(verb, arg) {
45316               var result;
45317
45318               // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
45319               // engine that has a deployed base of browsers that support generators.
45320               // However, SM's generators use the Python-inspired semantics of
45321               // outdated ES6 drafts.  We would like to support ES6, but we'd also
45322               // like to make it possible to use generators in deployed browsers, so
45323               // we also support Python-style generators.  At some point we can remove
45324               // this block.
45325
45326               if (typeof StopIteration === "undefined") {
45327                   // ES6 Generators
45328                   try {
45329                       result = generator[verb](arg);
45330                   } catch (exception) {
45331                       return reject(exception);
45332                   }
45333                   if (result.done) {
45334                       return Q(result.value);
45335                   } else {
45336                       return when(result.value, callback, errback);
45337                   }
45338               } else {
45339                   // SpiderMonkey Generators
45340                   // FIXME: Remove this case when SM does ES6 generators.
45341                   try {
45342                       result = generator[verb](arg);
45343                   } catch (exception) {
45344                       if (isStopIteration(exception)) {
45345                           return Q(exception.value);
45346                       } else {
45347                           return reject(exception);
45348                       }
45349                   }
45350                   return when(result, callback, errback);
45351               }
45352           }
45353           var generator = makeGenerator.apply(this, arguments);
45354           var callback = continuer.bind(continuer, "next");
45355           var errback = continuer.bind(continuer, "throw");
45356           return callback();
45357       };
45358   }
45359
45360   /**
45361    * The spawn function is a small wrapper around async that immediately
45362    * calls the generator and also ends the promise chain, so that any
45363    * unhandled errors are thrown instead of forwarded to the error
45364    * handler. This is useful because it's extremely common to run
45365    * generators at the top-level to work with libraries.
45366    */
45367   Q.spawn = spawn;
45368   function spawn(makeGenerator) {
45369       Q.done(Q.async(makeGenerator)());
45370   }
45371
45372   // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
45373   /**
45374    * Throws a ReturnValue exception to stop an asynchronous generator.
45375    *
45376    * This interface is a stop-gap measure to support generator return
45377    * values in older Firefox/SpiderMonkey.  In browsers that support ES6
45378    * generators like Chromium 29, just use "return" in your generator
45379    * functions.
45380    *
45381    * @param value the return value for the surrounding generator
45382    * @throws ReturnValue exception with the value.
45383    * @example
45384    * // ES6 style
45385    * Q.async(function* () {
45386    *      var foo = yield getFooPromise();
45387    *      var bar = yield getBarPromise();
45388    *      return foo + bar;
45389    * })
45390    * // Older SpiderMonkey style
45391    * Q.async(function () {
45392    *      var foo = yield getFooPromise();
45393    *      var bar = yield getBarPromise();
45394    *      Q.return(foo + bar);
45395    * })
45396    */
45397   Q["return"] = _return;
45398   function _return(value) {
45399       throw new QReturnValue(value);
45400   }
45401
45402   /**
45403    * The promised function decorator ensures that any promise arguments
45404    * are settled and passed as values (`this` is also settled and passed
45405    * as a value).  It will also ensure that the result of a function is
45406    * always a promise.
45407    *
45408    * @example
45409    * var add = Q.promised(function (a, b) {
45410    *     return a + b;
45411    * });
45412    * add(Q(a), Q(B));
45413    *
45414    * @param {function} callback The function to decorate
45415    * @returns {function} a function that has been decorated.
45416    */
45417   Q.promised = promised;
45418   function promised(callback) {
45419       return function () {
45420           return spread([this, all(arguments)], function (self, args) {
45421               return callback.apply(self, args);
45422           });
45423       };
45424   }
45425
45426   /**
45427    * sends a message to a value in a future turn
45428    * @param object* the recipient
45429    * @param op the name of the message operation, e.g., "when",
45430    * @param args further arguments to be forwarded to the operation
45431    * @returns result {Promise} a promise for the result of the operation
45432    */
45433   Q.dispatch = dispatch;
45434   function dispatch(object, op, args) {
45435       return Q(object).dispatch(op, args);
45436   }
45437
45438   Promise.prototype.dispatch = function (op, args) {
45439       var self = this;
45440       var deferred = defer();
45441       Q.nextTick(function () {
45442           self.promiseDispatch(deferred.resolve, op, args);
45443       });
45444       return deferred.promise;
45445   };
45446
45447   /**
45448    * Gets the value of a property in a future turn.
45449    * @param object    promise or immediate reference for target object
45450    * @param name      name of property to get
45451    * @return promise for the property value
45452    */
45453   Q.get = function (object, key) {
45454       return Q(object).dispatch("get", [key]);
45455   };
45456
45457   Promise.prototype.get = function (key) {
45458       return this.dispatch("get", [key]);
45459   };
45460
45461   /**
45462    * Sets the value of a property in a future turn.
45463    * @param object    promise or immediate reference for object object
45464    * @param name      name of property to set
45465    * @param value     new value of property
45466    * @return promise for the return value
45467    */
45468   Q.set = function (object, key, value) {
45469       return Q(object).dispatch("set", [key, value]);
45470   };
45471
45472   Promise.prototype.set = function (key, value) {
45473       return this.dispatch("set", [key, value]);
45474   };
45475
45476   /**
45477    * Deletes a property in a future turn.
45478    * @param object    promise or immediate reference for target object
45479    * @param name      name of property to delete
45480    * @return promise for the return value
45481    */
45482   Q.del = // XXX legacy
45483   Q["delete"] = function (object, key) {
45484       return Q(object).dispatch("delete", [key]);
45485   };
45486
45487   Promise.prototype.del = // XXX legacy
45488   Promise.prototype["delete"] = function (key) {
45489       return this.dispatch("delete", [key]);
45490   };
45491
45492   /**
45493    * Invokes a method in a future turn.
45494    * @param object    promise or immediate reference for target object
45495    * @param name      name of method to invoke
45496    * @param value     a value to post, typically an array of
45497    *                  invocation arguments for promises that
45498    *                  are ultimately backed with `resolve` values,
45499    *                  as opposed to those backed with URLs
45500    *                  wherein the posted value can be any
45501    *                  JSON serializable object.
45502    * @return promise for the return value
45503    */
45504   // bound locally because it is used by other methods
45505   Q.mapply = // XXX As proposed by "Redsandro"
45506   Q.post = function (object, name, args) {
45507       return Q(object).dispatch("post", [name, args]);
45508   };
45509
45510   Promise.prototype.mapply = // XXX As proposed by "Redsandro"
45511   Promise.prototype.post = function (name, args) {
45512       return this.dispatch("post", [name, args]);
45513   };
45514
45515   /**
45516    * Invokes a method in a future turn.
45517    * @param object    promise or immediate reference for target object
45518    * @param name      name of method to invoke
45519    * @param ...args   array of invocation arguments
45520    * @return promise for the return value
45521    */
45522   Q.send = // XXX Mark Miller's proposed parlance
45523   Q.mcall = // XXX As proposed by "Redsandro"
45524   Q.invoke = function (object, name /*...args*/) {
45525       return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
45526   };
45527
45528   Promise.prototype.send = // XXX Mark Miller's proposed parlance
45529   Promise.prototype.mcall = // XXX As proposed by "Redsandro"
45530   Promise.prototype.invoke = function (name /*...args*/) {
45531       return this.dispatch("post", [name, array_slice(arguments, 1)]);
45532   };
45533
45534   /**
45535    * Applies the promised function in a future turn.
45536    * @param object    promise or immediate reference for target function
45537    * @param args      array of application arguments
45538    */
45539   Q.fapply = function (object, args) {
45540       return Q(object).dispatch("apply", [void 0, args]);
45541   };
45542
45543   Promise.prototype.fapply = function (args) {
45544       return this.dispatch("apply", [void 0, args]);
45545   };
45546
45547   /**
45548    * Calls the promised function in a future turn.
45549    * @param object    promise or immediate reference for target function
45550    * @param ...args   array of application arguments
45551    */
45552   Q["try"] =
45553   Q.fcall = function (object /* ...args*/) {
45554       return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
45555   };
45556
45557   Promise.prototype.fcall = function (/*...args*/) {
45558       return this.dispatch("apply", [void 0, array_slice(arguments)]);
45559   };
45560
45561   /**
45562    * Binds the promised function, transforming return values into a fulfilled
45563    * promise and thrown errors into a rejected one.
45564    * @param object    promise or immediate reference for target function
45565    * @param ...args   array of application arguments
45566    */
45567   Q.fbind = function (object /*...args*/) {
45568       var promise = Q(object);
45569       var args = array_slice(arguments, 1);
45570       return function fbound() {
45571           return promise.dispatch("apply", [
45572               this,
45573               args.concat(array_slice(arguments))
45574           ]);
45575       };
45576   };
45577   Promise.prototype.fbind = function (/*...args*/) {
45578       var promise = this;
45579       var args = array_slice(arguments);
45580       return function fbound() {
45581           return promise.dispatch("apply", [
45582               this,
45583               args.concat(array_slice(arguments))
45584           ]);
45585       };
45586   };
45587
45588   /**
45589    * Requests the names of the owned properties of a promised
45590    * object in a future turn.
45591    * @param object    promise or immediate reference for target object
45592    * @return promise for the keys of the eventually settled object
45593    */
45594   Q.keys = function (object) {
45595       return Q(object).dispatch("keys", []);
45596   };
45597
45598   Promise.prototype.keys = function () {
45599       return this.dispatch("keys", []);
45600   };
45601
45602   /**
45603    * Turns an array of promises into a promise for an array.  If any of
45604    * the promises gets rejected, the whole array is rejected immediately.
45605    * @param {Array*} an array (or promise for an array) of values (or
45606    * promises for values)
45607    * @returns a promise for an array of the corresponding values
45608    */
45609   // By Mark Miller
45610   // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
45611   Q.all = all;
45612   function all(promises) {
45613       return when(promises, function (promises) {
45614           var pendingCount = 0;
45615           var deferred = defer();
45616           array_reduce(promises, function (undefined, promise, index) {
45617               var snapshot;
45618               if (
45619                   isPromise(promise) &&
45620                   (snapshot = promise.inspect()).state === "fulfilled"
45621               ) {
45622                   promises[index] = snapshot.value;
45623               } else {
45624                   ++pendingCount;
45625                   when(
45626                       promise,
45627                       function (value) {
45628                           promises[index] = value;
45629                           if (--pendingCount === 0) {
45630                               deferred.resolve(promises);
45631                           }
45632                       },
45633                       deferred.reject,
45634                       function (progress) {
45635                           deferred.notify({ index: index, value: progress });
45636                       }
45637                   );
45638               }
45639           }, void 0);
45640           if (pendingCount === 0) {
45641               deferred.resolve(promises);
45642           }
45643           return deferred.promise;
45644       });
45645   }
45646
45647   Promise.prototype.all = function () {
45648       return all(this);
45649   };
45650
45651   /**
45652    * Returns the first resolved promise of an array. Prior rejected promises are
45653    * ignored.  Rejects only if all promises are rejected.
45654    * @param {Array*} an array containing values or promises for values
45655    * @returns a promise fulfilled with the value of the first resolved promise,
45656    * or a rejected promise if all promises are rejected.
45657    */
45658   Q.any = any;
45659
45660   function any(promises) {
45661       if (promises.length === 0) {
45662           return Q.resolve();
45663       }
45664
45665       var deferred = Q.defer();
45666       var pendingCount = 0;
45667       array_reduce(promises, function (prev, current, index) {
45668           var promise = promises[index];
45669
45670           pendingCount++;
45671
45672           when(promise, onFulfilled, onRejected, onProgress);
45673           function onFulfilled(result) {
45674               deferred.resolve(result);
45675           }
45676           function onRejected(err) {
45677               pendingCount--;
45678               if (pendingCount === 0) {
45679                   var rejection = err || new Error("" + err);
45680
45681                   rejection.message = ("Q can't get fulfillment value from any promise, all " +
45682                       "promises were rejected. Last error message: " + rejection.message);
45683
45684                   deferred.reject(rejection);
45685               }
45686           }
45687           function onProgress(progress) {
45688               deferred.notify({
45689                   index: index,
45690                   value: progress
45691               });
45692           }
45693       }, undefined);
45694
45695       return deferred.promise;
45696   }
45697
45698   Promise.prototype.any = function () {
45699       return any(this);
45700   };
45701
45702   /**
45703    * Waits for all promises to be settled, either fulfilled or
45704    * rejected.  This is distinct from `all` since that would stop
45705    * waiting at the first rejection.  The promise returned by
45706    * `allResolved` will never be rejected.
45707    * @param promises a promise for an array (or an array) of promises
45708    * (or values)
45709    * @return a promise for an array of promises
45710    */
45711   Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
45712   function allResolved(promises) {
45713       return when(promises, function (promises) {
45714           promises = array_map(promises, Q);
45715           return when(all(array_map(promises, function (promise) {
45716               return when(promise, noop, noop);
45717           })), function () {
45718               return promises;
45719           });
45720       });
45721   }
45722
45723   Promise.prototype.allResolved = function () {
45724       return allResolved(this);
45725   };
45726
45727   /**
45728    * @see Promise#allSettled
45729    */
45730   Q.allSettled = allSettled;
45731   function allSettled(promises) {
45732       return Q(promises).allSettled();
45733   }
45734
45735   /**
45736    * Turns an array of promises into a promise for an array of their states (as
45737    * returned by `inspect`) when they have all settled.
45738    * @param {Array[Any*]} values an array (or promise for an array) of values (or
45739    * promises for values)
45740    * @returns {Array[State]} an array of states for the respective values.
45741    */
45742   Promise.prototype.allSettled = function () {
45743       return this.then(function (promises) {
45744           return all(array_map(promises, function (promise) {
45745               promise = Q(promise);
45746               function regardless() {
45747                   return promise.inspect();
45748               }
45749               return promise.then(regardless, regardless);
45750           }));
45751       });
45752   };
45753
45754   /**
45755    * Captures the failure of a promise, giving an oportunity to recover
45756    * with a callback.  If the given promise is fulfilled, the returned
45757    * promise is fulfilled.
45758    * @param {Any*} promise for something
45759    * @param {Function} callback to fulfill the returned promise if the
45760    * given promise is rejected
45761    * @returns a promise for the return value of the callback
45762    */
45763   Q.fail = // XXX legacy
45764   Q["catch"] = function (object, rejected) {
45765       return Q(object).then(void 0, rejected);
45766   };
45767
45768   Promise.prototype.fail = // XXX legacy
45769   Promise.prototype["catch"] = function (rejected) {
45770       return this.then(void 0, rejected);
45771   };
45772
45773   /**
45774    * Attaches a listener that can respond to progress notifications from a
45775    * promise's originating deferred. This listener receives the exact arguments
45776    * passed to ``deferred.notify``.
45777    * @param {Any*} promise for something
45778    * @param {Function} callback to receive any progress notifications
45779    * @returns the given promise, unchanged
45780    */
45781   Q.progress = progress;
45782   function progress(object, progressed) {
45783       return Q(object).then(void 0, void 0, progressed);
45784   }
45785
45786   Promise.prototype.progress = function (progressed) {
45787       return this.then(void 0, void 0, progressed);
45788   };
45789
45790   /**
45791    * Provides an opportunity to observe the settling of a promise,
45792    * regardless of whether the promise is fulfilled or rejected.  Forwards
45793    * the resolution to the returned promise when the callback is done.
45794    * The callback can return a promise to defer completion.
45795    * @param {Any*} promise
45796    * @param {Function} callback to observe the resolution of the given
45797    * promise, takes no arguments.
45798    * @returns a promise for the resolution of the given promise when
45799    * ``fin`` is done.
45800    */
45801   Q.fin = // XXX legacy
45802   Q["finally"] = function (object, callback) {
45803       return Q(object)["finally"](callback);
45804   };
45805
45806   Promise.prototype.fin = // XXX legacy
45807   Promise.prototype["finally"] = function (callback) {
45808       if (!callback || typeof callback.apply !== "function") {
45809           throw new Error("Q can't apply finally callback");
45810       }
45811       callback = Q(callback);
45812       return this.then(function (value) {
45813           return callback.fcall().then(function () {
45814               return value;
45815           });
45816       }, function (reason) {
45817           // TODO attempt to recycle the rejection with "this".
45818           return callback.fcall().then(function () {
45819               throw reason;
45820           });
45821       });
45822   };
45823
45824   /**
45825    * Terminates a chain of promises, forcing rejections to be
45826    * thrown as exceptions.
45827    * @param {Any*} promise at the end of a chain of promises
45828    * @returns nothing
45829    */
45830   Q.done = function (object, fulfilled, rejected, progress) {
45831       return Q(object).done(fulfilled, rejected, progress);
45832   };
45833
45834   Promise.prototype.done = function (fulfilled, rejected, progress) {
45835       var onUnhandledError = function (error) {
45836           // forward to a future turn so that ``when``
45837           // does not catch it and turn it into a rejection.
45838           Q.nextTick(function () {
45839               makeStackTraceLong(error, promise);
45840               if (Q.onerror) {
45841                   Q.onerror(error);
45842               } else {
45843                   throw error;
45844               }
45845           });
45846       };
45847
45848       // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
45849       var promise = fulfilled || rejected || progress ?
45850           this.then(fulfilled, rejected, progress) :
45851           this;
45852
45853       if (typeof process === "object" && process && process.domain) {
45854           onUnhandledError = process.domain.bind(onUnhandledError);
45855       }
45856
45857       promise.then(void 0, onUnhandledError);
45858   };
45859
45860   /**
45861    * Causes a promise to be rejected if it does not get fulfilled before
45862    * some milliseconds time out.
45863    * @param {Any*} promise
45864    * @param {Number} milliseconds timeout
45865    * @param {Any*} custom error message or Error object (optional)
45866    * @returns a promise for the resolution of the given promise if it is
45867    * fulfilled before the timeout, otherwise rejected.
45868    */
45869   Q.timeout = function (object, ms, error) {
45870       return Q(object).timeout(ms, error);
45871   };
45872
45873   Promise.prototype.timeout = function (ms, error) {
45874       var deferred = defer();
45875       var timeoutId = setTimeout(function () {
45876           if (!error || "string" === typeof error) {
45877               error = new Error(error || "Timed out after " + ms + " ms");
45878               error.code = "ETIMEDOUT";
45879           }
45880           deferred.reject(error);
45881       }, ms);
45882
45883       this.then(function (value) {
45884           clearTimeout(timeoutId);
45885           deferred.resolve(value);
45886       }, function (exception) {
45887           clearTimeout(timeoutId);
45888           deferred.reject(exception);
45889       }, deferred.notify);
45890
45891       return deferred.promise;
45892   };
45893
45894   /**
45895    * Returns a promise for the given value (or promised value), some
45896    * milliseconds after it resolved. Passes rejections immediately.
45897    * @param {Any*} promise
45898    * @param {Number} milliseconds
45899    * @returns a promise for the resolution of the given promise after milliseconds
45900    * time has elapsed since the resolution of the given promise.
45901    * If the given promise rejects, that is passed immediately.
45902    */
45903   Q.delay = function (object, timeout) {
45904       if (timeout === void 0) {
45905           timeout = object;
45906           object = void 0;
45907       }
45908       return Q(object).delay(timeout);
45909   };
45910
45911   Promise.prototype.delay = function (timeout) {
45912       return this.then(function (value) {
45913           var deferred = defer();
45914           setTimeout(function () {
45915               deferred.resolve(value);
45916           }, timeout);
45917           return deferred.promise;
45918       });
45919   };
45920
45921   /**
45922    * Passes a continuation to a Node function, which is called with the given
45923    * arguments provided as an array, and returns a promise.
45924    *
45925    *      Q.nfapply(FS.readFile, [__filename])
45926    *      .then(function (content) {
45927    *      })
45928    *
45929    */
45930   Q.nfapply = function (callback, args) {
45931       return Q(callback).nfapply(args);
45932   };
45933
45934   Promise.prototype.nfapply = function (args) {
45935       var deferred = defer();
45936       var nodeArgs = array_slice(args);
45937       nodeArgs.push(deferred.makeNodeResolver());
45938       this.fapply(nodeArgs).fail(deferred.reject);
45939       return deferred.promise;
45940   };
45941
45942   /**
45943    * Passes a continuation to a Node function, which is called with the given
45944    * arguments provided individually, and returns a promise.
45945    * @example
45946    * Q.nfcall(FS.readFile, __filename)
45947    * .then(function (content) {
45948    * })
45949    *
45950    */
45951   Q.nfcall = function (callback /*...args*/) {
45952       var args = array_slice(arguments, 1);
45953       return Q(callback).nfapply(args);
45954   };
45955
45956   Promise.prototype.nfcall = function (/*...args*/) {
45957       var nodeArgs = array_slice(arguments);
45958       var deferred = defer();
45959       nodeArgs.push(deferred.makeNodeResolver());
45960       this.fapply(nodeArgs).fail(deferred.reject);
45961       return deferred.promise;
45962   };
45963
45964   /**
45965    * Wraps a NodeJS continuation passing function and returns an equivalent
45966    * version that returns a promise.
45967    * @example
45968    * Q.nfbind(FS.readFile, __filename)("utf-8")
45969    * .then(console.log)
45970    * .done()
45971    */
45972   Q.nfbind =
45973   Q.denodeify = function (callback /*...args*/) {
45974       if (callback === undefined) {
45975           throw new Error("Q can't wrap an undefined function");
45976       }
45977       var baseArgs = array_slice(arguments, 1);
45978       return function () {
45979           var nodeArgs = baseArgs.concat(array_slice(arguments));
45980           var deferred = defer();
45981           nodeArgs.push(deferred.makeNodeResolver());
45982           Q(callback).fapply(nodeArgs).fail(deferred.reject);
45983           return deferred.promise;
45984       };
45985   };
45986
45987   Promise.prototype.nfbind =
45988   Promise.prototype.denodeify = function (/*...args*/) {
45989       var args = array_slice(arguments);
45990       args.unshift(this);
45991       return Q.denodeify.apply(void 0, args);
45992   };
45993
45994   Q.nbind = function (callback, thisp /*...args*/) {
45995       var baseArgs = array_slice(arguments, 2);
45996       return function () {
45997           var nodeArgs = baseArgs.concat(array_slice(arguments));
45998           var deferred = defer();
45999           nodeArgs.push(deferred.makeNodeResolver());
46000           function bound() {
46001               return callback.apply(thisp, arguments);
46002           }
46003           Q(bound).fapply(nodeArgs).fail(deferred.reject);
46004           return deferred.promise;
46005       };
46006   };
46007
46008   Promise.prototype.nbind = function (/*thisp, ...args*/) {
46009       var args = array_slice(arguments, 0);
46010       args.unshift(this);
46011       return Q.nbind.apply(void 0, args);
46012   };
46013
46014   /**
46015    * Calls a method of a Node-style object that accepts a Node-style
46016    * callback with a given array of arguments, plus a provided callback.
46017    * @param object an object that has the named method
46018    * @param {String} name name of the method of object
46019    * @param {Array} args arguments to pass to the method; the callback
46020    * will be provided by Q and appended to these arguments.
46021    * @returns a promise for the value or error
46022    */
46023   Q.nmapply = // XXX As proposed by "Redsandro"
46024   Q.npost = function (object, name, args) {
46025       return Q(object).npost(name, args);
46026   };
46027
46028   Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
46029   Promise.prototype.npost = function (name, args) {
46030       var nodeArgs = array_slice(args || []);
46031       var deferred = defer();
46032       nodeArgs.push(deferred.makeNodeResolver());
46033       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46034       return deferred.promise;
46035   };
46036
46037   /**
46038    * Calls a method of a Node-style object that accepts a Node-style
46039    * callback, forwarding the given variadic arguments, plus a provided
46040    * callback argument.
46041    * @param object an object that has the named method
46042    * @param {String} name name of the method of object
46043    * @param ...args arguments to pass to the method; the callback will
46044    * be provided by Q and appended to these arguments.
46045    * @returns a promise for the value or error
46046    */
46047   Q.nsend = // XXX Based on Mark Miller's proposed "send"
46048   Q.nmcall = // XXX Based on "Redsandro's" proposal
46049   Q.ninvoke = function (object, name /*...args*/) {
46050       var nodeArgs = array_slice(arguments, 2);
46051       var deferred = defer();
46052       nodeArgs.push(deferred.makeNodeResolver());
46053       Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46054       return deferred.promise;
46055   };
46056
46057   Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
46058   Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
46059   Promise.prototype.ninvoke = function (name /*...args*/) {
46060       var nodeArgs = array_slice(arguments, 1);
46061       var deferred = defer();
46062       nodeArgs.push(deferred.makeNodeResolver());
46063       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46064       return deferred.promise;
46065   };
46066
46067   /**
46068    * If a function would like to support both Node continuation-passing-style and
46069    * promise-returning-style, it can end its internal promise chain with
46070    * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
46071    * elects to use a nodeback, the result will be sent there.  If they do not
46072    * pass a nodeback, they will receive the result promise.
46073    * @param object a result (or a promise for a result)
46074    * @param {Function} nodeback a Node.js-style callback
46075    * @returns either the promise or nothing
46076    */
46077   Q.nodeify = nodeify;
46078   function nodeify(object, nodeback) {
46079       return Q(object).nodeify(nodeback);
46080   }
46081
46082   Promise.prototype.nodeify = function (nodeback) {
46083       if (nodeback) {
46084           this.then(function (value) {
46085               Q.nextTick(function () {
46086                   nodeback(null, value);
46087               });
46088           }, function (error) {
46089               Q.nextTick(function () {
46090                   nodeback(error);
46091               });
46092           });
46093       } else {
46094           return this;
46095       }
46096   };
46097
46098   Q.noConflict = function() {
46099       throw new Error("Q.noConflict only works when Q is used as a global");
46100   };
46101
46102   // All code before this point will be filtered from stack traces.
46103   var qEndingLine = captureLine();
46104
46105   return Q;
46106
46107   });
46108   });
46109
46110   var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
46111   var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
46112   var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
46113   var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
46114   var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
46115   var maxResults$2 = 2000;
46116   var tileZoom$2 = 16.5;
46117   var tiler$3 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
46118   var dispatch$4 = dispatch('loadedBubbles', 'viewerChanged');
46119   var minHfov = 10;         // zoom in degrees:  20, 10, 5
46120   var maxHfov = 90;         // zoom out degrees
46121   var defaultHfov = 45;
46122
46123   var _hires = false;
46124   var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
46125   var _currScene = 0;
46126   var _ssCache;
46127   var _pannellumViewer;
46128   var _sceneOptions;
46129   var _dataUrlArray = [];
46130
46131
46132   /**
46133    * abortRequest().
46134    */
46135   function abortRequest$3(i) {
46136       i.abort();
46137   }
46138
46139
46140   /**
46141    * localeTimeStamp().
46142    */
46143   function localeTimestamp(s) {
46144       if (!s) return null;
46145       var detected = utilDetect();
46146       var options = { day: 'numeric', month: 'short', year: 'numeric' };
46147       var d = new Date(s);
46148       if (isNaN(d.getTime())) return null;
46149       return d.toLocaleString(detected.locale, options);
46150   }
46151
46152
46153   /**
46154    * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
46155    */
46156   function loadTiles$2(which, url, projection, margin) {
46157       var tiles = tiler$3.margin(margin).getTiles(projection);
46158
46159       // abort inflight requests that are no longer needed
46160       var cache = _ssCache[which];
46161       forEach(cache.inflight, function(v, k) {
46162           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
46163
46164           if (!wanted) {
46165               abortRequest$3(v);
46166               delete cache.inflight[k];
46167           }
46168       });
46169
46170       tiles.forEach(function (tile) {
46171          loadNextTilePage$2(which, url, tile);
46172       });
46173   }
46174
46175   /**
46176    * loadNextTilePage() load data for the next tile page in line.
46177    */
46178   function loadNextTilePage$2(which, url, tile) {
46179       var cache = _ssCache[which];
46180       var nextPage = cache.nextPage[tile.id] || 0;
46181       var id = tile.id + ',' + String(nextPage);
46182       if (cache.loaded[id] || cache.inflight[id]) return;
46183
46184       cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
46185           cache.loaded[id] = true;
46186           delete cache.inflight[id];
46187           if (!bubbles) return;
46188
46189           // [].shift() removes the first element, some statistics info, not a bubble point
46190           bubbles.shift();
46191
46192           var features = bubbles.map(function(bubble) {
46193               if (cache.points[bubble.id]) return null;  // skip duplicates
46194
46195               var loc = [bubble.lo, bubble.la];
46196               var d = {
46197                   loc: loc,
46198                   key: bubble.id,
46199                   ca: bubble.he,
46200                   captured_at: bubble.cd,
46201                   captured_by: 'microsoft',
46202                   // nbn: bubble.nbn,
46203                   // pbn: bubble.pbn,
46204                   // ad: bubble.ad,
46205                   // rn: bubble.rn,
46206                   pr: bubble.pr,  // previous
46207                   ne: bubble.ne,  // next
46208                   pano: true,
46209                   sequenceKey: null
46210               };
46211
46212               cache.points[bubble.id] = d;
46213
46214               // a sequence starts here
46215               if (bubble.pr === undefined) {
46216                   cache.leaders.push(bubble.id);
46217               }
46218
46219               return {
46220                   minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
46221               };
46222
46223           }).filter(Boolean);
46224
46225           cache.rtree.load(features);
46226
46227           connectSequences();
46228
46229           if (which === 'bubbles') {
46230               dispatch$4.call('loadedBubbles');
46231           }
46232       });
46233   }
46234
46235
46236   // call this sometimes to connect the bubbles into sequences
46237   function connectSequences() {
46238       var cache = _ssCache.bubbles;
46239       var keepLeaders = [];
46240
46241       for (var i = 0; i < cache.leaders.length; i++) {
46242           var bubble = cache.points[cache.leaders[i]];
46243           var seen = {};
46244
46245           // try to make a sequence.. use the key of the leader bubble.
46246           var sequence = { key: bubble.key, bubbles: [] };
46247           var complete = false;
46248
46249           do {
46250               sequence.bubbles.push(bubble);
46251               seen[bubble.key] = true;
46252
46253               if (bubble.ne === undefined) {
46254                   complete = true;
46255               } else {
46256                   bubble = cache.points[bubble.ne];  // advance to next
46257               }
46258           } while (bubble && !seen[bubble.key] && !complete);
46259
46260
46261           if (complete) {
46262               _ssCache.sequences[sequence.key] = sequence;
46263
46264               // assign bubbles to the sequence
46265               for (var j = 0; j < sequence.bubbles.length; j++) {
46266                   sequence.bubbles[j].sequenceKey = sequence.key;
46267               }
46268
46269               // create a GeoJSON LineString
46270               sequence.geojson = {
46271                   type: 'LineString',
46272                   properties: { key: sequence.key },
46273                   coordinates: sequence.bubbles.map(function (d) { return d.loc; })
46274               };
46275
46276           } else {
46277               keepLeaders.push(cache.leaders[i]);
46278           }
46279       }
46280
46281       // couldn't complete these, save for later
46282       cache.leaders = keepLeaders;
46283   }
46284
46285   /**
46286    * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
46287    */
46288   function getBubbles(url, tile, callback) {
46289       var rect = tile.extent.rectangle();
46290       var urlForRequest = url + utilQsString({
46291           n: rect[3],
46292           s: rect[1],
46293           e: rect[2],
46294           w: rect[0],
46295           c: maxResults$2,
46296           appkey: bubbleAppKey,
46297           jsCallback: '{callback}'
46298       });
46299
46300       return jsonpRequest(urlForRequest, function (data) {
46301           if (!data || data.error) {
46302               callback(null);
46303           } else {
46304               callback(data);
46305           }
46306       });
46307   }
46308
46309   /**
46310    * partitionViewport() partition viewport into `psize` x `psize` regions.
46311    */
46312   function partitionViewport$2(psize, projection) {
46313       var dimensions = projection.clipExtent()[1];
46314       psize = psize || 16;
46315
46316       var cols = range(0, dimensions[0], psize);
46317       var rows = range(0, dimensions[1], psize);
46318       var partitions = [];
46319
46320       rows.forEach(function (y) {
46321           cols.forEach(function (x) {
46322               var min$$1 = [x, y + psize];
46323               var max$$1 = [x + psize, y];
46324               partitions.push(geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
46325           });
46326       });
46327
46328       return partitions;
46329   }
46330
46331
46332   /**
46333    * searchLimited().
46334    */
46335   function searchLimited$2(psize, limit, projection, rtree) {
46336       limit = limit || 3;
46337
46338       var partitions = partitionViewport$2(psize, projection);
46339       var results;
46340
46341       results = flatten(map$3(partitions, function (extent$$1) {
46342           return rtree.search(extent$$1.bbox())
46343               .slice(0, limit)
46344               .map(function (d) { return d.data; });
46345       }));
46346
46347       return results;
46348   }
46349
46350
46351   /**
46352    * getImage()
46353    */
46354   function getImage(imgInfo) {
46355       var response = q.defer();
46356       var img = new Image();
46357
46358       img.onload = function() {
46359           var canvas = document.getElementById('canvas' + imgInfo.face);
46360           var ctx = canvas.getContext('2d');
46361           ctx.drawImage(img, imgInfo.x, imgInfo.y);
46362           response.resolve({imgInfo:imgInfo, status: 'ok'});
46363       };
46364       img.onerror = function() {
46365           response.resolve({data: imgInfo, status: 'error'});
46366       };
46367       img.setAttribute('crossorigin', '');
46368       img.src = imgInfo.url;
46369
46370       return response.promise;
46371   }
46372
46373
46374   /**
46375    * loadCanvas()
46376    */
46377   function loadCanvas(imgInfoGroup) {
46378       var response = q.defer();
46379       var getImagePromises = imgInfoGroup.map(function(imgInfo) {
46380           return getImage(imgInfo);
46381       });
46382
46383       q.all(getImagePromises).then(function(data) {
46384           var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
46385           switch (data[0].imgInfo.face) {
46386               case '01':
46387                   _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
46388                   break;
46389               case '02':
46390                   _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
46391                   break;
46392               case '03':
46393                   _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
46394                   break;
46395               case '10':
46396                   _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
46397                   break;
46398               case '11':
46399                   _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
46400                   break;
46401               case '12':
46402                   _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
46403                   break;
46404           }
46405           response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
46406       });
46407
46408       return response.promise;
46409   }
46410
46411
46412   function setupCanvas(selection$$1, reset) {
46413       if (reset) {
46414           selection$$1.selectAll('#divForCanvasWork')
46415               .remove();
46416       }
46417
46418       // Add the Streetside working canvases. These are used for 'stitching', or combining,
46419       // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
46420       selection$$1.selectAll('#divForCanvasWork')
46421           .data([0])
46422           .enter()
46423           .append('div')
46424           .attr('id', 'divForCanvasWork')
46425           .attr('display', 'none')
46426           .selectAll('canvas')
46427           .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
46428           .enter()
46429           .append('canvas')
46430           .attr('id', function(d) { return d; })
46431           .attr('width', _resolution)
46432           .attr('height', _resolution);
46433   }
46434
46435
46436   /**
46437    * processFaces()
46438    */
46439   function processFaces(imgFaceInfoGroups) {
46440       var response = q.defer();
46441       var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
46442           return loadCanvas(faceImgGroup);
46443       });
46444
46445       q.all(loadCanvasPromises).then(function() {
46446           response.resolve({status: 'processFaces done'});
46447       });
46448
46449       return response.promise;
46450   }
46451
46452
46453
46454   function qkToXY(qk) {
46455       var x = 0;
46456       var y = 0;
46457       var scale = 256;
46458       for (var i = qk.length; i > 0; i--) {
46459           var key = qk[i-1];
46460           x += (+(key === '1' || key === '3')) * scale;
46461           y += (+(key === '2' || key === '3')) * scale;
46462           scale *= 2;
46463       }
46464       return [x, y];
46465   }
46466
46467
46468   function getQuadKeys() {
46469       var dim = _resolution / 256;
46470       var quadKeys;
46471
46472       if (dim === 16) {
46473           quadKeys = [
46474               '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
46475               '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
46476               '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
46477               '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
46478               '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
46479               '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
46480               '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
46481               '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
46482
46483               '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
46484               '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
46485               '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
46486               '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
46487               '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
46488               '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
46489               '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
46490               '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
46491           ];
46492
46493       } else if (dim === 8) {
46494           quadKeys = [
46495               '000','001','010','011',  '100','101','110','111',
46496               '002','003','012','013',  '102','103','112','113',
46497               '020','021','030','031',  '120','121','130','131',
46498               '022','023','032','033',  '122','123','132','133',
46499
46500               '200','201','210','211',  '300','301','310','311',
46501               '202','203','212','213',  '302','303','312','313',
46502               '220','221','230','231',  '320','321','330','331',
46503               '222','223','232','233',  '322','323','332','333'
46504           ];
46505
46506       } else if (dim === 4) {
46507           quadKeys = [
46508               '00','01',  '10','11',
46509               '02','03',  '12','13',
46510
46511               '20','21',  '30','31',
46512               '22','23',  '32','33'
46513           ];
46514
46515       } else {  // dim === 2
46516           quadKeys = [
46517               '0', '1',
46518               '2', '3'
46519           ];
46520       }
46521
46522       return quadKeys;
46523   }
46524
46525
46526
46527   var serviceStreetside = {
46528       /**
46529        * init() initialize streetside.
46530        */
46531       init: function () {
46532           if (!_ssCache) {
46533               this.reset();
46534           }
46535
46536           this.event = utilRebind(this, dispatch$4, 'on');
46537       },
46538
46539       /**
46540        * reset() reset the cache.
46541        */
46542       reset: function () {
46543           var cache = _ssCache;
46544
46545           if (cache) {
46546               if (cache.bubbles && cache.bubbles.inflight) {
46547                   forEach(cache.bubbles.inflight, abortRequest$3);
46548               }
46549           }
46550
46551           _ssCache = {
46552               bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
46553               sequences: {}
46554           };
46555       },
46556
46557       /**
46558        * bubbles()
46559        */
46560       bubbles: function (projection) {
46561           var psize = 32, limit = 3;
46562           return searchLimited$2(psize, limit, projection, _ssCache.bubbles.rtree);
46563       },
46564
46565
46566       sequences: function(projection) {
46567           var viewport = projection.clipExtent();
46568           var min$$1 = [viewport[0][0], viewport[1][1]];
46569           var max$$1 = [viewport[1][0], viewport[0][1]];
46570           var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
46571           var seen = {};
46572           var results = [];
46573
46574           // all sequences for bubbles in viewport
46575           _ssCache.bubbles.rtree.search(bbox)
46576               .forEach(function(d) {
46577                   var key = d.data.sequenceKey;
46578                   if (key && !seen[key]) {
46579                       seen[key] = true;
46580                       results.push(_ssCache.sequences[key].geojson);
46581                   }
46582               });
46583
46584           return results;
46585       },
46586
46587
46588       /**
46589        * loadBubbles()
46590        */
46591       loadBubbles: function (projection, margin) {
46592           // by default: request 2 nearby tiles so we can connect sequences.
46593           if (margin === undefined) margin = 2;
46594
46595           loadTiles$2('bubbles', bubbleApi, projection, margin);
46596       },
46597
46598
46599       viewer: function() {
46600           return _pannellumViewer;
46601       },
46602
46603
46604       initViewer: function () {
46605           if (!window.pannellum) return;
46606           if (_pannellumViewer) return;
46607
46608           var sceneID = ++_currScene + '';
46609           var options = {
46610               'default': { firstScene: sceneID },
46611               scenes: {}
46612           };
46613           options.scenes[sceneID] = _sceneOptions;
46614
46615           _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
46616
46617           _pannellumViewer
46618               .on('mousedown', function() {
46619                   select(window).on('mousemove.pannellum', function() {
46620                       dispatch$4.call('viewerChanged');
46621                   });
46622               })
46623               .on('mouseup', function() {
46624                   select(window).on('mousemove.pannellum', null);
46625                   // continue dispatching events for a few seconds, in case viewer has inertia.
46626                   var t$$1 = timer(function(elapsed) {
46627                       dispatch$4.call('viewerChanged');
46628                       if (elapsed > 2000) {
46629                           t$$1.stop();
46630                       }
46631                   });
46632               });
46633       },
46634
46635
46636       /**
46637        * loadViewer() create the streeside viewer.
46638        */
46639       loadViewer: function (context) {
46640           var that = this;
46641
46642           // create ms-wrapper, a photo wrapper class
46643           var wrap = select('#photoviewer').selectAll('.ms-wrapper')
46644               .data([0]);
46645
46646           // inject ms-wrapper into the photoviewer div
46647           // (used by all to house each custom photo viewer)
46648           var wrapEnter = wrap.enter()
46649               .append('div')
46650               .attr('id', 'ms')
46651               .attr('class', 'photo-wrapper ms-wrapper')
46652               .classed('hide', true);
46653
46654           // inject div to support streetside viewer (pannellum) and attribution line
46655           wrapEnter
46656               .append('div')
46657               .attr('id', 'viewer-streetside')
46658               .append('div')
46659               .attr('class', 'photo-attribution fillD');
46660
46661           var controlsEnter = wrapEnter
46662               .append('div')
46663               .attr('class', 'photo-controls-wrap')
46664               .append('div')
46665               .attr('class', 'photo-controls');
46666
46667           controlsEnter
46668               .append('button')
46669               .on('click.back', step(-1))
46670               .text('◄');
46671
46672           controlsEnter
46673               .append('button')
46674               .on('click.forward', step(1))
46675               .text('►');
46676
46677
46678           // create working canvas for stitching together images
46679           wrap = wrap
46680               .merge(wrapEnter)
46681               .call(setupCanvas, true);
46682
46683           // load streetside pannellum viewer css
46684           select('head').selectAll('#streetside-viewercss')
46685               .data([0])
46686               .enter()
46687               .append('link')
46688               .attr('id', 'streetside-viewercss')
46689               .attr('rel', 'stylesheet')
46690               .attr('href', context.asset(pannellumViewerCSS));
46691
46692           // load streetside pannellum viewer js
46693           select('head').selectAll('#streetside-viewerjs')
46694               .data([0])
46695               .enter()
46696               .append('script')
46697               .attr('id', 'streetside-viewerjs')
46698               .attr('src', context.asset(pannellumViewerJS));
46699
46700
46701           // Register viewer resize handler
46702           context.ui().on('photoviewerResize', function() {
46703               if (_pannellumViewer) {
46704                   _pannellumViewer.resize();
46705               }
46706           });
46707
46708
46709           function step(stepBy) {
46710               return function() {
46711                   var viewer = select('#photoviewer');
46712                   var selected = viewer.empty() ? undefined : viewer.datum();
46713                   if (!selected) return;
46714
46715                   var nextID = (stepBy === 1 ? selected.ne : selected.pr);
46716                   var yaw = _pannellumViewer.getYaw();
46717                   var ca = selected.ca + yaw;
46718                   var origin = selected.loc;
46719
46720                   // construct a search trapezoid pointing out from current bubble
46721                   var meters = 35;
46722                   var p1 = [
46723                       origin[0] + geoMetersToLon(meters / 5, origin[1]),
46724                       origin[1]
46725                   ];
46726                   var p2 = [
46727                       origin[0] + geoMetersToLon(meters / 2, origin[1]),
46728                       origin[1] + geoMetersToLat(meters)
46729                   ];
46730                   var p3 = [
46731                       origin[0] - geoMetersToLon(meters / 2, origin[1]),
46732                       origin[1] + geoMetersToLat(meters)
46733                   ];
46734                   var p4 = [
46735                       origin[0] - geoMetersToLon(meters / 5, origin[1]),
46736                       origin[1]
46737                   ];
46738
46739                   var poly = [p1, p2, p3, p4, p1];
46740
46741                   // rotate it to face forward/backward
46742                   var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
46743                   poly = geoRotate(poly, -angle, origin);
46744
46745                   var extent$$1 = poly.reduce(function(extent$$1, point$$1) {
46746                       return extent$$1.extend(geoExtent$$1(point$$1));
46747                   }, geoExtent$$1());
46748
46749                   // find nearest other bubble in the search polygon
46750                   var minDist = Infinity;
46751                   _ssCache.bubbles.rtree.search(extent$$1.bbox())
46752                       .forEach(function(d) {
46753                           if (d.data.key === selected.key) return;
46754                           if (!geoPointInPolygon(d.data.loc, poly)) return;
46755
46756                           var dist = geoVecLength(d.data.loc, selected.loc);
46757                           var theta = selected.ca - d.data.ca;
46758                           var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
46759                           if (minTheta > 20) {
46760                               dist += 5;  // penalize distance if camera angles don't match
46761                           }
46762
46763                           if (dist < minDist) {
46764                               nextID = d.data.key;
46765                               minDist = dist;
46766                           }
46767                       });
46768
46769                   var nextBubble = nextID && _ssCache.bubbles.points[nextID];
46770                   if (!nextBubble) return;
46771
46772                   context.map().centerEase(nextBubble.loc);
46773
46774                   that.selectImage(nextBubble)
46775                       .then(function(r) {
46776                           if (r.status === 'ok') {
46777                               _sceneOptions.yaw = yaw;
46778                               that.showViewer();
46779                           }
46780                       });
46781               };
46782           }
46783       },
46784
46785       /**
46786        * showViewer()
46787        */
46788       showViewer: function (yaw) {
46789           if (!_sceneOptions) return;
46790
46791           if (yaw !== undefined) {
46792               _sceneOptions.yaw = yaw;
46793           }
46794
46795           if (!_pannellumViewer) {
46796               this.initViewer();
46797           } else {
46798               // make a new scene
46799               var sceneID = ++_currScene + '';
46800               _pannellumViewer
46801                   .addScene(sceneID, _sceneOptions)
46802                   .loadScene(sceneID);
46803
46804               // remove previous scene
46805               if (_currScene > 2) {
46806                   sceneID = (_currScene - 1) + '';
46807                   _pannellumViewer
46808                       .removeScene(sceneID);
46809               }
46810           }
46811
46812           var wrap = select('#photoviewer')
46813               .classed('hide', false);
46814
46815           var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
46816
46817           if (isHidden) {
46818               wrap
46819                   .selectAll('.photo-wrapper:not(.ms-wrapper)')
46820                   .classed('hide', true);
46821
46822               wrap
46823                   .selectAll('.photo-wrapper.ms-wrapper')
46824                   .classed('hide', false);
46825           }
46826
46827           return this;
46828       },
46829
46830       /**
46831        * hideViewer()
46832        */
46833       hideViewer: function () {
46834           var viewer = select('#photoviewer');
46835           if (!viewer.empty()) viewer.datum(null);
46836
46837           viewer
46838               .classed('hide', true)
46839               .selectAll('.photo-wrapper')
46840               .classed('hide', true);
46841
46842           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
46843               .classed('selected', false);
46844
46845           return this.setStyles(null, true);
46846       },
46847
46848       /**
46849        * selectImage().
46850        */
46851       selectImage: function (d) {
46852           var response = q.defer();
46853           var that = this;
46854
46855           var viewer = select('#photoviewer');
46856           if (!viewer.empty()) viewer.datum(d);
46857
46858           this.setStyles(null, true);
46859
46860           var wrap = select('#photoviewer .ms-wrapper');
46861           var attribution = wrap.selectAll('.photo-attribution').html('');
46862
46863           wrap.selectAll('.pnlm-load-box')   // display "loading.."
46864               .style('display', 'block');
46865
46866           if (!d) {
46867               response.resolve({status: 'ok'});
46868               return response.promise;
46869           }
46870
46871           var line1 = attribution
46872               .append('div')
46873               .attr('class', 'attribution-row');
46874
46875           // Add hires checkbox
46876           var label = line1
46877               .append('label')
46878               .attr('class', 'streetside-hires');
46879
46880           label
46881               .append('input')
46882               .attr('type', 'checkbox')
46883               .attr('id', 'streetside-hires-input')
46884               .property('checked', _hires)
46885               .on('click', function() {
46886                   event.stopPropagation();
46887
46888                   _hires = !_hires;
46889                   _resolution = _hires ? 1024 : 512;
46890                   wrap.call(setupCanvas, true);
46891
46892                   var viewstate = {
46893                       yaw: _pannellumViewer.getYaw(),
46894                       pitch: _pannellumViewer.getPitch(),
46895                       hfov: _pannellumViewer.getHfov()
46896                   };
46897
46898                   that.selectImage(d)
46899                       .then(function(r) {
46900                           if (r.status === 'ok') {
46901                               _sceneOptions = assignIn(_sceneOptions, viewstate);
46902                               that.showViewer();
46903                           }
46904                       });
46905               });
46906
46907           label
46908               .append('span')
46909               .text(t('streetside.hires'));
46910
46911
46912           var captureInfo = line1
46913               .append('div')
46914               .attr('class', 'attribution-capture-info');
46915
46916           // Add capture date
46917           if (d.captured_by) {
46918               var yyyy = (new Date()).getFullYear();
46919
46920               captureInfo
46921                   .append('a')
46922                   .attr('class', 'captured_by')
46923                   .attr('target', '_blank')
46924                   .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
46925                   .text('©' + yyyy + ' Microsoft');
46926
46927               captureInfo
46928                   .append('span')
46929                   .text('|');
46930           }
46931
46932           if (d.captured_at) {
46933               captureInfo
46934                   .append('span')
46935                   .attr('class', 'captured_at')
46936                   .text(localeTimestamp(d.captured_at));
46937           }
46938
46939           // Add image links
46940           var line2 = attribution
46941               .append('div')
46942               .attr('class', 'attribution-row');
46943
46944           line2
46945               .append('a')
46946               .attr('class', 'image-view-link')
46947               .attr('target', '_blank')
46948               .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
46949                   '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
46950               .text(t('streetside.view_on_bing'));
46951
46952           line2
46953               .append('a')
46954               .attr('class', 'image-report-link')
46955               .attr('target', '_blank')
46956               .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
46957                   '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
46958               .text(t('streetside.report'));
46959
46960
46961           var bubbleIdQuadKey = d.key.toString(4);
46962           var paddingNeeded = 16 - bubbleIdQuadKey.length;
46963           for (var i = 0; i < paddingNeeded; i++) {
46964               bubbleIdQuadKey = '0' + bubbleIdQuadKey;
46965           }
46966           var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
46967           var imgUrlSuffix = '.jpg?g=6338&n=z';
46968
46969           // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
46970           var faceKeys = ['01','02','03','10','11','12'];
46971
46972           // Map images to cube faces
46973           var quadKeys = getQuadKeys();
46974           var faces = faceKeys.map(function(faceKey) {
46975               return quadKeys.map(function(quadKey) {
46976                   var xy = qkToXY(quadKey);
46977                   return {
46978                       face: faceKey,
46979                       url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
46980                       x: xy[0],
46981                       y: xy[1]
46982                   };
46983               });
46984           });
46985
46986           processFaces(faces).then(function() {
46987               _sceneOptions = {
46988                   showFullscreenCtrl: false,
46989                   autoLoad: true,
46990                   compass: true,
46991                   northOffset: d.ca,
46992                   yaw: 0,
46993                   minHfov: minHfov,
46994                   maxHfov: maxHfov,
46995                   hfov: defaultHfov,
46996                   type: 'cubemap',
46997                   cubeMap: [
46998                       _dataUrlArray[0],
46999                       _dataUrlArray[1],
47000                       _dataUrlArray[2],
47001                       _dataUrlArray[3],
47002                       _dataUrlArray[4],
47003                       _dataUrlArray[5]
47004                   ]
47005               };
47006               response.resolve({status: 'ok'});
47007           });
47008
47009           return response.promise;
47010       },
47011
47012
47013       getSequenceKeyForBubble: function(d) {
47014           return d && d.sequenceKey;
47015       },
47016
47017
47018       /**
47019        * setStyles().
47020        */
47021       setStyles: function (hovered, reset) {
47022           if (reset) {  // reset all layers
47023               d3_selectAll('.viewfield-group')
47024                   .classed('highlighted', false)
47025                   .classed('hovered', false)
47026                   .classed('selected', false);
47027
47028               d3_selectAll('.sequence')
47029                   .classed('highlighted', false)
47030                   .classed('selected', false);
47031           }
47032
47033           var hoveredBubbleKey = hovered && hovered.key;
47034           var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
47035           var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
47036           var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
47037
47038           var viewer = select('#photoviewer');
47039           var selected = viewer.empty() ? undefined : viewer.datum();
47040           var selectedBubbleKey = selected && selected.key;
47041           var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
47042           var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
47043           var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
47044
47045           // highlight sibling viewfields on either the selected or the hovered sequences
47046           var highlightedBubbleKeys = union(hoveredBubbleKeys, selectedBubbleKeys);
47047
47048           d3_selectAll('.layer-streetside-images .viewfield-group')
47049               .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
47050               .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
47051               .classed('selected', function (d) { return d.key === selectedBubbleKey; });
47052
47053           d3_selectAll('.layer-streetside-images .sequence')
47054               .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
47055               .classed('selected', function (d) { return d.properties.key === selectedSequenceKey; });
47056
47057           // update viewfields if needed
47058           d3_selectAll('.viewfield-group .viewfield')
47059               .attr('d', viewfieldPath);
47060
47061           function viewfieldPath() {
47062               var d = this.parentNode.__data__;
47063               if (d.pano && d.key !== selectedBubbleKey) {
47064                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
47065               } else {
47066                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
47067               }
47068           }
47069
47070           return this;
47071       },
47072
47073       /**
47074        * cache().
47075        */
47076       cache: function () {
47077           return _ssCache;
47078       }
47079   };
47080
47081   var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/',
47082       inflight$1 = {},
47083       popularKeys = {},
47084       taginfoCache = {},
47085       tag_sorts = {
47086           point: 'count_nodes',
47087           vertex: 'count_nodes',
47088           area: 'count_ways',
47089           line: 'count_ways'
47090       },
47091       tag_sort_members = {
47092           point: 'count_node_members',
47093           vertex: 'count_node_members',
47094           area: 'count_way_members',
47095           line: 'count_way_members',
47096           relation: 'count_relation_members'
47097       },
47098       tag_filters = {
47099           point: 'nodes',
47100           vertex: 'nodes',
47101           area: 'ways',
47102           line: 'ways'
47103       },
47104       tag_members_fractions = {
47105           point: 'count_node_members_fraction',
47106           vertex: 'count_node_members_fraction',
47107           area: 'count_way_members_fraction',
47108           line: 'count_way_members_fraction',
47109           relation: 'count_relation_members_fraction'
47110       };
47111
47112
47113   function sets(params, n, o) {
47114       if (params.geometry && o[params.geometry]) {
47115           params[n] = o[params.geometry];
47116       }
47117       return params;
47118   }
47119
47120
47121   function setFilter(params) {
47122       return sets(params, 'filter', tag_filters);
47123   }
47124
47125
47126   function setSort(params) {
47127       return sets(params, 'sortname', tag_sorts);
47128   }
47129
47130
47131   function setSortMembers(params) {
47132       return sets(params, 'sortname', tag_sort_members);
47133   }
47134
47135
47136   function clean(params) {
47137       return omit(params, ['geometry', 'debounce']);
47138   }
47139
47140
47141   function filterKeys(type) {
47142       var count_type = type ? 'count_' + type : 'count_all';
47143       return function(d) {
47144           return parseFloat(d[count_type]) > 2500 || d.in_wiki;
47145       };
47146   }
47147
47148
47149   function filterMultikeys(prefix) {
47150       return function(d) {
47151           // d.key begins with prefix, and d.key contains no additional ':'s
47152           var re = new RegExp('^' + prefix + '(.*)$');
47153           var matches = d.key.match(re) || [];
47154           return (matches.length === 2 && matches[1].indexOf(':') === -1);
47155       };
47156   }
47157
47158
47159   function filterValues(allowUpperCase) {
47160       return function(d) {
47161           if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
47162           if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
47163           return parseFloat(d.fraction) > 0.0 || d.in_wiki;
47164       };
47165   }
47166
47167
47168   function filterRoles(geometry) {
47169       return function(d) {
47170           if (d.role === '') return false; // exclude empty role
47171           if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
47172           return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
47173       };
47174   }
47175
47176
47177   function valKey(d) {
47178       return {
47179           value: d.key,
47180           title: d.key
47181       };
47182   }
47183
47184
47185   function valKeyDescription(d) {
47186       return {
47187           value: d.value,
47188           title: d.description || d.value
47189       };
47190   }
47191
47192
47193   function roleKey(d) {
47194       return {
47195           value: d.role,
47196           title: d.role
47197       };
47198   }
47199
47200
47201   // sort keys with ':' lower than keys without ':'
47202   function sortKeys(a, b) {
47203       return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
47204           : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
47205           : 0;
47206   }
47207
47208
47209   var debouncedRequest = debounce(request$1, 500, { leading: false });
47210
47211   function request$1(url, params, exactMatch, callback, loaded) {
47212       if (inflight$1[url]) return;
47213
47214       if (checkCache(url, params, exactMatch, callback)) return;
47215
47216       inflight$1[url] = d3_json(url, function (err, data) {
47217           delete inflight$1[url];
47218           loaded(err, data);
47219       });
47220   }
47221
47222
47223   function checkCache(url, params, exactMatch, callback) {
47224       var rp = params.rp || 25,
47225           testQuery = params.query || '',
47226           testUrl = url;
47227
47228       do {
47229           var hit = taginfoCache[testUrl];
47230
47231           // exact match, or shorter match yielding fewer than max results (rp)
47232           if (hit && (url === testUrl || hit.length < rp)) {
47233               callback(null, hit);
47234               return true;
47235           }
47236
47237           // don't try to shorten the query
47238           if (exactMatch || !testQuery.length) return false;
47239
47240           // do shorten the query to see if we already have a cached result
47241           // that has returned fewer than max results (rp)
47242           testQuery = testQuery.slice(0, -1);
47243           testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
47244       } while (testQuery.length >= 0);
47245
47246       return false;
47247   }
47248
47249
47250   var serviceTaginfo = {
47251
47252       init: function() {
47253           inflight$1 = {};
47254           taginfoCache = {};
47255           popularKeys = {};
47256
47257           // Fetch popular keys.  We'll exclude these from `values`
47258           // lookups because they stress taginfo, and they aren't likely
47259           // to yield meaningful autocomplete results.. see #3955
47260           var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false };
47261           this.keys(params, function(err, data) {
47262               if (err) return;
47263               data.forEach(function(d) {
47264                   if (d.value === 'opening_hours') return;  // exception
47265                   popularKeys[d.value] = true;
47266               });
47267           });
47268       },
47269
47270
47271       reset: function() {
47272           forEach(inflight$1, function(req) { req.abort(); });
47273           inflight$1 = {};
47274       },
47275
47276
47277       keys: function(params, callback) {
47278           var doRequest = params.debounce ? debouncedRequest : request$1;
47279           params = clean(setSort(params));
47280           params = assignIn({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
47281
47282           var url = apibase$3 + 'keys/all?' + utilQsString(params);
47283           doRequest(url, params, false, callback, function(err, d) {
47284               if (err) {
47285                   callback(err);
47286               } else {
47287                   var f = filterKeys(params.filter);
47288                   var result = d.data.filter(f).sort(sortKeys).map(valKey);
47289                   taginfoCache[url] = result;
47290                   callback(null, result);
47291               }
47292           });
47293       },
47294
47295
47296       multikeys: function(params, callback) {
47297           var doRequest = params.debounce ? debouncedRequest : request$1;
47298           params = clean(setSort(params));
47299           params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
47300           var prefix = params.query;
47301
47302           var url = apibase$3 + 'keys/all?' + utilQsString(params);
47303           doRequest(url, params, true, callback, function(err, d) {
47304               if (err) {
47305                   callback(err);
47306               } else {
47307                   var f = filterMultikeys(prefix);
47308                   var result = d.data.filter(f).map(valKey);
47309                   taginfoCache[url] = result;
47310                   callback(null, result);
47311               }
47312           });
47313       },
47314
47315
47316       values: function(params, callback) {
47317           // Exclude popular keys from values lookups.. see #3955
47318           var key = params.key;
47319           if (key && popularKeys[key]) {
47320               callback(null, []);
47321               return;
47322           }
47323
47324           var doRequest = params.debounce ? debouncedRequest : request$1;
47325           params = clean(setSort(setFilter(params)));
47326           params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
47327
47328           var url = apibase$3 + 'key/values?' + utilQsString(params);
47329           doRequest(url, params, false, callback, function(err, d) {
47330               if (err) {
47331                   callback(err);
47332               } else {
47333                   // In most cases we prefer taginfo value results with lowercase letters.
47334                   // A few OSM keys expect values to contain uppercase values (see #3377).
47335                   // This is not an exhaustive list (e.g. `name` also has uppercase values)
47336                   // but these are the fields where taginfo value lookup is most useful.
47337                   var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times/;
47338                   var allowUpperCase = (params.key.match(re) !== null);
47339                   var f = filterValues(allowUpperCase);
47340
47341                   var result = d.data.filter(f).map(valKeyDescription);
47342                   taginfoCache[url] = result;
47343                   callback(null, result);
47344               }
47345           });
47346       },
47347
47348
47349       roles: function(params, callback) {
47350           var doRequest = params.debounce ? debouncedRequest : request$1;
47351           var geometry = params.geometry;
47352           params = clean(setSortMembers(params));
47353           params = assignIn({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
47354
47355           var url = apibase$3 + 'relation/roles?' + utilQsString(params);
47356           doRequest(url, params, true, callback, function(err, d) {
47357               if (err) {
47358                   callback(err);
47359               } else {
47360                   var f = filterRoles(geometry);
47361                   var result = d.data.filter(f).map(roleKey);
47362                   taginfoCache[url] = result;
47363                   callback(null, result);
47364               }
47365           });
47366       },
47367
47368
47369       docs: function(params, callback) {
47370           var doRequest = params.debounce ? debouncedRequest : request$1;
47371           params = clean(setSort(params));
47372
47373           var path = 'key/wiki_pages?';
47374           if (params.value) path = 'tag/wiki_pages?';
47375           else if (params.rtype) path = 'relation/wiki_pages?';
47376
47377           var url = apibase$3 + path + utilQsString(params);
47378           doRequest(url, params, true, callback, function(err, d) {
47379               if (err) {
47380                   callback(err);
47381               } else {
47382                   taginfoCache[url] = d.data;
47383                   callback(null, d.data);
47384               }
47385           });
47386       },
47387
47388
47389       apibase: function(_) {
47390           if (!arguments.length) return apibase$3;
47391           apibase$3 = _;
47392           return this;
47393       }
47394
47395   };
47396
47397   var helpers = createCommonjsModule(function (module, exports) {
47398   Object.defineProperty(exports, "__esModule", { value: true });
47399   /**
47400    * @module helpers
47401    */
47402   /**
47403    * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
47404    *
47405    * @memberof helpers
47406    * @type {number}
47407    */
47408   exports.earthRadius = 6371008.8;
47409   /**
47410    * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
47411    *
47412    * @memberof helpers
47413    * @type {Object}
47414    */
47415   exports.factors = {
47416       centimeters: exports.earthRadius * 100,
47417       centimetres: exports.earthRadius * 100,
47418       degrees: exports.earthRadius / 111325,
47419       feet: exports.earthRadius * 3.28084,
47420       inches: exports.earthRadius * 39.370,
47421       kilometers: exports.earthRadius / 1000,
47422       kilometres: exports.earthRadius / 1000,
47423       meters: exports.earthRadius,
47424       metres: exports.earthRadius,
47425       miles: exports.earthRadius / 1609.344,
47426       millimeters: exports.earthRadius * 1000,
47427       millimetres: exports.earthRadius * 1000,
47428       nauticalmiles: exports.earthRadius / 1852,
47429       radians: 1,
47430       yards: exports.earthRadius / 1.0936,
47431   };
47432   /**
47433    * Units of measurement factors based on 1 meter.
47434    *
47435    * @memberof helpers
47436    * @type {Object}
47437    */
47438   exports.unitsFactors = {
47439       centimeters: 100,
47440       centimetres: 100,
47441       degrees: 1 / 111325,
47442       feet: 3.28084,
47443       inches: 39.370,
47444       kilometers: 1 / 1000,
47445       kilometres: 1 / 1000,
47446       meters: 1,
47447       metres: 1,
47448       miles: 1 / 1609.344,
47449       millimeters: 1000,
47450       millimetres: 1000,
47451       nauticalmiles: 1 / 1852,
47452       radians: 1 / exports.earthRadius,
47453       yards: 1 / 1.0936,
47454   };
47455   /**
47456    * Area of measurement factors based on 1 square meter.
47457    *
47458    * @memberof helpers
47459    * @type {Object}
47460    */
47461   exports.areaFactors = {
47462       acres: 0.000247105,
47463       centimeters: 10000,
47464       centimetres: 10000,
47465       feet: 10.763910417,
47466       inches: 1550.003100006,
47467       kilometers: 0.000001,
47468       kilometres: 0.000001,
47469       meters: 1,
47470       metres: 1,
47471       miles: 3.86e-7,
47472       millimeters: 1000000,
47473       millimetres: 1000000,
47474       yards: 1.195990046,
47475   };
47476   /**
47477    * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
47478    *
47479    * @name feature
47480    * @param {Geometry} geometry input geometry
47481    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47482    * @param {Object} [options={}] Optional Parameters
47483    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47484    * @param {string|number} [options.id] Identifier associated with the Feature
47485    * @returns {Feature} a GeoJSON Feature
47486    * @example
47487    * var geometry = {
47488    *   "type": "Point",
47489    *   "coordinates": [110, 50]
47490    * };
47491    *
47492    * var feature = turf.feature(geometry);
47493    *
47494    * //=feature
47495    */
47496   function feature(geom, properties, options) {
47497       if (options === void 0) { options = {}; }
47498       var feat = { type: "Feature" };
47499       if (options.id === 0 || options.id) {
47500           feat.id = options.id;
47501       }
47502       if (options.bbox) {
47503           feat.bbox = options.bbox;
47504       }
47505       feat.properties = properties || {};
47506       feat.geometry = geom;
47507       return feat;
47508   }
47509   exports.feature = feature;
47510   /**
47511    * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
47512    * For GeometryCollection type use `helpers.geometryCollection`
47513    *
47514    * @name geometry
47515    * @param {string} type Geometry Type
47516    * @param {Array<any>} coordinates Coordinates
47517    * @param {Object} [options={}] Optional Parameters
47518    * @returns {Geometry} a GeoJSON Geometry
47519    * @example
47520    * var type = "Point";
47521    * var coordinates = [110, 50];
47522    * var geometry = turf.geometry(type, coordinates);
47523    * // => geometry
47524    */
47525   function geometry(type, coordinates, options) {
47526       if (options === void 0) { options = {}; }
47527       switch (type) {
47528           case "Point": return point(coordinates).geometry;
47529           case "LineString": return lineString(coordinates).geometry;
47530           case "Polygon": return polygon(coordinates).geometry;
47531           case "MultiPoint": return multiPoint(coordinates).geometry;
47532           case "MultiLineString": return multiLineString(coordinates).geometry;
47533           case "MultiPolygon": return multiPolygon(coordinates).geometry;
47534           default: throw new Error(type + " is invalid");
47535       }
47536   }
47537   exports.geometry = geometry;
47538   /**
47539    * Creates a {@link Point} {@link Feature} from a Position.
47540    *
47541    * @name point
47542    * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
47543    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47544    * @param {Object} [options={}] Optional Parameters
47545    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47546    * @param {string|number} [options.id] Identifier associated with the Feature
47547    * @returns {Feature<Point>} a Point feature
47548    * @example
47549    * var point = turf.point([-75.343, 39.984]);
47550    *
47551    * //=point
47552    */
47553   function point(coordinates, properties, options) {
47554       if (options === void 0) { options = {}; }
47555       var geom = {
47556           type: "Point",
47557           coordinates: coordinates,
47558       };
47559       return feature(geom, properties, options);
47560   }
47561   exports.point = point;
47562   /**
47563    * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
47564    *
47565    * @name points
47566    * @param {Array<Array<number>>} coordinates an array of Points
47567    * @param {Object} [properties={}] Translate these properties to each Feature
47568    * @param {Object} [options={}] Optional Parameters
47569    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
47570    * associated with the FeatureCollection
47571    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47572    * @returns {FeatureCollection<Point>} Point Feature
47573    * @example
47574    * var points = turf.points([
47575    *   [-75, 39],
47576    *   [-80, 45],
47577    *   [-78, 50]
47578    * ]);
47579    *
47580    * //=points
47581    */
47582   function points(coordinates, properties, options) {
47583       if (options === void 0) { options = {}; }
47584       return featureCollection(coordinates.map(function (coords) {
47585           return point(coords, properties);
47586       }), options);
47587   }
47588   exports.points = points;
47589   /**
47590    * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
47591    *
47592    * @name polygon
47593    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
47594    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47595    * @param {Object} [options={}] Optional Parameters
47596    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47597    * @param {string|number} [options.id] Identifier associated with the Feature
47598    * @returns {Feature<Polygon>} Polygon Feature
47599    * @example
47600    * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
47601    *
47602    * //=polygon
47603    */
47604   function polygon(coordinates, properties, options) {
47605       if (options === void 0) { options = {}; }
47606       for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
47607           var ring = coordinates_1[_i];
47608           if (ring.length < 4) {
47609               throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
47610           }
47611           for (var j = 0; j < ring[ring.length - 1].length; j++) {
47612               // Check if first point of Polygon contains two numbers
47613               if (ring[ring.length - 1][j] !== ring[0][j]) {
47614                   throw new Error("First and last Position are not equivalent.");
47615               }
47616           }
47617       }
47618       var geom = {
47619           type: "Polygon",
47620           coordinates: coordinates,
47621       };
47622       return feature(geom, properties, options);
47623   }
47624   exports.polygon = polygon;
47625   /**
47626    * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
47627    *
47628    * @name polygons
47629    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
47630    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47631    * @param {Object} [options={}] Optional Parameters
47632    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47633    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47634    * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
47635    * @example
47636    * var polygons = turf.polygons([
47637    *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
47638    *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
47639    * ]);
47640    *
47641    * //=polygons
47642    */
47643   function polygons(coordinates, properties, options) {
47644       if (options === void 0) { options = {}; }
47645       return featureCollection(coordinates.map(function (coords) {
47646           return polygon(coords, properties);
47647       }), options);
47648   }
47649   exports.polygons = polygons;
47650   /**
47651    * Creates a {@link LineString} {@link Feature} from an Array of Positions.
47652    *
47653    * @name lineString
47654    * @param {Array<Array<number>>} coordinates an array of Positions
47655    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47656    * @param {Object} [options={}] Optional Parameters
47657    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47658    * @param {string|number} [options.id] Identifier associated with the Feature
47659    * @returns {Feature<LineString>} LineString Feature
47660    * @example
47661    * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
47662    * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
47663    *
47664    * //=linestring1
47665    * //=linestring2
47666    */
47667   function lineString(coordinates, properties, options) {
47668       if (options === void 0) { options = {}; }
47669       if (coordinates.length < 2) {
47670           throw new Error("coordinates must be an array of two or more positions");
47671       }
47672       var geom = {
47673           type: "LineString",
47674           coordinates: coordinates,
47675       };
47676       return feature(geom, properties, options);
47677   }
47678   exports.lineString = lineString;
47679   /**
47680    * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
47681    *
47682    * @name lineStrings
47683    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
47684    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47685    * @param {Object} [options={}] Optional Parameters
47686    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
47687    * associated with the FeatureCollection
47688    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47689    * @returns {FeatureCollection<LineString>} LineString FeatureCollection
47690    * @example
47691    * var linestrings = turf.lineStrings([
47692    *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
47693    *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
47694    * ]);
47695    *
47696    * //=linestrings
47697    */
47698   function lineStrings(coordinates, properties, options) {
47699       if (options === void 0) { options = {}; }
47700       return featureCollection(coordinates.map(function (coords) {
47701           return lineString(coords, properties);
47702       }), options);
47703   }
47704   exports.lineStrings = lineStrings;
47705   /**
47706    * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
47707    *
47708    * @name featureCollection
47709    * @param {Feature[]} features input features
47710    * @param {Object} [options={}] Optional Parameters
47711    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47712    * @param {string|number} [options.id] Identifier associated with the Feature
47713    * @returns {FeatureCollection} FeatureCollection of Features
47714    * @example
47715    * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
47716    * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
47717    * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
47718    *
47719    * var collection = turf.featureCollection([
47720    *   locationA,
47721    *   locationB,
47722    *   locationC
47723    * ]);
47724    *
47725    * //=collection
47726    */
47727   function featureCollection(features, options) {
47728       if (options === void 0) { options = {}; }
47729       var fc = { type: "FeatureCollection" };
47730       if (options.id) {
47731           fc.id = options.id;
47732       }
47733       if (options.bbox) {
47734           fc.bbox = options.bbox;
47735       }
47736       fc.features = features;
47737       return fc;
47738   }
47739   exports.featureCollection = featureCollection;
47740   /**
47741    * Creates a {@link Feature<MultiLineString>} based on a
47742    * coordinate array. Properties can be added optionally.
47743    *
47744    * @name multiLineString
47745    * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
47746    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47747    * @param {Object} [options={}] Optional Parameters
47748    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47749    * @param {string|number} [options.id] Identifier associated with the Feature
47750    * @returns {Feature<MultiLineString>} a MultiLineString feature
47751    * @throws {Error} if no coordinates are passed
47752    * @example
47753    * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
47754    *
47755    * //=multiLine
47756    */
47757   function multiLineString(coordinates, properties, options) {
47758       if (options === void 0) { options = {}; }
47759       var geom = {
47760           type: "MultiLineString",
47761           coordinates: coordinates,
47762       };
47763       return feature(geom, properties, options);
47764   }
47765   exports.multiLineString = multiLineString;
47766   /**
47767    * Creates a {@link Feature<MultiPoint>} based on a
47768    * coordinate array. Properties can be added optionally.
47769    *
47770    * @name multiPoint
47771    * @param {Array<Array<number>>} coordinates an array of Positions
47772    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47773    * @param {Object} [options={}] Optional Parameters
47774    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47775    * @param {string|number} [options.id] Identifier associated with the Feature
47776    * @returns {Feature<MultiPoint>} a MultiPoint feature
47777    * @throws {Error} if no coordinates are passed
47778    * @example
47779    * var multiPt = turf.multiPoint([[0,0],[10,10]]);
47780    *
47781    * //=multiPt
47782    */
47783   function multiPoint(coordinates, properties, options) {
47784       if (options === void 0) { options = {}; }
47785       var geom = {
47786           type: "MultiPoint",
47787           coordinates: coordinates,
47788       };
47789       return feature(geom, properties, options);
47790   }
47791   exports.multiPoint = multiPoint;
47792   /**
47793    * Creates a {@link Feature<MultiPolygon>} based on a
47794    * coordinate array. Properties can be added optionally.
47795    *
47796    * @name multiPolygon
47797    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
47798    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47799    * @param {Object} [options={}] Optional Parameters
47800    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47801    * @param {string|number} [options.id] Identifier associated with the Feature
47802    * @returns {Feature<MultiPolygon>} a multipolygon feature
47803    * @throws {Error} if no coordinates are passed
47804    * @example
47805    * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
47806    *
47807    * //=multiPoly
47808    *
47809    */
47810   function multiPolygon(coordinates, properties, options) {
47811       if (options === void 0) { options = {}; }
47812       var geom = {
47813           type: "MultiPolygon",
47814           coordinates: coordinates,
47815       };
47816       return feature(geom, properties, options);
47817   }
47818   exports.multiPolygon = multiPolygon;
47819   /**
47820    * Creates a {@link Feature<GeometryCollection>} based on a
47821    * coordinate array. Properties can be added optionally.
47822    *
47823    * @name geometryCollection
47824    * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
47825    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47826    * @param {Object} [options={}] Optional Parameters
47827    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47828    * @param {string|number} [options.id] Identifier associated with the Feature
47829    * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
47830    * @example
47831    * var pt = turf.geometry("Point", [100, 0]);
47832    * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
47833    * var collection = turf.geometryCollection([pt, line]);
47834    *
47835    * // => collection
47836    */
47837   function geometryCollection(geometries, properties, options) {
47838       if (options === void 0) { options = {}; }
47839       var geom = {
47840           type: "GeometryCollection",
47841           geometries: geometries,
47842       };
47843       return feature(geom, properties, options);
47844   }
47845   exports.geometryCollection = geometryCollection;
47846   /**
47847    * Round number to precision
47848    *
47849    * @param {number} num Number
47850    * @param {number} [precision=0] Precision
47851    * @returns {number} rounded number
47852    * @example
47853    * turf.round(120.4321)
47854    * //=120
47855    *
47856    * turf.round(120.4321, 2)
47857    * //=120.43
47858    */
47859   function round(num, precision) {
47860       if (precision === void 0) { precision = 0; }
47861       if (precision && !(precision >= 0)) {
47862           throw new Error("precision must be a positive number");
47863       }
47864       var multiplier = Math.pow(10, precision || 0);
47865       return Math.round(num * multiplier) / multiplier;
47866   }
47867   exports.round = round;
47868   /**
47869    * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
47870    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
47871    *
47872    * @name radiansToLength
47873    * @param {number} radians in radians across the sphere
47874    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
47875    * meters, kilometres, kilometers.
47876    * @returns {number} distance
47877    */
47878   function radiansToLength(radians, units) {
47879       if (units === void 0) { units = "kilometers"; }
47880       var factor = exports.factors[units];
47881       if (!factor) {
47882           throw new Error(units + " units is invalid");
47883       }
47884       return radians * factor;
47885   }
47886   exports.radiansToLength = radiansToLength;
47887   /**
47888    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
47889    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
47890    *
47891    * @name lengthToRadians
47892    * @param {number} distance in real units
47893    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
47894    * meters, kilometres, kilometers.
47895    * @returns {number} radians
47896    */
47897   function lengthToRadians(distance, units) {
47898       if (units === void 0) { units = "kilometers"; }
47899       var factor = exports.factors[units];
47900       if (!factor) {
47901           throw new Error(units + " units is invalid");
47902       }
47903       return distance / factor;
47904   }
47905   exports.lengthToRadians = lengthToRadians;
47906   /**
47907    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
47908    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
47909    *
47910    * @name lengthToDegrees
47911    * @param {number} distance in real units
47912    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
47913    * meters, kilometres, kilometers.
47914    * @returns {number} degrees
47915    */
47916   function lengthToDegrees(distance, units) {
47917       return radiansToDegrees(lengthToRadians(distance, units));
47918   }
47919   exports.lengthToDegrees = lengthToDegrees;
47920   /**
47921    * Converts any bearing angle from the north line direction (positive clockwise)
47922    * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
47923    *
47924    * @name bearingToAzimuth
47925    * @param {number} bearing angle, between -180 and +180 degrees
47926    * @returns {number} angle between 0 and 360 degrees
47927    */
47928   function bearingToAzimuth(bearing) {
47929       var angle = bearing % 360;
47930       if (angle < 0) {
47931           angle += 360;
47932       }
47933       return angle;
47934   }
47935   exports.bearingToAzimuth = bearingToAzimuth;
47936   /**
47937    * Converts an angle in radians to degrees
47938    *
47939    * @name radiansToDegrees
47940    * @param {number} radians angle in radians
47941    * @returns {number} degrees between 0 and 360 degrees
47942    */
47943   function radiansToDegrees(radians) {
47944       var degrees = radians % (2 * Math.PI);
47945       return degrees * 180 / Math.PI;
47946   }
47947   exports.radiansToDegrees = radiansToDegrees;
47948   /**
47949    * Converts an angle in degrees to radians
47950    *
47951    * @name degreesToRadians
47952    * @param {number} degrees angle between 0 and 360 degrees
47953    * @returns {number} angle in radians
47954    */
47955   function degreesToRadians(degrees) {
47956       var radians = degrees % 360;
47957       return radians * Math.PI / 180;
47958   }
47959   exports.degreesToRadians = degreesToRadians;
47960   /**
47961    * Converts a length to the requested unit.
47962    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
47963    *
47964    * @param {number} length to be converted
47965    * @param {Units} [originalUnit="kilometers"] of the length
47966    * @param {Units} [finalUnit="kilometers"] returned unit
47967    * @returns {number} the converted length
47968    */
47969   function convertLength(length, originalUnit, finalUnit) {
47970       if (originalUnit === void 0) { originalUnit = "kilometers"; }
47971       if (finalUnit === void 0) { finalUnit = "kilometers"; }
47972       if (!(length >= 0)) {
47973           throw new Error("length must be a positive number");
47974       }
47975       return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
47976   }
47977   exports.convertLength = convertLength;
47978   /**
47979    * Converts a area to the requested unit.
47980    * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
47981    * @param {number} area to be converted
47982    * @param {Units} [originalUnit="meters"] of the distance
47983    * @param {Units} [finalUnit="kilometers"] returned unit
47984    * @returns {number} the converted distance
47985    */
47986   function convertArea(area, originalUnit, finalUnit) {
47987       if (originalUnit === void 0) { originalUnit = "meters"; }
47988       if (finalUnit === void 0) { finalUnit = "kilometers"; }
47989       if (!(area >= 0)) {
47990           throw new Error("area must be a positive number");
47991       }
47992       var startFactor = exports.areaFactors[originalUnit];
47993       if (!startFactor) {
47994           throw new Error("invalid original units");
47995       }
47996       var finalFactor = exports.areaFactors[finalUnit];
47997       if (!finalFactor) {
47998           throw new Error("invalid final units");
47999       }
48000       return (area / startFactor) * finalFactor;
48001   }
48002   exports.convertArea = convertArea;
48003   /**
48004    * isNumber
48005    *
48006    * @param {*} num Number to validate
48007    * @returns {boolean} true/false
48008    * @example
48009    * turf.isNumber(123)
48010    * //=true
48011    * turf.isNumber('foo')
48012    * //=false
48013    */
48014   function isNumber(num) {
48015       return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
48016   }
48017   exports.isNumber = isNumber;
48018   /**
48019    * isObject
48020    *
48021    * @param {*} input variable to validate
48022    * @returns {boolean} true/false
48023    * @example
48024    * turf.isObject({elevation: 10})
48025    * //=true
48026    * turf.isObject('foo')
48027    * //=false
48028    */
48029   function isObject(input) {
48030       return (!!input) && (input.constructor === Object);
48031   }
48032   exports.isObject = isObject;
48033   /**
48034    * Validate BBox
48035    *
48036    * @private
48037    * @param {Array<number>} bbox BBox to validate
48038    * @returns {void}
48039    * @throws Error if BBox is not valid
48040    * @example
48041    * validateBBox([-180, -40, 110, 50])
48042    * //=OK
48043    * validateBBox([-180, -40])
48044    * //=Error
48045    * validateBBox('Foo')
48046    * //=Error
48047    * validateBBox(5)
48048    * //=Error
48049    * validateBBox(null)
48050    * //=Error
48051    * validateBBox(undefined)
48052    * //=Error
48053    */
48054   function validateBBox(bbox) {
48055       if (!bbox) {
48056           throw new Error("bbox is required");
48057       }
48058       if (!Array.isArray(bbox)) {
48059           throw new Error("bbox must be an Array");
48060       }
48061       if (bbox.length !== 4 && bbox.length !== 6) {
48062           throw new Error("bbox must be an Array of 4 or 6 numbers");
48063       }
48064       bbox.forEach(function (num) {
48065           if (!isNumber(num)) {
48066               throw new Error("bbox must only contain numbers");
48067           }
48068       });
48069   }
48070   exports.validateBBox = validateBBox;
48071   /**
48072    * Validate Id
48073    *
48074    * @private
48075    * @param {string|number} id Id to validate
48076    * @returns {void}
48077    * @throws Error if Id is not valid
48078    * @example
48079    * validateId([-180, -40, 110, 50])
48080    * //=Error
48081    * validateId([-180, -40])
48082    * //=Error
48083    * validateId('Foo')
48084    * //=OK
48085    * validateId(5)
48086    * //=OK
48087    * validateId(null)
48088    * //=Error
48089    * validateId(undefined)
48090    * //=Error
48091    */
48092   function validateId(id) {
48093       if (!id) {
48094           throw new Error("id is required");
48095       }
48096       if (["string", "number"].indexOf(typeof id) === -1) {
48097           throw new Error("id must be a number or a string");
48098       }
48099   }
48100   exports.validateId = validateId;
48101   // Deprecated methods
48102   function radians2degrees() {
48103       throw new Error("method has been renamed to `radiansToDegrees`");
48104   }
48105   exports.radians2degrees = radians2degrees;
48106   function degrees2radians() {
48107       throw new Error("method has been renamed to `degreesToRadians`");
48108   }
48109   exports.degrees2radians = degrees2radians;
48110   function distanceToDegrees() {
48111       throw new Error("method has been renamed to `lengthToDegrees`");
48112   }
48113   exports.distanceToDegrees = distanceToDegrees;
48114   function distanceToRadians() {
48115       throw new Error("method has been renamed to `lengthToRadians`");
48116   }
48117   exports.distanceToRadians = distanceToRadians;
48118   function radiansToDistance() {
48119       throw new Error("method has been renamed to `radiansToLength`");
48120   }
48121   exports.radiansToDistance = radiansToDistance;
48122   function bearingToAngle() {
48123       throw new Error("method has been renamed to `bearingToAzimuth`");
48124   }
48125   exports.bearingToAngle = bearingToAngle;
48126   function convertDistance() {
48127       throw new Error("method has been renamed to `convertLength`");
48128   }
48129   exports.convertDistance = convertDistance;
48130   });
48131
48132   var index$4 = unwrapExports(helpers);
48133   var helpers_1 = helpers.earthRadius;
48134   var helpers_2 = helpers.factors;
48135   var helpers_3 = helpers.unitsFactors;
48136   var helpers_4 = helpers.areaFactors;
48137   var helpers_5 = helpers.feature;
48138   var helpers_6 = helpers.geometry;
48139   var helpers_7 = helpers.point;
48140   var helpers_8 = helpers.points;
48141   var helpers_9 = helpers.polygon;
48142   var helpers_10 = helpers.polygons;
48143   var helpers_11 = helpers.lineString;
48144   var helpers_12 = helpers.lineStrings;
48145   var helpers_13 = helpers.featureCollection;
48146   var helpers_14 = helpers.multiLineString;
48147   var helpers_15 = helpers.multiPoint;
48148   var helpers_16 = helpers.multiPolygon;
48149   var helpers_17 = helpers.geometryCollection;
48150   var helpers_18 = helpers.round;
48151   var helpers_19 = helpers.radiansToLength;
48152   var helpers_20 = helpers.lengthToRadians;
48153   var helpers_21 = helpers.lengthToDegrees;
48154   var helpers_22 = helpers.bearingToAzimuth;
48155   var helpers_23 = helpers.radiansToDegrees;
48156   var helpers_24 = helpers.degreesToRadians;
48157   var helpers_25 = helpers.convertLength;
48158   var helpers_26 = helpers.convertArea;
48159   var helpers_27 = helpers.isNumber;
48160   var helpers_28 = helpers.isObject;
48161   var helpers_29 = helpers.validateBBox;
48162   var helpers_30 = helpers.validateId;
48163   var helpers_31 = helpers.radians2degrees;
48164   var helpers_32 = helpers.degrees2radians;
48165   var helpers_33 = helpers.distanceToDegrees;
48166   var helpers_34 = helpers.distanceToRadians;
48167   var helpers_35 = helpers.radiansToDistance;
48168   var helpers_36 = helpers.bearingToAngle;
48169   var helpers_37 = helpers.convertDistance;
48170
48171   var helpers$1 = /*#__PURE__*/Object.freeze({
48172     default: index$4,
48173     __moduleExports: helpers,
48174     earthRadius: helpers_1,
48175     factors: helpers_2,
48176     unitsFactors: helpers_3,
48177     areaFactors: helpers_4,
48178     feature: helpers_5,
48179     geometry: helpers_6,
48180     point: helpers_7,
48181     points: helpers_8,
48182     polygon: helpers_9,
48183     polygons: helpers_10,
48184     lineString: helpers_11,
48185     lineStrings: helpers_12,
48186     featureCollection: helpers_13,
48187     multiLineString: helpers_14,
48188     multiPoint: helpers_15,
48189     multiPolygon: helpers_16,
48190     geometryCollection: helpers_17,
48191     round: helpers_18,
48192     radiansToLength: helpers_19,
48193     lengthToRadians: helpers_20,
48194     lengthToDegrees: helpers_21,
48195     bearingToAzimuth: helpers_22,
48196     radiansToDegrees: helpers_23,
48197     degreesToRadians: helpers_24,
48198     convertLength: helpers_25,
48199     convertArea: helpers_26,
48200     isNumber: helpers_27,
48201     isObject: helpers_28,
48202     validateBBox: helpers_29,
48203     validateId: helpers_30,
48204     radians2degrees: helpers_31,
48205     degrees2radians: helpers_32,
48206     distanceToDegrees: helpers_33,
48207     distanceToRadians: helpers_34,
48208     radiansToDistance: helpers_35,
48209     bearingToAngle: helpers_36,
48210     convertDistance: helpers_37
48211   });
48212
48213   var helpers_1$1 = ( helpers$1 && index$4 ) || helpers$1;
48214
48215   var invariant = createCommonjsModule(function (module, exports) {
48216   Object.defineProperty(exports, "__esModule", { value: true });
48217
48218   /**
48219    * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
48220    *
48221    * @name getCoord
48222    * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
48223    * @returns {Array<number>} coordinates
48224    * @example
48225    * var pt = turf.point([10, 10]);
48226    *
48227    * var coord = turf.getCoord(pt);
48228    * //= [10, 10]
48229    */
48230   function getCoord(coord) {
48231       if (!coord) {
48232           throw new Error("coord is required");
48233       }
48234       if (!Array.isArray(coord)) {
48235           if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
48236               return coord.geometry.coordinates;
48237           }
48238           if (coord.type === "Point") {
48239               return coord.coordinates;
48240           }
48241       }
48242       if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
48243           return coord;
48244       }
48245       throw new Error("coord must be GeoJSON Point or an Array of numbers");
48246   }
48247   exports.getCoord = getCoord;
48248   /**
48249    * Unwrap coordinates from a Feature, Geometry Object or an Array
48250    *
48251    * @name getCoords
48252    * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
48253    * @returns {Array<any>} coordinates
48254    * @example
48255    * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
48256    *
48257    * var coords = turf.getCoords(poly);
48258    * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
48259    */
48260   function getCoords(coords) {
48261       if (Array.isArray(coords)) {
48262           return coords;
48263       }
48264       // Feature
48265       if (coords.type === "Feature") {
48266           if (coords.geometry !== null) {
48267               return coords.geometry.coordinates;
48268           }
48269       }
48270       else {
48271           // Geometry
48272           if (coords.coordinates) {
48273               return coords.coordinates;
48274           }
48275       }
48276       throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
48277   }
48278   exports.getCoords = getCoords;
48279   /**
48280    * Checks if coordinates contains a number
48281    *
48282    * @name containsNumber
48283    * @param {Array<any>} coordinates GeoJSON Coordinates
48284    * @returns {boolean} true if Array contains a number
48285    */
48286   function containsNumber(coordinates) {
48287       if (coordinates.length > 1 && helpers_1$1.isNumber(coordinates[0]) && helpers_1$1.isNumber(coordinates[1])) {
48288           return true;
48289       }
48290       if (Array.isArray(coordinates[0]) && coordinates[0].length) {
48291           return containsNumber(coordinates[0]);
48292       }
48293       throw new Error("coordinates must only contain numbers");
48294   }
48295   exports.containsNumber = containsNumber;
48296   /**
48297    * Enforce expectations about types of GeoJSON objects for Turf.
48298    *
48299    * @name geojsonType
48300    * @param {GeoJSON} value any GeoJSON object
48301    * @param {string} type expected GeoJSON type
48302    * @param {string} name name of calling function
48303    * @throws {Error} if value is not the expected type.
48304    */
48305   function geojsonType(value, type, name) {
48306       if (!type || !name) {
48307           throw new Error("type and name required");
48308       }
48309       if (!value || value.type !== type) {
48310           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
48311       }
48312   }
48313   exports.geojsonType = geojsonType;
48314   /**
48315    * Enforce expectations about types of {@link Feature} inputs for Turf.
48316    * Internally this uses {@link geojsonType} to judge geometry types.
48317    *
48318    * @name featureOf
48319    * @param {Feature} feature a feature with an expected geometry type
48320    * @param {string} type expected GeoJSON type
48321    * @param {string} name name of calling function
48322    * @throws {Error} error if value is not the expected type.
48323    */
48324   function featureOf(feature, type, name) {
48325       if (!feature) {
48326           throw new Error("No feature passed");
48327       }
48328       if (!name) {
48329           throw new Error(".featureOf() requires a name");
48330       }
48331       if (!feature || feature.type !== "Feature" || !feature.geometry) {
48332           throw new Error("Invalid input to " + name + ", Feature with geometry required");
48333       }
48334       if (!feature.geometry || feature.geometry.type !== type) {
48335           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
48336       }
48337   }
48338   exports.featureOf = featureOf;
48339   /**
48340    * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
48341    * Internally this uses {@link geojsonType} to judge geometry types.
48342    *
48343    * @name collectionOf
48344    * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
48345    * @param {string} type expected GeoJSON type
48346    * @param {string} name name of calling function
48347    * @throws {Error} if value is not the expected type.
48348    */
48349   function collectionOf(featureCollection, type, name) {
48350       if (!featureCollection) {
48351           throw new Error("No featureCollection passed");
48352       }
48353       if (!name) {
48354           throw new Error(".collectionOf() requires a name");
48355       }
48356       if (!featureCollection || featureCollection.type !== "FeatureCollection") {
48357           throw new Error("Invalid input to " + name + ", FeatureCollection required");
48358       }
48359       for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
48360           var feature = _a[_i];
48361           if (!feature || feature.type !== "Feature" || !feature.geometry) {
48362               throw new Error("Invalid input to " + name + ", Feature with geometry required");
48363           }
48364           if (!feature.geometry || feature.geometry.type !== type) {
48365               throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
48366           }
48367       }
48368   }
48369   exports.collectionOf = collectionOf;
48370   /**
48371    * Get Geometry from Feature or Geometry Object
48372    *
48373    * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
48374    * @returns {Geometry|null} GeoJSON Geometry Object
48375    * @throws {Error} if geojson is not a Feature or Geometry Object
48376    * @example
48377    * var point = {
48378    *   "type": "Feature",
48379    *   "properties": {},
48380    *   "geometry": {
48381    *     "type": "Point",
48382    *     "coordinates": [110, 40]
48383    *   }
48384    * }
48385    * var geom = turf.getGeom(point)
48386    * //={"type": "Point", "coordinates": [110, 40]}
48387    */
48388   function getGeom(geojson) {
48389       if (geojson.type === "Feature") {
48390           return geojson.geometry;
48391       }
48392       return geojson;
48393   }
48394   exports.getGeom = getGeom;
48395   /**
48396    * Get GeoJSON object's type, Geometry type is prioritize.
48397    *
48398    * @param {GeoJSON} geojson GeoJSON object
48399    * @param {string} [name="geojson"] name of the variable to display in error message
48400    * @returns {string} GeoJSON type
48401    * @example
48402    * var point = {
48403    *   "type": "Feature",
48404    *   "properties": {},
48405    *   "geometry": {
48406    *     "type": "Point",
48407    *     "coordinates": [110, 40]
48408    *   }
48409    * }
48410    * var geom = turf.getType(point)
48411    * //="Point"
48412    */
48413   function getType(geojson, name) {
48414       if (geojson.type === "FeatureCollection") {
48415           return "FeatureCollection";
48416       }
48417       if (geojson.type === "GeometryCollection") {
48418           return "GeometryCollection";
48419       }
48420       if (geojson.type === "Feature" && geojson.geometry !== null) {
48421           return geojson.geometry.type;
48422       }
48423       return geojson.type;
48424   }
48425   exports.getType = getType;
48426   });
48427
48428   var index$5 = unwrapExports(invariant);
48429   var invariant_1 = invariant.getCoord;
48430   var invariant_2 = invariant.getCoords;
48431   var invariant_3 = invariant.containsNumber;
48432   var invariant_4 = invariant.geojsonType;
48433   var invariant_5 = invariant.featureOf;
48434   var invariant_6 = invariant.collectionOf;
48435   var invariant_7 = invariant.getGeom;
48436   var invariant_8 = invariant.getType;
48437
48438   var invariant$1 = /*#__PURE__*/Object.freeze({
48439     default: index$5,
48440     __moduleExports: invariant,
48441     getCoord: invariant_1,
48442     getCoords: invariant_2,
48443     containsNumber: invariant_3,
48444     geojsonType: invariant_4,
48445     featureOf: invariant_5,
48446     collectionOf: invariant_6,
48447     getGeom: invariant_7,
48448     getType: invariant_8
48449   });
48450
48451   var lineclip_1$1 = lineclip$3;
48452   var default_1$2 = lineclip$3;
48453
48454   lineclip$3.polyline = lineclip$3;
48455   lineclip$3.polygon = polygonclip$1;
48456
48457
48458   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
48459   // handle polylines rather than just segments
48460
48461   function lineclip$3(points, bbox, result) {
48462
48463       var len = points.length,
48464           codeA = bitCode$1(points[0], bbox),
48465           part = [],
48466           i, a, b, codeB, lastCode;
48467
48468       if (!result) result = [];
48469
48470       for (i = 1; i < len; i++) {
48471           a = points[i - 1];
48472           b = points[i];
48473           codeB = lastCode = bitCode$1(b, bbox);
48474
48475           while (true) {
48476
48477               if (!(codeA | codeB)) { // accept
48478                   part.push(a);
48479
48480                   if (codeB !== lastCode) { // segment went outside
48481                       part.push(b);
48482
48483                       if (i < len - 1) { // start a new line
48484                           result.push(part);
48485                           part = [];
48486                       }
48487                   } else if (i === len - 1) {
48488                       part.push(b);
48489                   }
48490                   break;
48491
48492               } else if (codeA & codeB) { // trivial reject
48493                   break;
48494
48495               } else if (codeA) { // a outside, intersect with clip edge
48496                   a = intersect$2(a, b, codeA, bbox);
48497                   codeA = bitCode$1(a, bbox);
48498
48499               } else { // b outside
48500                   b = intersect$2(a, b, codeB, bbox);
48501                   codeB = bitCode$1(b, bbox);
48502               }
48503           }
48504
48505           codeA = lastCode;
48506       }
48507
48508       if (part.length) result.push(part);
48509
48510       return result;
48511   }
48512
48513   // Sutherland-Hodgeman polygon clipping algorithm
48514
48515   function polygonclip$1(points, bbox) {
48516
48517       var result, edge, prev, prevInside, i, p, inside;
48518
48519       // clip against each side of the clip rectangle
48520       for (edge = 1; edge <= 8; edge *= 2) {
48521           result = [];
48522           prev = points[points.length - 1];
48523           prevInside = !(bitCode$1(prev, bbox) & edge);
48524
48525           for (i = 0; i < points.length; i++) {
48526               p = points[i];
48527               inside = !(bitCode$1(p, bbox) & edge);
48528
48529               // if segment goes through the clip window, add an intersection
48530               if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
48531
48532               if (inside) result.push(p); // add a point if it's inside
48533
48534               prev = p;
48535               prevInside = inside;
48536           }
48537
48538           points = result;
48539
48540           if (!points.length) break;
48541       }
48542
48543       return result;
48544   }
48545
48546   // intersect a segment against one of the 4 lines that make up the bbox
48547
48548   function intersect$2(a, b, edge, bbox) {
48549       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
48550              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
48551              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
48552              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
48553              null;
48554   }
48555
48556   // bit code reflects the point position relative to the bbox:
48557
48558   //         left  mid  right
48559   //    top  1001  1000  1010
48560   //    mid  0001  0000  0010
48561   // bottom  0101  0100  0110
48562
48563   function bitCode$1(p, bbox) {
48564       var code = 0;
48565
48566       if (p[0] < bbox[0]) code |= 1; // left
48567       else if (p[0] > bbox[2]) code |= 2; // right
48568
48569       if (p[1] < bbox[1]) code |= 4; // bottom
48570       else if (p[1] > bbox[3]) code |= 8; // top
48571
48572       return code;
48573   }
48574   lineclip_1$1.default = default_1$2;
48575
48576   var invariant_1$1 = ( invariant$1 && index$5 ) || invariant$1;
48577
48578   var bboxClip_1 = createCommonjsModule(function (module, exports) {
48579   var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
48580       if (mod && mod.__esModule) return mod;
48581       var result = {};
48582       if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
48583       result["default"] = mod;
48584       return result;
48585   };
48586   Object.defineProperty(exports, "__esModule", { value: true });
48587
48588
48589   var lineclip = __importStar(lineclip_1$1);
48590   /**
48591    * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
48592    * [lineclip](https://github.com/mapbox/lineclip).
48593    * May result in degenerate edges when clipping Polygons.
48594    *
48595    * @name bboxClip
48596    * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
48597    * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
48598    * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
48599    * @example
48600    * var bbox = [0, 0, 10, 10];
48601    * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
48602    *
48603    * var clipped = turf.bboxClip(poly, bbox);
48604    *
48605    * //addToMap
48606    * var addToMap = [bbox, poly, clipped]
48607    */
48608   function bboxClip(feature, bbox) {
48609       var geom = invariant_1$1.getGeom(feature);
48610       var type = geom.type;
48611       var properties = feature.type === "Feature" ? feature.properties : {};
48612       var coords = geom.coordinates;
48613       switch (type) {
48614           case "LineString":
48615           case "MultiLineString":
48616               var lines_1 = [];
48617               if (type === "LineString") {
48618                   coords = [coords];
48619               }
48620               coords.forEach(function (line) {
48621                   lineclip.polyline(line, bbox, lines_1);
48622               });
48623               if (lines_1.length === 1) {
48624                   return helpers_1$1.lineString(lines_1[0], properties);
48625               }
48626               return helpers_1$1.multiLineString(lines_1, properties);
48627           case "Polygon":
48628               return helpers_1$1.polygon(clipPolygon(coords, bbox), properties);
48629           case "MultiPolygon":
48630               return helpers_1$1.multiPolygon(coords.map(function (poly) {
48631                   return clipPolygon(poly, bbox);
48632               }), properties);
48633           default:
48634               throw new Error("geometry " + type + " not supported");
48635       }
48636   }
48637   exports.default = bboxClip;
48638   function clipPolygon(rings, bbox) {
48639       var outRings = [];
48640       for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
48641           var ring = rings_1[_i];
48642           var clipped = lineclip.polygon(ring, bbox);
48643           if (clipped.length > 0) {
48644               if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
48645                   clipped.push(clipped[0]);
48646               }
48647               if (clipped.length >= 4) {
48648                   outRings.push(clipped);
48649               }
48650           }
48651       }
48652       return outRings;
48653   }
48654   });
48655
48656   var turf_bboxClip = unwrapExports(bboxClip_1);
48657
48658   var martinez_umd = createCommonjsModule(function (module, exports) {
48659   /**
48660    * martinez v0.5.0
48661    * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
48662    *
48663    * @author Alex Milevski <info@w8r.name>
48664    * @license MIT
48665    * @preserve
48666    */
48667
48668   (function (global, factory) {
48669     factory(exports);
48670   }(commonjsGlobal, (function (exports) {
48671     function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
48672
48673     var SplayTree = function SplayTree(compare, noDuplicates) {
48674       if ( compare === void 0 ) compare = DEFAULT_COMPARE;
48675       if ( noDuplicates === void 0 ) noDuplicates = false;
48676
48677       this._compare = compare;
48678       this._root = null;
48679       this._size = 0;
48680       this._noDuplicates = !!noDuplicates;
48681     };
48682
48683     var prototypeAccessors = { size: { configurable: true } };
48684
48685
48686     SplayTree.prototype.rotateLeft = function rotateLeft (x) {
48687       var y = x.right;
48688       if (y) {
48689         x.right = y.left;
48690         if (y.left) { y.left.parent = x; }
48691         y.parent = x.parent;
48692       }
48693
48694       if (!x.parent)              { this._root = y; }
48695       else if (x === x.parent.left) { x.parent.left = y; }
48696       else                        { x.parent.right = y; }
48697       if (y) { y.left = x; }
48698       x.parent = y;
48699     };
48700
48701
48702     SplayTree.prototype.rotateRight = function rotateRight (x) {
48703       var y = x.left;
48704       if (y) {
48705         x.left = y.right;
48706         if (y.right) { y.right.parent = x; }
48707         y.parent = x.parent;
48708       }
48709
48710       if (!x.parent)             { this._root = y; }
48711       else if(x === x.parent.left) { x.parent.left = y; }
48712       else                       { x.parent.right = y; }
48713       if (y) { y.right = x; }
48714       x.parent = y;
48715     };
48716
48717
48718     SplayTree.prototype._splay = function _splay (x) {
48719         var this$1 = this;
48720
48721       while (x.parent) {
48722         var p = x.parent;
48723         if (!p.parent) {
48724           if (p.left === x) { this$1.rotateRight(p); }
48725           else            { this$1.rotateLeft(p); }
48726         } else if (p.left === x && p.parent.left === p) {
48727           this$1.rotateRight(p.parent);
48728           this$1.rotateRight(p);
48729         } else if (p.right === x && p.parent.right === p) {
48730           this$1.rotateLeft(p.parent);
48731           this$1.rotateLeft(p);
48732         } else if (p.left === x && p.parent.right === p) {
48733           this$1.rotateRight(p);
48734           this$1.rotateLeft(p);
48735         } else {
48736           this$1.rotateLeft(p);
48737           this$1.rotateRight(p);
48738         }
48739       }
48740     };
48741
48742
48743     SplayTree.prototype.splay = function splay (x) {
48744         var this$1 = this;
48745
48746       var p, gp, ggp, l, r;
48747
48748       while (x.parent) {
48749         p = x.parent;
48750         gp = p.parent;
48751
48752         if (gp && gp.parent) {
48753           ggp = gp.parent;
48754           if (ggp.left === gp) { ggp.left= x; }
48755           else               { ggp.right = x; }
48756           x.parent = ggp;
48757         } else {
48758           x.parent = null;
48759           this$1._root = x;
48760         }
48761
48762         l = x.left; r = x.right;
48763
48764         if (x === p.left) { // left
48765           if (gp) {
48766             if (gp.left === p) {
48767               /* zig-zig */
48768               if (p.right) {
48769                 gp.left = p.right;
48770                 gp.left.parent = gp;
48771               } else { gp.left = null; }
48772
48773               p.right = gp;
48774               gp.parent = p;
48775             } else {
48776               /* zig-zag */
48777               if (l) {
48778                 gp.right = l;
48779                 l.parent = gp;
48780               } else { gp.right = null; }
48781
48782               x.left  = gp;
48783               gp.parent = x;
48784             }
48785           }
48786           if (r) {
48787             p.left = r;
48788             r.parent = p;
48789           } else { p.left = null; }
48790
48791           x.right= p;
48792           p.parent = x;
48793         } else { // right
48794           if (gp) {
48795             if (gp.right === p) {
48796               /* zig-zig */
48797               if (p.left) {
48798                 gp.right = p.left;
48799                 gp.right.parent = gp;
48800               } else { gp.right = null; }
48801
48802               p.left = gp;
48803               gp.parent = p;
48804             } else {
48805               /* zig-zag */
48806               if (r) {
48807                 gp.left = r;
48808                 r.parent = gp;
48809               } else { gp.left = null; }
48810
48811               x.right = gp;
48812               gp.parent = x;
48813             }
48814           }
48815           if (l) {
48816             p.right = l;
48817             l.parent = p;
48818           } else { p.right = null; }
48819
48820           x.left = p;
48821           p.parent = x;
48822         }
48823       }
48824     };
48825
48826
48827     SplayTree.prototype.replace = function replace (u, v) {
48828       if (!u.parent) { this._root = v; }
48829       else if (u === u.parent.left) { u.parent.left = v; }
48830       else { u.parent.right = v; }
48831       if (v) { v.parent = u.parent; }
48832     };
48833
48834
48835     SplayTree.prototype.minNode = function minNode (u) {
48836         if ( u === void 0 ) u = this._root;
48837
48838       if (u) { while (u.left) { u = u.left; } }
48839       return u;
48840     };
48841
48842
48843     SplayTree.prototype.maxNode = function maxNode (u) {
48844         if ( u === void 0 ) u = this._root;
48845
48846       if (u) { while (u.right) { u = u.right; } }
48847       return u;
48848     };
48849
48850
48851     SplayTree.prototype.insert = function insert (key, data) {
48852       var z = this._root;
48853       var p = null;
48854       var comp = this._compare;
48855       var cmp;
48856
48857       if (this._noDuplicates) {
48858         while (z) {
48859           p = z;
48860           cmp = comp(z.key, key);
48861           if (cmp === 0) { return; }
48862           else if (comp(z.key, key) < 0) { z = z.right; }
48863           else { z = z.left; }
48864         }
48865       } else {
48866         while (z) {
48867           p = z;
48868           if (comp(z.key, key) < 0) { z = z.right; }
48869           else { z = z.left; }
48870         }
48871       }
48872
48873       z = { key: key, data: data, left: null, right: null, parent: p };
48874
48875       if (!p)                        { this._root = z; }
48876       else if (comp(p.key, z.key) < 0) { p.right = z; }
48877       else                           { p.left= z; }
48878
48879       this.splay(z);
48880       this._size++;
48881       return z;
48882     };
48883
48884
48885     SplayTree.prototype.find = function find (key) {
48886       var z  = this._root;
48887       var comp = this._compare;
48888       while (z) {
48889         var cmp = comp(z.key, key);
48890         if    (cmp < 0) { z = z.right; }
48891         else if (cmp > 0) { z = z.left; }
48892         else            { return z; }
48893       }
48894       return null;
48895     };
48896
48897     /**
48898      * Whether the tree contains a node with the given key
48899      * @param{Key} key
48900      * @return {boolean} true/false
48901      */
48902     SplayTree.prototype.contains = function contains (key) {
48903       var node     = this._root;
48904       var comparator = this._compare;
48905       while (node){
48906         var cmp = comparator(key, node.key);
48907         if    (cmp === 0) { return true; }
48908         else if (cmp < 0) { node = node.left; }
48909         else              { node = node.right; }
48910       }
48911
48912       return false;
48913     };
48914
48915
48916     SplayTree.prototype.remove = function remove (key) {
48917       var z = this.find(key);
48918
48919       if (!z) { return false; }
48920
48921       this.splay(z);
48922
48923       if (!z.left) { this.replace(z, z.right); }
48924       else if (!z.right) { this.replace(z, z.left); }
48925       else {
48926         var y = this.minNode(z.right);
48927         if (y.parent !== z) {
48928           this.replace(y, y.right);
48929           y.right = z.right;
48930           y.right.parent = y;
48931         }
48932         this.replace(z, y);
48933         y.left = z.left;
48934         y.left.parent = y;
48935       }
48936
48937       this._size--;
48938       return true;
48939     };
48940
48941
48942     SplayTree.prototype.removeNode = function removeNode (z) {
48943       if (!z) { return false; }
48944
48945       this.splay(z);
48946
48947       if (!z.left) { this.replace(z, z.right); }
48948       else if (!z.right) { this.replace(z, z.left); }
48949       else {
48950         var y = this.minNode(z.right);
48951         if (y.parent !== z) {
48952           this.replace(y, y.right);
48953           y.right = z.right;
48954           y.right.parent = y;
48955         }
48956         this.replace(z, y);
48957         y.left = z.left;
48958         y.left.parent = y;
48959       }
48960
48961       this._size--;
48962       return true;
48963     };
48964
48965
48966     SplayTree.prototype.erase = function erase (key) {
48967       var z = this.find(key);
48968       if (!z) { return; }
48969
48970       this.splay(z);
48971
48972       var s = z.left;
48973       var t = z.right;
48974
48975       var sMax = null;
48976       if (s) {
48977         s.parent = null;
48978         sMax = this.maxNode(s);
48979         this.splay(sMax);
48980         this._root = sMax;
48981       }
48982       if (t) {
48983         if (s) { sMax.right = t; }
48984         else { this._root = t; }
48985         t.parent = sMax;
48986       }
48987
48988       this._size--;
48989     };
48990
48991     /**
48992      * Removes and returns the node with smallest key
48993      * @return {?Node}
48994      */
48995     SplayTree.prototype.pop = function pop () {
48996       var node = this._root, returnValue = null;
48997       if (node) {
48998         while (node.left) { node = node.left; }
48999         returnValue = { key: node.key, data: node.data };
49000         this.remove(node.key);
49001       }
49002       return returnValue;
49003     };
49004
49005
49006     /* eslint-disable class-methods-use-this */
49007
49008     /**
49009      * Successor node
49010      * @param{Node} node
49011      * @return {?Node}
49012      */
49013     SplayTree.prototype.next = function next (node) {
49014       var successor = node;
49015       if (successor) {
49016         if (successor.right) {
49017           successor = successor.right;
49018           while (successor && successor.left) { successor = successor.left; }
49019         } else {
49020           successor = node.parent;
49021           while (successor && successor.right === node) {
49022             node = successor; successor = successor.parent;
49023           }
49024         }
49025       }
49026       return successor;
49027     };
49028
49029
49030     /**
49031      * Predecessor node
49032      * @param{Node} node
49033      * @return {?Node}
49034      */
49035     SplayTree.prototype.prev = function prev (node) {
49036       var predecessor = node;
49037       if (predecessor) {
49038         if (predecessor.left) {
49039           predecessor = predecessor.left;
49040           while (predecessor && predecessor.right) { predecessor = predecessor.right; }
49041         } else {
49042           predecessor = node.parent;
49043           while (predecessor && predecessor.left === node) {
49044             node = predecessor;
49045             predecessor = predecessor.parent;
49046           }
49047         }
49048       }
49049       return predecessor;
49050     };
49051     /* eslint-enable class-methods-use-this */
49052
49053
49054     /**
49055      * @param{forEachCallback} callback
49056      * @return {SplayTree}
49057      */
49058     SplayTree.prototype.forEach = function forEach (callback) {
49059       var current = this._root;
49060       var s = [], done = false, i = 0;
49061
49062       while (!done) {
49063         // Reach the left most Node of the current Node
49064         if (current) {
49065           // Place pointer to a tree node on the stack
49066           // before traversing the node's left subtree
49067           s.push(current);
49068           current = current.left;
49069         } else {
49070           // BackTrack from the empty subtree and visit the Node
49071           // at the top of the stack; however, if the stack is
49072           // empty you are done
49073           if (s.length > 0) {
49074             current = s.pop();
49075             callback(current, i++);
49076
49077             // We have visited the node and its left
49078             // subtree. Now, it's right subtree's turn
49079             current = current.right;
49080           } else { done = true; }
49081         }
49082       }
49083       return this;
49084     };
49085
49086
49087     /**
49088      * Walk key range from `low` to `high`. Stops if `fn` returns a value.
49089      * @param{Key}    low
49090      * @param{Key}    high
49091      * @param{Function} fn
49092      * @param{*?}     ctx
49093      * @return {SplayTree}
49094      */
49095     SplayTree.prototype.range = function range (low, high, fn, ctx) {
49096         var this$1 = this;
49097
49098       var Q = [];
49099       var compare = this._compare;
49100       var node = this._root, cmp;
49101
49102       while (Q.length !== 0 || node) {
49103         if (node) {
49104           Q.push(node);
49105           node = node.left;
49106         } else {
49107           node = Q.pop();
49108           cmp = compare(node.key, high);
49109           if (cmp > 0) {
49110             break;
49111           } else if (compare(node.key, low) >= 0) {
49112             if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
49113           }
49114           node = node.right;
49115         }
49116       }
49117       return this;
49118     };
49119
49120     /**
49121      * Returns all keys in order
49122      * @return {Array<Key>}
49123      */
49124     SplayTree.prototype.keys = function keys () {
49125       var current = this._root;
49126       var s = [], r = [], done = false;
49127
49128       while (!done) {
49129         if (current) {
49130           s.push(current);
49131           current = current.left;
49132         } else {
49133           if (s.length > 0) {
49134             current = s.pop();
49135             r.push(current.key);
49136             current = current.right;
49137           } else { done = true; }
49138         }
49139       }
49140       return r;
49141     };
49142
49143
49144     /**
49145      * Returns `data` fields of all nodes in order.
49146      * @return {Array<Value>}
49147      */
49148     SplayTree.prototype.values = function values () {
49149       var current = this._root;
49150       var s = [], r = [], done = false;
49151
49152       while (!done) {
49153         if (current) {
49154           s.push(current);
49155           current = current.left;
49156         } else {
49157           if (s.length > 0) {
49158             current = s.pop();
49159             r.push(current.data);
49160             current = current.right;
49161           } else { done = true; }
49162         }
49163       }
49164       return r;
49165     };
49166
49167
49168     /**
49169      * Returns node at given index
49170      * @param{number} index
49171      * @return {?Node}
49172      */
49173     SplayTree.prototype.at = function at (index) {
49174       // removed after a consideration, more misleading than useful
49175       // index = index % this.size;
49176       // if (index < 0) index = this.size - index;
49177
49178       var current = this._root;
49179       var s = [], done = false, i = 0;
49180
49181       while (!done) {
49182         if (current) {
49183           s.push(current);
49184           current = current.left;
49185         } else {
49186           if (s.length > 0) {
49187             current = s.pop();
49188             if (i === index) { return current; }
49189             i++;
49190             current = current.right;
49191           } else { done = true; }
49192         }
49193       }
49194       return null;
49195     };
49196
49197     /**
49198      * Bulk-load items. Both array have to be same size
49199      * @param{Array<Key>}  keys
49200      * @param{Array<Value>}[values]
49201      * @param{Boolean}     [presort=false] Pre-sort keys and values, using
49202      *                                       tree's comparator. Sorting is done
49203      *                                       in-place
49204      * @return {AVLTree}
49205      */
49206     SplayTree.prototype.load = function load (keys, values, presort) {
49207         if ( keys === void 0 ) keys = [];
49208         if ( values === void 0 ) values = [];
49209         if ( presort === void 0 ) presort = false;
49210
49211       if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
49212       var size = keys.length;
49213       if (presort) { sort(keys, values, 0, size - 1, this._compare); }
49214       this._root = loadRecursive(null, keys, values, 0, size);
49215       this._size = size;
49216       return this;
49217     };
49218
49219
49220     SplayTree.prototype.min = function min () {
49221       var node = this.minNode(this._root);
49222       if (node) { return node.key; }
49223       else    { return null; }
49224     };
49225
49226
49227     SplayTree.prototype.max = function max () {
49228       var node = this.maxNode(this._root);
49229       if (node) { return node.key; }
49230       else    { return null; }
49231     };
49232
49233     SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
49234     prototypeAccessors.size.get = function () { return this._size; };
49235
49236
49237     /**
49238      * Create a tree and load it with items
49239      * @param{Array<Key>}        keys
49240      * @param{Array<Value>?}      [values]
49241
49242      * @param{Function?}          [comparator]
49243      * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
49244      *                                             tree's comparator. Sorting is done
49245      *                                             in-place
49246      * @param{Boolean?}           [noDuplicates=false] Allow duplicates
49247      * @return {SplayTree}
49248      */
49249     SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
49250       return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
49251     };
49252
49253     Object.defineProperties( SplayTree.prototype, prototypeAccessors );
49254
49255
49256     function loadRecursive (parent, keys, values, start, end) {
49257       var size = end - start;
49258       if (size > 0) {
49259         var middle = start + Math.floor(size / 2);
49260         var key    = keys[middle];
49261         var data   = values[middle];
49262         var node   = { key: key, data: data, parent: parent };
49263         node.left    = loadRecursive(node, keys, values, start, middle);
49264         node.right   = loadRecursive(node, keys, values, middle + 1, end);
49265         return node;
49266       }
49267       return null;
49268     }
49269
49270
49271     function sort(keys, values, left, right, compare) {
49272       if (left >= right) { return; }
49273
49274       var pivot = keys[(left + right) >> 1];
49275       var i = left - 1;
49276       var j = right + 1;
49277
49278       while (true) {
49279         do { i++; } while (compare(keys[i], pivot) < 0);
49280         do { j--; } while (compare(keys[j], pivot) > 0);
49281         if (i >= j) { break; }
49282
49283         var tmp = keys[i];
49284         keys[i] = keys[j];
49285         keys[j] = tmp;
49286
49287         tmp = values[i];
49288         values[i] = values[j];
49289         values[j] = tmp;
49290       }
49291
49292       sort(keys, values,  left,     j, compare);
49293       sort(keys, values, j + 1, right, compare);
49294     }
49295
49296     var NORMAL               = 0;
49297     var NON_CONTRIBUTING     = 1;
49298     var SAME_TRANSITION      = 2;
49299     var DIFFERENT_TRANSITION = 3;
49300
49301     var INTERSECTION = 0;
49302     var UNION        = 1;
49303     var DIFFERENCE   = 2;
49304     var XOR          = 3;
49305
49306     /**
49307      * @param  {SweepEvent} event
49308      * @param  {SweepEvent} prev
49309      * @param  {Operation} operation
49310      */
49311     function computeFields (event, prev, operation) {
49312       // compute inOut and otherInOut fields
49313       if (prev === null) {
49314         event.inOut      = false;
49315         event.otherInOut = true;
49316
49317       // previous line segment in sweepline belongs to the same polygon
49318       } else {
49319         if (event.isSubject === prev.isSubject) {
49320           event.inOut      = !prev.inOut;
49321           event.otherInOut = prev.otherInOut;
49322
49323         // previous line segment in sweepline belongs to the clipping polygon
49324         } else {
49325           event.inOut      = !prev.otherInOut;
49326           event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
49327         }
49328
49329         // compute prevInResult field
49330         if (prev) {
49331           event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
49332             ? prev.prevInResult : prev;
49333         }
49334       }
49335
49336       // check if the line segment belongs to the Boolean operation
49337       event.inResult = inResult(event, operation);
49338     }
49339
49340
49341     /* eslint-disable indent */
49342     function inResult(event, operation) {
49343       switch (event.type) {
49344         case NORMAL:
49345           switch (operation) {
49346             case INTERSECTION:
49347               return !event.otherInOut;
49348             case UNION:
49349               return event.otherInOut;
49350             case DIFFERENCE:
49351               // return (event.isSubject && !event.otherInOut) ||
49352               //         (!event.isSubject && event.otherInOut);
49353               return (event.isSubject && event.otherInOut) ||
49354                       (!event.isSubject && !event.otherInOut);
49355             case XOR:
49356               return true;
49357           }
49358           break;
49359         case SAME_TRANSITION:
49360           return operation === INTERSECTION || operation === UNION;
49361         case DIFFERENT_TRANSITION:
49362           return operation === DIFFERENCE;
49363         case NON_CONTRIBUTING:
49364           return false;
49365       }
49366       return false;
49367     }
49368     /* eslint-enable indent */
49369
49370     var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
49371
49372       /**
49373        * Is left endpoint?
49374        * @type {Boolean}
49375        */
49376       this.left = left;
49377
49378       /**
49379        * @type {Array.<Number>}
49380        */
49381       this.point = point;
49382
49383       /**
49384        * Other edge reference
49385        * @type {SweepEvent}
49386        */
49387       this.otherEvent = otherEvent;
49388
49389       /**
49390        * Belongs to source or clipping polygon
49391        * @type {Boolean}
49392        */
49393       this.isSubject = isSubject;
49394
49395       /**
49396        * Edge contribution type
49397        * @type {Number}
49398        */
49399       this.type = edgeType || NORMAL;
49400
49401
49402       /**
49403        * In-out transition for the sweepline crossing polygon
49404        * @type {Boolean}
49405        */
49406       this.inOut = false;
49407
49408
49409       /**
49410        * @type {Boolean}
49411        */
49412       this.otherInOut = false;
49413
49414       /**
49415        * Previous event in result?
49416        * @type {SweepEvent}
49417        */
49418       this.prevInResult = null;
49419
49420       /**
49421        * Does event belong to result?
49422        * @type {Boolean}
49423        */
49424       this.inResult = false;
49425
49426
49427       // connection step
49428
49429       /**
49430        * @type {Boolean}
49431        */
49432       this.resultInOut = false;
49433
49434       this.isExteriorRing = true;
49435     };
49436
49437
49438     /**
49439      * @param{Array.<Number>}p
49440      * @return {Boolean}
49441      */
49442     SweepEvent.prototype.isBelow = function isBelow (p) {
49443       var p0 = this.point, p1 = this.otherEvent.point;
49444       return this.left
49445         ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
49446         // signedArea(this.point, this.otherEvent.point, p) > 0 :
49447         : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
49448         //signedArea(this.otherEvent.point, this.point, p) > 0;
49449     };
49450
49451
49452     /**
49453      * @param{Array.<Number>}p
49454      * @return {Boolean}
49455      */
49456     SweepEvent.prototype.isAbove = function isAbove (p) {
49457       return !this.isBelow(p);
49458     };
49459
49460
49461     /**
49462      * @return {Boolean}
49463      */
49464     SweepEvent.prototype.isVertical = function isVertical () {
49465       return this.point[0] === this.otherEvent.point[0];
49466     };
49467
49468
49469     SweepEvent.prototype.clone = function clone () {
49470       var copy = new SweepEvent(
49471         this.point, this.left, this.otherEvent, this.isSubject, this.type);
49472
49473       copy.inResult     = this.inResult;
49474       copy.prevInResult = this.prevInResult;
49475       copy.isExteriorRing = this.isExteriorRing;
49476       copy.inOut        = this.inOut;
49477       copy.otherInOut   = this.otherInOut;
49478
49479       return copy;
49480     };
49481
49482     function equals(p1, p2) {
49483       if (p1[0] === p2[0]) {
49484         if (p1[1] === p2[1]) {
49485           return true;
49486         } else {
49487           return false;
49488         }
49489       }
49490       return false;
49491     }
49492
49493     // const EPSILON = 1e-9;
49494     // const abs = Math.abs;
49495     // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
49496     // Precision problem.
49497     //
49498     // module.exports = function equals(p1, p2) {
49499     //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
49500     // };
49501
49502     /**
49503      * Signed area of the triangle (p0, p1, p2)
49504      * @param  {Array.<Number>} p0
49505      * @param  {Array.<Number>} p1
49506      * @param  {Array.<Number>} p2
49507      * @return {Number}
49508      */
49509     function signedArea(p0, p1, p2) {
49510       return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
49511     }
49512
49513     /**
49514      * @param  {SweepEvent} e1
49515      * @param  {SweepEvent} e2
49516      * @return {Number}
49517      */
49518     function compareEvents(e1, e2) {
49519       var p1 = e1.point;
49520       var p2 = e2.point;
49521
49522       // Different x-coordinate
49523       if (p1[0] > p2[0]) { return 1; }
49524       if (p1[0] < p2[0]) { return -1; }
49525
49526       // Different points, but same x-coordinate
49527       // Event with lower y-coordinate is processed first
49528       if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
49529
49530       return specialCases(e1, e2, p1, p2);
49531     }
49532
49533
49534     /* eslint-disable no-unused-vars */
49535     function specialCases(e1, e2, p1, p2) {
49536       // Same coordinates, but one is a left endpoint and the other is
49537       // a right endpoint. The right endpoint is processed first
49538       if (e1.left !== e2.left)
49539         { return e1.left ? 1 : -1; }
49540
49541       // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
49542       // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
49543       // Same coordinates, both events
49544       // are left endpoints or right endpoints.
49545       // not collinear
49546       if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
49547         // the event associate to the bottom segment is processed first
49548         return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
49549       }
49550
49551       return (!e1.isSubject && e2.isSubject) ? 1 : -1;
49552     }
49553     /* eslint-enable no-unused-vars */
49554
49555     /**
49556      * @param  {SweepEvent} se
49557      * @param  {Array.<Number>} p
49558      * @param  {Queue} queue
49559      * @return {Queue}
49560      */
49561     function divideSegment(se, p, queue)  {
49562       var r = new SweepEvent(p, false, se,            se.isSubject);
49563       var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
49564
49565       /* eslint-disable no-console */
49566       if (equals(se.point, se.otherEvent.point)) {
49567
49568         console.warn('what is that, a collapsed segment?', se);
49569       }
49570       /* eslint-enable no-console */
49571
49572       r.contourId = l.contourId = se.contourId;
49573
49574       // avoid a rounding error. The left event would be processed after the right event
49575       if (compareEvents(l, se.otherEvent) > 0) {
49576         se.otherEvent.left = true;
49577         l.left = false;
49578       }
49579
49580       // avoid a rounding error. The left event would be processed after the right event
49581       // if (compareEvents(se, r) > 0) {}
49582
49583       se.otherEvent.otherEvent = l;
49584       se.otherEvent = r;
49585
49586       queue.push(l);
49587       queue.push(r);
49588
49589       return queue;
49590     }
49591
49592     //const EPS = 1e-9;
49593
49594     /**
49595      * Finds the magnitude of the cross product of two vectors (if we pretend
49596      * they're in three dimensions)
49597      *
49598      * @param {Object} a First vector
49599      * @param {Object} b Second vector
49600      * @private
49601      * @returns {Number} The magnitude of the cross product
49602      */
49603     function crossProduct(a, b) {
49604       return (a[0] * b[1]) - (a[1] * b[0]);
49605     }
49606
49607     /**
49608      * Finds the dot product of two vectors.
49609      *
49610      * @param {Object} a First vector
49611      * @param {Object} b Second vector
49612      * @private
49613      * @returns {Number} The dot product
49614      */
49615     function dotProduct(a, b) {
49616       return (a[0] * b[0]) + (a[1] * b[1]);
49617     }
49618
49619     /**
49620      * Finds the intersection (if any) between two line segments a and b, given the
49621      * line segments' end points a1, a2 and b1, b2.
49622      *
49623      * This algorithm is based on Schneider and Eberly.
49624      * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
49625      * Page 244.
49626      *
49627      * @param {Array.<Number>} a1 point of first line
49628      * @param {Array.<Number>} a2 point of first line
49629      * @param {Array.<Number>} b1 point of second line
49630      * @param {Array.<Number>} b2 point of second line
49631      * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
49632      *                                         (meaning connected segments) as
49633      *                                         intersections
49634      * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
49635      * intersection. If they overlap, the two end points of the overlapping segment.
49636      * Otherwise, null.
49637      */
49638     function intersection (a1, a2, b1, b2, noEndpointTouch) {
49639       // The algorithm expects our lines in the form P + sd, where P is a point,
49640       // s is on the interval [0, 1], and d is a vector.
49641       // We are passed two points. P can be the first point of each pair. The
49642       // vector, then, could be thought of as the distance (in x and y components)
49643       // from the first point to the second point.
49644       // So first, let's make our vectors:
49645       var va = [a2[0] - a1[0], a2[1] - a1[1]];
49646       var vb = [b2[0] - b1[0], b2[1] - b1[1]];
49647       // We also define a function to convert back to regular point form:
49648
49649       /* eslint-disable arrow-body-style */
49650
49651       function toPoint(p, s, d) {
49652         return [
49653           p[0] + s * d[0],
49654           p[1] + s * d[1]
49655         ];
49656       }
49657
49658       /* eslint-enable arrow-body-style */
49659
49660       // The rest is pretty much a straight port of the algorithm.
49661       var e = [b1[0] - a1[0], b1[1] - a1[1]];
49662       var kross    = crossProduct(va, vb);
49663       var sqrKross = kross * kross;
49664       var sqrLenA  = dotProduct(va, va);
49665       //const sqrLenB  = dotProduct(vb, vb);
49666
49667       // Check for line intersection. This works because of the properties of the
49668       // cross product -- specifically, two vectors are parallel if and only if the
49669       // cross product is the 0 vector. The full calculation involves relative error
49670       // to account for possible very small line segments. See Schneider & Eberly
49671       // for details.
49672       if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
49673         // If they're not parallel, then (because these are line segments) they
49674         // still might not actually intersect. This code checks that the
49675         // intersection point of the lines is actually on both line segments.
49676         var s = crossProduct(e, vb) / kross;
49677         if (s < 0 || s > 1) {
49678           // not on line segment a
49679           return null;
49680         }
49681         var t = crossProduct(e, va) / kross;
49682         if (t < 0 || t > 1) {
49683           // not on line segment b
49684           return null;
49685         }
49686         if (s === 0 || s === 1) {
49687           // on an endpoint of line segment a
49688           return noEndpointTouch ? null : [toPoint(a1, s, va)];
49689         }
49690         if (t === 0 || t === 1) {
49691           // on an endpoint of line segment b
49692           return noEndpointTouch ? null : [toPoint(b1, t, vb)];
49693         }
49694         return [toPoint(a1, s, va)];
49695       }
49696
49697       // If we've reached this point, then the lines are either parallel or the
49698       // same, but the segments could overlap partially or fully, or not at all.
49699       // So we need to find the overlap, if any. To do that, we can use e, which is
49700       // the (vector) difference between the two initial points. If this is parallel
49701       // with the line itself, then the two lines are the same line, and there will
49702       // be overlap.
49703       //const sqrLenE = dotProduct(e, e);
49704       kross = crossProduct(e, va);
49705       sqrKross = kross * kross;
49706
49707       if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
49708       // Lines are just parallel, not the same. No overlap.
49709         return null;
49710       }
49711
49712       var sa = dotProduct(va, e) / sqrLenA;
49713       var sb = sa + dotProduct(va, vb) / sqrLenA;
49714       var smin = Math.min(sa, sb);
49715       var smax = Math.max(sa, sb);
49716
49717       // this is, essentially, the FindIntersection acting on floats from
49718       // Schneider & Eberly, just inlined into this function.
49719       if (smin <= 1 && smax >= 0) {
49720
49721         // overlap on an end point
49722         if (smin === 1) {
49723           return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
49724         }
49725
49726         if (smax === 0) {
49727           return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
49728         }
49729
49730         if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
49731
49732         // There's overlap on a segment -- two points of intersection. Return both.
49733         return [
49734           toPoint(a1, smin > 0 ? smin : 0, va),
49735           toPoint(a1, smax < 1 ? smax : 1, va)
49736         ];
49737       }
49738
49739       return null;
49740     }
49741
49742     /**
49743      * @param  {SweepEvent} se1
49744      * @param  {SweepEvent} se2
49745      * @param  {Queue}      queue
49746      * @return {Number}
49747      */
49748     function possibleIntersection (se1, se2, queue) {
49749       // that disallows self-intersecting polygons,
49750       // did cost us half a day, so I'll leave it
49751       // out of respect
49752       // if (se1.isSubject === se2.isSubject) return;
49753       var inter = intersection(
49754         se1.point, se1.otherEvent.point,
49755         se2.point, se2.otherEvent.point
49756       );
49757
49758       var nintersections = inter ? inter.length : 0;
49759       if (nintersections === 0) { return 0; } // no intersection
49760
49761       // the line segments intersect at an endpoint of both line segments
49762       if ((nintersections === 1) &&
49763           (equals(se1.point, se2.point) ||
49764            equals(se1.otherEvent.point, se2.otherEvent.point))) {
49765         return 0;
49766       }
49767
49768       if (nintersections === 2 && se1.isSubject === se2.isSubject) {
49769         // if(se1.contourId === se2.contourId){
49770         // console.warn('Edges of the same polygon overlap',
49771         //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
49772         // }
49773         //throw new Error('Edges of the same polygon overlap');
49774         return 0;
49775       }
49776
49777       // The line segments associated to se1 and se2 intersect
49778       if (nintersections === 1) {
49779
49780         // if the intersection point is not an endpoint of se1
49781         if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
49782           divideSegment(se1, inter[0], queue);
49783         }
49784
49785         // if the intersection point is not an endpoint of se2
49786         if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
49787           divideSegment(se2, inter[0], queue);
49788         }
49789         return 1;
49790       }
49791
49792       // The line segments associated to se1 and se2 overlap
49793       var events        = [];
49794       var leftCoincide  = false;
49795       var rightCoincide = false;
49796
49797       if (equals(se1.point, se2.point)) {
49798         leftCoincide = true; // linked
49799       } else if (compareEvents(se1, se2) === 1) {
49800         events.push(se2, se1);
49801       } else {
49802         events.push(se1, se2);
49803       }
49804
49805       if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
49806         rightCoincide = true;
49807       } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
49808         events.push(se2.otherEvent, se1.otherEvent);
49809       } else {
49810         events.push(se1.otherEvent, se2.otherEvent);
49811       }
49812
49813       if ((leftCoincide && rightCoincide) || leftCoincide) {
49814         // both line segments are equal or share the left endpoint
49815         se2.type = NON_CONTRIBUTING;
49816         se1.type = (se2.inOut === se1.inOut)
49817           ? SAME_TRANSITION : DIFFERENT_TRANSITION;
49818
49819         if (leftCoincide && !rightCoincide) {
49820           // honestly no idea, but changing events selection from [2, 1]
49821           // to [0, 1] fixes the overlapping self-intersecting polygons issue
49822           divideSegment(events[1].otherEvent, events[0].point, queue);
49823         }
49824         return 2;
49825       }
49826
49827       // the line segments share the right endpoint
49828       if (rightCoincide) {
49829         divideSegment(events[0], events[1].point, queue);
49830         return 3;
49831       }
49832
49833       // no line segment includes totally the other one
49834       if (events[0] !== events[3].otherEvent) {
49835         divideSegment(events[0], events[1].point, queue);
49836         divideSegment(events[1], events[2].point, queue);
49837         return 3;
49838       }
49839
49840       // one line segment includes the other one
49841       divideSegment(events[0], events[1].point, queue);
49842       divideSegment(events[3].otherEvent, events[2].point, queue);
49843
49844       return 3;
49845     }
49846
49847     /**
49848      * @param  {SweepEvent} le1
49849      * @param  {SweepEvent} le2
49850      * @return {Number}
49851      */
49852     function compareSegments(le1, le2) {
49853       if (le1 === le2) { return 0; }
49854
49855       // Segments are not collinear
49856       if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
49857         signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
49858
49859         // If they share their left endpoint use the right endpoint to sort
49860         if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
49861
49862         // Different left endpoint: use the left endpoint to sort
49863         if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
49864
49865         // has the line segment associated to e1 been inserted
49866         // into S after the line segment associated to e2 ?
49867         if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
49868
49869         // The line segment associated to e2 has been inserted
49870         // into S after the line segment associated to e1
49871         return le1.isBelow(le2.point) ? -1 : 1;
49872       }
49873
49874       if (le1.isSubject === le2.isSubject) { // same polygon
49875         var p1 = le1.point, p2 = le2.point;
49876         if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
49877           p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
49878           if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
49879           else { return le1.contourId > le2.contourId ? 1 : -1; }
49880         }
49881       } else { // Segments are collinear, but belong to separate polygons
49882         return le1.isSubject ? -1 : 1;
49883       }
49884
49885       return compareEvents(le1, le2) === 1 ? 1 : -1;
49886     }
49887
49888     function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
49889       var sweepLine = new SplayTree(compareSegments);
49890       var sortedEvents = [];
49891
49892       var rightbound = Math.min(sbbox[2], cbbox[2]);
49893
49894       var prev, next, begin;
49895
49896       while (eventQueue.length !== 0) {
49897         var event = eventQueue.pop();
49898         sortedEvents.push(event);
49899
49900         // optimization by bboxes for intersection and difference goes here
49901         if ((operation === INTERSECTION && event.point[0] > rightbound) ||
49902             (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
49903           break;
49904         }
49905
49906         if (event.left) {
49907           next  = prev = sweepLine.insert(event);
49908           begin = sweepLine.minNode();
49909
49910           if (prev !== begin) { prev = sweepLine.prev(prev); }
49911           else                { prev = null; }
49912
49913           next = sweepLine.next(next);
49914
49915           var prevEvent = prev ? prev.key : null;
49916           var prevprevEvent = (void 0);
49917           computeFields(event, prevEvent, operation);
49918           if (next) {
49919             if (possibleIntersection(event, next.key, eventQueue) === 2) {
49920               computeFields(event, prevEvent, operation);
49921               computeFields(event, next.key, operation);
49922             }
49923           }
49924
49925           if (prev) {
49926             if (possibleIntersection(prev.key, event, eventQueue) === 2) {
49927               var prevprev = prev;
49928               if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
49929               else                    { prevprev = null; }
49930
49931               prevprevEvent = prevprev ? prevprev.key : null;
49932               computeFields(prevEvent, prevprevEvent, operation);
49933               computeFields(event,     prevEvent,     operation);
49934             }
49935           }
49936         } else {
49937           event = event.otherEvent;
49938           next = prev = sweepLine.find(event);
49939
49940           if (prev && next) {
49941
49942             if (prev !== begin) { prev = sweepLine.prev(prev); }
49943             else                { prev = null; }
49944
49945             next = sweepLine.next(next);
49946             sweepLine.remove(event);
49947
49948             if (next && prev) {
49949               possibleIntersection(prev.key, next.key, eventQueue);
49950             }
49951           }
49952         }
49953       }
49954       return sortedEvents;
49955     }
49956
49957     /**
49958      * @param  {Array.<SweepEvent>} sortedEvents
49959      * @return {Array.<SweepEvent>}
49960      */
49961     function orderEvents(sortedEvents) {
49962       var event, i, len, tmp;
49963       var resultEvents = [];
49964       for (i = 0, len = sortedEvents.length; i < len; i++) {
49965         event = sortedEvents[i];
49966         if ((event.left && event.inResult) ||
49967           (!event.left && event.otherEvent.inResult)) {
49968           resultEvents.push(event);
49969         }
49970       }
49971       // Due to overlapping edges the resultEvents array can be not wholly sorted
49972       var sorted = false;
49973       while (!sorted) {
49974         sorted = true;
49975         for (i = 0, len = resultEvents.length; i < len; i++) {
49976           if ((i + 1) < len &&
49977             compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
49978             tmp = resultEvents[i];
49979             resultEvents[i] = resultEvents[i + 1];
49980             resultEvents[i + 1] = tmp;
49981             sorted = false;
49982           }
49983         }
49984       }
49985
49986
49987       for (i = 0, len = resultEvents.length; i < len; i++) {
49988         event = resultEvents[i];
49989         event.pos = i;
49990       }
49991
49992       // imagine, the right event is found in the beginning of the queue,
49993       // when his left counterpart is not marked yet
49994       for (i = 0, len = resultEvents.length; i < len; i++) {
49995         event = resultEvents[i];
49996         if (!event.left) {
49997           tmp = event.pos;
49998           event.pos = event.otherEvent.pos;
49999           event.otherEvent.pos = tmp;
50000         }
50001       }
50002
50003       return resultEvents;
50004     }
50005
50006
50007     /**
50008      * @param  {Number} pos
50009      * @param  {Array.<SweepEvent>} resultEvents
50010      * @param  {Object>}    processed
50011      * @return {Number}
50012      */
50013     function nextPos(pos, resultEvents, processed, origIndex) {
50014       var p, p1;
50015       var newPos = pos + 1;
50016       var length = resultEvents.length;
50017
50018       p  = resultEvents[pos].point;
50019
50020       if (newPos < length)
50021         { p1 = resultEvents[newPos].point; }
50022
50023
50024       // while in range and not the current one by value
50025       while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
50026         if (!processed[newPos]) {
50027           return newPos;
50028         } else   {
50029           newPos++;
50030         }
50031         p1 = resultEvents[newPos].point;
50032       }
50033
50034       newPos = pos - 1;
50035
50036       while (processed[newPos] && newPos >= origIndex) {
50037         newPos--;
50038       }
50039       return newPos;
50040     }
50041
50042
50043     /**
50044      * @param  {Array.<SweepEvent>} sortedEvents
50045      * @return {Array.<*>} polygons
50046      */
50047     function connectEdges(sortedEvents, operation) {
50048       var i, len;
50049       var resultEvents = orderEvents(sortedEvents);
50050
50051       // "false"-filled array
50052       var processed = {};
50053       var result = [];
50054       var event;
50055
50056       for (i = 0, len = resultEvents.length; i < len; i++) {
50057         if (processed[i]) { continue; }
50058         var contour = [[]];
50059
50060         if (!resultEvents[i].isExteriorRing) {
50061           if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
50062             result.push(contour);
50063           } else if (result.length === 0) {
50064             result.push([[contour]]);
50065           } else {
50066             result[result.length - 1].push(contour[0]);
50067           }
50068         } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
50069           result[result.length - 1].push(contour[0]);
50070         } else {
50071           result.push(contour);
50072         }
50073
50074         var ringId = result.length - 1;
50075         var pos = i;
50076
50077         var initial = resultEvents[i].point;
50078         contour[0].push(initial);
50079
50080         while (pos >= i) {
50081           event = resultEvents[pos];
50082           processed[pos] = true;
50083
50084           if (event.left) {
50085             event.resultInOut = false;
50086             event.contourId   = ringId;
50087           } else {
50088             event.otherEvent.resultInOut = true;
50089             event.otherEvent.contourId   = ringId;
50090           }
50091
50092           pos = event.pos;
50093           processed[pos] = true;
50094           contour[0].push(resultEvents[pos].point);
50095           pos = nextPos(pos, resultEvents, processed, i);
50096         }
50097
50098         pos = pos === -1 ? i : pos;
50099
50100         event = resultEvents[pos];
50101         processed[pos] = processed[event.pos] = true;
50102         event.otherEvent.resultInOut = true;
50103         event.otherEvent.contourId   = ringId;
50104       }
50105
50106       // Handle if the result is a polygon (eg not multipoly)
50107       // Commented it again, let's see what do we mean by that
50108       // if (result.length === 1) result = result[0];
50109       return result;
50110     }
50111
50112     var tinyqueue = TinyQueue;
50113     var default_1 = TinyQueue;
50114
50115     function TinyQueue(data, compare) {
50116         var this$1 = this;
50117
50118         if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
50119
50120         this.data = data || [];
50121         this.length = this.data.length;
50122         this.compare = compare || defaultCompare;
50123
50124         if (this.length > 0) {
50125             for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
50126         }
50127     }
50128
50129     function defaultCompare(a, b) {
50130         return a < b ? -1 : a > b ? 1 : 0;
50131     }
50132
50133     TinyQueue.prototype = {
50134
50135         push: function (item) {
50136             this.data.push(item);
50137             this.length++;
50138             this._up(this.length - 1);
50139         },
50140
50141         pop: function () {
50142             if (this.length === 0) { return undefined; }
50143
50144             var top = this.data[0];
50145             this.length--;
50146
50147             if (this.length > 0) {
50148                 this.data[0] = this.data[this.length];
50149                 this._down(0);
50150             }
50151             this.data.pop();
50152
50153             return top;
50154         },
50155
50156         peek: function () {
50157             return this.data[0];
50158         },
50159
50160         _up: function (pos) {
50161             var data = this.data;
50162             var compare = this.compare;
50163             var item = data[pos];
50164
50165             while (pos > 0) {
50166                 var parent = (pos - 1) >> 1;
50167                 var current = data[parent];
50168                 if (compare(item, current) >= 0) { break; }
50169                 data[pos] = current;
50170                 pos = parent;
50171             }
50172
50173             data[pos] = item;
50174         },
50175
50176         _down: function (pos) {
50177             var this$1 = this;
50178
50179             var data = this.data;
50180             var compare = this.compare;
50181             var halfLength = this.length >> 1;
50182             var item = data[pos];
50183
50184             while (pos < halfLength) {
50185                 var left = (pos << 1) + 1;
50186                 var right = left + 1;
50187                 var best = data[left];
50188
50189                 if (right < this$1.length && compare(data[right], best) < 0) {
50190                     left = right;
50191                     best = data[right];
50192                 }
50193                 if (compare(best, item) >= 0) { break; }
50194
50195                 data[pos] = best;
50196                 pos = left;
50197             }
50198
50199             data[pos] = item;
50200         }
50201     };
50202     tinyqueue.default = default_1;
50203
50204     var max = Math.max;
50205     var min = Math.min;
50206
50207     var contourId = 0;
50208
50209
50210     function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
50211       var i, len, s1, s2, e1, e2;
50212       for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
50213         s1 = contourOrHole[i];
50214         s2 = contourOrHole[i + 1];
50215         e1 = new SweepEvent(s1, false, undefined, isSubject);
50216         e2 = new SweepEvent(s2, false, e1,        isSubject);
50217         e1.otherEvent = e2;
50218
50219         if (s1[0] === s2[0] && s1[1] === s2[1]) {
50220           continue; // skip collapsed edges, or it breaks
50221         }
50222
50223         e1.contourId = e2.contourId = depth;
50224         if (!isExteriorRing) {
50225           e1.isExteriorRing = false;
50226           e2.isExteriorRing = false;
50227         }
50228         if (compareEvents(e1, e2) > 0) {
50229           e2.left = true;
50230         } else {
50231           e1.left = true;
50232         }
50233
50234         var x = s1[0], y = s1[1];
50235         bbox[0] = min(bbox[0], x);
50236         bbox[1] = min(bbox[1], y);
50237         bbox[2] = max(bbox[2], x);
50238         bbox[3] = max(bbox[3], y);
50239
50240         // Pushing it so the queue is sorted from left to right,
50241         // with object on the left having the highest priority.
50242         Q.push(e1);
50243         Q.push(e2);
50244       }
50245     }
50246
50247
50248     function fillQueue(subject, clipping, sbbox, cbbox, operation) {
50249       var eventQueue = new tinyqueue(null, compareEvents);
50250       var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
50251
50252       for (i = 0, ii = subject.length; i < ii; i++) {
50253         polygonSet = subject[i];
50254         for (j = 0, jj = polygonSet.length; j < jj; j++) {
50255           isExteriorRing = j === 0;
50256           if (isExteriorRing) { contourId++; }
50257           processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
50258         }
50259       }
50260
50261       for (i = 0, ii = clipping.length; i < ii; i++) {
50262         polygonSet = clipping[i];
50263         for (j = 0, jj = polygonSet.length; j < jj; j++) {
50264           isExteriorRing = j === 0;
50265           if (operation === DIFFERENCE) { isExteriorRing = false; }
50266           if (isExteriorRing) { contourId++; }
50267           processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
50268         }
50269       }
50270
50271       return eventQueue;
50272     }
50273
50274     var EMPTY = [];
50275
50276
50277     function trivialOperation(subject, clipping, operation) {
50278       var result = null;
50279       if (subject.length * clipping.length === 0) {
50280         if        (operation === INTERSECTION) {
50281           result = EMPTY;
50282         } else if (operation === DIFFERENCE) {
50283           result = subject;
50284         } else if (operation === UNION ||
50285                    operation === XOR) {
50286           result = (subject.length === 0) ? clipping : subject;
50287         }
50288       }
50289       return result;
50290     }
50291
50292
50293     function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
50294       var result = null;
50295       if (sbbox[0] > cbbox[2] ||
50296           cbbox[0] > sbbox[2] ||
50297           sbbox[1] > cbbox[3] ||
50298           cbbox[1] > sbbox[3]) {
50299         if        (operation === INTERSECTION) {
50300           result = EMPTY;
50301         } else if (operation === DIFFERENCE) {
50302           result = subject;
50303         } else if (operation === UNION ||
50304                    operation === XOR) {
50305           result = subject.concat(clipping);
50306         }
50307       }
50308       return result;
50309     }
50310
50311
50312     function boolean(subject, clipping, operation) {
50313       if (typeof subject[0][0][0] === 'number') {
50314         subject = [subject];
50315       }
50316       if (typeof clipping[0][0][0] === 'number') {
50317         clipping = [clipping];
50318       }
50319       var trivial = trivialOperation(subject, clipping, operation);
50320       if (trivial) {
50321         return trivial === EMPTY ? null : trivial;
50322       }
50323       var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
50324       var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
50325
50326       //console.time('fill queue');
50327       var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
50328       //console.timeEnd('fill queue');
50329
50330       trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
50331       if (trivial) {
50332         return trivial === EMPTY ? null : trivial;
50333       }
50334       //console.time('subdivide edges');
50335       var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
50336       //console.timeEnd('subdivide edges');
50337
50338       //console.time('connect vertices');
50339       var result = connectEdges(sortedEvents, operation);
50340       //console.timeEnd('connect vertices');
50341       return result;
50342     }
50343
50344     function union (subject, clipping) {
50345       return boolean(subject, clipping, UNION);
50346     }
50347
50348     function diff (subject, clipping) {
50349       return boolean(subject, clipping, DIFFERENCE);
50350     }
50351
50352     function xor (subject, clipping){
50353       return boolean(subject, clipping, XOR);
50354     }
50355
50356     function intersection$1 (subject, clipping) {
50357       return boolean(subject, clipping, INTERSECTION);
50358     }
50359
50360     /**
50361      * @enum {Number}
50362      */
50363     var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
50364
50365     exports.union = union;
50366     exports.diff = diff;
50367     exports.xor = xor;
50368     exports.intersection = intersection$1;
50369     exports.operations = operations;
50370
50371     Object.defineProperty(exports, '__esModule', { value: true });
50372
50373   })));
50374
50375   });
50376
50377   var martinez = unwrapExports(martinez_umd);
50378
50379   var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
50380     var e, m;
50381     var eLen = (nBytes * 8) - mLen - 1;
50382     var eMax = (1 << eLen) - 1;
50383     var eBias = eMax >> 1;
50384     var nBits = -7;
50385     var i = isLE ? (nBytes - 1) : 0;
50386     var d = isLE ? -1 : 1;
50387     var s = buffer[offset + i];
50388
50389     i += d;
50390
50391     e = s & ((1 << (-nBits)) - 1);
50392     s >>= (-nBits);
50393     nBits += eLen;
50394     for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
50395
50396     m = e & ((1 << (-nBits)) - 1);
50397     e >>= (-nBits);
50398     nBits += mLen;
50399     for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
50400
50401     if (e === 0) {
50402       e = 1 - eBias;
50403     } else if (e === eMax) {
50404       return m ? NaN : ((s ? -1 : 1) * Infinity)
50405     } else {
50406       m = m + Math.pow(2, mLen);
50407       e = e - eBias;
50408     }
50409     return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
50410   };
50411
50412   var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
50413     var e, m, c;
50414     var eLen = (nBytes * 8) - mLen - 1;
50415     var eMax = (1 << eLen) - 1;
50416     var eBias = eMax >> 1;
50417     var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
50418     var i = isLE ? 0 : (nBytes - 1);
50419     var d = isLE ? 1 : -1;
50420     var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
50421
50422     value = Math.abs(value);
50423
50424     if (isNaN(value) || value === Infinity) {
50425       m = isNaN(value) ? 1 : 0;
50426       e = eMax;
50427     } else {
50428       e = Math.floor(Math.log(value) / Math.LN2);
50429       if (value * (c = Math.pow(2, -e)) < 1) {
50430         e--;
50431         c *= 2;
50432       }
50433       if (e + eBias >= 1) {
50434         value += rt / c;
50435       } else {
50436         value += rt * Math.pow(2, 1 - eBias);
50437       }
50438       if (value * c >= 2) {
50439         e++;
50440         c /= 2;
50441       }
50442
50443       if (e + eBias >= eMax) {
50444         m = 0;
50445         e = eMax;
50446       } else if (e + eBias >= 1) {
50447         m = ((value * c) - 1) * Math.pow(2, mLen);
50448         e = e + eBias;
50449       } else {
50450         m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
50451         e = 0;
50452       }
50453     }
50454
50455     for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
50456
50457     e = (e << mLen) | m;
50458     eLen += mLen;
50459     for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
50460
50461     buffer[offset + i - d] |= s * 128;
50462   };
50463
50464   var ieee754 = {
50465         read: read$6,
50466         write: write$6
50467   };
50468
50469   var ieee754$1 = /*#__PURE__*/Object.freeze({
50470     default: ieee754,
50471     __moduleExports: ieee754,
50472     read: read$6,
50473     write: write$6
50474   });
50475
50476   var ieee754$2 = ( ieee754$1 && ieee754 ) || ieee754$1;
50477
50478   var pbf = Pbf;
50479
50480
50481
50482   function Pbf(buf) {
50483       this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
50484       this.pos = 0;
50485       this.type = 0;
50486       this.length = this.buf.length;
50487   }
50488
50489   Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
50490   Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
50491   Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
50492   Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
50493
50494   var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
50495       SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
50496
50497   Pbf.prototype = {
50498
50499       destroy: function() {
50500           this.buf = null;
50501       },
50502
50503       // === READING =================================================================
50504
50505       readFields: function(readField, result, end) {
50506           end = end || this.length;
50507
50508           while (this.pos < end) {
50509               var val = this.readVarint(),
50510                   tag = val >> 3,
50511                   startPos = this.pos;
50512
50513               this.type = val & 0x7;
50514               readField(tag, result, this);
50515
50516               if (this.pos === startPos) this.skip(val);
50517           }
50518           return result;
50519       },
50520
50521       readMessage: function(readField, result) {
50522           return this.readFields(readField, result, this.readVarint() + this.pos);
50523       },
50524
50525       readFixed32: function() {
50526           var val = readUInt32(this.buf, this.pos);
50527           this.pos += 4;
50528           return val;
50529       },
50530
50531       readSFixed32: function() {
50532           var val = readInt32(this.buf, this.pos);
50533           this.pos += 4;
50534           return val;
50535       },
50536
50537       // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
50538
50539       readFixed64: function() {
50540           var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
50541           this.pos += 8;
50542           return val;
50543       },
50544
50545       readSFixed64: function() {
50546           var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
50547           this.pos += 8;
50548           return val;
50549       },
50550
50551       readFloat: function() {
50552           var val = ieee754$2.read(this.buf, this.pos, true, 23, 4);
50553           this.pos += 4;
50554           return val;
50555       },
50556
50557       readDouble: function() {
50558           var val = ieee754$2.read(this.buf, this.pos, true, 52, 8);
50559           this.pos += 8;
50560           return val;
50561       },
50562
50563       readVarint: function(isSigned) {
50564           var buf = this.buf,
50565               val, b;
50566
50567           b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
50568           b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
50569           b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
50570           b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
50571           b = buf[this.pos];   val |= (b & 0x0f) << 28;
50572
50573           return readVarintRemainder(val, isSigned, this);
50574       },
50575
50576       readVarint64: function() { // for compatibility with v2.0.1
50577           return this.readVarint(true);
50578       },
50579
50580       readSVarint: function() {
50581           var num = this.readVarint();
50582           return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
50583       },
50584
50585       readBoolean: function() {
50586           return Boolean(this.readVarint());
50587       },
50588
50589       readString: function() {
50590           var end = this.readVarint() + this.pos,
50591               str = readUtf8(this.buf, this.pos, end);
50592           this.pos = end;
50593           return str;
50594       },
50595
50596       readBytes: function() {
50597           var end = this.readVarint() + this.pos,
50598               buffer = this.buf.subarray(this.pos, end);
50599           this.pos = end;
50600           return buffer;
50601       },
50602
50603       // verbose for performance reasons; doesn't affect gzipped size
50604
50605       readPackedVarint: function(arr, isSigned) {
50606           var end = readPackedEnd(this);
50607           arr = arr || [];
50608           while (this.pos < end) arr.push(this.readVarint(isSigned));
50609           return arr;
50610       },
50611       readPackedSVarint: function(arr) {
50612           var end = readPackedEnd(this);
50613           arr = arr || [];
50614           while (this.pos < end) arr.push(this.readSVarint());
50615           return arr;
50616       },
50617       readPackedBoolean: function(arr) {
50618           var end = readPackedEnd(this);
50619           arr = arr || [];
50620           while (this.pos < end) arr.push(this.readBoolean());
50621           return arr;
50622       },
50623       readPackedFloat: function(arr) {
50624           var end = readPackedEnd(this);
50625           arr = arr || [];
50626           while (this.pos < end) arr.push(this.readFloat());
50627           return arr;
50628       },
50629       readPackedDouble: function(arr) {
50630           var end = readPackedEnd(this);
50631           arr = arr || [];
50632           while (this.pos < end) arr.push(this.readDouble());
50633           return arr;
50634       },
50635       readPackedFixed32: function(arr) {
50636           var end = readPackedEnd(this);
50637           arr = arr || [];
50638           while (this.pos < end) arr.push(this.readFixed32());
50639           return arr;
50640       },
50641       readPackedSFixed32: function(arr) {
50642           var end = readPackedEnd(this);
50643           arr = arr || [];
50644           while (this.pos < end) arr.push(this.readSFixed32());
50645           return arr;
50646       },
50647       readPackedFixed64: function(arr) {
50648           var end = readPackedEnd(this);
50649           arr = arr || [];
50650           while (this.pos < end) arr.push(this.readFixed64());
50651           return arr;
50652       },
50653       readPackedSFixed64: function(arr) {
50654           var end = readPackedEnd(this);
50655           arr = arr || [];
50656           while (this.pos < end) arr.push(this.readSFixed64());
50657           return arr;
50658       },
50659
50660       skip: function(val) {
50661           var type = val & 0x7;
50662           if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
50663           else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
50664           else if (type === Pbf.Fixed32) this.pos += 4;
50665           else if (type === Pbf.Fixed64) this.pos += 8;
50666           else throw new Error('Unimplemented type: ' + type);
50667       },
50668
50669       // === WRITING =================================================================
50670
50671       writeTag: function(tag, type) {
50672           this.writeVarint((tag << 3) | type);
50673       },
50674
50675       realloc: function(min) {
50676           var length = this.length || 16;
50677
50678           while (length < this.pos + min) length *= 2;
50679
50680           if (length !== this.length) {
50681               var buf = new Uint8Array(length);
50682               buf.set(this.buf);
50683               this.buf = buf;
50684               this.length = length;
50685           }
50686       },
50687
50688       finish: function() {
50689           this.length = this.pos;
50690           this.pos = 0;
50691           return this.buf.subarray(0, this.length);
50692       },
50693
50694       writeFixed32: function(val) {
50695           this.realloc(4);
50696           writeInt32(this.buf, val, this.pos);
50697           this.pos += 4;
50698       },
50699
50700       writeSFixed32: function(val) {
50701           this.realloc(4);
50702           writeInt32(this.buf, val, this.pos);
50703           this.pos += 4;
50704       },
50705
50706       writeFixed64: function(val) {
50707           this.realloc(8);
50708           writeInt32(this.buf, val & -1, this.pos);
50709           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
50710           this.pos += 8;
50711       },
50712
50713       writeSFixed64: function(val) {
50714           this.realloc(8);
50715           writeInt32(this.buf, val & -1, this.pos);
50716           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
50717           this.pos += 8;
50718       },
50719
50720       writeVarint: function(val) {
50721           val = +val || 0;
50722
50723           if (val > 0xfffffff || val < 0) {
50724               writeBigVarint(val, this);
50725               return;
50726           }
50727
50728           this.realloc(4);
50729
50730           this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50731           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50732           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50733           this.buf[this.pos++] =   (val >>> 7) & 0x7f;
50734       },
50735
50736       writeSVarint: function(val) {
50737           this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
50738       },
50739
50740       writeBoolean: function(val) {
50741           this.writeVarint(Boolean(val));
50742       },
50743
50744       writeString: function(str) {
50745           str = String(str);
50746           this.realloc(str.length * 4);
50747
50748           this.pos++; // reserve 1 byte for short string length
50749
50750           var startPos = this.pos;
50751           // write the string directly to the buffer and see how much was written
50752           this.pos = writeUtf8(this.buf, str, this.pos);
50753           var len = this.pos - startPos;
50754
50755           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
50756
50757           // finally, write the message length in the reserved place and restore the position
50758           this.pos = startPos - 1;
50759           this.writeVarint(len);
50760           this.pos += len;
50761       },
50762
50763       writeFloat: function(val) {
50764           this.realloc(4);
50765           ieee754$2.write(this.buf, val, this.pos, true, 23, 4);
50766           this.pos += 4;
50767       },
50768
50769       writeDouble: function(val) {
50770           this.realloc(8);
50771           ieee754$2.write(this.buf, val, this.pos, true, 52, 8);
50772           this.pos += 8;
50773       },
50774
50775       writeBytes: function(buffer) {
50776           var len = buffer.length;
50777           this.writeVarint(len);
50778           this.realloc(len);
50779           for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
50780       },
50781
50782       writeRawMessage: function(fn, obj) {
50783           this.pos++; // reserve 1 byte for short message length
50784
50785           // write the message directly to the buffer and see how much was written
50786           var startPos = this.pos;
50787           fn(obj, this);
50788           var len = this.pos - startPos;
50789
50790           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
50791
50792           // finally, write the message length in the reserved place and restore the position
50793           this.pos = startPos - 1;
50794           this.writeVarint(len);
50795           this.pos += len;
50796       },
50797
50798       writeMessage: function(tag, fn, obj) {
50799           this.writeTag(tag, Pbf.Bytes);
50800           this.writeRawMessage(fn, obj);
50801       },
50802
50803       writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
50804       writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
50805       writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
50806       writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
50807       writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
50808       writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
50809       writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
50810       writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
50811       writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
50812
50813       writeBytesField: function(tag, buffer) {
50814           this.writeTag(tag, Pbf.Bytes);
50815           this.writeBytes(buffer);
50816       },
50817       writeFixed32Field: function(tag, val) {
50818           this.writeTag(tag, Pbf.Fixed32);
50819           this.writeFixed32(val);
50820       },
50821       writeSFixed32Field: function(tag, val) {
50822           this.writeTag(tag, Pbf.Fixed32);
50823           this.writeSFixed32(val);
50824       },
50825       writeFixed64Field: function(tag, val) {
50826           this.writeTag(tag, Pbf.Fixed64);
50827           this.writeFixed64(val);
50828       },
50829       writeSFixed64Field: function(tag, val) {
50830           this.writeTag(tag, Pbf.Fixed64);
50831           this.writeSFixed64(val);
50832       },
50833       writeVarintField: function(tag, val) {
50834           this.writeTag(tag, Pbf.Varint);
50835           this.writeVarint(val);
50836       },
50837       writeSVarintField: function(tag, val) {
50838           this.writeTag(tag, Pbf.Varint);
50839           this.writeSVarint(val);
50840       },
50841       writeStringField: function(tag, str) {
50842           this.writeTag(tag, Pbf.Bytes);
50843           this.writeString(str);
50844       },
50845       writeFloatField: function(tag, val) {
50846           this.writeTag(tag, Pbf.Fixed32);
50847           this.writeFloat(val);
50848       },
50849       writeDoubleField: function(tag, val) {
50850           this.writeTag(tag, Pbf.Fixed64);
50851           this.writeDouble(val);
50852       },
50853       writeBooleanField: function(tag, val) {
50854           this.writeVarintField(tag, Boolean(val));
50855       }
50856   };
50857
50858   function readVarintRemainder(l, s, p) {
50859       var buf = p.buf,
50860           h, b;
50861
50862       b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
50863       b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
50864       b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
50865       b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
50866       b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
50867       b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
50868
50869       throw new Error('Expected varint not more than 10 bytes');
50870   }
50871
50872   function readPackedEnd(pbf) {
50873       return pbf.type === Pbf.Bytes ?
50874           pbf.readVarint() + pbf.pos : pbf.pos + 1;
50875   }
50876
50877   function toNum(low, high, isSigned) {
50878       if (isSigned) {
50879           return high * 0x100000000 + (low >>> 0);
50880       }
50881
50882       return ((high >>> 0) * 0x100000000) + (low >>> 0);
50883   }
50884
50885   function writeBigVarint(val, pbf) {
50886       var low, high;
50887
50888       if (val >= 0) {
50889           low  = (val % 0x100000000) | 0;
50890           high = (val / 0x100000000) | 0;
50891       } else {
50892           low  = ~(-val % 0x100000000);
50893           high = ~(-val / 0x100000000);
50894
50895           if (low ^ 0xffffffff) {
50896               low = (low + 1) | 0;
50897           } else {
50898               low = 0;
50899               high = (high + 1) | 0;
50900           }
50901       }
50902
50903       if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
50904           throw new Error('Given varint doesn\'t fit into 10 bytes');
50905       }
50906
50907       pbf.realloc(10);
50908
50909       writeBigVarintLow(low, high, pbf);
50910       writeBigVarintHigh(high, pbf);
50911   }
50912
50913   function writeBigVarintLow(low, high, pbf) {
50914       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
50915       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
50916       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
50917       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
50918       pbf.buf[pbf.pos]   = low & 0x7f;
50919   }
50920
50921   function writeBigVarintHigh(high, pbf) {
50922       var lsb = (high & 0x07) << 4;
50923
50924       pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
50925       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
50926       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
50927       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
50928       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
50929       pbf.buf[pbf.pos++]  = high & 0x7f;
50930   }
50931
50932   function makeRoomForExtraLength(startPos, len, pbf) {
50933       var extraLen =
50934           len <= 0x3fff ? 1 :
50935           len <= 0x1fffff ? 2 :
50936           len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
50937
50938       // if 1 byte isn't enough for encoding message length, shift the data to the right
50939       pbf.realloc(extraLen);
50940       for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
50941   }
50942
50943   function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
50944   function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
50945   function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
50946   function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
50947   function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
50948   function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
50949   function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
50950   function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
50951   function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
50952
50953   // Buffer code below from https://github.com/feross/buffer, MIT-licensed
50954
50955   function readUInt32(buf, pos) {
50956       return ((buf[pos]) |
50957           (buf[pos + 1] << 8) |
50958           (buf[pos + 2] << 16)) +
50959           (buf[pos + 3] * 0x1000000);
50960   }
50961
50962   function writeInt32(buf, val, pos) {
50963       buf[pos] = val;
50964       buf[pos + 1] = (val >>> 8);
50965       buf[pos + 2] = (val >>> 16);
50966       buf[pos + 3] = (val >>> 24);
50967   }
50968
50969   function readInt32(buf, pos) {
50970       return ((buf[pos]) |
50971           (buf[pos + 1] << 8) |
50972           (buf[pos + 2] << 16)) +
50973           (buf[pos + 3] << 24);
50974   }
50975
50976   function readUtf8(buf, pos, end) {
50977       var str = '';
50978       var i = pos;
50979
50980       while (i < end) {
50981           var b0 = buf[i];
50982           var c = null; // codepoint
50983           var bytesPerSequence =
50984               b0 > 0xEF ? 4 :
50985               b0 > 0xDF ? 3 :
50986               b0 > 0xBF ? 2 : 1;
50987
50988           if (i + bytesPerSequence > end) break;
50989
50990           var b1, b2, b3;
50991
50992           if (bytesPerSequence === 1) {
50993               if (b0 < 0x80) {
50994                   c = b0;
50995               }
50996           } else if (bytesPerSequence === 2) {
50997               b1 = buf[i + 1];
50998               if ((b1 & 0xC0) === 0x80) {
50999                   c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
51000                   if (c <= 0x7F) {
51001                       c = null;
51002                   }
51003               }
51004           } else if (bytesPerSequence === 3) {
51005               b1 = buf[i + 1];
51006               b2 = buf[i + 2];
51007               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
51008                   c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
51009                   if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
51010                       c = null;
51011                   }
51012               }
51013           } else if (bytesPerSequence === 4) {
51014               b1 = buf[i + 1];
51015               b2 = buf[i + 2];
51016               b3 = buf[i + 3];
51017               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
51018                   c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
51019                   if (c <= 0xFFFF || c >= 0x110000) {
51020                       c = null;
51021                   }
51022               }
51023           }
51024
51025           if (c === null) {
51026               c = 0xFFFD;
51027               bytesPerSequence = 1;
51028
51029           } else if (c > 0xFFFF) {
51030               c -= 0x10000;
51031               str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
51032               c = 0xDC00 | c & 0x3FF;
51033           }
51034
51035           str += String.fromCharCode(c);
51036           i += bytesPerSequence;
51037       }
51038
51039       return str;
51040   }
51041
51042   function writeUtf8(buf, str, pos) {
51043       for (var i = 0, c, lead; i < str.length; i++) {
51044           c = str.charCodeAt(i); // code point
51045
51046           if (c > 0xD7FF && c < 0xE000) {
51047               if (lead) {
51048                   if (c < 0xDC00) {
51049                       buf[pos++] = 0xEF;
51050                       buf[pos++] = 0xBF;
51051                       buf[pos++] = 0xBD;
51052                       lead = c;
51053                       continue;
51054                   } else {
51055                       c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
51056                       lead = null;
51057                   }
51058               } else {
51059                   if (c > 0xDBFF || (i + 1 === str.length)) {
51060                       buf[pos++] = 0xEF;
51061                       buf[pos++] = 0xBF;
51062                       buf[pos++] = 0xBD;
51063                   } else {
51064                       lead = c;
51065                   }
51066                   continue;
51067               }
51068           } else if (lead) {
51069               buf[pos++] = 0xEF;
51070               buf[pos++] = 0xBF;
51071               buf[pos++] = 0xBD;
51072               lead = null;
51073           }
51074
51075           if (c < 0x80) {
51076               buf[pos++] = c;
51077           } else {
51078               if (c < 0x800) {
51079                   buf[pos++] = c >> 0x6 | 0xC0;
51080               } else {
51081                   if (c < 0x10000) {
51082                       buf[pos++] = c >> 0xC | 0xE0;
51083                   } else {
51084                       buf[pos++] = c >> 0x12 | 0xF0;
51085                       buf[pos++] = c >> 0xC & 0x3F | 0x80;
51086                   }
51087                   buf[pos++] = c >> 0x6 & 0x3F | 0x80;
51088               }
51089               buf[pos++] = c & 0x3F | 0x80;
51090           }
51091       }
51092       return pos;
51093   }
51094
51095   var pointGeometry = Point;
51096
51097   /**
51098    * A standalone point geometry with useful accessor, comparison, and
51099    * modification methods.
51100    *
51101    * @class Point
51102    * @param {Number} x the x-coordinate. this could be longitude or screen
51103    * pixels, or any other sort of unit.
51104    * @param {Number} y the y-coordinate. this could be latitude or screen
51105    * pixels, or any other sort of unit.
51106    * @example
51107    * var point = new Point(-77, 38);
51108    */
51109   function Point(x, y) {
51110       this.x = x;
51111       this.y = y;
51112   }
51113
51114   Point.prototype = {
51115
51116       /**
51117        * Clone this point, returning a new point that can be modified
51118        * without affecting the old one.
51119        * @return {Point} the clone
51120        */
51121       clone: function() { return new Point(this.x, this.y); },
51122
51123       /**
51124        * Add this point's x & y coordinates to another point,
51125        * yielding a new point.
51126        * @param {Point} p the other point
51127        * @return {Point} output point
51128        */
51129       add:     function(p) { return this.clone()._add(p); },
51130
51131       /**
51132        * Subtract this point's x & y coordinates to from point,
51133        * yielding a new point.
51134        * @param {Point} p the other point
51135        * @return {Point} output point
51136        */
51137       sub:     function(p) { return this.clone()._sub(p); },
51138
51139       /**
51140        * Multiply this point's x & y coordinates by point,
51141        * yielding a new point.
51142        * @param {Point} p the other point
51143        * @return {Point} output point
51144        */
51145       multByPoint:    function(p) { return this.clone()._multByPoint(p); },
51146
51147       /**
51148        * Divide this point's x & y coordinates by point,
51149        * yielding a new point.
51150        * @param {Point} p the other point
51151        * @return {Point} output point
51152        */
51153       divByPoint:     function(p) { return this.clone()._divByPoint(p); },
51154
51155       /**
51156        * Multiply this point's x & y coordinates by a factor,
51157        * yielding a new point.
51158        * @param {Point} k factor
51159        * @return {Point} output point
51160        */
51161       mult:    function(k) { return this.clone()._mult(k); },
51162
51163       /**
51164        * Divide this point's x & y coordinates by a factor,
51165        * yielding a new point.
51166        * @param {Point} k factor
51167        * @return {Point} output point
51168        */
51169       div:     function(k) { return this.clone()._div(k); },
51170
51171       /**
51172        * Rotate this point around the 0, 0 origin by an angle a,
51173        * given in radians
51174        * @param {Number} a angle to rotate around, in radians
51175        * @return {Point} output point
51176        */
51177       rotate:  function(a) { return this.clone()._rotate(a); },
51178
51179       /**
51180        * Rotate this point around p point by an angle a,
51181        * given in radians
51182        * @param {Number} a angle to rotate around, in radians
51183        * @param {Point} p Point to rotate around
51184        * @return {Point} output point
51185        */
51186       rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
51187
51188       /**
51189        * Multiply this point by a 4x1 transformation matrix
51190        * @param {Array<Number>} m transformation matrix
51191        * @return {Point} output point
51192        */
51193       matMult: function(m) { return this.clone()._matMult(m); },
51194
51195       /**
51196        * Calculate this point but as a unit vector from 0, 0, meaning
51197        * that the distance from the resulting point to the 0, 0
51198        * coordinate will be equal to 1 and the angle from the resulting
51199        * point to the 0, 0 coordinate will be the same as before.
51200        * @return {Point} unit vector point
51201        */
51202       unit:    function() { return this.clone()._unit(); },
51203
51204       /**
51205        * Compute a perpendicular point, where the new y coordinate
51206        * is the old x coordinate and the new x coordinate is the old y
51207        * coordinate multiplied by -1
51208        * @return {Point} perpendicular point
51209        */
51210       perp:    function() { return this.clone()._perp(); },
51211
51212       /**
51213        * Return a version of this point with the x & y coordinates
51214        * rounded to integers.
51215        * @return {Point} rounded point
51216        */
51217       round:   function() { return this.clone()._round(); },
51218
51219       /**
51220        * Return the magitude of this point: this is the Euclidean
51221        * distance from the 0, 0 coordinate to this point's x and y
51222        * coordinates.
51223        * @return {Number} magnitude
51224        */
51225       mag: function() {
51226           return Math.sqrt(this.x * this.x + this.y * this.y);
51227       },
51228
51229       /**
51230        * Judge whether this point is equal to another point, returning
51231        * true or false.
51232        * @param {Point} other the other point
51233        * @return {boolean} whether the points are equal
51234        */
51235       equals: function(other) {
51236           return this.x === other.x &&
51237                  this.y === other.y;
51238       },
51239
51240       /**
51241        * Calculate the distance from this point to another point
51242        * @param {Point} p the other point
51243        * @return {Number} distance
51244        */
51245       dist: function(p) {
51246           return Math.sqrt(this.distSqr(p));
51247       },
51248
51249       /**
51250        * Calculate the distance from this point to another point,
51251        * without the square root step. Useful if you're comparing
51252        * relative distances.
51253        * @param {Point} p the other point
51254        * @return {Number} distance
51255        */
51256       distSqr: function(p) {
51257           var dx = p.x - this.x,
51258               dy = p.y - this.y;
51259           return dx * dx + dy * dy;
51260       },
51261
51262       /**
51263        * Get the angle from the 0, 0 coordinate to this point, in radians
51264        * coordinates.
51265        * @return {Number} angle
51266        */
51267       angle: function() {
51268           return Math.atan2(this.y, this.x);
51269       },
51270
51271       /**
51272        * Get the angle from this point to another point, in radians
51273        * @param {Point} b the other point
51274        * @return {Number} angle
51275        */
51276       angleTo: function(b) {
51277           return Math.atan2(this.y - b.y, this.x - b.x);
51278       },
51279
51280       /**
51281        * Get the angle between this point and another point, in radians
51282        * @param {Point} b the other point
51283        * @return {Number} angle
51284        */
51285       angleWith: function(b) {
51286           return this.angleWithSep(b.x, b.y);
51287       },
51288
51289       /*
51290        * Find the angle of the two vectors, solving the formula for
51291        * the cross product a x b = |a||b|sin(θ) for θ.
51292        * @param {Number} x the x-coordinate
51293        * @param {Number} y the y-coordinate
51294        * @return {Number} the angle in radians
51295        */
51296       angleWithSep: function(x, y) {
51297           return Math.atan2(
51298               this.x * y - this.y * x,
51299               this.x * x + this.y * y);
51300       },
51301
51302       _matMult: function(m) {
51303           var x = m[0] * this.x + m[1] * this.y,
51304               y = m[2] * this.x + m[3] * this.y;
51305           this.x = x;
51306           this.y = y;
51307           return this;
51308       },
51309
51310       _add: function(p) {
51311           this.x += p.x;
51312           this.y += p.y;
51313           return this;
51314       },
51315
51316       _sub: function(p) {
51317           this.x -= p.x;
51318           this.y -= p.y;
51319           return this;
51320       },
51321
51322       _mult: function(k) {
51323           this.x *= k;
51324           this.y *= k;
51325           return this;
51326       },
51327
51328       _div: function(k) {
51329           this.x /= k;
51330           this.y /= k;
51331           return this;
51332       },
51333
51334       _multByPoint: function(p) {
51335           this.x *= p.x;
51336           this.y *= p.y;
51337           return this;
51338       },
51339
51340       _divByPoint: function(p) {
51341           this.x /= p.x;
51342           this.y /= p.y;
51343           return this;
51344       },
51345
51346       _unit: function() {
51347           this._div(this.mag());
51348           return this;
51349       },
51350
51351       _perp: function() {
51352           var y = this.y;
51353           this.y = this.x;
51354           this.x = -y;
51355           return this;
51356       },
51357
51358       _rotate: function(angle) {
51359           var cos = Math.cos(angle),
51360               sin = Math.sin(angle),
51361               x = cos * this.x - sin * this.y,
51362               y = sin * this.x + cos * this.y;
51363           this.x = x;
51364           this.y = y;
51365           return this;
51366       },
51367
51368       _rotateAround: function(angle, p) {
51369           var cos = Math.cos(angle),
51370               sin = Math.sin(angle),
51371               x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
51372               y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
51373           this.x = x;
51374           this.y = y;
51375           return this;
51376       },
51377
51378       _round: function() {
51379           this.x = Math.round(this.x);
51380           this.y = Math.round(this.y);
51381           return this;
51382       }
51383   };
51384
51385   /**
51386    * Construct a point from an array if necessary, otherwise if the input
51387    * is already a Point, or an unknown type, return it unchanged
51388    * @param {Array<Number>|Point|*} a any kind of input value
51389    * @return {Point} constructed point, or passed-through value.
51390    * @example
51391    * // this
51392    * var point = Point.convert([0, 1]);
51393    * // is equivalent to
51394    * var point = new Point(0, 1);
51395    */
51396   Point.convert = function (a) {
51397       if (a instanceof Point) {
51398           return a;
51399       }
51400       if (Array.isArray(a)) {
51401           return new Point(a[0], a[1]);
51402       }
51403       return a;
51404   };
51405
51406   var pointGeometry$1 = /*#__PURE__*/Object.freeze({
51407     default: pointGeometry,
51408     __moduleExports: pointGeometry
51409   });
51410
51411   var Point$1 = ( pointGeometry$1 && pointGeometry ) || pointGeometry$1;
51412
51413   var vectortilefeature = VectorTileFeature;
51414
51415   function VectorTileFeature(pbf, end, extent, keys, values) {
51416       // Public
51417       this.properties = {};
51418       this.extent = extent;
51419       this.type = 0;
51420
51421       // Private
51422       this._pbf = pbf;
51423       this._geometry = -1;
51424       this._keys = keys;
51425       this._values = values;
51426
51427       pbf.readFields(readFeature, this, end);
51428   }
51429
51430   function readFeature(tag, feature, pbf) {
51431       if (tag == 1) feature.id = pbf.readVarint();
51432       else if (tag == 2) readTag(pbf, feature);
51433       else if (tag == 3) feature.type = pbf.readVarint();
51434       else if (tag == 4) feature._geometry = pbf.pos;
51435   }
51436
51437   function readTag(pbf, feature) {
51438       var end = pbf.readVarint() + pbf.pos;
51439
51440       while (pbf.pos < end) {
51441           var key = feature._keys[pbf.readVarint()],
51442               value = feature._values[pbf.readVarint()];
51443           feature.properties[key] = value;
51444       }
51445   }
51446
51447   VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
51448
51449   VectorTileFeature.prototype.loadGeometry = function() {
51450       var pbf = this._pbf;
51451       pbf.pos = this._geometry;
51452
51453       var end = pbf.readVarint() + pbf.pos,
51454           cmd = 1,
51455           length = 0,
51456           x = 0,
51457           y = 0,
51458           lines = [],
51459           line;
51460
51461       while (pbf.pos < end) {
51462           if (length <= 0) {
51463               var cmdLen = pbf.readVarint();
51464               cmd = cmdLen & 0x7;
51465               length = cmdLen >> 3;
51466           }
51467
51468           length--;
51469
51470           if (cmd === 1 || cmd === 2) {
51471               x += pbf.readSVarint();
51472               y += pbf.readSVarint();
51473
51474               if (cmd === 1) { // moveTo
51475                   if (line) lines.push(line);
51476                   line = [];
51477               }
51478
51479               line.push(new Point$1(x, y));
51480
51481           } else if (cmd === 7) {
51482
51483               // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
51484               if (line) {
51485                   line.push(line[0].clone()); // closePolygon
51486               }
51487
51488           } else {
51489               throw new Error('unknown command ' + cmd);
51490           }
51491       }
51492
51493       if (line) lines.push(line);
51494
51495       return lines;
51496   };
51497
51498   VectorTileFeature.prototype.bbox = function() {
51499       var pbf = this._pbf;
51500       pbf.pos = this._geometry;
51501
51502       var end = pbf.readVarint() + pbf.pos,
51503           cmd = 1,
51504           length = 0,
51505           x = 0,
51506           y = 0,
51507           x1 = Infinity,
51508           x2 = -Infinity,
51509           y1 = Infinity,
51510           y2 = -Infinity;
51511
51512       while (pbf.pos < end) {
51513           if (length <= 0) {
51514               var cmdLen = pbf.readVarint();
51515               cmd = cmdLen & 0x7;
51516               length = cmdLen >> 3;
51517           }
51518
51519           length--;
51520
51521           if (cmd === 1 || cmd === 2) {
51522               x += pbf.readSVarint();
51523               y += pbf.readSVarint();
51524               if (x < x1) x1 = x;
51525               if (x > x2) x2 = x;
51526               if (y < y1) y1 = y;
51527               if (y > y2) y2 = y;
51528
51529           } else if (cmd !== 7) {
51530               throw new Error('unknown command ' + cmd);
51531           }
51532       }
51533
51534       return [x1, y1, x2, y2];
51535   };
51536
51537   VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
51538       var size = this.extent * Math.pow(2, z),
51539           x0 = this.extent * x,
51540           y0 = this.extent * y,
51541           coords = this.loadGeometry(),
51542           type = VectorTileFeature.types[this.type],
51543           i, j;
51544
51545       function project(line) {
51546           for (var j = 0; j < line.length; j++) {
51547               var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
51548               line[j] = [
51549                   (p.x + x0) * 360 / size - 180,
51550                   360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
51551               ];
51552           }
51553       }
51554
51555       switch (this.type) {
51556       case 1:
51557           var points = [];
51558           for (i = 0; i < coords.length; i++) {
51559               points[i] = coords[i][0];
51560           }
51561           coords = points;
51562           project(coords);
51563           break;
51564
51565       case 2:
51566           for (i = 0; i < coords.length; i++) {
51567               project(coords[i]);
51568           }
51569           break;
51570
51571       case 3:
51572           coords = classifyRings(coords);
51573           for (i = 0; i < coords.length; i++) {
51574               for (j = 0; j < coords[i].length; j++) {
51575                   project(coords[i][j]);
51576               }
51577           }
51578           break;
51579       }
51580
51581       if (coords.length === 1) {
51582           coords = coords[0];
51583       } else {
51584           type = 'Multi' + type;
51585       }
51586
51587       var result = {
51588           type: "Feature",
51589           geometry: {
51590               type: type,
51591               coordinates: coords
51592           },
51593           properties: this.properties
51594       };
51595
51596       if ('id' in this) {
51597           result.id = this.id;
51598       }
51599
51600       return result;
51601   };
51602
51603   // classifies an array of rings into polygons with outer rings and holes
51604
51605   function classifyRings(rings) {
51606       var len = rings.length;
51607
51608       if (len <= 1) return [rings];
51609
51610       var polygons = [],
51611           polygon,
51612           ccw;
51613
51614       for (var i = 0; i < len; i++) {
51615           var area = signedArea(rings[i]);
51616           if (area === 0) continue;
51617
51618           if (ccw === undefined) ccw = area < 0;
51619
51620           if (ccw === area < 0) {
51621               if (polygon) polygons.push(polygon);
51622               polygon = [rings[i]];
51623
51624           } else {
51625               polygon.push(rings[i]);
51626           }
51627       }
51628       if (polygon) polygons.push(polygon);
51629
51630       return polygons;
51631   }
51632
51633   function signedArea(ring) {
51634       var sum = 0;
51635       for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
51636           p1 = ring[i];
51637           p2 = ring[j];
51638           sum += (p2.x - p1.x) * (p1.y + p2.y);
51639       }
51640       return sum;
51641   }
51642
51643   var vectortilelayer = VectorTileLayer;
51644
51645   function VectorTileLayer(pbf, end) {
51646       // Public
51647       this.version = 1;
51648       this.name = null;
51649       this.extent = 4096;
51650       this.length = 0;
51651
51652       // Private
51653       this._pbf = pbf;
51654       this._keys = [];
51655       this._values = [];
51656       this._features = [];
51657
51658       pbf.readFields(readLayer, this, end);
51659
51660       this.length = this._features.length;
51661   }
51662
51663   function readLayer(tag, layer, pbf) {
51664       if (tag === 15) layer.version = pbf.readVarint();
51665       else if (tag === 1) layer.name = pbf.readString();
51666       else if (tag === 5) layer.extent = pbf.readVarint();
51667       else if (tag === 2) layer._features.push(pbf.pos);
51668       else if (tag === 3) layer._keys.push(pbf.readString());
51669       else if (tag === 4) layer._values.push(readValueMessage(pbf));
51670   }
51671
51672   function readValueMessage(pbf) {
51673       var value = null,
51674           end = pbf.readVarint() + pbf.pos;
51675
51676       while (pbf.pos < end) {
51677           var tag = pbf.readVarint() >> 3;
51678
51679           value = tag === 1 ? pbf.readString() :
51680               tag === 2 ? pbf.readFloat() :
51681               tag === 3 ? pbf.readDouble() :
51682               tag === 4 ? pbf.readVarint64() :
51683               tag === 5 ? pbf.readVarint() :
51684               tag === 6 ? pbf.readSVarint() :
51685               tag === 7 ? pbf.readBoolean() : null;
51686       }
51687
51688       return value;
51689   }
51690
51691   // return feature `i` from this layer as a `VectorTileFeature`
51692   VectorTileLayer.prototype.feature = function(i) {
51693       if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
51694
51695       this._pbf.pos = this._features[i];
51696
51697       var end = this._pbf.readVarint() + this._pbf.pos;
51698       return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
51699   };
51700
51701   var vectortile = VectorTile;
51702
51703   function VectorTile(pbf, end) {
51704       this.layers = pbf.readFields(readTile, {}, end);
51705   }
51706
51707   function readTile(tag, layers, pbf) {
51708       if (tag === 3) {
51709           var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
51710           if (layer.length) layers[layer.name] = layer;
51711       }
51712   }
51713
51714   var VectorTile$1 = vectortile;
51715   var VectorTileFeature$1 = vectortilefeature;
51716   var VectorTileLayer$1 = vectortilelayer;
51717
51718   var vectorTile = {
51719         VectorTile: VectorTile$1,
51720         VectorTileFeature: VectorTileFeature$1,
51721         VectorTileLayer: VectorTileLayer$1
51722   };
51723
51724   var tiler$4 = utilTiler().tileSize(512).margin(1);
51725   var dispatch$5 = dispatch('loadedData');
51726   var _vtCache;
51727
51728
51729   function abortRequest$4(i) {
51730       i.abort();
51731   }
51732
51733
51734   function vtToGeoJSON(data, tile, mergeCache) {
51735       var vectorTile$$1 = new vectorTile.VectorTile(new pbf(data.response));
51736       var layers = Object.keys(vectorTile$$1.layers);
51737       if (!Array.isArray(layers)) { layers = [layers]; }
51738
51739       var features = [];
51740       layers.forEach(function(layerID) {
51741           var layer = vectorTile$$1.layers[layerID];
51742           if (layer) {
51743               for (var i = 0; i < layer.length; i++) {
51744                   var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
51745                   var geometry = feature.geometry;
51746
51747                   // Treat all Polygons as MultiPolygons
51748                   if (geometry.type === 'Polygon') {
51749                       geometry.type = 'MultiPolygon';
51750                       geometry.coordinates = [geometry.coordinates];
51751                   }
51752
51753                   // Clip to tile bounds
51754                   if (geometry.type === 'MultiPolygon') {
51755                       var isClipped = false;
51756                       var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
51757                       if (!isEqual(feature.geometry, featureClip.geometry)) {
51758                           // feature = featureClip;
51759                           isClipped = true;
51760                       }
51761                       if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
51762                       if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
51763                   }
51764
51765                   // Generate some unique IDs and add some metadata
51766                   var featurehash = utilHashcode(fastJsonStableStringify(feature));
51767                   var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
51768                   feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
51769                   feature.__featurehash__ = featurehash;
51770                   feature.__propertyhash__ = propertyhash;
51771                   features.push(feature);
51772
51773                   // Clipped Polygons at same zoom with identical properties can get merged
51774                   if (isClipped && geometry.type === 'MultiPolygon') {
51775                       var merged = mergeCache[propertyhash];
51776                       if (merged && merged.length) {
51777                           var other = merged[0];
51778                           var coords = martinez.union(
51779                               feature.geometry.coordinates, other.geometry.coordinates
51780                           );
51781
51782                           if (!coords || !coords.length) {
51783                               continue;  // something failed in martinez union
51784                           }
51785
51786                           merged.push(feature);
51787                           for (var j = 0; j < merged.length; j++) {      // all these features get...
51788                               merged[j].geometry.coordinates = coords;   // same coords
51789                               merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
51790                           }
51791                       } else {
51792                           mergeCache[propertyhash] = [feature];
51793                       }
51794                   }
51795               }
51796           }
51797       });
51798
51799       return features;
51800   }
51801
51802
51803   function loadTile(source, tile) {
51804       if (source.loaded[tile.id] || source.inflight[tile.id]) return;
51805
51806       var url = source.template
51807           .replace('{x}', tile.xyz[0])
51808           .replace('{y}', tile.xyz[1])
51809           // TMS-flipped y coordinate
51810           .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
51811           .replace(/\{z(oom)?\}/, tile.xyz[2])
51812           .replace(/\{switch:([^}]+)\}/, function(s, r) {
51813               var subdomains = r.split(',');
51814               return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
51815           });
51816
51817       source.inflight[tile.id] = request(url)
51818           .responseType('arraybuffer')
51819           .get(function(err, data) {
51820               source.loaded[tile.id] = [];
51821               delete source.inflight[tile.id];
51822               if (err || !data) return;
51823
51824               var z = tile.xyz[2];
51825               if (!source.canMerge[z]) {
51826                   source.canMerge[z] = {};  // initialize mergeCache
51827               }
51828
51829               source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
51830               dispatch$5.call('loadedData');
51831           });
51832   }
51833
51834
51835   var serviceVectorTile = {
51836
51837       init: function() {
51838           if (!_vtCache) {
51839               this.reset();
51840           }
51841
51842           this.event = utilRebind(this, dispatch$5, 'on');
51843       },
51844
51845
51846       reset: function() {
51847           for (var sourceID in _vtCache) {
51848               var source = _vtCache[sourceID];
51849               if (source && source.inflight) {
51850                   forEach(source.inflight, abortRequest$4);
51851               }
51852           }
51853
51854           _vtCache = {};
51855       },
51856
51857
51858       addSource: function(sourceID, template) {
51859           _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
51860           return _vtCache[sourceID];
51861       },
51862
51863
51864       data: function(sourceID, projection) {
51865           var source = _vtCache[sourceID];
51866           if (!source) return [];
51867
51868           var tiles = tiler$4.getTiles(projection);
51869           var seen = {};
51870           var results = [];
51871
51872           for (var i = 0; i < tiles.length; i++) {
51873               var features = source.loaded[tiles[i].id];
51874               if (!features || !features.length) continue;
51875
51876               for (var j = 0; j < features.length; j++) {
51877                   var feature = features[j];
51878                   var hash = feature.__featurehash__;
51879                   if (seen[hash]) continue;
51880                   seen[hash] = true;
51881
51882                   // return a shallow clone, because the hash may change
51883                   // later if this feature gets merged with another
51884                   results.push(clone(feature));
51885               }
51886           }
51887
51888           return results;
51889       },
51890
51891
51892       loadTiles: function(sourceID, template, projection) {
51893           var source = _vtCache[sourceID];
51894           if (!source) {
51895               source = this.addSource(sourceID, template);
51896           }
51897
51898           var tiles = tiler$4.getTiles(projection);
51899
51900           // abort inflight requests that are no longer needed
51901           forEach(source.inflight, function(v, k) {
51902               var wanted = find$1(tiles, function(tile) { return k === tile.id; });
51903
51904               if (!wanted) {
51905                   abortRequest$4(v);
51906                   delete source.inflight[k];
51907               }
51908           });
51909
51910           tiles.forEach(function(tile) {
51911               loadTile(source, tile);
51912           });
51913       },
51914
51915
51916       cache: function() {
51917           return _vtCache;
51918       }
51919
51920   };
51921
51922   var endpoint = 'https://www.wikidata.org/w/api.php?';
51923
51924   var serviceWikidata = {
51925
51926       init: function() {},
51927       reset: function() {},
51928
51929
51930       // Given a Wikipedia language and article title, return an array of
51931       // corresponding Wikidata entities.
51932       itemsByTitle: function(lang, title, callback) {
51933           if (!title) {
51934               callback('', {});
51935               return;
51936           }
51937
51938           lang = lang || 'en';
51939           d3_json(endpoint + utilQsString({
51940               action: 'wbgetentities',
51941               format: 'json',
51942               sites: lang.replace(/-/g, '_') + 'wiki',
51943               titles: title,
51944               languages: 'en', // shrink response by filtering to one language
51945               origin: '*'
51946           }), function(err, data) {
51947               if (err || !data || data.error) {
51948                   callback('', {});
51949               } else {
51950                   callback(title, data.entities || {});
51951               }
51952           });
51953       }
51954
51955   };
51956
51957   var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
51958
51959   var serviceWikipedia = {
51960
51961       init: function() {},
51962       reset: function() {},
51963
51964
51965       search: function(lang, query, callback) {
51966           if (!query) {
51967               callback('', []);
51968               return;
51969           }
51970
51971           lang = lang || 'en';
51972           d3_json(endpoint$1.replace('en', lang) +
51973               utilQsString({
51974                   action: 'query',
51975                   list: 'search',
51976                   srlimit: '10',
51977                   srinfo: 'suggestion',
51978                   format: 'json',
51979                   origin: '*',
51980                   srsearch: query
51981               }), function(err, data) {
51982                   if (err || !data || !data.query || !data.query.search || data.error) {
51983                       callback('', []);
51984                   } else {
51985                       var results = data.query.search.map(function(d) { return d.title; });
51986                       callback(query, results);
51987                   }
51988               }
51989           );
51990       },
51991
51992
51993       suggestions: function(lang, query, callback) {
51994           if (!query) {
51995               callback('', []);
51996               return;
51997           }
51998
51999           lang = lang || 'en';
52000           d3_json(endpoint$1.replace('en', lang) +
52001               utilQsString({
52002                   action: 'opensearch',
52003                   namespace: 0,
52004                   suggest: '',
52005                   format: 'json',
52006                   origin: '*',
52007                   search: query
52008               }), function(err, data) {
52009                   if (err || !data || data.error) {
52010                       callback('', []);
52011                   } else {
52012                       callback(data[0], data[1] || []);
52013                   }
52014               }
52015           );
52016       },
52017
52018
52019       translations: function(lang, title, callback) {
52020           if (!title) {
52021               callback({});
52022               return;
52023           }
52024
52025           d3_json(endpoint$1.replace('en', lang) +
52026               utilQsString({
52027                   action: 'query',
52028                   prop: 'langlinks',
52029                   format: 'json',
52030                   origin: '*',
52031                   lllimit: 500,
52032                   titles: title
52033               }), function(err, data) {
52034                   if (err || !data || !data.query || !data.query.pages || data.error) {
52035                       callback({});
52036                   } else {
52037                       var list = data.query.pages[Object.keys(data.query.pages)[0]],
52038                           translations = {};
52039                       if (list && list.langlinks) {
52040                           list.langlinks.forEach(function(d) {
52041                               translations[d.lang] = d['*'];
52042                           });
52043                       }
52044                       callback(translations);
52045                   }
52046               }
52047           );
52048       }
52049
52050   };
52051
52052   var services = {
52053       geocoder: serviceNominatim,
52054       mapillary: serviceMapillary,
52055       openstreetcam: serviceOpenstreetcam,
52056       osm: serviceOsm,
52057       streetside: serviceStreetside,
52058       taginfo: serviceTaginfo,
52059       vectorTile: serviceVectorTile,
52060       wikidata: serviceWikidata,
52061       wikipedia: serviceWikipedia
52062   };
52063
52064   function modeAddNote$$1(context) {
52065
52066       var mode = {
52067           id: 'add-note',
52068           button: 'note',
52069           title: t('modes.add_note.title'),
52070           description: t('modes.add_note.description'),
52071           key: '4'
52072       };
52073
52074       var behavior = behaviorDraw(context)
52075           .tail(t('modes.add_note.tail'))
52076           .on('click', add)
52077           .on('cancel', cancel)
52078           .on('finish', cancel);
52079
52080
52081       function add(loc) {
52082           var osm = services.osm;
52083           if (!osm) return;
52084
52085           var note = osmNote({ loc: loc, status: 'open', comments: [] });
52086           osm.replaceNote(note);
52087
52088           // force a reraw (there is no history change that would otherwise do this)
52089           context.pan([0,0]);
52090
52091           context
52092               .selectedNoteID(note.id)
52093               .enter(modeSelectNote$$1(context, note.id).newFeature(true));
52094       }
52095
52096
52097       function cancel() {
52098           context.enter(modeBrowse(context));
52099       }
52100
52101
52102       mode.enter = function() {
52103           context.install(behavior);
52104       };
52105
52106
52107       mode.exit = function() {
52108           context.uninstall(behavior);
52109       };
52110
52111
52112       return mode;
52113   }
52114
52115   function modeDragNode$$1(context) {
52116       var mode = {
52117           id: 'drag-node',
52118           button: 'browse'
52119       };
52120       var hover = behaviorHover(context).altDisables(true)
52121           .on('hover', context.ui().sidebar.hover);
52122       var edit = behaviorEdit(context);
52123
52124       var _nudgeInterval;
52125       var _restoreSelectedIDs = [];
52126       var _wasMidpoint = false;
52127       var _isCancelled = false;
52128       var _activeEntity;
52129       var _startLoc;
52130       var _lastLoc;
52131
52132
52133       function startNudge(entity, nudge) {
52134           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
52135           _nudgeInterval = window.setInterval(function() {
52136               context.pan(nudge);
52137               doMove(entity, nudge);
52138           }, 50);
52139       }
52140
52141
52142       function stopNudge() {
52143           if (_nudgeInterval) {
52144               window.clearInterval(_nudgeInterval);
52145               _nudgeInterval = null;
52146           }
52147       }
52148
52149
52150       function moveAnnotation(entity) {
52151           return t('operations.move.annotation.' + entity.geometry(context.graph()));
52152       }
52153
52154
52155       function connectAnnotation(entity) {
52156           return t('operations.connect.annotation.' + entity.geometry(context.graph()));
52157       }
52158
52159
52160       function origin(entity) {
52161           return context.projection(entity.loc);
52162       }
52163
52164
52165       function keydown() {
52166           if (event.keyCode === d3keybinding.modifierCodes.alt) {
52167               if (context.surface().classed('nope')) {
52168                   context.surface()
52169                       .classed('nope-suppressed', true);
52170               }
52171               context.surface()
52172                   .classed('nope', false)
52173                   .classed('nope-disabled', true);
52174           }
52175       }
52176
52177
52178       function keyup() {
52179           if (event.keyCode === d3keybinding.modifierCodes.alt) {
52180               if (context.surface().classed('nope-suppressed')) {
52181                   context.surface()
52182                       .classed('nope', true);
52183               }
52184               context.surface()
52185                   .classed('nope-suppressed', false)
52186                   .classed('nope-disabled', false);
52187           }
52188       }
52189
52190
52191       function start(entity) {
52192           _wasMidpoint = entity.type === 'midpoint';
52193           var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
52194           _isCancelled = event.sourceEvent.shiftKey || hasHidden;
52195
52196
52197           if (_isCancelled) {
52198               if (hasHidden) {
52199                   uiFlash()
52200                       .duration(4000)
52201                       .text(t('modes.drag_node.connected_to_hidden'))();
52202               }
52203               return drag.cancel();
52204           }
52205
52206           if (_wasMidpoint) {
52207               var midpoint = entity;
52208               entity = osmNode();
52209               context.perform(actionAddMidpoint(midpoint, entity));
52210               entity = context.entity(entity.id);   // get post-action entity
52211
52212               var vertex = context.surface().selectAll('.' + entity.id);
52213               drag.target(vertex.node(), entity);
52214
52215           } else {
52216               context.perform(actionNoop());
52217           }
52218
52219           _activeEntity = entity;
52220           _startLoc = entity.loc;
52221
52222           context.surface().selectAll('.' + _activeEntity.id)
52223               .classed('active', true);
52224
52225           context.enter(mode);
52226       }
52227
52228
52229       // related code
52230       // - `behavior/draw.js` `datum()`
52231       function datum() {
52232           var event$$1 = event && event.sourceEvent;
52233           if (!event$$1 || event$$1.altKey) {
52234               return {};
52235           } else {
52236               // When dragging, snap only to touch targets..
52237               // (this excludes area fills and active drawing elements)
52238               var d = event$$1.target.__data__;
52239               return (d && d.properties && d.properties.target) ? d : {};
52240           }
52241       }
52242
52243
52244       function doMove(entity, nudge) {
52245           nudge = nudge || [0, 0];
52246
52247           var currPoint = (event && event.point) || context.projection(_lastLoc);
52248           var currMouse = geoVecSubtract(currPoint, nudge);
52249           var loc = context.projection.invert(currMouse);
52250
52251           if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
52252               // related code
52253               // - `mode/drag_node.js`     `doMode()`
52254               // - `behavior/draw.js`      `click()`
52255               // - `behavior/draw_way.js`  `move()`
52256               var d = datum();
52257               var target = d && d.properties && d.properties.entity;
52258               var targetLoc = target && target.loc;
52259               var targetNodes = d && d.properties && d.properties.nodes;
52260               var edge;
52261
52262               if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
52263                   loc = targetLoc;
52264
52265               } else if (targetNodes) {   // snap to way - a line target with `.nodes`
52266                   edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
52267                   if (edge) {
52268                       loc = edge.loc;
52269                   }
52270               }
52271           }
52272
52273           context.replace(
52274               actionMoveNode(entity.id, loc),
52275               moveAnnotation(entity)
52276           );
52277
52278           // Below here: validations
52279           var isInvalid = false;
52280
52281           // Check if this connection to `target` could cause relations to break..
52282           if (target) {
52283               isInvalid = hasRelationConflict(entity, target, edge, context.graph());
52284           }
52285
52286           // Check if this drag causes the geometry to break..
52287           if (!isInvalid) {
52288               isInvalid = hasInvalidGeometry(entity, context.graph());
52289           }
52290
52291
52292           var nope = context.surface().classed('nope');
52293           if (isInvalid === 'relation' || isInvalid === 'restriction') {
52294               if (!nope) {   // about to nope - show hint
52295                   uiFlash()
52296                       .duration(4000)
52297                       .text(t('operations.connect.' + isInvalid,
52298                           { relation: context.presets().item('type/restriction').name() }
52299                       ))();
52300               }
52301           } else {
52302               if (nope) {   // about to un-nope, remove hint
52303                   uiFlash()
52304                       .duration(1)
52305                       .text('')();
52306               }
52307           }
52308
52309
52310           var nopeDisabled = context.surface().classed('nope-disabled');
52311           if (nopeDisabled) {
52312               context.surface()
52313                   .classed('nope', false)
52314                   .classed('nope-suppressed', isInvalid);
52315           } else {
52316               context.surface()
52317                   .classed('nope', isInvalid)
52318                   .classed('nope-suppressed', false);
52319           }
52320
52321           _lastLoc = loc;
52322       }
52323
52324
52325       // Uses `actionConnect.disabled()` to know whether this connection is ok..
52326       function hasRelationConflict(entity, target, edge, graph) {
52327           var testGraph = graph.update();  // copy
52328
52329           // if snapping to way - add midpoint there and consider that the target..
52330           if (edge) {
52331               var midpoint = osmNode();
52332               var action = actionAddMidpoint({
52333                   loc: edge.loc,
52334                   edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
52335               }, midpoint);
52336
52337               testGraph = action(testGraph);
52338               target = midpoint;
52339           }
52340
52341           // can we connect to it?
52342           var ids = [entity.id, target.id];
52343           return actionConnect(ids).disabled(testGraph);
52344       }
52345
52346
52347       function hasInvalidGeometry(entity, graph) {
52348           var parents = graph.parentWays(entity);
52349           var i, j, k;
52350
52351           for (i = 0; i < parents.length; i++) {
52352               var parent = parents[i];
52353               var nodes = [];
52354               var activeIndex = null;    // which multipolygon ring contains node being dragged
52355
52356               // test any parent multipolygons for valid geometry
52357               var relations = graph.parentRelations(parent);
52358               for (j = 0; j < relations.length; j++) {
52359                   if (!relations[j].isMultipolygon()) continue;
52360
52361                   var rings = osmJoinWays(relations[j].members, graph);
52362
52363                   // find active ring and test it for self intersections
52364                   for (k = 0; k < rings.length; k++) {
52365                       nodes = rings[k].nodes;
52366                       if (find$1(nodes, function(n) { return n.id === entity.id; })) {
52367                           activeIndex = k;
52368                           if (geoHasSelfIntersections(nodes, entity.id)) {
52369                               return true;
52370                           }
52371                       }
52372                       rings[k].coords = nodes.map(function(n) { return n.loc; });
52373                   }
52374
52375                   // test active ring for intersections with other rings in the multipolygon
52376                   for (k = 0; k < rings.length; k++) {
52377                       if (k === activeIndex) continue;
52378
52379                       // make sure active ring doesnt cross passive rings
52380                       if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
52381                           return true;
52382                       }
52383                   }
52384               }
52385
52386
52387               // If we still haven't tested this node's parent way for self-intersections.
52388               // (because it's not a member of a multipolygon), test it now.
52389               if (activeIndex === null) {
52390                   nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
52391                   if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
52392                       return true;
52393                   }
52394               }
52395
52396           }
52397
52398           return false;
52399       }
52400
52401
52402       function move(entity) {
52403           if (_isCancelled) return;
52404           event.sourceEvent.stopPropagation();
52405
52406           context.surface().classed('nope-disabled', event.sourceEvent.altKey);
52407
52408           _lastLoc = context.projection.invert(event.point);
52409
52410           doMove(entity);
52411           var nudge = geoViewportEdge(event.point, context.map().dimensions());
52412           if (nudge) {
52413               startNudge(entity, nudge);
52414           } else {
52415               stopNudge();
52416           }
52417       }
52418
52419
52420       function end(entity) {
52421           if (_isCancelled) return;
52422
52423           var d = datum();
52424           var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
52425           var target = d && d.properties && d.properties.entity;   // entity to snap to
52426
52427           if (nope) {   // bounce back
52428               context.perform(
52429                   _actionBounceBack(entity.id, _startLoc)
52430               );
52431
52432           } else if (target && target.type === 'way') {
52433               var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
52434               context.replace(
52435                   actionAddMidpoint({
52436                       loc: choice.loc,
52437                       edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
52438                   }, entity),
52439                   connectAnnotation(target)
52440               );
52441
52442           } else if (target && target.type === 'node') {
52443               context.replace(
52444                   actionConnect([target.id, entity.id]),
52445                   connectAnnotation(target)
52446               );
52447
52448           } else if (_wasMidpoint) {
52449               context.replace(
52450                   actionNoop(),
52451                   t('operations.add.annotation.vertex')
52452               );
52453
52454           } else {
52455               context.replace(
52456                   actionNoop(),
52457                   moveAnnotation(entity)
52458               );
52459           }
52460
52461           var reselection = _restoreSelectedIDs.filter(function(id) {
52462               return context.graph().hasEntity(id);
52463           });
52464
52465           if (reselection.length) {
52466               context.enter(modeSelect(context, reselection));
52467           } else {
52468               context.enter(modeBrowse(context));
52469           }
52470       }
52471
52472
52473       function _actionBounceBack(nodeID, toLoc) {
52474           var moveNode = actionMoveNode(nodeID, toLoc);
52475           var action = function(graph, t$$1) {
52476               // last time through, pop off the bounceback perform.
52477               // it will then overwrite the initial perform with a moveNode that does nothing
52478               if (t$$1 === 1) context.pop();
52479               return moveNode(graph, t$$1);
52480           };
52481           action.transitionable = true;
52482           return action;
52483       }
52484
52485
52486       function cancel() {
52487           drag.cancel();
52488           context.enter(modeBrowse(context));
52489       }
52490
52491
52492       var drag = behaviorDrag()
52493           .selector('.layer-points-targets .target')
52494           .surface(select('#map').node())
52495           .origin(origin)
52496           .on('start', start)
52497           .on('move', move)
52498           .on('end', end);
52499
52500
52501       mode.enter = function() {
52502           context.install(hover);
52503           context.install(edit);
52504
52505           select(window)
52506               .on('keydown.drawWay', keydown)
52507               .on('keyup.drawWay', keyup);
52508
52509           context.history()
52510               .on('undone.drag-node', cancel);
52511       };
52512
52513
52514       mode.exit = function() {
52515           context.ui().sidebar.hover.cancel();
52516           context.uninstall(hover);
52517           context.uninstall(edit);
52518
52519           select(window)
52520               .on('keydown.hover', null)
52521               .on('keyup.hover', null);
52522
52523           context.history()
52524               .on('undone.drag-node', null);
52525
52526           _activeEntity = null;
52527
52528           context.surface()
52529               .classed('nope', false)
52530               .classed('nope-suppressed', false)
52531               .classed('nope-disabled', false)
52532               .selectAll('.active')
52533               .classed('active', false);
52534
52535           stopNudge();
52536       };
52537
52538
52539       mode.selectedIDs = function() {
52540           if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
52541           // no assign
52542           return mode;
52543       };
52544
52545
52546       mode.activeID = function() {
52547           if (!arguments.length) return _activeEntity && _activeEntity.id;
52548           // no assign
52549           return mode;
52550       };
52551
52552
52553       mode.restoreSelectedIDs = function(_) {
52554           if (!arguments.length) return _restoreSelectedIDs;
52555           _restoreSelectedIDs = _;
52556           return mode;
52557       };
52558
52559
52560       mode.behavior = drag;
52561
52562
52563       return mode;
52564   }
52565
52566   function modeDragNote$$1(context) {
52567       var mode = {
52568           id: 'drag-note',
52569           button: 'browse'
52570       };
52571
52572       var edit = behaviorEdit(context);
52573
52574       var _nudgeInterval;
52575       var _lastLoc;
52576
52577
52578       function startNudge(note, nudge) {
52579           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
52580           _nudgeInterval = window.setInterval(function() {
52581               context.pan(nudge);
52582               doMove(note, nudge);
52583           }, 50);
52584       }
52585
52586
52587       function stopNudge() {
52588           if (_nudgeInterval) {
52589               window.clearInterval(_nudgeInterval);
52590               _nudgeInterval = null;
52591           }
52592       }
52593
52594
52595       function origin(note) {
52596           return context.projection(note.loc);
52597       }
52598
52599
52600       function start(note) {
52601           context.surface().selectAll('.note-' + note.id)
52602               .classed('active', true);
52603
52604           context.perform(actionNoop());
52605           context.enter(mode);
52606           context.selectedNoteID(note.id);
52607       }
52608
52609
52610       function move(note) {
52611           event.sourceEvent.stopPropagation();
52612           _lastLoc = context.projection.invert(event.point);
52613
52614           doMove(note);
52615           var nudge = geoViewportEdge(event.point, context.map().dimensions());
52616           if (nudge) {
52617               startNudge(note, nudge);
52618           } else {
52619               stopNudge();
52620           }
52621       }
52622
52623
52624       function doMove(note, nudge) {
52625           nudge = nudge || [0, 0];
52626
52627           var currPoint = (event && event.point) || context.projection(_lastLoc);
52628           var currMouse = geoVecSubtract(currPoint, nudge);
52629           var loc = context.projection.invert(currMouse);
52630
52631           note = note.move(loc);
52632
52633           var osm = services.osm;
52634           if (osm) {
52635               osm.replaceNote(note);  // update note cache
52636           }
52637
52638           context.replace(actionNoop());   // trigger redraw
52639       }
52640
52641
52642       function end(note) {
52643           context.replace(actionNoop());   // trigger redraw
52644
52645           context
52646               .selectedNoteID(note.id)
52647               .enter(modeSelectNote$$1(context, note.id));
52648       }
52649
52650
52651       var drag = behaviorDrag()
52652           .selector('.layer-notes .new')
52653           .surface(select('#map').node())
52654           .origin(origin)
52655           .on('start', start)
52656           .on('move', move)
52657           .on('end', end);
52658
52659
52660       mode.enter = function() {
52661           context.install(edit);
52662       };
52663
52664
52665       mode.exit = function() {
52666           context.ui().sidebar.hover.cancel();
52667           context.uninstall(edit);
52668
52669           context.surface()
52670               .selectAll('.active')
52671               .classed('active', false);
52672
52673           stopNudge();
52674       };
52675
52676       mode.behavior = drag;
52677
52678       return mode;
52679   }
52680
52681   function modeBrowse(context) {
52682       var mode = {
52683           button: 'browse',
52684           id: 'browse',
52685           title: t('modes.browse.title'),
52686           description: t('modes.browse.description')
52687       }, sidebar;
52688
52689       var behaviors = [
52690           behaviorPaste(context),
52691           behaviorHover(context).on('hover', context.ui().sidebar.hover),
52692           behaviorSelect(context),
52693           behaviorLasso(context),
52694           modeDragNode$$1(context).behavior,
52695           modeDragNote$$1(context).behavior
52696       ];
52697
52698
52699       mode.enter = function() {
52700           behaviors.forEach(context.install);
52701
52702           // Get focus on the body.
52703           if (document.activeElement && document.activeElement.blur) {
52704               document.activeElement.blur();
52705           }
52706
52707           if (sidebar) {
52708               context.ui().sidebar.show(sidebar);
52709           } else {
52710               context.ui().sidebar.select(null);
52711           }
52712       };
52713
52714
52715       mode.exit = function() {
52716           context.ui().sidebar.hover.cancel();
52717           behaviors.forEach(context.uninstall);
52718
52719           if (sidebar) {
52720               context.ui().sidebar.hide();
52721           }
52722       };
52723
52724
52725       mode.sidebar = function(_) {
52726           if (!arguments.length) return sidebar;
52727           sidebar = _;
52728           return mode;
52729       };
52730
52731
52732       return mode;
52733   }
52734
52735   function modeDrawArea(context, wayId, startGraph) {
52736       var mode = {
52737           button: 'area',
52738           id: 'draw-area'
52739       };
52740
52741       var behavior;
52742
52743
52744       mode.enter = function() {
52745           var way = context.entity(wayId);
52746
52747           behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
52748               .tail(t('modes.draw_area.tail'));
52749
52750           var addNode = behavior.addNode;
52751
52752           behavior.addNode = function(node, d) {
52753               var length = way.nodes.length;
52754               var penultimate = length > 2 ? way.nodes[length - 2] : null;
52755
52756               if (node.id === way.first() || node.id === penultimate) {
52757                   behavior.finish();
52758               } else {
52759                   addNode(node, d);
52760               }
52761           };
52762
52763           context.install(behavior);
52764       };
52765
52766
52767       mode.exit = function() {
52768           context.uninstall(behavior);
52769       };
52770
52771
52772       mode.selectedIDs = function() {
52773           return [wayId];
52774       };
52775
52776
52777       mode.activeID = function() {
52778           return (behavior && behavior.activeID()) || [];
52779       };
52780
52781
52782       return mode;
52783   }
52784
52785   function modeDrawLine(context, wayId, startGraph, affix) {
52786       var mode = {
52787           button: 'line',
52788           id: 'draw-line'
52789       };
52790
52791       var behavior;
52792
52793
52794       mode.enter = function() {
52795           var way = context.entity(wayId);
52796           var index = (affix === 'prefix') ? 0 : undefined;
52797           var headId = (affix === 'prefix') ? way.first() : way.last();
52798
52799           behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
52800               .tail(t('modes.draw_line.tail'));
52801
52802           var addNode = behavior.addNode;
52803           behavior.addNode = function(node, d) {
52804               if (node.id === headId) {
52805                   behavior.finish();
52806               } else {
52807                   addNode(node, d);
52808               }
52809           };
52810
52811           context.install(behavior);
52812       };
52813
52814
52815       mode.exit = function() {
52816           context.uninstall(behavior);
52817       };
52818
52819
52820       mode.selectedIDs = function() {
52821           return [wayId];
52822       };
52823
52824
52825       mode.activeID = function() {
52826           return (behavior && behavior.activeID()) || [];
52827       };
52828
52829       return mode;
52830   }
52831
52832   function operationCircularize(selectedIDs, context) {
52833       var entityId = selectedIDs[0],
52834           entity = context.entity(entityId),
52835           extent = entity.extent(context.graph()),
52836           geometry = context.geometry(entityId),
52837           action = actionCircularize(entityId, context.projection);
52838
52839
52840       var operation = function() {
52841           context.perform(action, operation.annotation());
52842       };
52843
52844
52845       operation.available = function() {
52846           return selectedIDs.length === 1 &&
52847               entity.type === 'way' &&
52848               uniq(entity.nodes).length > 1;
52849       };
52850
52851
52852       operation.disabled = function() {
52853           var reason;
52854           if (extent.percentContainedIn(context.extent()) < 0.8) {
52855               reason = 'too_large';
52856           } else if (context.hasHiddenConnections(entityId)) {
52857               reason = 'connected_to_hidden';
52858           }
52859           return action.disabled(context.graph()) || reason;
52860       };
52861
52862
52863       operation.tooltip = function() {
52864           var disable = operation.disabled();
52865           return disable ?
52866               t('operations.circularize.' + disable) :
52867               t('operations.circularize.description.' + geometry);
52868       };
52869
52870
52871       operation.annotation = function() {
52872           return t('operations.circularize.annotation.' + geometry);
52873       };
52874
52875
52876       operation.id = 'circularize';
52877       operation.keys = [t('operations.circularize.key')];
52878       operation.title = t('operations.circularize.title');
52879       operation.behavior = behaviorOperation(context).which(operation);
52880
52881       return operation;
52882   }
52883
52884   function operationContinue(selectedIDs, context) {
52885       var graph = context.graph(),
52886           entities = selectedIDs.map(function(id) { return graph.entity(id); }),
52887           geometries = assignIn({ line: [], vertex: [] },
52888               groupBy(entities, function(entity) { return entity.geometry(graph); })),
52889           vertex = geometries.vertex[0];
52890
52891
52892       function candidateWays() {
52893           return graph.parentWays(vertex).filter(function(parent) {
52894               return parent.geometry(graph) === 'line' &&
52895                   !parent.isClosed() &&
52896                   parent.affix(vertex.id) &&
52897                   (geometries.line.length === 0 || geometries.line[0] === parent);
52898           });
52899       }
52900
52901
52902       var operation = function() {
52903           var candidate = candidateWays()[0];
52904           context.enter(
52905               modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
52906           );
52907       };
52908
52909
52910       operation.available = function() {
52911           return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
52912               !context.features().hasHiddenConnections(vertex, context.graph());
52913       };
52914
52915
52916       operation.disabled = function() {
52917           var candidates = candidateWays();
52918           if (candidates.length === 0)
52919               return 'not_eligible';
52920           if (candidates.length > 1)
52921               return 'multiple';
52922       };
52923
52924
52925       operation.tooltip = function() {
52926           var disable = operation.disabled();
52927           return disable ?
52928               t('operations.continue.' + disable) :
52929               t('operations.continue.description');
52930       };
52931
52932
52933       operation.annotation = function() {
52934           return t('operations.continue.annotation.line');
52935       };
52936
52937
52938       operation.id = 'continue';
52939       operation.keys = [t('operations.continue.key')];
52940       operation.title = t('operations.continue.title');
52941       operation.behavior = behaviorOperation(context).which(operation);
52942
52943       return operation;
52944   }
52945
52946   function operationDelete(selectedIDs, context) {
52947       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
52948           action = actionDeleteMultiple(selectedIDs),
52949           extent = selectedIDs.reduce(function(extent, id) {
52950                   return extent.extend(context.entity(id).extent(context.graph()));
52951               }, geoExtent$$1());
52952
52953
52954       var operation = function() {
52955           var nextSelectedID;
52956           var nextSelectedLoc;
52957
52958           if (selectedIDs.length === 1) {
52959               var id = selectedIDs[0],
52960                   entity = context.entity(id),
52961                   geometry = context.geometry(id),
52962                   parents = context.graph().parentWays(entity),
52963                   parent = parents[0];
52964
52965               // Select the next closest node in the way.
52966               if (geometry === 'vertex') {
52967                   var nodes = parent.nodes,
52968                       i = nodes.indexOf(id);
52969
52970                   if (i === 0) {
52971                       i++;
52972                   } else if (i === nodes.length - 1) {
52973                       i--;
52974                   } else {
52975                       var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
52976                           b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
52977                       i = a < b ? i - 1 : i + 1;
52978                   }
52979
52980                   nextSelectedID = nodes[i];
52981                   nextSelectedLoc = context.entity(nextSelectedID).loc;
52982               }
52983           }
52984
52985           context.perform(action, operation.annotation());
52986
52987           if (nextSelectedID && nextSelectedLoc) {
52988               if (context.hasEntity(nextSelectedID)) {
52989                   context.enter(modeSelect(context, [nextSelectedID]).follow(true));
52990               } else {
52991                   context.map().centerEase(nextSelectedLoc);
52992                   context.enter(modeBrowse(context));
52993               }
52994           } else {
52995               context.enter(modeBrowse(context));
52996           }
52997
52998       };
52999
53000
53001       operation.available = function() {
53002           return true;
53003       };
53004
53005
53006       operation.disabled = function() {
53007           var reason;
53008           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53009               reason = 'too_large';
53010           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53011               reason = 'connected_to_hidden';
53012           } else if (some(selectedIDs, protectedMember)) {
53013               reason = 'part_of_relation';
53014           } else if (some(selectedIDs, incompleteRelation)) {
53015               reason = 'incomplete_relation';
53016           }
53017           return reason;
53018
53019           function incompleteRelation(id) {
53020               var entity = context.entity(id);
53021               return entity.type === 'relation' && !entity.isComplete(context.graph());
53022           }
53023
53024           function protectedMember(id) {
53025               var entity = context.entity(id);
53026               if (entity.type !== 'way') return false;
53027
53028               var parents = context.graph().parentRelations(entity);
53029               for (var i = 0; i < parents.length; i++) {
53030                   var parent = parents[i],
53031                       type = parent.tags.type,
53032                       role = parent.memberById(id).role || 'outer';
53033                   if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
53034                       return true;
53035                   }
53036               }
53037               return false;
53038           }
53039
53040       };
53041
53042
53043       operation.tooltip = function() {
53044           var disable = operation.disabled();
53045           return disable ?
53046               t('operations.delete.' + disable + '.' + multi) :
53047               t('operations.delete.description' + '.' + multi);
53048       };
53049
53050
53051       operation.annotation = function() {
53052           return selectedIDs.length === 1 ?
53053               t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
53054               t('operations.delete.annotation.multiple', { n: selectedIDs.length });
53055       };
53056
53057
53058       operation.id = 'delete';
53059       operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
53060       operation.title = t('operations.delete.title');
53061       operation.behavior = behaviorOperation(context).which(operation);
53062
53063       return operation;
53064   }
53065
53066   function operationDisconnect(selectedIDs, context) {
53067       var vertices = filter(selectedIDs, function(entityId) {
53068           return context.geometry(entityId) === 'vertex';
53069       });
53070
53071       var entityId = vertices[0],
53072           action = actionDisconnect(entityId);
53073
53074       if (selectedIDs.length > 1) {
53075           action.limitWays(without(selectedIDs, entityId));
53076       }
53077
53078
53079       var operation = function() {
53080           context.perform(action, operation.annotation());
53081       };
53082
53083
53084       operation.available = function() {
53085           return vertices.length === 1;
53086       };
53087
53088
53089       operation.disabled = function() {
53090           var reason;
53091           if (some(selectedIDs, context.hasHiddenConnections)) {
53092               reason = 'connected_to_hidden';
53093           }
53094           return action.disabled(context.graph()) || reason;
53095       };
53096
53097
53098       operation.tooltip = function() {
53099           var disable = operation.disabled();
53100           return disable ?
53101               t('operations.disconnect.' + disable) :
53102               t('operations.disconnect.description');
53103       };
53104
53105
53106       operation.annotation = function() {
53107           return t('operations.disconnect.annotation');
53108       };
53109
53110
53111       operation.id = 'disconnect';
53112       operation.keys = [t('operations.disconnect.key')];
53113       operation.title = t('operations.disconnect.title');
53114       operation.behavior = behaviorOperation(context).which(operation);
53115
53116       return operation;
53117   }
53118
53119   function operationMerge(selectedIDs, context) {
53120
53121       function updatePresetTags(newGraph, ids) {
53122           var id = ids[0];
53123           var newEntity = newGraph.hasEntity(id);
53124
53125           if (!newEntity) return;
53126           var newPreset = context.presets().match(newEntity, newGraph);
53127           context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
53128       }
53129
53130
53131       var join = actionJoin(selectedIDs);
53132       var merge = actionMerge(selectedIDs);
53133       var mergePolygon = actionMergePolygon(selectedIDs);
53134       var mergeNodes = actionMergeNodes(selectedIDs);
53135
53136
53137       var operation = function() {
53138           var doUpdateTags;
53139           var action;
53140
53141           if (!join.disabled(context.graph())) {
53142               doUpdateTags = false;
53143               action = join;
53144           } else if (!merge.disabled(context.graph())) {
53145               doUpdateTags = true;
53146               action = merge;
53147           } else if (!mergePolygon.disabled(context.graph())) {
53148               doUpdateTags = false;
53149               action = mergePolygon;
53150           } else {
53151               doUpdateTags = true;
53152               action = mergeNodes;
53153           }
53154
53155           context.perform(action, operation.annotation());
53156
53157           var ids = selectedIDs.filter(function(id) {
53158               var entity = context.hasEntity(id);
53159               return entity && entity.type !== 'node';
53160           });
53161
53162           // if we merged tags, rematch preset to update tags if necessary (#3851)
53163           if (doUpdateTags) {
53164               updatePresetTags(context.graph(), ids);
53165           }
53166
53167           context.enter(modeSelect(context, ids));
53168       };
53169
53170
53171       operation.available = function() {
53172           return selectedIDs.length >= 2;
53173       };
53174
53175
53176       operation.disabled = function() {
53177           return join.disabled(context.graph()) &&
53178               merge.disabled(context.graph()) &&
53179               mergePolygon.disabled(context.graph()) &&
53180               mergeNodes.disabled(context.graph());
53181       };
53182
53183
53184       operation.tooltip = function() {
53185           var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
53186           var m = merge.disabled(context.graph());         // 'not_eligible'
53187           var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
53188           var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
53189
53190           // disabled for one of various reasons
53191           if (j && m && p && n) {
53192               if (j === 'restriction' || n === 'restriction') {
53193                   return t('operations.merge.restriction',
53194                       { relation: context.presets().item('type/restriction').name() });
53195
53196               } else if (p === 'incomplete_relation') {
53197                   return t('operations.merge.incomplete_relation');
53198
53199               } else if (n === 'relation') {
53200                   return t('operations.merge.relation');
53201
53202               } else {
53203                   return t('operations.merge.' + j);
53204               }
53205
53206           } else {
53207               return t('operations.merge.description');
53208           }
53209       };
53210
53211
53212       operation.annotation = function() {
53213           return t('operations.merge.annotation', { n: selectedIDs.length });
53214       };
53215
53216
53217       operation.id = 'merge';
53218       operation.keys = [t('operations.merge.key')];
53219       operation.title = t('operations.merge.title');
53220       operation.behavior = behaviorOperation(context).which(operation);
53221
53222       return operation;
53223   }
53224
53225   function operationMove(selectedIDs, context) {
53226       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
53227       var extent = selectedIDs.reduce(function(extent, id) {
53228           return extent.extend(context.entity(id).extent(context.graph()));
53229       }, geoExtent$$1());
53230
53231
53232       var operation = function() {
53233           context.enter(modeMove$$1(context, selectedIDs));
53234       };
53235
53236
53237       operation.available = function() {
53238           return selectedIDs.length > 1 ||
53239               context.entity(selectedIDs[0]).type !== 'node';
53240       };
53241
53242
53243       operation.disabled = function() {
53244           var reason;
53245           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53246               reason = 'too_large';
53247           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53248               reason = 'connected_to_hidden';
53249           } else if (some(selectedIDs, incompleteRelation)) {
53250               reason = 'incomplete_relation';
53251           }
53252           return reason;
53253
53254           function incompleteRelation(id) {
53255               var entity = context.entity(id);
53256               return entity.type === 'relation' && !entity.isComplete(context.graph());
53257           }
53258       };
53259
53260
53261       operation.tooltip = function() {
53262           var disable = operation.disabled();
53263           return disable ?
53264               t('operations.move.' + disable + '.' + multi) :
53265               t('operations.move.description.' + multi);
53266       };
53267
53268
53269       operation.annotation = function() {
53270           return selectedIDs.length === 1 ?
53271               t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
53272               t('operations.move.annotation.multiple');
53273       };
53274
53275
53276       operation.id = 'move';
53277       operation.keys = [t('operations.move.key')];
53278       operation.title = t('operations.move.title');
53279       operation.behavior = behaviorOperation(context).which(operation);
53280
53281       return operation;
53282   }
53283
53284   function operationOrthogonalize(selectedIDs, context) {
53285       var entityId = selectedIDs[0],
53286           entity = context.entity(entityId),
53287           extent = entity.extent(context.graph()),
53288           geometry = context.geometry(entityId),
53289           action = actionOrthogonalize(entityId, context.projection);
53290
53291
53292       var operation = function() {
53293           context.perform(action, operation.annotation());
53294       };
53295
53296
53297       operation.available = function() {
53298           return selectedIDs.length === 1 &&
53299               entity.type === 'way' &&
53300               entity.isClosed() &&
53301               uniq(entity.nodes).length > 2;
53302       };
53303
53304
53305       operation.disabled = function() {
53306           var reason;
53307           if (extent.percentContainedIn(context.extent()) < 0.8) {
53308               reason = 'too_large';
53309           } else if (context.hasHiddenConnections(entityId)) {
53310               reason = 'connected_to_hidden';
53311           }
53312           return action.disabled(context.graph()) || reason;
53313       };
53314
53315
53316       operation.tooltip = function() {
53317           var disable = operation.disabled();
53318           return disable ?
53319               t('operations.orthogonalize.' + disable) :
53320               t('operations.orthogonalize.description.' + geometry);
53321       };
53322
53323
53324       operation.annotation = function() {
53325           return t('operations.orthogonalize.annotation.' + geometry);
53326       };
53327
53328
53329       operation.id = 'orthogonalize';
53330       operation.keys = [t('operations.orthogonalize.key')];
53331       operation.title = t('operations.orthogonalize.title');
53332       operation.behavior = behaviorOperation(context).which(operation);
53333
53334       return operation;
53335   }
53336
53337   /**
53338    * This method is like `_.uniq` except that it accepts `iteratee` which is
53339    * invoked for each element in `array` to generate the criterion by which
53340    * uniqueness is computed. The order of result values is determined by the
53341    * order they occur in the array. The iteratee is invoked with one argument:
53342    * (value).
53343    *
53344    * @static
53345    * @memberOf _
53346    * @since 4.0.0
53347    * @category Array
53348    * @param {Array} array The array to inspect.
53349    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
53350    * @returns {Array} Returns the new duplicate free array.
53351    * @example
53352    *
53353    * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
53354    * // => [2.1, 1.2]
53355    *
53356    * // The `_.property` iteratee shorthand.
53357    * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
53358    * // => [{ 'x': 1 }, { 'x': 2 }]
53359    */
53360   function uniqBy(array, iteratee) {
53361     return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
53362   }
53363
53364   function operationReflectShort(selectedIDs, context) {
53365       return operationReflect(selectedIDs, context, 'short');
53366   }
53367
53368
53369   function operationReflectLong(selectedIDs, context) {
53370       return operationReflect(selectedIDs, context, 'long');
53371   }
53372
53373
53374   function operationReflect(selectedIDs, context, axis) {
53375       axis = axis || 'long';
53376       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
53377           extent = selectedIDs.reduce(function(extent, id) {
53378               return extent.extend(context.entity(id).extent(context.graph()));
53379           }, geoExtent$$1());
53380
53381
53382       var operation = function() {
53383           var action = actionReflect(selectedIDs, context.projection)
53384               .useLongAxis(Boolean(axis === 'long'));
53385           context.perform(action, operation.annotation());
53386       };
53387
53388
53389       operation.available = function() {
53390           var nodes = utilGetAllNodes(selectedIDs, context.graph());
53391           return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
53392       };
53393
53394
53395       operation.disabled = function() {
53396           var reason;
53397           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53398               reason = 'too_large';
53399           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53400               reason = 'connected_to_hidden';
53401           } else if (some(selectedIDs, incompleteRelation)) {
53402               reason = 'incomplete_relation';
53403           }
53404           return reason;
53405
53406           function incompleteRelation(id) {
53407               var entity = context.entity(id);
53408               return entity.type === 'relation' && !entity.isComplete(context.graph());
53409           }
53410       };
53411
53412
53413       operation.tooltip = function() {
53414           var disable = operation.disabled();
53415           return disable ?
53416               t('operations.reflect.' + disable + '.' + multi) :
53417               t('operations.reflect.description.' + axis + '.' + multi);
53418       };
53419
53420
53421       operation.annotation = function() {
53422           return t('operations.reflect.annotation.' + axis + '.' + multi);
53423       };
53424
53425
53426       operation.id = 'reflect-' + axis;
53427       operation.keys = [t('operations.reflect.key.' + axis)];
53428       operation.title = t('operations.reflect.title.' + axis);
53429       operation.behavior = behaviorOperation(context).which(operation);
53430
53431       return operation;
53432   }
53433
53434   function operationReverse(selectedIDs, context) {
53435       var entityId = selectedIDs[0];
53436
53437       var operation = function() {
53438           context.perform(actionReverse(entityId), operation.annotation());
53439       };
53440
53441
53442       operation.available = function() {
53443           return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
53444       };
53445
53446
53447       operation.disabled = function() {
53448           return false;
53449       };
53450
53451
53452       operation.tooltip = function() {
53453           return t('operations.reverse.description');
53454       };
53455
53456
53457       operation.annotation = function() {
53458           return t('operations.reverse.annotation');
53459       };
53460
53461
53462       operation.id = 'reverse';
53463       operation.keys = [t('operations.reverse.key')];
53464       operation.title = t('operations.reverse.title');
53465       operation.behavior = behaviorOperation(context).which(operation);
53466
53467       return operation;
53468   }
53469
53470   function operationRotate(selectedIDs, context) {
53471       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
53472           extent = selectedIDs.reduce(function(extent, id) {
53473               return extent.extend(context.entity(id).extent(context.graph()));
53474           }, geoExtent$$1());
53475
53476
53477       var operation = function() {
53478           context.enter(modeRotate$$1(context, selectedIDs));
53479       };
53480
53481
53482       operation.available = function() {
53483           var nodes = utilGetAllNodes(selectedIDs, context.graph());
53484           return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
53485       };
53486
53487
53488       operation.disabled = function() {
53489           var reason;
53490           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53491               reason = 'too_large';
53492           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53493               reason = 'connected_to_hidden';
53494           } else if (some(selectedIDs, incompleteRelation)) {
53495               reason = 'incomplete_relation';
53496           }
53497           return reason;
53498
53499           function incompleteRelation(id) {
53500               var entity = context.entity(id);
53501               return entity.type === 'relation' && !entity.isComplete(context.graph());
53502           }
53503       };
53504
53505
53506       operation.tooltip = function() {
53507           var disable = operation.disabled();
53508           return disable ?
53509               t('operations.rotate.' + disable + '.' + multi) :
53510               t('operations.rotate.description.' + multi);
53511       };
53512
53513
53514       operation.annotation = function() {
53515           return selectedIDs.length === 1 ?
53516               t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
53517               t('operations.rotate.annotation.multiple');
53518       };
53519
53520
53521       operation.id = 'rotate';
53522       operation.keys = [t('operations.rotate.key')];
53523       operation.title = t('operations.rotate.title');
53524       operation.behavior = behaviorOperation(context).which(operation);
53525
53526       return operation;
53527   }
53528
53529   function operationSplit(selectedIDs, context) {
53530       var vertices = filter(selectedIDs, function(entityId) {
53531           return context.geometry(entityId) === 'vertex';
53532       });
53533
53534       var entityId = vertices[0],
53535           action = actionSplit(entityId),
53536           ways = [];
53537
53538       if (vertices.length === 1) {
53539           if (selectedIDs.length > 1) {
53540               action.limitWays(without(selectedIDs, entityId));
53541           }
53542           ways = action.ways(context.graph());
53543       }
53544
53545
53546       var operation = function() {
53547           var difference = context.perform(action, operation.annotation());
53548           context.enter(modeSelect(context, difference.extantIDs()));
53549       };
53550
53551
53552       operation.available = function() {
53553           return vertices.length === 1;
53554       };
53555
53556
53557       operation.disabled = function() {
53558           var reason;
53559           if (some(selectedIDs, context.hasHiddenConnections)) {
53560               reason = 'connected_to_hidden';
53561           }
53562           return action.disabled(context.graph()) || reason;
53563       };
53564
53565
53566       operation.tooltip = function() {
53567           var disable = operation.disabled();
53568           if (disable) {
53569               return t('operations.split.' + disable);
53570           }
53571           if (ways.length === 1) {
53572               return t('operations.split.description.' + context.geometry(ways[0].id));
53573           } else {
53574               return t('operations.split.description.multiple');
53575           }
53576       };
53577
53578
53579       operation.annotation = function() {
53580           return ways.length === 1 ?
53581               t('operations.split.annotation.' + context.geometry(ways[0].id)) :
53582               t('operations.split.annotation.multiple', { n: ways.length });
53583       };
53584
53585
53586       operation.id = 'split';
53587       operation.keys = [t('operations.split.key')];
53588       operation.title = t('operations.split.title');
53589       operation.behavior = behaviorOperation(context).which(operation);
53590
53591       return operation;
53592   }
53593
53594   function operationStraighten(selectedIDs, context) {
53595       var entityId = selectedIDs[0],
53596           action = actionStraighten(entityId, context.projection);
53597
53598
53599       function operation() {
53600           context.perform(action, operation.annotation());
53601       }
53602
53603
53604       operation.available = function() {
53605           var entity = context.entity(entityId);
53606           return selectedIDs.length === 1 &&
53607               entity.type === 'way' &&
53608               !entity.isClosed() &&
53609               uniq(entity.nodes).length > 2;
53610       };
53611
53612
53613       operation.disabled = function() {
53614           var reason;
53615           if (context.hasHiddenConnections(entityId)) {
53616               reason = 'connected_to_hidden';
53617           }
53618           return action.disabled(context.graph()) || reason;
53619       };
53620
53621
53622       operation.tooltip = function() {
53623           var disable = operation.disabled();
53624           return disable ?
53625               t('operations.straighten.' + disable) :
53626               t('operations.straighten.description');
53627       };
53628
53629
53630       operation.annotation = function() {
53631           return t('operations.straighten.annotation');
53632       };
53633
53634
53635       operation.id = 'straighten';
53636       operation.keys = [t('operations.straighten.key')];
53637       operation.title = t('operations.straighten.title');
53638       operation.behavior = behaviorOperation(context).which(operation);
53639
53640       return operation;
53641   }
53642
53643   function operationDetachNode(selectedIDs, context) {
53644       var nodeID = selectedIDs.length && selectedIDs[0];
53645       var action = actionDetachNode(nodeID);
53646
53647       var operation = function () {
53648           context.perform(action);  // do the detach
53649
53650           var mouse = context.map().mouseCoordinates();
53651           if (mouse.some(isNaN)) {
53652               enterMoveMode();
53653
53654           } else {
53655               // move detached node to the mouse location (transitioned)
53656               context.perform(actionMoveNode(nodeID, mouse));
53657
53658               // after transition completes, put at final mouse location and enter move mode.
53659               window.setTimeout(function() {
53660                   mouse = context.map().mouseCoordinates();
53661                   context.replace(actionMoveNode(nodeID, mouse));
53662                   enterMoveMode();
53663               }, 150);
53664           }
53665
53666           function enterMoveMode() {
53667               var baseGraph = context.graph();
53668               context.enter(modeMove$$1(context, [nodeID], baseGraph));
53669           }
53670       };
53671
53672
53673       operation.available = function () {
53674           if (selectedIDs.length !== 1) return false;
53675
53676           var graph = context.graph();
53677           var entity = graph.hasEntity(nodeID);
53678           if (!entity) return false;
53679
53680           return entity.type === 'node' &&
53681               entity.hasInterestingTags() &&
53682               graph.parentWays(entity).length > 0;
53683       };
53684
53685
53686       operation.disabled = function () {
53687           var reason;
53688           if (some(selectedIDs, context.hasHiddenConnections)) {
53689               reason = 'connected_to_hidden';
53690           }
53691           return action.disabled(context.graph()) || reason;
53692       };
53693
53694
53695       operation.tooltip = function () {
53696           var disableReason = operation.disabled();
53697           if (disableReason) {
53698               return t('operations.detach_node.' + disableReason,
53699                   { relation: context.presets().item('type/restriction').name() });
53700           } else {
53701               return t('operations.detach_node.description');
53702           }
53703       };
53704
53705
53706       operation.annotation = function () {
53707           return t('operations.detach_node.annotation');
53708       };
53709
53710
53711       operation.id = 'detach-node';
53712       operation.keys = [t('operations.detach_node.key')];
53713       operation.title = t('operations.detach_node.title');
53714       operation.behavior = behaviorOperation(context).which(operation);
53715
53716
53717       return operation;
53718   }
53719
53720
53721
53722   var Operations = /*#__PURE__*/Object.freeze({
53723     operationCircularize: operationCircularize,
53724     operationContinue: operationContinue,
53725     operationDelete: operationDelete,
53726     operationDisconnect: operationDisconnect,
53727     operationMerge: operationMerge,
53728     operationMove: operationMove,
53729     operationOrthogonalize: operationOrthogonalize,
53730     operationReflectShort: operationReflectShort,
53731     operationReflectLong: operationReflectLong,
53732     operationReverse: operationReverse,
53733     operationRotate: operationRotate,
53734     operationSplit: operationSplit,
53735     operationStraighten: operationStraighten,
53736     operationDetachNode: operationDetachNode
53737   });
53738
53739   function modeMove$$1(context, entityIDs, baseGraph) {
53740       var mode = {
53741           id: 'move',
53742           button: 'browse'
53743       };
53744
53745       var keybinding = d3keybinding('move');
53746       var behaviors = [
53747           behaviorEdit(context),
53748           operationCircularize(entityIDs, context).behavior,
53749           operationDelete(entityIDs, context).behavior,
53750           operationOrthogonalize(entityIDs, context).behavior,
53751           operationReflectLong(entityIDs, context).behavior,
53752           operationReflectShort(entityIDs, context).behavior,
53753           operationRotate(entityIDs, context).behavior
53754       ];
53755       var annotation = entityIDs.length === 1 ?
53756           t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
53757           t('operations.move.annotation.multiple');
53758
53759       var _prevGraph;
53760       var _cache;
53761       var _origin;
53762       var _nudgeInterval;
53763
53764
53765       function doMove(nudge) {
53766           nudge = nudge || [0, 0];
53767
53768           var fn;
53769           if (_prevGraph !== context.graph()) {
53770               _cache = {};
53771               _origin = context.map().mouseCoordinates();
53772               fn = context.perform;
53773           } else {
53774               fn = context.overwrite;
53775           }
53776
53777           var currMouse = context.mouse();
53778           var origMouse = context.projection(_origin);
53779           var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
53780
53781           fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
53782           _prevGraph = context.graph();
53783       }
53784
53785
53786       function startNudge(nudge) {
53787           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
53788           _nudgeInterval = window.setInterval(function() {
53789               context.pan(nudge);
53790               doMove(nudge);
53791           }, 50);
53792       }
53793
53794
53795       function stopNudge() {
53796           if (_nudgeInterval) {
53797               window.clearInterval(_nudgeInterval);
53798               _nudgeInterval = null;
53799           }
53800       }
53801
53802
53803       function move() {
53804           doMove();
53805           var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
53806           if (nudge) {
53807               startNudge(nudge);
53808           } else {
53809               stopNudge();
53810           }
53811       }
53812
53813
53814       function finish() {
53815           event.stopPropagation();
53816           context.enter(modeSelect(context, entityIDs));
53817           stopNudge();
53818       }
53819
53820
53821       function cancel() {
53822           if (baseGraph) {
53823               while (context.graph() !== baseGraph) context.pop();
53824               context.enter(modeBrowse(context));
53825           } else {
53826               context.pop();
53827               context.enter(modeSelect(context, entityIDs));
53828           }
53829           stopNudge();
53830       }
53831
53832
53833       function undone() {
53834           context.enter(modeBrowse(context));
53835       }
53836
53837
53838       mode.enter = function() {
53839           _origin = context.map().mouseCoordinates();
53840           _prevGraph = null;
53841           _cache = {};
53842
53843           behaviors.forEach(function(behavior) {
53844               context.install(behavior);
53845           });
53846
53847           context.surface()
53848               .on('mousemove.move', move)
53849               .on('click.move', finish);
53850
53851           context.history()
53852               .on('undone.move', undone);
53853
53854           keybinding
53855               .on('⎋', cancel)
53856               .on('↩', finish);
53857
53858           select(document)
53859               .call(keybinding);
53860       };
53861
53862
53863       mode.exit = function() {
53864           stopNudge();
53865
53866           behaviors.forEach(function(behavior) {
53867               context.uninstall(behavior);
53868           });
53869
53870           context.surface()
53871               .on('mousemove.move', null)
53872               .on('click.move', null);
53873
53874           context.history()
53875               .on('undone.move', null);
53876
53877           keybinding.off();
53878       };
53879
53880
53881       mode.selectedIDs = function() {
53882           if (!arguments.length) return entityIDs;
53883           // no assign
53884           return mode;
53885       };
53886
53887
53888       return mode;
53889   }
53890
53891   function modeRotate$$1(context, entityIDs) {
53892       var mode = {
53893           id: 'rotate',
53894           button: 'browse'
53895       };
53896
53897       var keybinding = d3keybinding('rotate');
53898       var behaviors = [
53899           behaviorEdit(context),
53900           operationCircularize(entityIDs, context).behavior,
53901           operationDelete(entityIDs, context).behavior,
53902           operationMove(entityIDs, context).behavior,
53903           operationOrthogonalize(entityIDs, context).behavior,
53904           operationReflectLong(entityIDs, context).behavior,
53905           operationReflectShort(entityIDs, context).behavior
53906       ];
53907       var annotation = entityIDs.length === 1 ?
53908           t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
53909           t('operations.rotate.annotation.multiple');
53910
53911       var _prevGraph;
53912       var _prevAngle;
53913       var _prevTransform;
53914       var _pivot;
53915
53916
53917       function doRotate() {
53918           var fn;
53919           if (context.graph() !== _prevGraph) {
53920               fn = context.perform;
53921           } else {
53922               fn = context.replace;
53923           }
53924
53925           // projection changed, recalculate _pivot
53926           var projection = context.projection;
53927           var currTransform = projection.transform();
53928           if (!_prevTransform ||
53929               currTransform.k !== _prevTransform.k ||
53930               currTransform.x !== _prevTransform.x ||
53931               currTransform.y !== _prevTransform.y) {
53932
53933               var nodes = utilGetAllNodes(entityIDs, context.graph());
53934               var points = nodes.map(function(n) { return projection(n.loc); });
53935
53936               if (points.length === 1) {  // degenerate case
53937                   _pivot = points[0];
53938               } else if (points.length === 2) {
53939                   _pivot = geoVecInterp(points[0], points[1], 0.5);
53940               } else {
53941                   _pivot = d3_polygonCentroid(d3_polygonHull(points));
53942               }
53943               _prevAngle = undefined;
53944           }
53945
53946
53947           var currMouse = context.mouse();
53948           var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
53949
53950           if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
53951           var delta = currAngle - _prevAngle;
53952
53953           fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
53954
53955           _prevTransform = currTransform;
53956           _prevAngle = currAngle;
53957           _prevGraph = context.graph();
53958       }
53959
53960
53961       function finish() {
53962           event.stopPropagation();
53963           context.enter(modeSelect(context, entityIDs));
53964       }
53965
53966
53967       function cancel() {
53968           context.pop();
53969           context.enter(modeSelect(context, entityIDs));
53970       }
53971
53972
53973       function undone() {
53974           context.enter(modeBrowse(context));
53975       }
53976
53977
53978       mode.enter = function() {
53979           behaviors.forEach(context.install);
53980
53981           context.surface()
53982               .on('mousemove.rotate', doRotate)
53983               .on('click.rotate', finish);
53984
53985           context.history()
53986               .on('undone.rotate', undone);
53987
53988           keybinding
53989               .on('⎋', cancel)
53990               .on('↩', finish);
53991
53992           select(document)
53993               .call(keybinding);
53994       };
53995
53996
53997       mode.exit = function() {
53998           behaviors.forEach(context.uninstall);
53999
54000           context.surface()
54001               .on('mousemove.rotate', null)
54002               .on('click.rotate', null);
54003
54004           context.history()
54005               .on('undone.rotate', null);
54006
54007           keybinding.off();
54008       };
54009
54010
54011       mode.selectedIDs = function() {
54012           if (!arguments.length) return entityIDs;
54013           // no assign
54014           return mode;
54015       };
54016
54017
54018       return mode;
54019   }
54020
54021   var _isSaving = false;
54022
54023
54024   function modeSave$$1(context) {
54025       var mode = { id: 'save' };
54026       var keybinding = d3keybinding('modeSave');
54027
54028       var loading = uiLoading(context)
54029           .message(t('save.uploading'))
54030           .blocking(true);
54031
54032       var commit = uiCommit(context)
54033           .on('cancel', cancel)
54034           .on('save', save);
54035
54036       var _toCheck = [];
54037       var _toLoad = [];
54038       var _loaded = {};
54039       var _toLoadCount = 0;
54040       var _toLoadTotal = 0;
54041
54042       var _conflicts = [];
54043       var _errors = [];
54044       var _origChanges;
54045       var _location;
54046
54047
54048       function cancel(selectedID) {
54049           if (selectedID) {
54050               context.enter(modeSelect(context, [selectedID]));
54051           } else {
54052               context.enter(modeBrowse(context));
54053           }
54054       }
54055
54056
54057       function save(changeset, tryAgain, checkConflicts) {
54058           // Guard against accidentally entering save code twice - #4641
54059           if (_isSaving && !tryAgain) {
54060               return;
54061           }
54062
54063           var osm = context.connection();
54064           if (!osm) {
54065               cancel();
54066               return;
54067           }
54068
54069           // If user somehow got logged out mid-save, try to reauthenticate..
54070           // This can happen if they were logged in from before, but the tokens are no longer valid.
54071           if (!osm.authenticated()) {
54072               osm.authenticate(function(err) {
54073                   if (err) {
54074                       cancel();   // quit save mode..
54075                   } else {
54076                       save(changeset, tryAgain, checkConflicts);  // continue where we left off..
54077                   }
54078               });
54079               return;
54080           }
54081
54082           if (!_isSaving) {
54083               keybindingOff();
54084               context.container().call(loading);  // block input
54085               _isSaving = true;
54086           }
54087
54088           var history = context.history();
54089           var localGraph = context.graph();
54090           var remoteGraph = coreGraph$$1(history.base(), true);
54091
54092           _conflicts = [];
54093           _errors = [];
54094
54095           // Store original changes, in case user wants to download them as an .osc file
54096           _origChanges = history.changes(actionDiscardTags(history.difference()));
54097
54098           // First time, `history.perform` a no-op action.
54099           // Any conflict resolutions will be done as `history.replace`
54100           if (!tryAgain) {
54101               history.perform(actionNoop());
54102           }
54103
54104           // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
54105           if (!checkConflicts) {
54106               upload(changeset);
54107
54108           // Do the full (slow) conflict check..
54109           } else {
54110               var modified = filter(history.difference().summary(), { changeType: 'modified' });
54111               _toCheck = map$3(map$3(modified, 'entity'), 'id');
54112               _toLoad = withChildNodes(_toCheck, localGraph);
54113               _loaded = {};
54114               _toLoadCount = 0;
54115               _toLoadTotal = _toLoad.length;
54116
54117               if (_toCheck.length) {
54118                   showProgress(_toLoadCount, _toLoadTotal);
54119                   _toLoad.forEach(function(id) { _loaded[id] = false; });
54120                   osm.loadMultiple(_toLoad, loaded);
54121               } else {
54122                   upload(changeset);
54123               }
54124           }
54125
54126           return;
54127
54128
54129           function withChildNodes(ids, graph) {
54130               return uniq(reduce(ids, function(result, id) {
54131                   var entity = graph.entity(id);
54132                   if (entity.type === 'way') {
54133                       try {
54134                           var children = graph.childNodes(entity);
54135                           result.push.apply(result, map$3(filter(children, 'version'), 'id'));
54136                       } catch (err) {
54137                           /* eslint-disable no-console */
54138                           if (typeof console !== 'undefined') console.error(err);
54139                           /* eslint-enable no-console */
54140                       }
54141                   }
54142                   return result;
54143               }, clone(ids)));
54144           }
54145
54146
54147           // Reload modified entities into an alternate graph and check for conflicts..
54148           function loaded(err, result) {
54149               if (_errors.length) return;
54150
54151               if (err) {
54152                   _errors.push({
54153                       msg: err.message || err.responseText,
54154                       details: [ t('save.status_code', { code: err.status }) ]
54155                   });
54156                   showErrors();
54157
54158               } else {
54159                   var loadMore = [];
54160
54161                   result.data.forEach(function(entity) {
54162                       remoteGraph.replace(entity);
54163                       _loaded[entity.id] = true;
54164                       _toLoad = without(_toLoad, entity.id);
54165
54166                       if (!entity.visible) return;
54167
54168                       // Because loadMultiple doesn't download /full like loadEntity,
54169                       // need to also load children that aren't already being checked..
54170                       var i, id;
54171                       if (entity.type === 'way') {
54172                           for (i = 0; i < entity.nodes.length; i++) {
54173                               id = entity.nodes[i];
54174                               if (_loaded[id] === undefined) {
54175                                   _loaded[id] = false;
54176                                   loadMore.push(id);
54177                               }
54178                           }
54179                       } else if (entity.type === 'relation' && entity.isMultipolygon()) {
54180                           for (i = 0; i < entity.members.length; i++) {
54181                               id = entity.members[i].id;
54182                               if (_loaded[id] === undefined) {
54183                                   _loaded[id] = false;
54184                                   loadMore.push(id);
54185                               }
54186                           }
54187                       }
54188                   });
54189
54190                   _toLoadCount += result.data.length;
54191                   _toLoadTotal += loadMore.length;
54192                   showProgress(_toLoadCount, _toLoadTotal);
54193
54194                   if (loadMore.length) {
54195                       _toLoad.push.apply(_toLoad, loadMore);
54196                       osm.loadMultiple(loadMore, loaded);
54197                   }
54198
54199                   if (!_toLoad.length) {
54200                       detectConflicts();
54201                   }
54202               }
54203           }
54204
54205
54206           function detectConflicts() {
54207               function choice(id, text, action) {
54208                   return { id: id, text: text, action: function() { history.replace(action); } };
54209               }
54210               function formatUser(d) {
54211                   return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
54212               }
54213               function entityName(entity) {
54214                   return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
54215               }
54216
54217               function sameVersions(local$$1, remote) {
54218                   if (local$$1.version !== remote.version) return false;
54219
54220                   if (local$$1.type === 'way') {
54221                       var children = union(local$$1.nodes, remote.nodes);
54222                       for (var i = 0; i < children.length; i++) {
54223                           var a = localGraph.hasEntity(children[i]);
54224                           var b = remoteGraph.hasEntity(children[i]);
54225                           if (a && b && a.version !== b.version) return false;
54226                       }
54227                   }
54228
54229                   return true;
54230               }
54231
54232               _toCheck.forEach(function(id) {
54233                   var local$$1 = localGraph.entity(id);
54234                   var remote = remoteGraph.entity(id);
54235
54236                   if (sameVersions(local$$1, remote)) return;
54237
54238                   var action = actionMergeRemoteChanges;
54239                   var merge = action(id, localGraph, remoteGraph, formatUser);
54240
54241                   history.replace(merge);
54242
54243                   var mergeConflicts = merge.conflicts();
54244                   if (!mergeConflicts.length) return;  // merged safely
54245
54246                   var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
54247                   var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
54248                   var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
54249                   var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
54250
54251                   _conflicts.push({
54252                       id: id,
54253                       name: entityName(local$$1),
54254                       details: mergeConflicts,
54255                       chosen: 1,
54256                       choices: [
54257                           choice(id, keepMine, forceLocal),
54258                           choice(id, keepTheirs, forceRemote)
54259                       ]
54260                   });
54261               });
54262
54263               upload(changeset);
54264           }
54265       }
54266
54267
54268       function upload(changeset) {
54269           var osm = context.connection();
54270           if (!osm) {
54271               _errors.push({ msg: 'No OSM Service' });
54272           }
54273
54274           if (_conflicts.length) {
54275               _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
54276               showConflicts(changeset);
54277
54278           } else if (_errors.length) {
54279               showErrors();
54280
54281           } else {
54282               var history = context.history();
54283               var changes = history.changes(actionDiscardTags(history.difference()));
54284               if (changes.modified.length || changes.created.length || changes.deleted.length) {
54285                   loadLocation();  // so it is ready when we display the save screen
54286                   osm.putChangeset(changeset, changes, uploadCallback);
54287               } else {        // changes were insignificant or reverted by user
54288                   select('.inspector-wrap *').remove();
54289                   loading.close();
54290                   _isSaving = false;
54291                   context.flush();
54292                   cancel();
54293               }
54294           }
54295       }
54296
54297
54298       function uploadCallback(err, changeset) {
54299           if (err) {
54300               if (err.status === 409) {          // 409 Conflict
54301                   save(changeset, true, true);   // tryAgain = true, checkConflicts = true
54302               } else {
54303                   _errors.push({
54304                       msg: err.message || err.responseText,
54305                       details: [ t('save.status_code', { code: err.status }) ]
54306                   });
54307                   showErrors();
54308               }
54309
54310           } else {
54311               context.history().clearSaved();
54312               success(changeset);
54313               // Add delay to allow for postgres replication #1646 #2678
54314               window.setTimeout(function() {
54315                   select('.inspector-wrap *').remove();
54316                   loading.close();
54317                   _isSaving = false;
54318                   context.flush();
54319               }, 2500);
54320           }
54321       }
54322
54323
54324       function showProgress(num, total) {
54325           var modal = context.container().select('.loading-modal .modal-section');
54326           var progress = modal.selectAll('.progress')
54327               .data([0]);
54328
54329           // enter/update
54330           progress.enter()
54331               .append('div')
54332               .attr('class', 'progress')
54333               .merge(progress)
54334               .text(t('save.conflict_progress', { num: num, total: total }));
54335       }
54336
54337
54338       function showConflicts(changeset) {
54339           var history = context.history();
54340           var selection$$1 = context.container()
54341               .select('#sidebar')
54342               .append('div')
54343               .attr('class','sidebar-component');
54344
54345           loading.close();
54346           _isSaving = false;
54347
54348           var ui = uiConflicts(context)
54349               .conflictList(_conflicts)
54350               .origChanges(_origChanges)
54351               .on('cancel', function() {
54352                   history.pop();
54353                   selection$$1.remove();
54354                   keybindingOn();
54355               })
54356               .on('save', function() {
54357                   for (var i = 0; i < _conflicts.length; i++) {
54358                       if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
54359                           var entity = context.hasEntity(_conflicts[i].id);
54360                           if (entity && entity.type === 'way') {
54361                               var children = uniq(entity.nodes);
54362                               for (var j = 0; j < children.length; j++) {
54363                                   history.replace(actionRevert(children[j]));
54364                               }
54365                           }
54366                           history.replace(actionRevert(_conflicts[i].id));
54367                       }
54368                   }
54369
54370                   selection$$1.remove();
54371                   save(changeset, true, false);  // tryAgain = true, checkConflicts = false
54372               });
54373
54374           selection$$1.call(ui);
54375       }
54376
54377
54378       function showErrors() {
54379           keybindingOn();
54380           context.history().pop();
54381           loading.close();
54382           _isSaving = false;
54383
54384           var selection$$1 = uiConfirm(context.container());
54385           selection$$1
54386               .select('.modal-section.header')
54387               .append('h3')
54388               .text(t('save.error'));
54389
54390           addErrors(selection$$1, _errors);
54391           selection$$1.okButton();
54392       }
54393
54394
54395       function addErrors(selection$$1, data) {
54396           var message = selection$$1
54397               .select('.modal-section.message-text');
54398
54399           var items = message
54400               .selectAll('.error-container')
54401               .data(data);
54402
54403           var enter = items.enter()
54404               .append('div')
54405               .attr('class', 'error-container');
54406
54407           enter
54408               .append('a')
54409               .attr('class', 'error-description')
54410               .attr('href', '#')
54411               .classed('hide-toggle', true)
54412               .text(function(d) { return d.msg || t('save.unknown_error_details'); })
54413               .on('click', function() {
54414                   event.preventDefault();
54415
54416                   var error = select(this);
54417                   var detail = select(this.nextElementSibling);
54418                   var exp = error.classed('expanded');
54419
54420                   detail.style('display', exp ? 'none' : 'block');
54421                   error.classed('expanded', !exp);
54422               });
54423
54424           var details = enter
54425               .append('div')
54426               .attr('class', 'error-detail-container')
54427               .style('display', 'none');
54428
54429           details
54430               .append('ul')
54431               .attr('class', 'error-detail-list')
54432               .selectAll('li')
54433               .data(function(d) { return d.details || []; })
54434               .enter()
54435               .append('li')
54436               .attr('class', 'error-detail-item')
54437               .text(function(d) { return d; });
54438
54439           items.exit()
54440               .remove();
54441       }
54442
54443
54444       function success(changeset) {
54445           commit.reset();
54446
54447           var ui = uiSuccess$$1(context)
54448               .changeset(changeset)
54449               .location(_location)
54450               .on('cancel', function() { context.ui().sidebar.hide(); });
54451
54452           context.enter(modeBrowse(context).sidebar(ui));
54453       }
54454
54455
54456       function keybindingOn() {
54457           select(document)
54458               .call(keybinding.on('⎋', cancel, true));
54459       }
54460
54461
54462       function keybindingOff() {
54463           select(document)
54464               .call(keybinding.off);
54465       }
54466
54467
54468       // Reverse geocode current map location so we can display a message on
54469       // the success screen like "Thank you for editing around city, state."
54470       function loadLocation() {
54471           _location = null;
54472           if (!services.geocoder) return;
54473
54474           services.geocoder.reverse(context.map().center(), function(err, result) {
54475               if (err || !result || !result.address) return;
54476
54477               var parts = [];
54478               var addr = result.address;
54479               var city = addr && (addr.town || addr.city || addr.county);
54480               if (city) parts.push(city);
54481               var region = addr && (addr.state || addr.country);
54482               if (region) parts.push(region);
54483
54484               _location = parts.join(', ');
54485           });
54486       }
54487
54488
54489       mode.enter = function() {
54490           function done() {
54491               context.ui().sidebar.show(commit);
54492           }
54493
54494           keybindingOn();
54495
54496           context.container().selectAll('#content')
54497               .attr('class', 'inactive');
54498
54499           var osm = context.connection();
54500           if (!osm) {
54501               cancel();
54502               return;
54503           }
54504
54505           if (osm.authenticated()) {
54506               done();
54507           } else {
54508               osm.authenticate(function(err) {
54509                   if (err) {
54510                       cancel();
54511                   } else {
54512                       done();
54513                   }
54514               });
54515           }
54516       };
54517
54518
54519       mode.exit = function() {
54520           _isSaving = false;
54521
54522           keybindingOff();
54523
54524           context.container().selectAll('#content')
54525               .attr('class', 'active');
54526
54527           context.ui().sidebar.hide();
54528       };
54529
54530       return mode;
54531   }
54532
54533   /* Built-in method references for those with the same name as other `lodash` methods. */
54534   var nativeMin$1 = Math.min;
54535
54536   /**
54537    * The base implementation of methods like `_.intersection`, without support
54538    * for iteratee shorthands, that accepts an array of arrays to inspect.
54539    *
54540    * @private
54541    * @param {Array} arrays The arrays to inspect.
54542    * @param {Function} [iteratee] The iteratee invoked per element.
54543    * @param {Function} [comparator] The comparator invoked per element.
54544    * @returns {Array} Returns the new array of shared values.
54545    */
54546   function baseIntersection(arrays, iteratee, comparator) {
54547     var includes = comparator ? arrayIncludesWith : arrayIncludes,
54548         length = arrays[0].length,
54549         othLength = arrays.length,
54550         othIndex = othLength,
54551         caches = Array(othLength),
54552         maxLength = Infinity,
54553         result = [];
54554
54555     while (othIndex--) {
54556       var array = arrays[othIndex];
54557       if (othIndex && iteratee) {
54558         array = arrayMap(array, baseUnary(iteratee));
54559       }
54560       maxLength = nativeMin$1(array.length, maxLength);
54561       caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
54562         ? new SetCache(othIndex && array)
54563         : undefined;
54564     }
54565     array = arrays[0];
54566
54567     var index = -1,
54568         seen = caches[0];
54569
54570     outer:
54571     while (++index < length && result.length < maxLength) {
54572       var value = array[index],
54573           computed = iteratee ? iteratee(value) : value;
54574
54575       value = (comparator || value !== 0) ? value : 0;
54576       if (!(seen
54577             ? cacheHas(seen, computed)
54578             : includes(result, computed, comparator)
54579           )) {
54580         othIndex = othLength;
54581         while (--othIndex) {
54582           var cache = caches[othIndex];
54583           if (!(cache
54584                 ? cacheHas(cache, computed)
54585                 : includes(arrays[othIndex], computed, comparator))
54586               ) {
54587             continue outer;
54588           }
54589         }
54590         if (seen) {
54591           seen.push(computed);
54592         }
54593         result.push(value);
54594       }
54595     }
54596     return result;
54597   }
54598
54599   /**
54600    * Casts `value` to an empty array if it's not an array like object.
54601    *
54602    * @private
54603    * @param {*} value The value to inspect.
54604    * @returns {Array|Object} Returns the cast array-like object.
54605    */
54606   function castArrayLikeObject(value) {
54607     return isArrayLikeObject(value) ? value : [];
54608   }
54609
54610   /**
54611    * Creates an array of unique values that are included in all given arrays
54612    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
54613    * for equality comparisons. The order and references of result values are
54614    * determined by the first array.
54615    *
54616    * @static
54617    * @memberOf _
54618    * @since 0.1.0
54619    * @category Array
54620    * @param {...Array} [arrays] The arrays to inspect.
54621    * @returns {Array} Returns the new array of intersecting values.
54622    * @example
54623    *
54624    * _.intersection([2, 1], [2, 3]);
54625    * // => [2]
54626    */
54627   var intersection = baseRest(function(arrays) {
54628     var mapped = arrayMap(arrays, castArrayLikeObject);
54629     return (mapped.length && mapped[0] === arrays[0])
54630       ? baseIntersection(mapped)
54631       : [];
54632   });
54633
54634   // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
54635   // For example, ⌘Z -> Ctrl+Z
54636   var uiCmd = function (code) {
54637       var detected = utilDetect();
54638
54639       if (detected.os === 'mac') {
54640           return code;
54641       }
54642
54643       if (detected.os === 'win') {
54644           if (code === '⌘⇧Z') return 'Ctrl+Y';
54645       }
54646
54647       var result = '',
54648           replacements = {
54649               '⌘': 'Ctrl',
54650               '⇧': 'Shift',
54651               '⌥': 'Alt',
54652               '⌫': 'Backspace',
54653               '⌦': 'Delete'
54654           };
54655
54656       for (var i = 0; i < code.length; i++) {
54657           if (code[i] in replacements) {
54658               result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
54659           } else {
54660               result += code[i];
54661           }
54662       }
54663
54664       return result;
54665   };
54666
54667
54668   // return a display-focused string for a given keyboard code
54669   uiCmd.display = function(code) {
54670       if (code.length !== 1) return code;
54671
54672       var detected = utilDetect();
54673       var mac = (detected.os === 'mac');
54674       var replacements = {
54675           '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
54676           '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
54677           '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
54678           '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
54679           '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
54680           '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
54681           '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
54682           '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
54683           '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
54684           '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
54685           '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
54686           '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
54687       };
54688
54689       return replacements[code] || code;
54690   };
54691
54692   var relatedParent;
54693
54694
54695   function modeSelect(context, selectedIDs) {
54696       var mode = {
54697           id: 'select',
54698           button: 'browse'
54699       };
54700
54701       var keybinding = d3keybinding('select');
54702       var timeout = null;
54703       var behaviors = [
54704           behaviorCopy(context),
54705           behaviorPaste(context),
54706           behaviorBreathe(context),
54707           behaviorHover(context),
54708           behaviorSelect(context),
54709           behaviorLasso(context),
54710           modeDragNode$$1(context).restoreSelectedIDs(selectedIDs).behavior,
54711           modeDragNote$$1(context).behavior
54712       ];
54713       var editMenu;
54714       var newFeature = false;
54715       var suppressMenu = true;
54716       var follow = false;
54717
54718
54719       var wrap = context.container()
54720           .select('.inspector-wrap');
54721
54722
54723       function singular() {
54724           if (selectedIDs.length === 1) {
54725               return context.hasEntity(selectedIDs[0]);
54726           }
54727       }
54728
54729
54730       function checkSelectedIDs() {
54731           var ids = [];
54732           if (Array.isArray(selectedIDs)) {
54733               ids = selectedIDs.filter(function(id) {
54734                   return context.hasEntity(id);
54735               });
54736           }
54737
54738           if (ids.length) {
54739               selectedIDs = ids;
54740           } else {
54741               context.enter(modeBrowse(context));
54742           }
54743           return !!ids.length;
54744       }
54745
54746
54747       // find the common parent ways for nextVertex, previousVertex
54748       function commonParents() {
54749           var graph = context.graph();
54750           var commonParents = [];
54751
54752           for (var i = 0; i < selectedIDs.length; i++) {
54753               var entity = context.hasEntity(selectedIDs[i]);
54754               if (!entity || entity.geometry(graph) !== 'vertex') {
54755                   return [];  // selection includes some not vertexes
54756               }
54757
54758               var currParents = map$3(graph.parentWays(entity), 'id');
54759               if (!commonParents.length) {
54760                   commonParents = currParents;
54761                   continue;
54762               }
54763
54764               commonParents = intersection(commonParents, currParents);
54765               if (!commonParents.length) {
54766                   return [];
54767               }
54768           }
54769
54770           return commonParents;
54771       }
54772
54773
54774       function singularParent() {
54775           var parents = commonParents();
54776           if (!parents || parents.length === 0) {
54777               relatedParent = null;
54778               return null;
54779           }
54780
54781           // relatedParent is used when we visit a vertex with multiple
54782           // parents, and we want to remember which parent line we started on.
54783
54784           if (parents.length === 1) {
54785               relatedParent = parents[0];  // remember this parent for later
54786               return relatedParent;
54787           }
54788
54789           if (parents.indexOf(relatedParent) !== -1) {
54790               return relatedParent;   // prefer the previously seen parent
54791           }
54792
54793           return parents[0];
54794       }
54795
54796
54797       function closeMenu() {
54798           if (editMenu) {
54799               context.surface().call(editMenu.close);
54800           }
54801       }
54802
54803
54804       function positionMenu() {
54805           if (!editMenu) { return; }
54806
54807           var entity = singular();
54808           if (entity && context.geometry(entity.id) === 'relation') {
54809               suppressMenu = true;
54810           } else {
54811               var point$$1 = context.mouse();
54812               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
54813
54814               if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
54815                   editMenu.center(point$$1);
54816               } else {
54817                   suppressMenu = true;
54818               }
54819           }
54820       }
54821
54822
54823       function showMenu() {
54824           closeMenu();
54825           if (editMenu) {
54826               context.surface().call(editMenu);
54827           }
54828       }
54829
54830
54831       function toggleMenu() {
54832           // deprecation warning - Radial Menu to be removed in iD v3
54833           if (select('.edit-menu, .radial-menu').empty()) {
54834               positionMenu();
54835               showMenu();
54836           } else {
54837               closeMenu();
54838           }
54839       }
54840
54841
54842       mode.selectedIDs = function() {
54843           return selectedIDs;
54844       };
54845
54846
54847       mode.reselect = function() {
54848           if (!checkSelectedIDs()) return;
54849
54850           var surfaceNode = context.surface().node();
54851           if (surfaceNode.focus) {   // FF doesn't support it
54852               surfaceNode.focus();
54853           }
54854
54855           positionMenu();
54856           if (!suppressMenu) {
54857               showMenu();
54858           }
54859       };
54860
54861
54862       mode.newFeature = function(_) {
54863           if (!arguments.length) return newFeature;
54864           newFeature = _;
54865           return mode;
54866       };
54867
54868
54869       mode.suppressMenu = function(_) {
54870           if (!arguments.length) return suppressMenu;
54871           suppressMenu = _;
54872           return mode;
54873       };
54874
54875
54876       mode.follow = function(_) {
54877           if (!arguments.length) return follow;
54878           follow = _;
54879           return mode;
54880       };
54881
54882
54883       mode.enter = function() {
54884
54885           function update() {
54886               closeMenu();
54887               checkSelectedIDs();
54888           }
54889
54890
54891           function dblclick() {
54892               var target = select(event.target);
54893
54894               var datum = target.datum();
54895               var entity = datum && datum.properties && datum.properties.entity;
54896               if (!entity) return;
54897
54898               if (entity instanceof osmWay && target.classed('target')) {
54899                   var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
54900                   var prev = entity.nodes[choice.index - 1];
54901                   var next = entity.nodes[choice.index];
54902
54903                   context.perform(
54904                       actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
54905                       t('operations.add.annotation.vertex')
54906                   );
54907
54908                   event.preventDefault();
54909                   event.stopPropagation();
54910
54911               } else if (entity.type === 'midpoint') {
54912                   context.perform(
54913                       actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
54914                       t('operations.add.annotation.vertex'));
54915
54916                   event.preventDefault();
54917                   event.stopPropagation();
54918               }
54919           }
54920
54921
54922           function selectElements(drawn) {
54923               if (!checkSelectedIDs()) return;
54924
54925               var surface = context.surface();
54926               var entity = singular();
54927
54928               if (entity && context.geometry(entity.id) === 'relation') {
54929                   suppressMenu = true;
54930                   return;
54931               }
54932
54933               surface.selectAll('.related')
54934                   .classed('related', false);
54935
54936               singularParent();
54937               if (relatedParent) {
54938                   surface.selectAll(utilEntitySelector([relatedParent]))
54939                       .classed('related', true);
54940               }
54941
54942               var selection$$1 = context.surface()
54943                   .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
54944
54945               if (selection$$1.empty()) {
54946                   // Return to browse mode if selected DOM elements have
54947                   // disappeared because the user moved them out of view..
54948                   var source = event && event.type === 'zoom' && event.sourceEvent;
54949                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
54950                       context.enter(modeBrowse(context));
54951                   }
54952               } else {
54953                   selection$$1
54954                       .classed('selected', true);
54955               }
54956           }
54957
54958
54959           function esc() {
54960               context.enter(modeBrowse(context));
54961           }
54962
54963
54964           function firstVertex() {
54965               event.preventDefault();
54966               var entity = singular();
54967               var parent = singularParent();
54968               var way;
54969
54970               if (entity && entity.type === 'way') {
54971                   way = entity;
54972               } else if (parent) {
54973                   way = context.entity(parent);
54974               }
54975
54976               if (way) {
54977                   context.enter(
54978                       modeSelect(context, [way.first()]).follow(true)
54979                   );
54980               }
54981           }
54982
54983
54984           function lastVertex() {
54985               event.preventDefault();
54986               var entity = singular();
54987               var parent = singularParent();
54988               var way;
54989
54990               if (entity && entity.type === 'way') {
54991                   way = entity;
54992               } else if (parent) {
54993                   way = context.entity(parent);
54994               }
54995
54996               if (way) {
54997                   context.enter(
54998                       modeSelect(context, [way.last()]).follow(true)
54999                   );
55000               }
55001           }
55002
55003
55004           function previousVertex() {
55005               event.preventDefault();
55006               var parent = singularParent();
55007               if (!parent) return;
55008
55009               var way = context.entity(parent);
55010               var length = way.nodes.length;
55011               var curr = way.nodes.indexOf(selectedIDs[0]);
55012               var index = -1;
55013
55014               if (curr > 0) {
55015                   index = curr - 1;
55016               } else if (way.isClosed()) {
55017                   index = length - 2;
55018               }
55019
55020               if (index !== -1) {
55021                   context.enter(
55022                       modeSelect(context, [way.nodes[index]]).follow(true)
55023                   );
55024               }
55025           }
55026
55027
55028           function nextVertex() {
55029               event.preventDefault();
55030               var parent = singularParent();
55031               if (!parent) return;
55032
55033               var way = context.entity(parent);
55034               var length = way.nodes.length;
55035               var curr = way.nodes.indexOf(selectedIDs[0]);
55036               var index = -1;
55037
55038               if (curr < length - 1) {
55039                   index = curr + 1;
55040               } else if (way.isClosed()) {
55041                   index = 0;
55042               }
55043
55044               if (index !== -1) {
55045                   context.enter(
55046                       modeSelect(context, [way.nodes[index]]).follow(true)
55047                   );
55048               }
55049           }
55050
55051
55052           function nextParent() {
55053               event.preventDefault();
55054               var parents = uniq(commonParents());
55055               if (!parents || parents.length < 2) return;
55056
55057               var index = parents.indexOf(relatedParent);
55058               if (index < 0 || index > parents.length - 2) {
55059                   relatedParent = parents[0];
55060               } else {
55061                   relatedParent = parents[index + 1];
55062               }
55063
55064               var surface = context.surface();
55065               surface.selectAll('.related')
55066                   .classed('related', false);
55067
55068               if (relatedParent) {
55069                   surface.selectAll(utilEntitySelector([relatedParent]))
55070                       .classed('related', true);
55071               }
55072           }
55073
55074
55075           if (!checkSelectedIDs()) return;
55076
55077           var operations = without(values$1(Operations), operationDelete)
55078               .map(function(o) { return o(selectedIDs, context); })
55079               .filter(function(o) { return o.available(); });
55080
55081           // deprecation warning - Radial Menu to be removed in iD v3
55082           var isRadialMenu = context.storage('edit-menu-style') === 'radial';
55083           if (isRadialMenu) {
55084               operations = operations.slice(0,7);
55085               operations.unshift(operationDelete(selectedIDs, context));
55086           } else {
55087               operations.push(operationDelete(selectedIDs, context));
55088           }
55089
55090           operations.forEach(function(operation) {
55091               if (operation.behavior) {
55092                   behaviors.push(operation.behavior);
55093               }
55094           });
55095
55096           behaviors.forEach(context.install);
55097
55098           keybinding
55099               .on(['[', 'pgup'], previousVertex)
55100               .on([']', 'pgdown'], nextVertex)
55101               .on(['{', uiCmd('⌘['), 'home'], firstVertex)
55102               .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
55103               .on(['\\', 'pause'], nextParent)
55104               .on('⎋', esc, true)
55105               .on('space', toggleMenu);
55106
55107           select(document)
55108               .call(keybinding);
55109
55110
55111           // deprecation warning - Radial Menu to be removed in iD v3
55112           editMenu = isRadialMenu
55113               ? uiRadialMenu(context, operations)
55114               : uiEditMenu(context, operations);
55115
55116           context.ui().sidebar
55117               .select(singular() ? singular().id : null, newFeature);
55118
55119           context.history()
55120               .on('undone.select', update)
55121               .on('redone.select', update);
55122
55123           context.map()
55124               .on('move.select', closeMenu)
55125               .on('drawn.select', selectElements);
55126
55127           context.surface()
55128               .on('dblclick.select', dblclick);
55129
55130
55131           selectElements();
55132
55133           if (selectedIDs.length > 1) {
55134               var entities = uiSelectionList(context, selectedIDs);
55135               context.ui().sidebar.show(entities);
55136           }
55137
55138           if (follow) {
55139               var extent = geoExtent$$1();
55140               var graph = context.graph();
55141               selectedIDs.forEach(function(id) {
55142                   var entity = context.entity(id);
55143                   extent._extend(entity.extent(graph));
55144               });
55145
55146               var loc = extent.center();
55147               context.map().centerEase(loc);
55148           } else if (singular() && singular().type === 'way') {
55149               context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
55150           }
55151
55152           timeout = window.setTimeout(function() {
55153               positionMenu();
55154               if (!suppressMenu) {
55155                   showMenu();
55156               }
55157           }, 270);  /* after any centerEase completes */
55158       };
55159
55160
55161       mode.exit = function() {
55162           if (timeout) window.clearTimeout(timeout);
55163
55164           behaviors.forEach(context.uninstall);
55165           keybinding.off();
55166           closeMenu();
55167           editMenu = undefined;
55168
55169           context.history()
55170               .on('undone.select', null)
55171               .on('redone.select', null);
55172
55173           var surface = context.surface();
55174
55175           surface
55176               .on('dblclick.select', null);
55177
55178           surface
55179               .selectAll('.selected')
55180               .classed('selected', false);
55181
55182           surface
55183               .selectAll('.related')
55184               .classed('related', false);
55185
55186           context.map().on('drawn.select', null);
55187           context.ui().sidebar.hide();
55188       };
55189
55190
55191       return mode;
55192   }
55193
55194   function modeSelectData$$1(context, selectedDatum) {
55195       var mode = {
55196           id: 'select-data',
55197           button: 'browse'
55198       };
55199
55200       var keybinding = d3keybinding('select-data');
55201       var dataEditor = uiDataEditor$$1(context);
55202
55203       var behaviors = [
55204           behaviorBreathe(context),
55205           behaviorHover(context),
55206           behaviorSelect(context),
55207           behaviorLasso(context),
55208           modeDragNode$$1(context).behavior,
55209           modeDragNote$$1(context).behavior
55210       ];
55211
55212
55213       // class the data as selected, or return to browse mode if the data is gone
55214       function selectData(drawn) {
55215           var selection$$1 = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
55216
55217           if (selection$$1.empty()) {
55218               // Return to browse mode if selected DOM elements have
55219               // disappeared because the user moved them out of view..
55220               var source = event && event.type === 'zoom' && event.sourceEvent;
55221               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
55222                   context.enter(modeBrowse(context));
55223               }
55224           } else {
55225               selection$$1.classed('selected', true);
55226           }
55227       }
55228
55229
55230       function esc() {
55231           context.enter(modeBrowse(context));
55232       }
55233
55234
55235       mode.enter = function() {
55236           behaviors.forEach(context.install);
55237           keybinding.on('⎋', esc, true);
55238           select(document).call(keybinding);
55239
55240           selectData();
55241
55242           context.ui().sidebar
55243               .show(dataEditor.datum(selectedDatum));
55244
55245           context.map()
55246               .on('drawn.select-data', selectData);
55247       };
55248
55249
55250       mode.exit = function() {
55251           behaviors.forEach(context.uninstall);
55252           keybinding.off();
55253
55254           context.surface()
55255               .selectAll('.layer-mapdata .selected')
55256               .classed('selected hover', false);
55257
55258           context.map()
55259               .on('drawn.select-data', null);
55260
55261           context.ui().sidebar
55262               .hide();
55263       };
55264
55265
55266       return mode;
55267   }
55268
55269   function modeSelectNote$$1(context, selectedNoteID) {
55270       var mode = {
55271           id: 'select-note',
55272           button: 'browse'
55273       };
55274
55275       var osm = services.osm;
55276       var keybinding = d3keybinding('select-note');
55277       var noteEditor = uiNoteEditor$$1(context)
55278           .on('change', function() {
55279               context.map().pan([0,0]);  // trigger a redraw
55280               var note = checkSelectedID();
55281               if (!note) return;
55282               context.ui().sidebar
55283                   .show(noteEditor.note(note));
55284           });
55285
55286       var behaviors = [
55287           behaviorBreathe(context),
55288           behaviorHover(context),
55289           behaviorSelect(context),
55290           behaviorLasso(context),
55291           modeDragNode$$1(context).behavior,
55292           modeDragNote$$1(context).behavior
55293       ];
55294
55295       var newFeature = false;
55296
55297
55298       function checkSelectedID() {
55299           if (!osm) return;
55300           var note = osm.getNote(selectedNoteID);
55301           if (!note) {
55302               context.enter(modeBrowse(context));
55303           }
55304           return note;
55305       }
55306
55307
55308       // class the note as selected, or return to browse mode if the note is gone
55309       function selectNote(drawn) {
55310           if (!checkSelectedID()) return;
55311
55312           var selection$$1 = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
55313
55314           if (selection$$1.empty()) {
55315               // Return to browse mode if selected DOM elements have
55316               // disappeared because the user moved them out of view..
55317               var source = event && event.type === 'zoom' && event.sourceEvent;
55318               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
55319                   context.enter(modeBrowse(context));
55320               }
55321
55322           } else {
55323               selection$$1
55324                   .classed('selected', true);
55325               context.selectedNoteID(selectedNoteID);
55326           }
55327       }
55328
55329
55330       function esc() {
55331           context.enter(modeBrowse(context));
55332       }
55333
55334
55335       mode.newFeature = function(_) {
55336           if (!arguments.length) return newFeature;
55337           newFeature = _;
55338           return mode;
55339       };
55340
55341
55342       mode.enter = function() {
55343           var note = checkSelectedID();
55344           if (!note) return;
55345
55346           behaviors.forEach(context.install);
55347           keybinding.on('⎋', esc, true);
55348           select(document).call(keybinding);
55349
55350           selectNote();
55351
55352           context.ui().sidebar
55353               .show(noteEditor.note(note));
55354
55355           context.map()
55356               .on('drawn.select', selectNote);
55357       };
55358
55359
55360       mode.exit = function() {
55361           behaviors.forEach(context.uninstall);
55362           keybinding.off();
55363
55364           context.surface()
55365               .selectAll('.layer-notes .selected')
55366               .classed('selected hover', false);
55367
55368           context.map()
55369               .on('drawn.select', null);
55370
55371           context.ui().sidebar
55372               .hide();
55373
55374           context.selectedNoteID(null);
55375       };
55376
55377
55378       return mode;
55379   }
55380
55381   function behaviorAddWay(context) {
55382       var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode'),
55383           draw = behaviorDraw(context);
55384
55385       var addWay = function(surface) {
55386           draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
55387               .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
55388               .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
55389               .on('cancel', addWay.cancel)
55390               .on('finish', addWay.cancel);
55391
55392           context.map()
55393               .dblclickEnable(false);
55394
55395           surface.call(draw);
55396       };
55397
55398
55399       addWay.off = function(surface) {
55400           surface.call(draw.off);
55401       };
55402
55403
55404       addWay.cancel = function() {
55405           window.setTimeout(function() {
55406               context.map().dblclickEnable(true);
55407           }, 1000);
55408
55409           context.enter(modeBrowse(context));
55410       };
55411
55412
55413       addWay.tail = function(text) {
55414           draw.tail(text);
55415           return addWay;
55416       };
55417
55418
55419       return utilRebind(addWay, dispatch$$1, 'on');
55420   }
55421
55422   function behaviorBreathe() {
55423       var duration = 800,
55424           steps = 4,
55425           selector$$1 = '.selected.shadow, .selected .shadow',
55426           selected = select(null),
55427           classed = '',
55428           params = {},
55429           done = false,
55430           timer$$1;
55431
55432
55433       function ratchetyInterpolator(a, b, steps, units) {
55434           a = parseFloat(a);
55435           b = parseFloat(b);
55436           var sample = quantize()
55437               .domain([0, 1])
55438               .range(d3_quantize(interpolateNumber(a, b), steps));
55439
55440           return function(t) {
55441               return String(sample(t)) + (units || '');
55442           };
55443       }
55444
55445
55446       function reset(selection$$1) {
55447           selection$$1
55448               .style('stroke-opacity', null)
55449               .style('stroke-width', null)
55450               .style('fill-opacity', null)
55451               .style('r', null);
55452       }
55453
55454
55455       function setAnimationParams(transition, fromTo) {
55456           var toFrom = (fromTo === 'from' ? 'to' : 'from');
55457
55458           transition
55459               .styleTween('stroke-opacity', function(d) {
55460                   return ratchetyInterpolator(
55461                       params[d.id][toFrom].opacity,
55462                       params[d.id][fromTo].opacity,
55463                       steps
55464                   );
55465               })
55466               .styleTween('stroke-width', function(d) {
55467                   return ratchetyInterpolator(
55468                       params[d.id][toFrom].width,
55469                       params[d.id][fromTo].width,
55470                       steps,
55471                       'px'
55472                   );
55473               })
55474               .styleTween('fill-opacity', function(d) {
55475                   return ratchetyInterpolator(
55476                       params[d.id][toFrom].opacity,
55477                       params[d.id][fromTo].opacity,
55478                       steps
55479                   );
55480               })
55481               .styleTween('r', function(d) {
55482                   return ratchetyInterpolator(
55483                       params[d.id][toFrom].width,
55484                       params[d.id][fromTo].width,
55485                       steps,
55486                       'px'
55487                   );
55488               });
55489       }
55490
55491
55492       function calcAnimationParams(selection$$1) {
55493           selection$$1
55494               .call(reset)
55495               .each(function(d) {
55496                   var s = select(this),
55497                       tag = s.node().tagName,
55498                       p = {'from': {}, 'to': {}},
55499                       opacity, width;
55500
55501                   // determine base opacity and width
55502                   if (tag === 'circle') {
55503                       opacity = parseFloat(s.style('fill-opacity') || 0.5);
55504                       width = parseFloat(s.style('r') || 15.5);
55505                   } else {
55506                       opacity = parseFloat(s.style('stroke-opacity') || 0.7);
55507                       width = parseFloat(s.style('stroke-width') || 10);
55508                   }
55509
55510                   // calculate from/to interpolation params..
55511                   p.tag = tag;
55512                   p.from.opacity = opacity * 0.6;
55513                   p.to.opacity = opacity * 1.25;
55514                   p.from.width = width * 0.7;
55515                   p.to.width = width * (tag === 'circle' ? 1.5 : 1);
55516                   params[d.id] = p;
55517               });
55518       }
55519
55520
55521       function run(surface, fromTo) {
55522           var toFrom = (fromTo === 'from' ? 'to' : 'from'),
55523               currSelected = surface.selectAll(selector$$1),
55524               currClassed = surface.attr('class');
55525
55526           if (done || currSelected.empty()) {
55527               selected.call(reset);
55528               return;
55529           }
55530
55531           if (!isEqual(currSelected.data(), selected.data()) || currClassed !== classed) {
55532               selected.call(reset);
55533               classed = currClassed;
55534               selected = currSelected.call(calcAnimationParams);
55535           }
55536
55537           selected
55538               .transition()
55539               .duration(duration)
55540               .call(setAnimationParams, fromTo)
55541               .on('end', function() {
55542                   surface.call(run, toFrom);
55543               });
55544       }
55545
55546
55547       var breathe = function(surface) {
55548           done = false;
55549           timer$$1 = timer(function() {
55550               // wait for elements to actually become selected
55551               if (surface.selectAll(selector$$1).empty()) {
55552                   return false;
55553               }
55554
55555               surface.call(run, 'from');
55556               timer$$1.stop();
55557               return true;
55558           }, 20);
55559       };
55560
55561
55562       breathe.off = function() {
55563           done = true;
55564           if (timer$$1) {
55565               timer$$1.stop();
55566           }
55567           selected
55568               .interrupt()
55569               .call(reset);
55570       };
55571
55572
55573       return breathe;
55574   }
55575
55576   function behaviorCopy(context) {
55577       var keybinding = d3keybinding('copy');
55578
55579
55580       function groupEntities(ids, graph) {
55581           var entities = ids.map(function (id) { return graph.entity(id); });
55582           return assignIn({relation: [], way: [], node: []},
55583               groupBy(entities, function(entity) { return entity.type; }));
55584       }
55585
55586
55587       function getDescendants(id, graph, descendants) {
55588           var entity = graph.entity(id),
55589               i, children;
55590
55591           descendants = descendants || {};
55592
55593           if (entity.type === 'relation') {
55594               children = map$3(entity.members, 'id');
55595           } else if (entity.type === 'way') {
55596               children = entity.nodes;
55597           } else {
55598               children = [];
55599           }
55600
55601           for (i = 0; i < children.length; i++) {
55602               if (!descendants[children[i]]) {
55603                   descendants[children[i]] = true;
55604                   descendants = getDescendants(children[i], graph, descendants);
55605               }
55606           }
55607
55608           return descendants;
55609       }
55610
55611
55612       function doCopy() {
55613           if (!getSelectionText()) event.preventDefault();
55614
55615           var graph = context.graph(),
55616               selected = groupEntities(context.selectedIDs(), graph),
55617               canCopy = [],
55618               skip = {},
55619               i, entity;
55620
55621           for (i = 0; i < selected.relation.length; i++) {
55622               entity = selected.relation[i];
55623               if (!skip[entity.id] && entity.isComplete(graph)) {
55624                   canCopy.push(entity.id);
55625                   skip = getDescendants(entity.id, graph, skip);
55626               }
55627           }
55628           for (i = 0; i < selected.way.length; i++) {
55629               entity = selected.way[i];
55630               if (!skip[entity.id]) {
55631                   canCopy.push(entity.id);
55632                   skip = getDescendants(entity.id, graph, skip);
55633               }
55634           }
55635           for (i = 0; i < selected.node.length; i++) {
55636               entity = selected.node[i];
55637               if (!skip[entity.id]) {
55638                   canCopy.push(entity.id);
55639               }
55640           }
55641
55642           context.copyIDs(canCopy);
55643       }
55644
55645
55646       function copy() {
55647           keybinding.on(uiCmd('⌘C'), doCopy);
55648           select(document).call(keybinding);
55649           return copy;
55650       }
55651
55652       function getSelectionText() {
55653           return window.getSelection().toString();
55654       }
55655
55656       copy.off = function() {
55657           select(document).call(keybinding.off);
55658       };
55659
55660
55661       return copy;
55662   }
55663
55664   /*
55665       `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
55666
55667       * The `origin` function is expected to return an [x, y] tuple rather than an
55668         {x, y} object.
55669       * The events are `start`, `move`, and `end`.
55670         (https://github.com/mbostock/d3/issues/563)
55671       * The `start` event is not dispatched until the first cursor movement occurs.
55672         (https://github.com/mbostock/d3/pull/368)
55673       * The `move` event has a `point` and `delta` [x, y] tuple properties rather
55674         than `x`, `y`, `dx`, and `dy` properties.
55675       * The `end` event is not dispatched if no movement occurs.
55676       * An `off` function is available that unbinds the drag's internal event handlers.
55677    */
55678
55679   function behaviorDrag() {
55680       var dispatch$$1 = dispatch('start', 'move', 'end');
55681       var _origin = null;
55682       var _selector = '';
55683       var _event;
55684       var _target;
55685       var _surface;
55686
55687
55688       var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
55689       var d3_event_userSelectSuppress = function() {
55690               var selection$$1 = selection();
55691               var select$$1 = selection$$1.style(d3_event_userSelectProperty);
55692               selection$$1.style(d3_event_userSelectProperty, 'none');
55693               return function() {
55694                   selection$$1.style(d3_event_userSelectProperty, select$$1);
55695               };
55696           };
55697
55698
55699       function d3_eventCancel() {
55700           event.stopPropagation();
55701           event.preventDefault();
55702       }
55703
55704
55705       function eventOf(thiz, argumentz) {
55706           return function(e1) {
55707               e1.target = drag;
55708               customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
55709           };
55710       }
55711
55712
55713       function dragstart() {
55714           _target = this;
55715           _event = eventOf(_target, arguments);
55716
55717           var eventTarget = event.target;
55718           var touchId = event.touches ? event.changedTouches[0].identifier : null;
55719           var offset;
55720           var startOrigin = point$$1();
55721           var started = false;
55722           var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
55723
55724           select(window)
55725               .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
55726               .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
55727
55728           if (_origin) {
55729               offset = _origin.apply(_target, arguments);
55730               offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
55731           } else {
55732               offset = [0, 0];
55733           }
55734
55735           if (touchId === null) {
55736               event.stopPropagation();
55737           }
55738
55739
55740           function point$$1() {
55741               var p = _surface || _target.parentNode;
55742               return touchId !== null ? d3_touches(p).filter(function(p) {
55743                   return p.identifier === touchId;
55744               })[0] : mouse(p);
55745           }
55746
55747
55748           function dragmove() {
55749               var p = point$$1();
55750               var dx = p[0] - startOrigin[0];
55751               var dy = p[1] - startOrigin[1];
55752
55753               if (dx === 0 && dy === 0)
55754                   return;
55755
55756               startOrigin = p;
55757               d3_eventCancel();
55758
55759               if (!started) {
55760                   started = true;
55761                   _event({ type: 'start' });
55762               } else {
55763                   _event({
55764                       type: 'move',
55765                       point: [p[0] + offset[0],  p[1] + offset[1]],
55766                       delta: [dx, dy]
55767                   });
55768               }
55769           }
55770
55771
55772           function dragend() {
55773               if (started) {
55774                   _event({ type: 'end' });
55775
55776                   d3_eventCancel();
55777                   if (event.target === eventTarget) {
55778                       select(window)
55779                           .on('click.drag', click, true);
55780                   }
55781               }
55782
55783               select(window)
55784                   .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
55785                   .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
55786
55787               selectEnable();
55788           }
55789
55790
55791           function click() {
55792               d3_eventCancel();
55793               select(window)
55794                   .on('click.drag', null);
55795           }
55796       }
55797
55798
55799       function drag(selection$$1) {
55800           var matchesSelector = utilPrefixDOMProperty('matchesSelector');
55801           var delegate = dragstart;
55802
55803           if (_selector) {
55804               delegate = function() {
55805                   var root = this;
55806                   var target = event.target;
55807                   for (; target && target !== root; target = target.parentNode) {
55808                       var datum = target.__data__;
55809
55810                       var entity = datum instanceof osmNote ?
55811                           datum : datum && datum.properties && datum.properties.entity;
55812
55813                       if (entity && target[matchesSelector](_selector)) {
55814                           return dragstart.call(target, entity);
55815                       }
55816                   }
55817               };
55818           }
55819
55820           selection$$1
55821               .on('mousedown.drag' + _selector, delegate)
55822               .on('touchstart.drag' + _selector, delegate);
55823       }
55824
55825
55826       drag.off = function(selection$$1) {
55827           selection$$1
55828               .on('mousedown.drag' + _selector, null)
55829               .on('touchstart.drag' + _selector, null);
55830       };
55831
55832
55833       drag.selector = function(_) {
55834           if (!arguments.length) return _selector;
55835           _selector = _;
55836           return drag;
55837       };
55838
55839
55840       drag.origin = function (_) {
55841           if (!arguments.length) return _origin;
55842           _origin = _;
55843           return drag;
55844       };
55845
55846
55847       drag.cancel = function() {
55848           select(window)
55849               .on('mousemove.drag', null)
55850               .on('mouseup.drag', null);
55851           return drag;
55852       };
55853
55854
55855       drag.target = function() {
55856           if (!arguments.length) return _target;
55857           _target = arguments[0];
55858           _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
55859           return drag;
55860       };
55861
55862
55863       drag.surface = function() {
55864           if (!arguments.length) return _surface;
55865           _surface = arguments[0];
55866           return drag;
55867       };
55868
55869
55870       return utilRebind(drag, dispatch$$1, 'on');
55871   }
55872
55873   function behaviorDrawWay(context, wayId, index, mode, startGraph) {
55874       var origWay = context.entity(wayId);
55875       var annotation = t((origWay.isDegenerate() ?
55876           'operations.start.annotation.' :
55877           'operations.continue.annotation.') + context.geometry(wayId)
55878       );
55879       var behavior = behaviorDraw(context);
55880       var _tempEdits = 0;
55881
55882       var end = osmNode({ loc: context.map().mouseCoordinates() });
55883
55884       // Push an annotated state for undo to return back to.
55885       // We must make sure to remove this edit later.
55886       context.perform(actionNoop(), annotation);
55887       _tempEdits++;
55888
55889       // Add the drawing node to the graph.
55890       // We must make sure to remove this edit later.
55891       context.perform(_actionAddDrawNode());
55892       _tempEdits++;
55893
55894
55895
55896       function keydown() {
55897           if (event.keyCode === d3keybinding.modifierCodes.alt) {
55898               if (context.surface().classed('nope')) {
55899                   context.surface()
55900                       .classed('nope-suppressed', true);
55901               }
55902               context.surface()
55903                   .classed('nope', false)
55904                   .classed('nope-disabled', true);
55905           }
55906       }
55907
55908
55909       function keyup() {
55910           if (event.keyCode === d3keybinding.modifierCodes.alt) {
55911               if (context.surface().classed('nope-suppressed')) {
55912                   context.surface()
55913                       .classed('nope', true);
55914               }
55915               context.surface()
55916                   .classed('nope-suppressed', false)
55917                   .classed('nope-disabled', false);
55918           }
55919       }
55920
55921
55922       // related code
55923       // - `mode/drag_node.js`     `doMode()`
55924       // - `behavior/draw.js`      `click()`
55925       // - `behavior/draw_way.js`  `move()`
55926       function move(datum) {
55927           context.surface().classed('nope-disabled', event.altKey);
55928
55929           var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
55930           var targetNodes = datum && datum.properties && datum.properties.nodes;
55931           var loc = context.map().mouseCoordinates();
55932
55933           if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
55934               loc = targetLoc;
55935
55936           } else if (targetNodes) {   // snap to way - a line target with `.nodes`
55937               var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
55938               if (choice) {
55939                   loc = choice.loc;
55940               }
55941           }
55942
55943           context.replace(actionMoveNode(end.id, loc));
55944           end = context.entity(end.id);
55945           checkGeometry(false);
55946       }
55947
55948
55949       // Check whether this edit causes the geometry to break.
55950       // If so, class the surface with a nope cursor.
55951       // `finishDraw` - Only checks the relevant line segments if finishing drawing
55952       function checkGeometry(finishDraw) {
55953           var nopeDisabled = context.surface().classed('nope-disabled');
55954           var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
55955
55956           if (nopeDisabled) {
55957               context.surface()
55958                   .classed('nope', false)
55959                   .classed('nope-suppressed', isInvalid);
55960           } else {
55961               context.surface()
55962                   .classed('nope', isInvalid)
55963                   .classed('nope-suppressed', false);
55964           }
55965       }
55966
55967
55968       function isInvalidGeometry(entity, graph, finishDraw) {
55969           var parents = graph.parentWays(entity);
55970
55971           for (var i = 0; i < parents.length; i++) {
55972               var parent = parents[i];
55973               var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
55974               
55975               if (origWay.isClosed()) { // Check if Area
55976                   if (finishDraw) {
55977                       nodes.splice(-2, 1);
55978                       entity = nodes[nodes.length-2];
55979                   } else {
55980                       nodes.pop();
55981                   }
55982               } else { // Line
55983                   if (finishDraw) {
55984                       nodes.pop();
55985                   }
55986               }
55987
55988               if (geoHasSelfIntersections(nodes, entity.id)) {
55989                   return true;
55990               }
55991           }
55992
55993           return false;
55994       }
55995
55996
55997       function undone() {
55998           // Undo popped the history back to the initial annotated no-op edit.
55999           // Remove initial no-op edit and whatever edit happened immediately before it.
56000           context.pop(2);
56001           _tempEdits = 0;
56002
56003           if (context.hasEntity(wayId)) {
56004               context.enter(mode);
56005           } else {
56006               context.enter(modeBrowse(context));
56007           }
56008       }
56009
56010
56011       function setActiveElements() {
56012           context.surface().selectAll('.' + end.id)
56013               .classed('active', true);
56014       }
56015
56016
56017       var drawWay = function(surface) {
56018           behavior
56019               .on('move', move)
56020               .on('click', drawWay.add)
56021               .on('clickWay', drawWay.addWay)
56022               .on('clickNode', drawWay.addNode)
56023               .on('undo', context.undo)
56024               .on('cancel', drawWay.cancel)
56025               .on('finish', drawWay.finish);
56026
56027           select(window)
56028               .on('keydown.drawWay', keydown)
56029               .on('keyup.drawWay', keyup);
56030
56031           context.map()
56032               .dblclickEnable(false)
56033               .on('drawn.draw', setActiveElements);
56034
56035           setActiveElements();
56036
56037           surface.call(behavior);
56038
56039           context.history()
56040               .on('undone.draw', undone);
56041       };
56042
56043
56044       drawWay.off = function(surface) {
56045           // Drawing was interrupted unexpectedly.
56046           // This can happen if the user changes modes,
56047           // clicks geolocate button, a hashchange event occurs, etc.
56048           if (_tempEdits) {
56049               context.pop(_tempEdits);
56050               while (context.graph() !== startGraph) {
56051                   context.pop();
56052               }
56053           }
56054
56055           context.map()
56056               .on('drawn.draw', null);
56057
56058           surface.call(behavior.off)
56059               .selectAll('.active')
56060               .classed('active', false);
56061
56062           surface
56063               .classed('nope', false)
56064               .classed('nope-suppressed', false)
56065               .classed('nope-disabled', false);
56066
56067           select(window)
56068               .on('keydown.hover', null)
56069               .on('keyup.hover', null);
56070
56071           context.history()
56072               .on('undone.draw', null);
56073       };
56074
56075
56076       function _actionAddDrawNode() {
56077           return function(graph) {
56078               return graph
56079                   .replace(end)
56080                   .replace(origWay.addNode(end.id, index));
56081           };
56082       }
56083
56084
56085       function _actionReplaceDrawNode(newNode) {
56086           return function(graph) {
56087               return graph
56088                   .replace(origWay.addNode(newNode.id, index))
56089                   .remove(end);
56090           };
56091       }
56092
56093
56094       // Accept the current position of the drawing node and continue drawing.
56095       drawWay.add = function(loc, d) {
56096           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56097               return;   // can't click here
56098           }
56099
56100           context.pop(_tempEdits);
56101           _tempEdits = 0;
56102
56103           context.perform(
56104               _actionAddDrawNode(),
56105               annotation
56106           );
56107
56108           checkGeometry(false);   // finishDraw = false
56109           context.enter(mode);
56110       };
56111
56112
56113       // Connect the way to an existing way.
56114       drawWay.addWay = function(loc, edge, d) {
56115           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56116               return;   // can't click here
56117           }
56118
56119           context.pop(_tempEdits);
56120           _tempEdits = 0;
56121
56122           context.perform(
56123               _actionAddDrawNode(),
56124               actionAddMidpoint({ loc: loc, edge: edge }, end),
56125               annotation
56126           );
56127
56128           checkGeometry(false);   // finishDraw = false
56129           context.enter(mode);
56130       };
56131
56132
56133       // Connect the way to an existing node and continue drawing.
56134       drawWay.addNode = function(node, d) {
56135           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56136               return;   // can't click here
56137           }
56138
56139           context.pop(_tempEdits);
56140           _tempEdits = 0;
56141
56142           context.perform(
56143               _actionReplaceDrawNode(node),
56144               annotation
56145           );
56146
56147           checkGeometry(false);   // finishDraw = false
56148           context.enter(mode);
56149       };
56150
56151
56152       // Finish the draw operation, removing the temporary edits.
56153       // If the way has enough nodes to be valid, it's selected.
56154       // Otherwise, delete everything and return to browse mode.
56155       drawWay.finish = function() {
56156           checkGeometry(true);   // finishDraw = true
56157           if (context.surface().classed('nope')) {
56158               return;   // can't click here
56159           }
56160
56161           context.pop(_tempEdits);
56162           _tempEdits = 0;
56163
56164           var way = context.hasEntity(wayId);
56165           if (!way || way.isDegenerate()) {
56166               drawWay.cancel();
56167               return;
56168           }
56169
56170           window.setTimeout(function() {
56171               context.map().dblclickEnable(true);
56172           }, 1000);
56173
56174           context.enter(modeSelect(context, [wayId]).newFeature(true));
56175       };
56176
56177
56178       // Cancel the draw operation, delete everything, and return to browse mode.
56179       drawWay.cancel = function() {
56180           context.pop(_tempEdits);
56181           _tempEdits = 0;
56182
56183           while (context.graph() !== startGraph) {
56184               context.pop();
56185           }
56186
56187           window.setTimeout(function() {
56188               context.map().dblclickEnable(true);
56189           }, 1000);
56190
56191           context.surface()
56192               .classed('nope', false)
56193               .classed('nope-disabled', false)
56194               .classed('nope-suppressed', false);
56195
56196           context.enter(modeBrowse(context));
56197       };
56198
56199
56200       drawWay.activeID = function() {
56201           if (!arguments.length) return end.id;
56202           // no assign
56203           return drawWay;
56204       };
56205
56206
56207       drawWay.tail = function(text) {
56208           behavior.tail(text);
56209           return drawWay;
56210       };
56211
56212
56213       return drawWay;
56214   }
56215
56216   function behaviorHash(context) {
56217       var s0 = null; // cached window.location.hash
56218       var lat = 90 - 1e-8; // allowable latitude range
56219
56220
56221       var parser = function(map, s) {
56222           var q = utilStringQs(s);
56223           var args = (q.map || '').split('/').map(Number);
56224
56225           if (args.length < 3 || args.some(isNaN)) {
56226               return true; // replace bogus hash
56227
56228           } else if (s !== formatter(map).slice(1)) {   // hash has changed
56229               var mode = context.mode(),
56230                   dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
56231                   maxdist = 500;
56232
56233               // Don't allow the hash location to change too much while drawing
56234               // This can happen if the user accidently hit the back button.  #3996
56235               if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
56236                   context.enter(modeBrowse(context));
56237               }
56238
56239               map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
56240           }
56241       };
56242
56243
56244       var formatter = function(map) {
56245           var center = map.center();
56246           var zoom = map.zoom();
56247           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
56248           var q = omit(utilStringQs(window.location.hash.substring(1)),
56249               ['comment', 'source', 'hashtags', 'walkthrough']
56250           );
56251           var newParams = {};
56252
56253           delete q.id;
56254           var selected = context.selectedIDs().filter(function(id) {
56255               return !context.entity(id).isNew();
56256           });
56257           if (selected.length) {
56258               newParams.id = selected.join(',');
56259           }
56260
56261           newParams.map = zoom.toFixed(2) +
56262               '/' + center[1].toFixed(precision) +
56263               '/' + center[0].toFixed(precision);
56264
56265           return '#' + utilQsString(assign(q, newParams), true);
56266       };
56267
56268
56269       function update() {
56270           if (context.inIntro()) return;
56271           var s1 = formatter(context.map());
56272           if (s0 !== s1) {
56273               window.location.replace(s0 = s1);  // don't recenter the map!
56274           }
56275       }
56276
56277
56278       var throttledUpdate = throttle(update, 500);
56279
56280
56281       function hashchange() {
56282           if (window.location.hash === s0) return;  // ignore spurious hashchange events
56283           if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
56284               update(); // replace bogus hash
56285           }
56286       }
56287
56288
56289       function hash() {
56290           context.map()
56291               .on('move.hash', throttledUpdate);
56292
56293           context
56294               .on('enter.hash', throttledUpdate);
56295
56296           select(window)
56297               .on('hashchange.hash', hashchange);
56298
56299           if (window.location.hash) {
56300
56301               var q = utilStringQs(window.location.hash.substring(1));
56302
56303               if (q.id) {
56304                   context.zoomToEntity(q.id.split(',')[0], !q.map);
56305               }
56306
56307               if (q.comment) {
56308                   context.storage('comment', q.comment);
56309                   context.storage('commentDate', Date.now());
56310               }
56311
56312               if (q.source) {
56313                   context.storage('source', q.source);
56314                   context.storage('commentDate', Date.now());
56315               }
56316
56317               if (q.hashtags) {
56318                   context.storage('hashtags', q.hashtags);
56319               }
56320
56321               if (q.walkthrough === 'true') {
56322                   hash.startWalkthrough = true;
56323               }
56324
56325               hashchange();
56326
56327               if (q.map) {
56328                   hash.hadHash = true;
56329               }
56330           }
56331       }
56332
56333
56334       hash.off = function() {
56335           throttledUpdate.cancel();
56336
56337           context.map()
56338               .on('move.hash', null);
56339
56340           context
56341               .on('enter.hash', null);
56342
56343           select(window)
56344               .on('hashchange.hash', null);
56345
56346           window.location.hash = '';
56347       };
56348
56349
56350       return hash;
56351   }
56352
56353   function behaviorLasso(context) {
56354
56355       var behavior = function(selection$$1) {
56356           var lasso;
56357
56358
56359           function mousedown() {
56360               var button = 0;  // left
56361               if (event.button === button && event.shiftKey === true) {
56362                   lasso = null;
56363
56364                   select(window)
56365                       .on('mousemove.lasso', mousemove)
56366                       .on('mouseup.lasso', mouseup);
56367
56368                   event.stopPropagation();
56369               }
56370           }
56371
56372
56373           function mousemove() {
56374               if (!lasso) {
56375                   lasso = uiLasso(context);
56376                   context.surface().call(lasso);
56377               }
56378
56379               lasso.p(context.mouse());
56380           }
56381
56382
56383           function normalize(a, b) {
56384               return [
56385                   [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
56386                   [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
56387           }
56388
56389
56390           function lassoed() {
56391               if (!lasso) return [];
56392
56393               var graph = context.graph(),
56394                   bounds = lasso.extent().map(context.projection.invert),
56395                   extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
56396
56397               return map$3(context.intersects(extent).filter(function(entity) {
56398                   return entity.type === 'node' &&
56399                       geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
56400                       !context.features().isHidden(entity, graph, entity.geometry(graph));
56401               }), 'id');
56402           }
56403
56404
56405           function mouseup() {
56406               select(window)
56407                   .on('mousemove.lasso', null)
56408                   .on('mouseup.lasso', null);
56409
56410               if (!lasso) return;
56411
56412               var ids = lassoed();
56413               lasso.close();
56414
56415               if (ids.length) {
56416                   context.enter(modeSelect(context, ids));
56417               }
56418           }
56419
56420           selection$$1
56421               .on('mousedown.lasso', mousedown);
56422       };
56423
56424
56425       behavior.off = function(selection$$1) {
56426           selection$$1.on('mousedown.lasso', null);
56427       };
56428
56429
56430       return behavior;
56431   }
56432
56433   /* Creates a keybinding behavior for an operation */
56434   function behaviorOperation() {
56435       var _operation, keybinding;
56436
56437       var behavior = function () {
56438           if (_operation && _operation.available()) {
56439               keybinding = d3keybinding('behavior.key.' + _operation.id);
56440               keybinding.on(_operation.keys, function() {
56441                   event.preventDefault();
56442                   var disabled = _operation.disabled();
56443                   var flash;
56444
56445                   if (disabled) {
56446                       flash = uiFlash()
56447                           .duration(4000)
56448                           .iconName('#iD-operation-' + _operation.id)
56449                           .iconClass('operation disabled')
56450                           .text(_operation.tooltip);
56451
56452                       flash();
56453
56454                   } else {
56455                       flash = uiFlash()
56456                           .duration(2000)
56457                           .iconName('#iD-operation-' + _operation.id)
56458                           .iconClass('operation')
56459                           .text(_operation.annotation() || _operation.title);
56460
56461                       flash();
56462                       _operation();
56463                   }
56464               });
56465
56466               select(document).call(keybinding);
56467           }
56468
56469           return behavior;
56470       };
56471
56472
56473       behavior.off = function() {
56474           if (keybinding) {
56475               select(document).call(keybinding.off);
56476           }
56477       };
56478
56479
56480       behavior.which = function (_) {
56481           if (!arguments.length) return _operation;
56482           _operation = _;
56483           return behavior;
56484       };
56485
56486
56487       return behavior;
56488   }
56489
56490   /**
56491    * The base implementation of `_.invert` and `_.invertBy` which inverts
56492    * `object` with values transformed by `iteratee` and set by `setter`.
56493    *
56494    * @private
56495    * @param {Object} object The object to iterate over.
56496    * @param {Function} setter The function to set `accumulator` values.
56497    * @param {Function} iteratee The iteratee to transform values.
56498    * @param {Object} accumulator The initial inverted object.
56499    * @returns {Function} Returns `accumulator`.
56500    */
56501   function baseInverter(object, setter, iteratee, accumulator) {
56502     baseForOwn(object, function(value, key, object) {
56503       setter(accumulator, iteratee(value), key, object);
56504     });
56505     return accumulator;
56506   }
56507
56508   /**
56509    * Creates a function like `_.invertBy`.
56510    *
56511    * @private
56512    * @param {Function} setter The function to set accumulator values.
56513    * @param {Function} toIteratee The function to resolve iteratees.
56514    * @returns {Function} Returns the new inverter function.
56515    */
56516   function createInverter(setter, toIteratee) {
56517     return function(object, iteratee) {
56518       return baseInverter(object, setter, toIteratee(iteratee), {});
56519     };
56520   }
56521
56522   /** Used for built-in method references. */
56523   var objectProto$j = Object.prototype;
56524
56525   /**
56526    * Used to resolve the
56527    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
56528    * of values.
56529    */
56530   var nativeObjectToString$2 = objectProto$j.toString;
56531
56532   /**
56533    * Creates an object composed of the inverted keys and values of `object`.
56534    * If `object` contains duplicate values, subsequent values overwrite
56535    * property assignments of previous values.
56536    *
56537    * @static
56538    * @memberOf _
56539    * @since 0.7.0
56540    * @category Object
56541    * @param {Object} object The object to invert.
56542    * @returns {Object} Returns the new inverted object.
56543    * @example
56544    *
56545    * var object = { 'a': 1, 'b': 2, 'c': 1 };
56546    *
56547    * _.invert(object);
56548    * // => { '1': 'c', '2': 'b' }
56549    */
56550   var invert = createInverter(function(result, value, key) {
56551     if (value != null &&
56552         typeof value.toString != 'function') {
56553       value = nativeObjectToString$2.call(value);
56554     }
56555
56556     result[value] = key;
56557   }, constant$d(identity$8));
56558
56559   /**
56560    * Creates an object with the same keys as `object` and values generated
56561    * by running each own enumerable string keyed property of `object` thru
56562    * `iteratee`. The iteratee is invoked with three arguments:
56563    * (value, key, object).
56564    *
56565    * @static
56566    * @memberOf _
56567    * @since 2.4.0
56568    * @category Object
56569    * @param {Object} object The object to iterate over.
56570    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
56571    * @returns {Object} Returns the new mapped object.
56572    * @see _.mapKeys
56573    * @example
56574    *
56575    * var users = {
56576    *   'fred':    { 'user': 'fred',    'age': 40 },
56577    *   'pebbles': { 'user': 'pebbles', 'age': 1 }
56578    * };
56579    *
56580    * _.mapValues(users, function(o) { return o.age; });
56581    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
56582    *
56583    * // The `_.property` iteratee shorthand.
56584    * _.mapValues(users, 'age');
56585    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
56586    */
56587   function mapValues(object, iteratee) {
56588     var result = {};
56589     iteratee = baseIteratee(iteratee, 3);
56590
56591     baseForOwn(object, function(value, key, object) {
56592       baseAssignValue(result, key, iteratee(value, key, object));
56593     });
56594     return result;
56595   }
56596
56597   function behaviorPaste(context) {
56598       var keybinding = d3keybinding('paste');
56599
56600
56601       function doPaste() {
56602           event.preventDefault();
56603
56604           var baseGraph = context.graph(),
56605               mouse$$1 = context.mouse(),
56606               projection = context.projection,
56607               viewport = geoExtent$$1(projection.clipExtent()).polygon();
56608
56609           if (!geoPointInPolygon(mouse$$1, viewport)) return;
56610
56611           var extent = geoExtent$$1(),
56612               oldIDs = context.copyIDs(),
56613               oldGraph = context.copyGraph(),
56614               newIDs = [];
56615
56616           if (!oldIDs.length) return;
56617
56618           var action = actionCopyEntities(oldIDs, oldGraph);
56619           context.perform(action);
56620
56621           var copies = action.copies();
56622           var originals = invert(mapValues(copies, 'id'));
56623           for (var id in copies) {
56624               var oldEntity = oldGraph.entity(id),
56625                   newEntity = copies[id];
56626
56627               extent._extend(oldEntity.extent(oldGraph));
56628
56629               // Exclude child nodes from newIDs if their parent way was also copied.
56630               var parents = context.graph().parentWays(newEntity),
56631                   parentCopied = false;
56632               for (var i = 0; i < parents.length; i++) {
56633                   if (originals[parents[i].id]) {
56634                       parentCopied = true;
56635                       break;
56636                   }
56637               }
56638
56639               if (!parentCopied) {
56640                   newIDs.push(newEntity.id);
56641               }
56642           }
56643
56644           // Put pasted objects where mouse pointer is..
56645           var center = projection(extent.center()),
56646               delta = [ mouse$$1[0] - center[0], mouse$$1[1] - center[1] ];
56647
56648           context.perform(actionMove(newIDs, delta, projection));
56649           context.enter(modeMove$$1(context, newIDs, baseGraph));
56650       }
56651
56652
56653       function paste() {
56654           keybinding.on(uiCmd('⌘V'), doPaste);
56655           select(document).call(keybinding);
56656           return paste;
56657       }
56658
56659
56660       paste.off = function() {
56661           select(document).call(keybinding.off);
56662       };
56663
56664
56665       return paste;
56666   }
56667
56668   function behaviorSelect(context) {
56669       var lastMouse = null;
56670       var suppressMenu = true;
56671       var tolerance = 4;
56672       var p1 = null;
56673
56674
56675       function point$$1() {
56676           return mouse(context.container().node());
56677       }
56678
56679
56680       function keydown() {
56681           var e = event;
56682           if (e && e.shiftKey) {
56683               context.surface()
56684                   .classed('behavior-multiselect', true);
56685           }
56686
56687           if (e && e.keyCode === 93) {  // context menu
56688               e.preventDefault();
56689               e.stopPropagation();
56690           }
56691       }
56692
56693
56694       function keyup() {
56695           var e = event;
56696           if (!e || !e.shiftKey) {
56697               context.surface()
56698                   .classed('behavior-multiselect', false);
56699           }
56700
56701
56702           if (e && e.keyCode === 93) {  // context menu
56703               e.preventDefault();
56704               e.stopPropagation();
56705               contextmenu();
56706           }
56707       }
56708
56709
56710       function mousedown() {
56711           if (!p1) p1 = point$$1();
56712           select(window)
56713               .on('mouseup.select', mouseup, true);
56714
56715           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
56716           suppressMenu = !isShowAlways;
56717       }
56718
56719
56720       function mousemove() {
56721           if (event) lastMouse = event;
56722       }
56723
56724
56725       function mouseup() {
56726           click();
56727       }
56728
56729
56730       function contextmenu() {
56731           var e = event;
56732           e.preventDefault();
56733           e.stopPropagation();
56734
56735           if (!+e.clientX && !+e.clientY) {
56736               if (lastMouse) {
56737                   e.sourceEvent = lastMouse;
56738               } else {
56739                   return;
56740               }
56741           }
56742
56743           if (!p1) p1 = point$$1();
56744           suppressMenu = false;
56745           click();
56746       }
56747
56748
56749       function click() {
56750           select(window)
56751               .on('mouseup.select', null, true);
56752
56753           if (!p1) return;
56754           var p2 = point$$1();
56755           var dist = geoVecLength(p1, p2);
56756
56757           p1 = null;
56758           if (dist > tolerance) {
56759               return;
56760           }
56761
56762           var isMultiselect = event.shiftKey || select('#surface .lasso').node();
56763           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
56764           var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
56765           var mode = context.mode();
56766
56767           var entity = datum && datum.properties && datum.properties.entity;
56768           if (entity) datum = entity;
56769
56770           if (datum && datum.type === 'midpoint') {
56771               datum = datum.parents[0];
56772           }
56773
56774           if (datum instanceof osmEntity$$1) {    // clicked an entity..
56775               var selectedIDs = context.selectedIDs();
56776               context.selectedNoteID(null);
56777
56778               if (!isMultiselect) {
56779                   if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
56780                       // multiple things already selected, just show the menu...
56781                       mode.suppressMenu(false).reselect();
56782                   } else {
56783                       // select a single thing..
56784                       context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
56785                   }
56786
56787               } else {
56788                   if (selectedIDs.indexOf(datum.id) !== -1) {
56789                       // clicked entity is already in the selectedIDs list..
56790                       if (!suppressMenu && !isShowAlways) {
56791                           // don't deselect clicked entity, just show the menu.
56792                           mode.suppressMenu(false).reselect();
56793                       } else {
56794                           // deselect clicked entity, then reenter select mode or return to browse mode..
56795                           selectedIDs = without(selectedIDs, datum.id);
56796                           context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
56797                       }
56798                   } else {
56799                       // clicked entity is not in the selected list, add it..
56800                       selectedIDs = selectedIDs.concat([datum.id]);
56801                       context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
56802                   }
56803               }
56804
56805           } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
56806               context
56807                   .selectedNoteID(null)
56808                   .enter(modeSelectData$$1(context, datum));
56809
56810           } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
56811               context
56812                   .selectedNoteID(datum.id)
56813                   .enter(modeSelectNote$$1(context, datum.id));
56814
56815           } else {    // clicked nothing..
56816               context.selectedNoteID(null);
56817               if (!isMultiselect && mode.id !== 'browse') {
56818                   context.enter(modeBrowse(context));
56819               }
56820           }
56821
56822           // reset for next time..
56823           suppressMenu = true;
56824       }
56825
56826
56827       var behavior = function(selection$$1) {
56828           lastMouse = null;
56829           suppressMenu = true;
56830           p1 = null;
56831
56832           select(window)
56833               .on('keydown.select', keydown)
56834               .on('keyup.select', keyup)
56835               .on('contextmenu.select-window', function() {
56836                   // Edge and IE really like to show the contextmenu on the
56837                   // menubar when user presses a keyboard menu button
56838                   // even after we've already preventdefaulted the key event.
56839                   var e = event;
56840                   if (+e.clientX === 0 && +e.clientY === 0) {
56841                       event.preventDefault();
56842                       event.stopPropagation();
56843                   }
56844               });
56845
56846           selection$$1
56847               .on('mousedown.select', mousedown)
56848               .on('mousemove.select', mousemove)
56849               .on('contextmenu.select', contextmenu);
56850
56851           if (event && event.shiftKey) {
56852               context.surface()
56853                   .classed('behavior-multiselect', true);
56854           }
56855       };
56856
56857
56858       behavior.off = function(selection$$1) {
56859           select(window)
56860               .on('keydown.select', null)
56861               .on('keyup.select', null)
56862               .on('contextmenu.select-window', null)
56863               .on('mouseup.select', null, true);
56864
56865           selection$$1
56866               .on('mousedown.select', null)
56867               .on('mousemove.select', null)
56868               .on('contextmenu.select', null);
56869
56870           context.surface()
56871               .classed('behavior-multiselect', false);
56872       };
56873
56874
56875       return behavior;
56876   }
56877
56878   function uiAccount(context) {
56879       var osm = context.connection();
56880
56881
56882       function update(selection$$1) {
56883           if (!osm) return;
56884
56885           if (!osm.authenticated()) {
56886               selection$$1.selectAll('#userLink, #logoutLink')
56887                   .classed('hide', true);
56888               return;
56889           }
56890
56891           osm.userDetails(function(err, details) {
56892               var userLink = selection$$1.select('#userLink'),
56893                   logoutLink = selection$$1.select('#logoutLink');
56894
56895               userLink.html('');
56896               logoutLink.html('');
56897
56898               if (err) return;
56899
56900               selection$$1.selectAll('#userLink, #logoutLink')
56901                   .classed('hide', false);
56902
56903               // Link
56904               userLink.append('a')
56905                   .attr('href', osm.userURL(details.display_name))
56906                   .attr('target', '_blank');
56907
56908               // Add thumbnail or dont
56909               if (details.image_url) {
56910                   userLink.append('img')
56911                       .attr('class', 'icon pre-text user-icon')
56912                       .attr('src', details.image_url);
56913               } else {
56914                   userLink
56915                       .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
56916               }
56917
56918               // Add user name
56919               userLink.append('span')
56920                   .attr('class', 'label')
56921                   .text(details.display_name);
56922
56923               logoutLink.append('a')
56924                   .attr('class', 'logout')
56925                   .attr('href', '#')
56926                   .text(t('logout'))
56927                   .on('click.logout', function() {
56928                       event.preventDefault();
56929                       osm.logout();
56930                   });
56931           });
56932       }
56933
56934
56935       return function(selection$$1) {
56936           selection$$1.append('li')
56937               .attr('id', 'logoutLink')
56938               .classed('hide', true);
56939
56940           selection$$1.append('li')
56941               .attr('id', 'userLink')
56942               .classed('hide', true);
56943
56944           if (osm) {
56945               osm.on('change.account', function() { update(selection$$1); });
56946               update(selection$$1);
56947           }
56948       };
56949   }
56950
56951   function uiAttribution(context) {
56952       var selection$$1;
56953
56954
56955       function attribution(data, klass) {
56956           var div = selection$$1.selectAll('.' + klass)
56957               .data([0]);
56958
56959           div = div.enter()
56960               .append('div')
56961               .attr('class', klass)
56962               .merge(div);
56963
56964
56965           var background = div.selectAll('.attribution')
56966               .data(data, function(d) { return d.name(); });
56967
56968           background.exit()
56969               .remove();
56970
56971           background = background.enter()
56972               .append('span')
56973               .attr('class', 'attribution')
56974               .each(function(d) {
56975                   if (d.terms_html) {
56976                       select(this)
56977                           .html(d.terms_html);
56978                       return;
56979                   }
56980
56981                   var selection$$1;
56982                   if (d.terms_url) {
56983                       selection$$1 = select(this)
56984                           .append('a')
56985                           .attr('href', d.terms_url)
56986                           .attr('target', '_blank');
56987                   } else {
56988                       selection$$1 = select(this);
56989                   }
56990
56991
56992                   var id_safe = d.id.replace('.', '<TX_DOT>');
56993                   var terms_text = t('imagery.' + id_safe + '.attribution.text',
56994                       { default: d.terms_text || d.id || d.name() }
56995                   );
56996
56997                   if (d.icon && !d.overlay) {
56998                       selection$$1
56999                           .append('img')
57000                           .attr('class', 'source-image')
57001                           .attr('src', d.icon);
57002                   }
57003
57004                   selection$$1
57005                       .append('span')
57006                       .attr('class', 'attribution-text')
57007                       .text(terms_text);
57008               })
57009               .merge(background);
57010
57011
57012           var copyright = background.selectAll('.copyright-notice')
57013               .data(function(d) {
57014                   var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
57015                   return notice ? [notice] : [];
57016               });
57017
57018           copyright.exit()
57019               .remove();
57020
57021           copyright = copyright.enter()
57022               .append('span')
57023               .attr('class', 'copyright-notice')
57024               .merge(copyright);
57025
57026           copyright
57027               .text(String);
57028       }
57029
57030
57031       function update() {
57032           attribution([context.background().baseLayerSource()], 'base-layer-attribution');
57033           attribution(context.background().overlayLayerSources().filter(function (s) {
57034               return s.validZoom(context.map().zoom());
57035           }), 'overlay-layer-attribution');
57036       }
57037
57038
57039       return function(select$$1) {
57040           selection$$1 = select$$1;
57041
57042           context.background()
57043               .on('change.attribution', update);
57044
57045           context.map()
57046               .on('move.attribution', throttle(update, 400, {leading: false}));
57047
57048           update();
57049       };
57050   }
57051
57052   // toggles the visibility of ui elements, using a combination of the
57053   // hide class, which sets display=none, and a d3 transition for opacity.
57054   // this will cause blinking when called repeatedly, so check that the
57055   // value actually changes between calls.
57056   function uiToggle(show, callback) {
57057       return function(selection$$1) {
57058           selection$$1
57059               .style('opacity', show ? 0 : 1)
57060               .classed('hide', false)
57061               .transition()
57062               .style('opacity', show ? 1 : 0)
57063               .on('end', function() {
57064                   select(this)
57065                       .classed('hide', !show)
57066                       .style('opacity', null);
57067                   if (callback) callback.apply(this);
57068               });
57069       };
57070   }
57071
57072   function uiDisclosure(context, key, expandedDefault) {
57073       var dispatch$$1 = dispatch('toggled');
57074       var _preference = (context.storage('disclosure.' + key + '.expanded'));
57075       var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
57076       var _title;
57077       var _updatePreference = true;
57078       var _content = function () {};
57079
57080
57081       var disclosure = function(selection$$1) {
57082           var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
57083               .data([0]);
57084
57085           // enter
57086           var hideToggleEnter = hideToggle.enter()
57087               .append('a')
57088               .attr('href', '#')
57089               .attr('class', 'hide-toggle hide-toggle-' + key)
57090               .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
57091
57092           hideToggleEnter
57093               .append('span')
57094               .attr('class', 'hide-toggle-text');
57095
57096           // update
57097           hideToggle = hideToggleEnter
57098               .merge(hideToggle);
57099
57100           hideToggle
57101               .on('click', toggle)
57102               .classed('expanded', _expanded);
57103
57104           hideToggle.selectAll('.hide-toggle-text')
57105               .text(_title);
57106
57107           hideToggle.selectAll('.hide-toggle-icon')
57108               .attr('xlink:href', _expanded ? '#iD-icon-down'
57109                   : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57110               );
57111
57112
57113           var wrap = selection$$1.selectAll('.disclosure-wrap')
57114               .data([0]);
57115
57116           wrap = wrap.enter()
57117               .append('div')
57118               .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
57119               .merge(wrap);
57120
57121           wrap
57122               .classed('hide', !_expanded)
57123               .call(_content);
57124
57125
57126           function toggle() {
57127               event.preventDefault();
57128
57129               _expanded = !_expanded;
57130
57131               if (_updatePreference) {
57132                   context.storage('disclosure.' + key + '.expanded', _expanded);
57133               }
57134
57135               hideToggle
57136                   .classed('expanded', _expanded);
57137
57138               hideToggle.selectAll('.hide-toggle-icon')
57139                   .attr('xlink:href', _expanded ? '#iD-icon-down'
57140                       : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57141                   );
57142
57143               wrap
57144                   .call(uiToggle(_expanded));
57145
57146               dispatch$$1.call('toggled', this, _expanded);
57147           }
57148       };
57149
57150
57151       disclosure.title = function(_) {
57152           if (!arguments.length) return _title;
57153           _title = _;
57154           return disclosure;
57155       };
57156
57157
57158       disclosure.expanded = function(_) {
57159           if (!arguments.length) return _expanded;
57160           _expanded = _;
57161           return disclosure;
57162       };
57163
57164
57165       disclosure.updatePreference = function(_) {
57166           if (!arguments.length) return _updatePreference;
57167           _updatePreference = _;
57168           return disclosure;
57169       };
57170
57171
57172       disclosure.content = function(_) {
57173           if (!arguments.length) return _content;
57174           _content = _;
57175           return disclosure;
57176       };
57177
57178
57179       return utilRebind(disclosure, dispatch$$1, 'on');
57180   }
57181
57182   function uiBackgroundDisplayOptions(context) {
57183       var detected = utilDetect();
57184       var storedOpacity = context.storage('background-opacity');
57185       var minVal = 0.25;
57186       var maxVal = detected.cssfilters ? 2 : 1;
57187
57188       var sliders = detected.cssfilters
57189           ? ['brightness', 'contrast', 'saturation', 'sharpness']
57190           : ['brightness'];
57191
57192       var _options = {
57193           brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
57194           contrast: 1,
57195           saturation: 1,
57196           sharpness: 1
57197       };
57198
57199       var _selection = select(null);
57200
57201
57202       function clamp(x, min, max) {
57203           return Math.max(min, Math.min(x, max));
57204       }
57205
57206
57207       function updateValue(d, val) {
57208           if (!val && event && event.target) {
57209               val = event.target.value;
57210           }
57211
57212           val = clamp(val, minVal, maxVal);
57213
57214           _options[d] = val;
57215           context.background()[d](val);
57216
57217           if (d === 'brightness') {
57218               context.storage('background-opacity', val);
57219           }
57220
57221           _selection
57222               .call(render);
57223       }
57224
57225
57226       function render(selection$$1) {
57227           var container = selection$$1.selectAll('.display-options-container')
57228               .data([0]);
57229
57230           var containerEnter = container.enter()
57231               .append('div')
57232               .attr('class', 'display-options-container controls-list');
57233
57234           // add slider controls
57235           var slidersEnter = containerEnter.selectAll('.display-control')
57236               .data(sliders)
57237               .enter()
57238               .append('div')
57239               .attr('class', function(d) { return 'display-control display-control-' + d; });
57240
57241           slidersEnter
57242               .append('h5')
57243               .text(function(d) { return t('background.' + d); })
57244               .append('span')
57245               .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
57246
57247           slidersEnter
57248               .append('input')
57249               .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
57250               .attr('type', 'range')
57251               .attr('min', minVal)
57252               .attr('max', maxVal)
57253               .attr('step', '0.05')
57254               .on('input', function(d) {
57255                   var val = select(this).property('value');
57256                   updateValue(d, val);
57257               });
57258
57259           slidersEnter
57260               .append('button')
57261               .attr('title', t('background.reset'))
57262               .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
57263               .on('click', function(d) {
57264                   if (event.button !== 0) return;
57265                   updateValue(d, 1);
57266               })
57267               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
57268
57269
57270           // update
57271           container = containerEnter
57272               .merge(container);
57273
57274           container.selectAll('.display-option-input')
57275               .property('value', function(d) { return _options[d]; });
57276
57277           container.selectAll('.display-option-value')
57278               .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
57279
57280           container.selectAll('.display-option-reset')
57281               .classed('disabled', function(d) { return _options[d] === 1; });
57282
57283           // first time only, set brightness if needed
57284           if (containerEnter.size() && _options.brightness !== 1) {
57285               context.background().brightness(_options.brightness);
57286           }
57287       }
57288
57289
57290       function backgroundDisplayOptions(selection$$1) {
57291           _selection = selection$$1;
57292
57293           selection$$1
57294               .call(uiDisclosure(context, 'background_display_options', true)
57295                   .title(t('background.display_options'))
57296                   .content(render)
57297               );
57298       }
57299
57300
57301       return backgroundDisplayOptions;
57302   }
57303
57304   function uiBackgroundOffset(context) {
57305       var directions = [
57306           ['right', [0.5, 0]],
57307           ['top', [0, -0.5]],
57308           ['left', [-0.5, 0]],
57309           ['bottom', [0, 0.5]]
57310       ];
57311
57312
57313       function d3_eventCancel() {
57314           event.stopPropagation();
57315           event.preventDefault();
57316       }
57317
57318
57319       function updateValue() {
57320           var meters = geoOffsetToMeters(context.background().offset());
57321           var x = +meters[0].toFixed(2);
57322           var y = +meters[1].toFixed(2);
57323
57324           d3_selectAll('.nudge-inner-rect')
57325               .select('input')
57326               .classed('error', false)
57327               .property('value', x + ', ' + y);
57328
57329           d3_selectAll('.nudge-reset')
57330               .classed('disabled', function() {
57331                   return (x === 0 && y === 0);
57332               });
57333       }
57334
57335
57336       function resetOffset() {
57337           context.background().offset([0, 0]);
57338           updateValue();
57339       }
57340
57341
57342       function nudge(d) {
57343           context.background().nudge(d, context.map().zoom());
57344           updateValue();
57345       }
57346
57347
57348       function clickNudgeButton(d) {
57349           var interval;
57350           var timeout = window.setTimeout(function() {
57351                   interval = window.setInterval(nudge.bind(null, d), 100);
57352               }, 500);
57353
57354           function doneNudge() {
57355               window.clearTimeout(timeout);
57356               window.clearInterval(interval);
57357               select(window)
57358                   .on('mouseup.buttonoffset', null, true)
57359                   .on('mousedown.buttonoffset', null, true);
57360           }
57361
57362           select(window)
57363               .on('mouseup.buttonoffset', doneNudge, true)
57364               .on('mousedown.buttonoffset', doneNudge, true);
57365
57366           nudge(d);
57367       }
57368
57369
57370       function inputOffset() {
57371           var input = select(this);
57372           var d = input.node().value;
57373
57374           if (d === '') return resetOffset();
57375
57376           d = d.replace(/;/g, ',').split(',').map(function(n) {
57377               // if n is NaN, it will always get mapped to false.
57378               return !isNaN(n) && n;
57379           });
57380
57381           if (d.length !== 2 || !d[0] || !d[1]) {
57382               input.classed('error', true);
57383               return;
57384           }
57385
57386           context.background().offset(geoMetersToOffset(d));
57387           updateValue();
57388       }
57389
57390
57391       function dragOffset() {
57392           event.preventDefault();
57393           if (event.button !== 0) return;
57394
57395           var origin = [event.clientX, event.clientY];
57396
57397           context.container()
57398               .append('div')
57399               .attr('class', 'nudge-surface');
57400
57401           select(window)
57402               .on('mousemove.offset', function() {
57403                   var latest = [event.clientX, event.clientY];
57404                   var d = [
57405                       -(origin[0] - latest[0]) / 4,
57406                       -(origin[1] - latest[1]) / 4
57407                   ];
57408
57409                   origin = latest;
57410                   nudge(d);
57411               })
57412               .on('mouseup.offset', function() {
57413                   if (event.button !== 0) return;
57414                   d3_selectAll('.nudge-surface')
57415                       .remove();
57416
57417                   select(window)
57418                       .on('mousemove.offset', null)
57419                       .on('mouseup.offset', null);
57420               });
57421       }
57422
57423
57424       function render(selection$$1) {
57425           var container = selection$$1.selectAll('.nudge-container')
57426               .data([0]);
57427
57428           var containerEnter = container.enter()
57429               .append('div')
57430               .attr('class', 'nudge-container cf');
57431
57432           containerEnter
57433               .append('div')
57434               .attr('class', 'nudge-instructions')
57435               .text(t('background.offset'));
57436
57437           var nudgeEnter = containerEnter
57438               .append('div')
57439               .attr('class', 'nudge-outer-rect')
57440               .on('mousedown', dragOffset);
57441
57442           nudgeEnter
57443               .append('div')
57444               .attr('class', 'nudge-inner-rect')
57445               .append('input')
57446               .on('change', inputOffset);
57447
57448           containerEnter
57449               .append('div')
57450               .selectAll('button')
57451               .data(directions).enter()
57452               .append('button')
57453               .attr('class', function(d) { return d[0] + ' nudge'; })
57454               .on('contextmenu', d3_eventCancel)
57455               .on('mousedown', function(d) {
57456                   if (event.button !== 0) return;
57457                   clickNudgeButton(d[1]);
57458               });
57459
57460           containerEnter
57461               .append('button')
57462               .attr('title', t('background.reset'))
57463               .attr('class', 'nudge-reset disabled')
57464               .on('contextmenu', d3_eventCancel)
57465               .on('click', function() {
57466                   if (event.button !== 0) return;
57467                   resetOffset();
57468               })
57469               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
57470
57471           updateValue();
57472       }
57473
57474
57475       function backgroundOffset(selection$$1) {
57476           selection$$1
57477               .call(uiDisclosure(context, 'background_offset', false)
57478                   .title(t('background.fix_misalignment'))
57479                   .content(render)
57480               );
57481       }
57482
57483
57484       context.background()
57485           .on('change.backgroundOffset-update', updateValue);
57486
57487       return backgroundOffset;
57488   }
57489
57490   var marked = createCommonjsModule(function (module, exports) {
57491   (function(root) {
57492
57493   /**
57494    * Block-Level Grammar
57495    */
57496
57497   var block = {
57498     newline: /^\n+/,
57499     code: /^( {4}[^\n]+\n*)+/,
57500     fences: noop,
57501     hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
57502     heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
57503     nptable: noop,
57504     blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
57505     list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
57506     html: '^ {0,3}(?:' // optional indentation
57507       + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
57508       + '|comment[^\\n]*(\\n+|$)' // (2)
57509       + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
57510       + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
57511       + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
57512       + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
57513       + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
57514       + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
57515       + ')',
57516     def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
57517     table: noop,
57518     lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
57519     paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
57520     text: /^[^\n]+/
57521   };
57522
57523   block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
57524   block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
57525   block.def = edit(block.def)
57526     .replace('label', block._label)
57527     .replace('title', block._title)
57528     .getRegex();
57529
57530   block.bullet = /(?:[*+-]|\d+\.)/;
57531   block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
57532   block.item = edit(block.item, 'gm')
57533     .replace(/bull/g, block.bullet)
57534     .getRegex();
57535
57536   block.list = edit(block.list)
57537     .replace(/bull/g, block.bullet)
57538     .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
57539     .replace('def', '\\n+(?=' + block.def.source + ')')
57540     .getRegex();
57541
57542   block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
57543     + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
57544     + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
57545     + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
57546     + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
57547     + '|track|ul';
57548   block._comment = /<!--(?!-?>)[\s\S]*?-->/;
57549   block.html = edit(block.html, 'i')
57550     .replace('comment', block._comment)
57551     .replace('tag', block._tag)
57552     .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
57553     .getRegex();
57554
57555   block.paragraph = edit(block.paragraph)
57556     .replace('hr', block.hr)
57557     .replace('heading', block.heading)
57558     .replace('lheading', block.lheading)
57559     .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
57560     .getRegex();
57561
57562   block.blockquote = edit(block.blockquote)
57563     .replace('paragraph', block.paragraph)
57564     .getRegex();
57565
57566   /**
57567    * Normal Block Grammar
57568    */
57569
57570   block.normal = merge({}, block);
57571
57572   /**
57573    * GFM Block Grammar
57574    */
57575
57576   block.gfm = merge({}, block.normal, {
57577     fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
57578     paragraph: /^/,
57579     heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
57580   });
57581
57582   block.gfm.paragraph = edit(block.paragraph)
57583     .replace('(?!', '(?!'
57584       + block.gfm.fences.source.replace('\\1', '\\2') + '|'
57585       + block.list.source.replace('\\1', '\\3') + '|')
57586     .getRegex();
57587
57588   /**
57589    * GFM + Tables Block Grammar
57590    */
57591
57592   block.tables = merge({}, block.gfm, {
57593     nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
57594     table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
57595   });
57596
57597   /**
57598    * Pedantic grammar
57599    */
57600
57601   block.pedantic = merge({}, block.normal, {
57602     html: edit(
57603       '^ *(?:comment *(?:\\n|\\s*$)'
57604       + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
57605       + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
57606       .replace('comment', block._comment)
57607       .replace(/tag/g, '(?!(?:'
57608         + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
57609         + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
57610         + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
57611       .getRegex(),
57612     def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
57613   });
57614
57615   /**
57616    * Block Lexer
57617    */
57618
57619   function Lexer(options) {
57620     this.tokens = [];
57621     this.tokens.links = Object.create(null);
57622     this.options = options || marked.defaults;
57623     this.rules = block.normal;
57624
57625     if (this.options.pedantic) {
57626       this.rules = block.pedantic;
57627     } else if (this.options.gfm) {
57628       if (this.options.tables) {
57629         this.rules = block.tables;
57630       } else {
57631         this.rules = block.gfm;
57632       }
57633     }
57634   }
57635
57636   /**
57637    * Expose Block Rules
57638    */
57639
57640   Lexer.rules = block;
57641
57642   /**
57643    * Static Lex Method
57644    */
57645
57646   Lexer.lex = function(src, options) {
57647     var lexer = new Lexer(options);
57648     return lexer.lex(src);
57649   };
57650
57651   /**
57652    * Preprocessing
57653    */
57654
57655   Lexer.prototype.lex = function(src) {
57656     src = src
57657       .replace(/\r\n|\r/g, '\n')
57658       .replace(/\t/g, '    ')
57659       .replace(/\u00a0/g, ' ')
57660       .replace(/\u2424/g, '\n');
57661
57662     return this.token(src, true);
57663   };
57664
57665   /**
57666    * Lexing
57667    */
57668
57669   Lexer.prototype.token = function(src, top) {
57670     src = src.replace(/^ +$/gm, '');
57671     var next,
57672         loose,
57673         cap,
57674         bull,
57675         b,
57676         item,
57677         listStart,
57678         listItems,
57679         t,
57680         space,
57681         i,
57682         tag,
57683         l,
57684         isordered,
57685         istask,
57686         ischecked;
57687
57688     while (src) {
57689       // newline
57690       if (cap = this.rules.newline.exec(src)) {
57691         src = src.substring(cap[0].length);
57692         if (cap[0].length > 1) {
57693           this.tokens.push({
57694             type: 'space'
57695           });
57696         }
57697       }
57698
57699       // code
57700       if (cap = this.rules.code.exec(src)) {
57701         src = src.substring(cap[0].length);
57702         cap = cap[0].replace(/^ {4}/gm, '');
57703         this.tokens.push({
57704           type: 'code',
57705           text: !this.options.pedantic
57706             ? rtrim(cap, '\n')
57707             : cap
57708         });
57709         continue;
57710       }
57711
57712       // fences (gfm)
57713       if (cap = this.rules.fences.exec(src)) {
57714         src = src.substring(cap[0].length);
57715         this.tokens.push({
57716           type: 'code',
57717           lang: cap[2],
57718           text: cap[3] || ''
57719         });
57720         continue;
57721       }
57722
57723       // heading
57724       if (cap = this.rules.heading.exec(src)) {
57725         src = src.substring(cap[0].length);
57726         this.tokens.push({
57727           type: 'heading',
57728           depth: cap[1].length,
57729           text: cap[2]
57730         });
57731         continue;
57732       }
57733
57734       // table no leading pipe (gfm)
57735       if (top && (cap = this.rules.nptable.exec(src))) {
57736         item = {
57737           type: 'table',
57738           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
57739           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
57740           cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
57741         };
57742
57743         if (item.header.length === item.align.length) {
57744           src = src.substring(cap[0].length);
57745
57746           for (i = 0; i < item.align.length; i++) {
57747             if (/^ *-+: *$/.test(item.align[i])) {
57748               item.align[i] = 'right';
57749             } else if (/^ *:-+: *$/.test(item.align[i])) {
57750               item.align[i] = 'center';
57751             } else if (/^ *:-+ *$/.test(item.align[i])) {
57752               item.align[i] = 'left';
57753             } else {
57754               item.align[i] = null;
57755             }
57756           }
57757
57758           for (i = 0; i < item.cells.length; i++) {
57759             item.cells[i] = splitCells(item.cells[i], item.header.length);
57760           }
57761
57762           this.tokens.push(item);
57763
57764           continue;
57765         }
57766       }
57767
57768       // hr
57769       if (cap = this.rules.hr.exec(src)) {
57770         src = src.substring(cap[0].length);
57771         this.tokens.push({
57772           type: 'hr'
57773         });
57774         continue;
57775       }
57776
57777       // blockquote
57778       if (cap = this.rules.blockquote.exec(src)) {
57779         src = src.substring(cap[0].length);
57780
57781         this.tokens.push({
57782           type: 'blockquote_start'
57783         });
57784
57785         cap = cap[0].replace(/^ *> ?/gm, '');
57786
57787         // Pass `top` to keep the current
57788         // "toplevel" state. This is exactly
57789         // how markdown.pl works.
57790         this.token(cap, top);
57791
57792         this.tokens.push({
57793           type: 'blockquote_end'
57794         });
57795
57796         continue;
57797       }
57798
57799       // list
57800       if (cap = this.rules.list.exec(src)) {
57801         src = src.substring(cap[0].length);
57802         bull = cap[2];
57803         isordered = bull.length > 1;
57804
57805         listStart = {
57806           type: 'list_start',
57807           ordered: isordered,
57808           start: isordered ? +bull : '',
57809           loose: false
57810         };
57811
57812         this.tokens.push(listStart);
57813
57814         // Get each top-level item.
57815         cap = cap[0].match(this.rules.item);
57816
57817         listItems = [];
57818         next = false;
57819         l = cap.length;
57820         i = 0;
57821
57822         for (; i < l; i++) {
57823           item = cap[i];
57824
57825           // Remove the list item's bullet
57826           // so it is seen as the next token.
57827           space = item.length;
57828           item = item.replace(/^ *([*+-]|\d+\.) +/, '');
57829
57830           // Outdent whatever the
57831           // list item contains. Hacky.
57832           if (~item.indexOf('\n ')) {
57833             space -= item.length;
57834             item = !this.options.pedantic
57835               ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
57836               : item.replace(/^ {1,4}/gm, '');
57837           }
57838
57839           // Determine whether the next list item belongs here.
57840           // Backpedal if it does not belong in this list.
57841           if (this.options.smartLists && i !== l - 1) {
57842             b = block.bullet.exec(cap[i + 1])[0];
57843             if (bull !== b && !(bull.length > 1 && b.length > 1)) {
57844               src = cap.slice(i + 1).join('\n') + src;
57845               i = l - 1;
57846             }
57847           }
57848
57849           // Determine whether item is loose or not.
57850           // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
57851           // for discount behavior.
57852           loose = next || /\n\n(?!\s*$)/.test(item);
57853           if (i !== l - 1) {
57854             next = item.charAt(item.length - 1) === '\n';
57855             if (!loose) loose = next;
57856           }
57857
57858           if (loose) {
57859             listStart.loose = true;
57860           }
57861
57862           // Check for task list items
57863           istask = /^\[[ xX]\] /.test(item);
57864           ischecked = undefined;
57865           if (istask) {
57866             ischecked = item[1] !== ' ';
57867             item = item.replace(/^\[[ xX]\] +/, '');
57868           }
57869
57870           t = {
57871             type: 'list_item_start',
57872             task: istask,
57873             checked: ischecked,
57874             loose: loose
57875           };
57876
57877           listItems.push(t);
57878           this.tokens.push(t);
57879
57880           // Recurse.
57881           this.token(item, false);
57882
57883           this.tokens.push({
57884             type: 'list_item_end'
57885           });
57886         }
57887
57888         if (listStart.loose) {
57889           l = listItems.length;
57890           i = 0;
57891           for (; i < l; i++) {
57892             listItems[i].loose = true;
57893           }
57894         }
57895
57896         this.tokens.push({
57897           type: 'list_end'
57898         });
57899
57900         continue;
57901       }
57902
57903       // html
57904       if (cap = this.rules.html.exec(src)) {
57905         src = src.substring(cap[0].length);
57906         this.tokens.push({
57907           type: this.options.sanitize
57908             ? 'paragraph'
57909             : 'html',
57910           pre: !this.options.sanitizer
57911             && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
57912           text: cap[0]
57913         });
57914         continue;
57915       }
57916
57917       // def
57918       if (top && (cap = this.rules.def.exec(src))) {
57919         src = src.substring(cap[0].length);
57920         if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
57921         tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
57922         if (!this.tokens.links[tag]) {
57923           this.tokens.links[tag] = {
57924             href: cap[2],
57925             title: cap[3]
57926           };
57927         }
57928         continue;
57929       }
57930
57931       // table (gfm)
57932       if (top && (cap = this.rules.table.exec(src))) {
57933         item = {
57934           type: 'table',
57935           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
57936           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
57937           cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
57938         };
57939
57940         if (item.header.length === item.align.length) {
57941           src = src.substring(cap[0].length);
57942
57943           for (i = 0; i < item.align.length; i++) {
57944             if (/^ *-+: *$/.test(item.align[i])) {
57945               item.align[i] = 'right';
57946             } else if (/^ *:-+: *$/.test(item.align[i])) {
57947               item.align[i] = 'center';
57948             } else if (/^ *:-+ *$/.test(item.align[i])) {
57949               item.align[i] = 'left';
57950             } else {
57951               item.align[i] = null;
57952             }
57953           }
57954
57955           for (i = 0; i < item.cells.length; i++) {
57956             item.cells[i] = splitCells(
57957               item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
57958               item.header.length);
57959           }
57960
57961           this.tokens.push(item);
57962
57963           continue;
57964         }
57965       }
57966
57967       // lheading
57968       if (cap = this.rules.lheading.exec(src)) {
57969         src = src.substring(cap[0].length);
57970         this.tokens.push({
57971           type: 'heading',
57972           depth: cap[2] === '=' ? 1 : 2,
57973           text: cap[1]
57974         });
57975         continue;
57976       }
57977
57978       // top-level paragraph
57979       if (top && (cap = this.rules.paragraph.exec(src))) {
57980         src = src.substring(cap[0].length);
57981         this.tokens.push({
57982           type: 'paragraph',
57983           text: cap[1].charAt(cap[1].length - 1) === '\n'
57984             ? cap[1].slice(0, -1)
57985             : cap[1]
57986         });
57987         continue;
57988       }
57989
57990       // text
57991       if (cap = this.rules.text.exec(src)) {
57992         // Top-level should never reach here.
57993         src = src.substring(cap[0].length);
57994         this.tokens.push({
57995           type: 'text',
57996           text: cap[0]
57997         });
57998         continue;
57999       }
58000
58001       if (src) {
58002         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
58003       }
58004     }
58005
58006     return this.tokens;
58007   };
58008
58009   /**
58010    * Inline-Level Grammar
58011    */
58012
58013   var inline = {
58014     escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
58015     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
58016     url: noop,
58017     tag: '^comment'
58018       + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
58019       + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
58020       + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
58021       + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
58022       + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
58023     link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
58024     reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
58025     nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
58026     strong: /^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
58027     em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
58028     code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
58029     br: /^( {2,}|\\)\n(?!\s*$)/,
58030     del: noop,
58031     text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
58032   };
58033
58034   inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
58035
58036   inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
58037   inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
58038   inline.autolink = edit(inline.autolink)
58039     .replace('scheme', inline._scheme)
58040     .replace('email', inline._email)
58041     .getRegex();
58042
58043   inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
58044
58045   inline.tag = edit(inline.tag)
58046     .replace('comment', block._comment)
58047     .replace('attribute', inline._attribute)
58048     .getRegex();
58049
58050   inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
58051   inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f\\]*\)|[^\s\x00-\x1f()\\])*?)/;
58052   inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
58053
58054   inline.link = edit(inline.link)
58055     .replace('label', inline._label)
58056     .replace('href', inline._href)
58057     .replace('title', inline._title)
58058     .getRegex();
58059
58060   inline.reflink = edit(inline.reflink)
58061     .replace('label', inline._label)
58062     .getRegex();
58063
58064   /**
58065    * Normal Inline Grammar
58066    */
58067
58068   inline.normal = merge({}, inline);
58069
58070   /**
58071    * Pedantic Inline Grammar
58072    */
58073
58074   inline.pedantic = merge({}, inline.normal, {
58075     strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
58076     em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
58077     link: edit(/^!?\[(label)\]\((.*?)\)/)
58078       .replace('label', inline._label)
58079       .getRegex(),
58080     reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
58081       .replace('label', inline._label)
58082       .getRegex()
58083   });
58084
58085   /**
58086    * GFM Inline Grammar
58087    */
58088
58089   inline.gfm = merge({}, inline.normal, {
58090     escape: edit(inline.escape).replace('])', '~|])').getRegex(),
58091     url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
58092       .replace('email', inline._email)
58093       .getRegex(),
58094     _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
58095     del: /^~+(?=\S)([\s\S]*?\S)~+/,
58096     text: edit(inline.text)
58097       .replace(']|', '~]|')
58098       .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
58099       .getRegex()
58100   });
58101
58102   /**
58103    * GFM + Line Breaks Inline Grammar
58104    */
58105
58106   inline.breaks = merge({}, inline.gfm, {
58107     br: edit(inline.br).replace('{2,}', '*').getRegex(),
58108     text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
58109   });
58110
58111   /**
58112    * Inline Lexer & Compiler
58113    */
58114
58115   function InlineLexer(links, options) {
58116     this.options = options || marked.defaults;
58117     this.links = links;
58118     this.rules = inline.normal;
58119     this.renderer = this.options.renderer || new Renderer();
58120     this.renderer.options = this.options;
58121
58122     if (!this.links) {
58123       throw new Error('Tokens array requires a `links` property.');
58124     }
58125
58126     if (this.options.pedantic) {
58127       this.rules = inline.pedantic;
58128     } else if (this.options.gfm) {
58129       if (this.options.breaks) {
58130         this.rules = inline.breaks;
58131       } else {
58132         this.rules = inline.gfm;
58133       }
58134     }
58135   }
58136
58137   /**
58138    * Expose Inline Rules
58139    */
58140
58141   InlineLexer.rules = inline;
58142
58143   /**
58144    * Static Lexing/Compiling Method
58145    */
58146
58147   InlineLexer.output = function(src, links, options) {
58148     var inline = new InlineLexer(links, options);
58149     return inline.output(src);
58150   };
58151
58152   /**
58153    * Lexing/Compiling
58154    */
58155
58156   InlineLexer.prototype.output = function(src) {
58157     var out = '',
58158         link,
58159         text,
58160         href,
58161         title,
58162         cap,
58163         prevCapZero;
58164
58165     while (src) {
58166       // escape
58167       if (cap = this.rules.escape.exec(src)) {
58168         src = src.substring(cap[0].length);
58169         out += cap[1];
58170         continue;
58171       }
58172
58173       // autolink
58174       if (cap = this.rules.autolink.exec(src)) {
58175         src = src.substring(cap[0].length);
58176         if (cap[2] === '@') {
58177           text = escape(this.mangle(cap[1]));
58178           href = 'mailto:' + text;
58179         } else {
58180           text = escape(cap[1]);
58181           href = text;
58182         }
58183         out += this.renderer.link(href, null, text);
58184         continue;
58185       }
58186
58187       // url (gfm)
58188       if (!this.inLink && (cap = this.rules.url.exec(src))) {
58189         do {
58190           prevCapZero = cap[0];
58191           cap[0] = this.rules._backpedal.exec(cap[0])[0];
58192         } while (prevCapZero !== cap[0]);
58193         src = src.substring(cap[0].length);
58194         if (cap[2] === '@') {
58195           text = escape(cap[0]);
58196           href = 'mailto:' + text;
58197         } else {
58198           text = escape(cap[0]);
58199           if (cap[1] === 'www.') {
58200             href = 'http://' + text;
58201           } else {
58202             href = text;
58203           }
58204         }
58205         out += this.renderer.link(href, null, text);
58206         continue;
58207       }
58208
58209       // tag
58210       if (cap = this.rules.tag.exec(src)) {
58211         if (!this.inLink && /^<a /i.test(cap[0])) {
58212           this.inLink = true;
58213         } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
58214           this.inLink = false;
58215         }
58216         src = src.substring(cap[0].length);
58217         out += this.options.sanitize
58218           ? this.options.sanitizer
58219             ? this.options.sanitizer(cap[0])
58220             : escape(cap[0])
58221           : cap[0];
58222         continue;
58223       }
58224
58225       // link
58226       if (cap = this.rules.link.exec(src)) {
58227         src = src.substring(cap[0].length);
58228         this.inLink = true;
58229         href = cap[2];
58230         if (this.options.pedantic) {
58231           link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
58232
58233           if (link) {
58234             href = link[1];
58235             title = link[3];
58236           } else {
58237             title = '';
58238           }
58239         } else {
58240           title = cap[3] ? cap[3].slice(1, -1) : '';
58241         }
58242         href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
58243         out += this.outputLink(cap, {
58244           href: InlineLexer.escapes(href),
58245           title: InlineLexer.escapes(title)
58246         });
58247         this.inLink = false;
58248         continue;
58249       }
58250
58251       // reflink, nolink
58252       if ((cap = this.rules.reflink.exec(src))
58253           || (cap = this.rules.nolink.exec(src))) {
58254         src = src.substring(cap[0].length);
58255         link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
58256         link = this.links[link.toLowerCase()];
58257         if (!link || !link.href) {
58258           out += cap[0].charAt(0);
58259           src = cap[0].substring(1) + src;
58260           continue;
58261         }
58262         this.inLink = true;
58263         out += this.outputLink(cap, link);
58264         this.inLink = false;
58265         continue;
58266       }
58267
58268       // strong
58269       if (cap = this.rules.strong.exec(src)) {
58270         src = src.substring(cap[0].length);
58271         out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
58272         continue;
58273       }
58274
58275       // em
58276       if (cap = this.rules.em.exec(src)) {
58277         src = src.substring(cap[0].length);
58278         out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
58279         continue;
58280       }
58281
58282       // code
58283       if (cap = this.rules.code.exec(src)) {
58284         src = src.substring(cap[0].length);
58285         out += this.renderer.codespan(escape(cap[2].trim(), true));
58286         continue;
58287       }
58288
58289       // br
58290       if (cap = this.rules.br.exec(src)) {
58291         src = src.substring(cap[0].length);
58292         out += this.renderer.br();
58293         continue;
58294       }
58295
58296       // del (gfm)
58297       if (cap = this.rules.del.exec(src)) {
58298         src = src.substring(cap[0].length);
58299         out += this.renderer.del(this.output(cap[1]));
58300         continue;
58301       }
58302
58303       // text
58304       if (cap = this.rules.text.exec(src)) {
58305         src = src.substring(cap[0].length);
58306         out += this.renderer.text(escape(this.smartypants(cap[0])));
58307         continue;
58308       }
58309
58310       if (src) {
58311         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
58312       }
58313     }
58314
58315     return out;
58316   };
58317
58318   InlineLexer.escapes = function(text) {
58319     return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
58320   };
58321
58322   /**
58323    * Compile Link
58324    */
58325
58326   InlineLexer.prototype.outputLink = function(cap, link) {
58327     var href = link.href,
58328         title = link.title ? escape(link.title) : null;
58329
58330     return cap[0].charAt(0) !== '!'
58331       ? this.renderer.link(href, title, this.output(cap[1]))
58332       : this.renderer.image(href, title, escape(cap[1]));
58333   };
58334
58335   /**
58336    * Smartypants Transformations
58337    */
58338
58339   InlineLexer.prototype.smartypants = function(text) {
58340     if (!this.options.smartypants) return text;
58341     return text
58342       // em-dashes
58343       .replace(/---/g, '\u2014')
58344       // en-dashes
58345       .replace(/--/g, '\u2013')
58346       // opening singles
58347       .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
58348       // closing singles & apostrophes
58349       .replace(/'/g, '\u2019')
58350       // opening doubles
58351       .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
58352       // closing doubles
58353       .replace(/"/g, '\u201d')
58354       // ellipses
58355       .replace(/\.{3}/g, '\u2026');
58356   };
58357
58358   /**
58359    * Mangle Links
58360    */
58361
58362   InlineLexer.prototype.mangle = function(text) {
58363     if (!this.options.mangle) return text;
58364     var out = '',
58365         l = text.length,
58366         i = 0,
58367         ch;
58368
58369     for (; i < l; i++) {
58370       ch = text.charCodeAt(i);
58371       if (Math.random() > 0.5) {
58372         ch = 'x' + ch.toString(16);
58373       }
58374       out += '&#' + ch + ';';
58375     }
58376
58377     return out;
58378   };
58379
58380   /**
58381    * Renderer
58382    */
58383
58384   function Renderer(options) {
58385     this.options = options || marked.defaults;
58386   }
58387
58388   Renderer.prototype.code = function(code, lang, escaped) {
58389     if (this.options.highlight) {
58390       var out = this.options.highlight(code, lang);
58391       if (out != null && out !== code) {
58392         escaped = true;
58393         code = out;
58394       }
58395     }
58396
58397     if (!lang) {
58398       return '<pre><code>'
58399         + (escaped ? code : escape(code, true))
58400         + '</code></pre>';
58401     }
58402
58403     return '<pre><code class="'
58404       + this.options.langPrefix
58405       + escape(lang, true)
58406       + '">'
58407       + (escaped ? code : escape(code, true))
58408       + '</code></pre>\n';
58409   };
58410
58411   Renderer.prototype.blockquote = function(quote) {
58412     return '<blockquote>\n' + quote + '</blockquote>\n';
58413   };
58414
58415   Renderer.prototype.html = function(html) {
58416     return html;
58417   };
58418
58419   Renderer.prototype.heading = function(text, level, raw) {
58420     if (this.options.headerIds) {
58421       return '<h'
58422         + level
58423         + ' id="'
58424         + this.options.headerPrefix
58425         + raw.toLowerCase().replace(/[^\w]+/g, '-')
58426         + '">'
58427         + text
58428         + '</h'
58429         + level
58430         + '>\n';
58431     }
58432     // ignore IDs
58433     return '<h' + level + '>' + text + '</h' + level + '>\n';
58434   };
58435
58436   Renderer.prototype.hr = function() {
58437     return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
58438   };
58439
58440   Renderer.prototype.list = function(body, ordered, start) {
58441     var type = ordered ? 'ol' : 'ul',
58442         startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
58443     return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
58444   };
58445
58446   Renderer.prototype.listitem = function(text) {
58447     return '<li>' + text + '</li>\n';
58448   };
58449
58450   Renderer.prototype.checkbox = function(checked) {
58451     return '<input '
58452       + (checked ? 'checked="" ' : '')
58453       + 'disabled="" type="checkbox"'
58454       + (this.options.xhtml ? ' /' : '')
58455       + '> ';
58456   };
58457
58458   Renderer.prototype.paragraph = function(text) {
58459     return '<p>' + text + '</p>\n';
58460   };
58461
58462   Renderer.prototype.table = function(header, body) {
58463     if (body) body = '<tbody>' + body + '</tbody>';
58464
58465     return '<table>\n'
58466       + '<thead>\n'
58467       + header
58468       + '</thead>\n'
58469       + body
58470       + '</table>\n';
58471   };
58472
58473   Renderer.prototype.tablerow = function(content) {
58474     return '<tr>\n' + content + '</tr>\n';
58475   };
58476
58477   Renderer.prototype.tablecell = function(content, flags) {
58478     var type = flags.header ? 'th' : 'td';
58479     var tag = flags.align
58480       ? '<' + type + ' align="' + flags.align + '">'
58481       : '<' + type + '>';
58482     return tag + content + '</' + type + '>\n';
58483   };
58484
58485   // span level renderer
58486   Renderer.prototype.strong = function(text) {
58487     return '<strong>' + text + '</strong>';
58488   };
58489
58490   Renderer.prototype.em = function(text) {
58491     return '<em>' + text + '</em>';
58492   };
58493
58494   Renderer.prototype.codespan = function(text) {
58495     return '<code>' + text + '</code>';
58496   };
58497
58498   Renderer.prototype.br = function() {
58499     return this.options.xhtml ? '<br/>' : '<br>';
58500   };
58501
58502   Renderer.prototype.del = function(text) {
58503     return '<del>' + text + '</del>';
58504   };
58505
58506   Renderer.prototype.link = function(href, title, text) {
58507     if (this.options.sanitize) {
58508       try {
58509         var prot = decodeURIComponent(unescape(href))
58510           .replace(/[^\w:]/g, '')
58511           .toLowerCase();
58512       } catch (e) {
58513         return text;
58514       }
58515       if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
58516         return text;
58517       }
58518     }
58519     if (this.options.baseUrl && !originIndependentUrl.test(href)) {
58520       href = resolveUrl(this.options.baseUrl, href);
58521     }
58522     try {
58523       href = encodeURI(href).replace(/%25/g, '%');
58524     } catch (e) {
58525       return text;
58526     }
58527     var out = '<a href="' + escape(href) + '"';
58528     if (title) {
58529       out += ' title="' + title + '"';
58530     }
58531     out += '>' + text + '</a>';
58532     return out;
58533   };
58534
58535   Renderer.prototype.image = function(href, title, text) {
58536     if (this.options.baseUrl && !originIndependentUrl.test(href)) {
58537       href = resolveUrl(this.options.baseUrl, href);
58538     }
58539     var out = '<img src="' + href + '" alt="' + text + '"';
58540     if (title) {
58541       out += ' title="' + title + '"';
58542     }
58543     out += this.options.xhtml ? '/>' : '>';
58544     return out;
58545   };
58546
58547   Renderer.prototype.text = function(text) {
58548     return text;
58549   };
58550
58551   /**
58552    * TextRenderer
58553    * returns only the textual part of the token
58554    */
58555
58556   function TextRenderer() {}
58557
58558   // no need for block level renderers
58559
58560   TextRenderer.prototype.strong =
58561   TextRenderer.prototype.em =
58562   TextRenderer.prototype.codespan =
58563   TextRenderer.prototype.del =
58564   TextRenderer.prototype.text = function (text) {
58565     return text;
58566   };
58567
58568   TextRenderer.prototype.link =
58569   TextRenderer.prototype.image = function(href, title, text) {
58570     return '' + text;
58571   };
58572
58573   TextRenderer.prototype.br = function() {
58574     return '';
58575   };
58576
58577   /**
58578    * Parsing & Compiling
58579    */
58580
58581   function Parser(options) {
58582     this.tokens = [];
58583     this.token = null;
58584     this.options = options || marked.defaults;
58585     this.options.renderer = this.options.renderer || new Renderer();
58586     this.renderer = this.options.renderer;
58587     this.renderer.options = this.options;
58588   }
58589
58590   /**
58591    * Static Parse Method
58592    */
58593
58594   Parser.parse = function(src, options) {
58595     var parser = new Parser(options);
58596     return parser.parse(src);
58597   };
58598
58599   /**
58600    * Parse Loop
58601    */
58602
58603   Parser.prototype.parse = function(src) {
58604     this.inline = new InlineLexer(src.links, this.options);
58605     // use an InlineLexer with a TextRenderer to extract pure text
58606     this.inlineText = new InlineLexer(
58607       src.links,
58608       merge({}, this.options, {renderer: new TextRenderer()})
58609     );
58610     this.tokens = src.reverse();
58611
58612     var out = '';
58613     while (this.next()) {
58614       out += this.tok();
58615     }
58616
58617     return out;
58618   };
58619
58620   /**
58621    * Next Token
58622    */
58623
58624   Parser.prototype.next = function() {
58625     return this.token = this.tokens.pop();
58626   };
58627
58628   /**
58629    * Preview Next Token
58630    */
58631
58632   Parser.prototype.peek = function() {
58633     return this.tokens[this.tokens.length - 1] || 0;
58634   };
58635
58636   /**
58637    * Parse Text Tokens
58638    */
58639
58640   Parser.prototype.parseText = function() {
58641     var body = this.token.text;
58642
58643     while (this.peek().type === 'text') {
58644       body += '\n' + this.next().text;
58645     }
58646
58647     return this.inline.output(body);
58648   };
58649
58650   /**
58651    * Parse Current Token
58652    */
58653
58654   Parser.prototype.tok = function() {
58655     switch (this.token.type) {
58656       case 'space': {
58657         return '';
58658       }
58659       case 'hr': {
58660         return this.renderer.hr();
58661       }
58662       case 'heading': {
58663         return this.renderer.heading(
58664           this.inline.output(this.token.text),
58665           this.token.depth,
58666           unescape(this.inlineText.output(this.token.text)));
58667       }
58668       case 'code': {
58669         return this.renderer.code(this.token.text,
58670           this.token.lang,
58671           this.token.escaped);
58672       }
58673       case 'table': {
58674         var header = '',
58675             body = '',
58676             i,
58677             row,
58678             cell,
58679             j;
58680
58681         // header
58682         cell = '';
58683         for (i = 0; i < this.token.header.length; i++) {
58684           cell += this.renderer.tablecell(
58685             this.inline.output(this.token.header[i]),
58686             { header: true, align: this.token.align[i] }
58687           );
58688         }
58689         header += this.renderer.tablerow(cell);
58690
58691         for (i = 0; i < this.token.cells.length; i++) {
58692           row = this.token.cells[i];
58693
58694           cell = '';
58695           for (j = 0; j < row.length; j++) {
58696             cell += this.renderer.tablecell(
58697               this.inline.output(row[j]),
58698               { header: false, align: this.token.align[j] }
58699             );
58700           }
58701
58702           body += this.renderer.tablerow(cell);
58703         }
58704         return this.renderer.table(header, body);
58705       }
58706       case 'blockquote_start': {
58707         body = '';
58708
58709         while (this.next().type !== 'blockquote_end') {
58710           body += this.tok();
58711         }
58712
58713         return this.renderer.blockquote(body);
58714       }
58715       case 'list_start': {
58716         body = '';
58717         var ordered = this.token.ordered,
58718             start = this.token.start;
58719
58720         while (this.next().type !== 'list_end') {
58721           body += this.tok();
58722         }
58723
58724         return this.renderer.list(body, ordered, start);
58725       }
58726       case 'list_item_start': {
58727         body = '';
58728         var loose = this.token.loose;
58729
58730         if (this.token.task) {
58731           body += this.renderer.checkbox(this.token.checked);
58732         }
58733
58734         while (this.next().type !== 'list_item_end') {
58735           body += !loose && this.token.type === 'text'
58736             ? this.parseText()
58737             : this.tok();
58738         }
58739
58740         return this.renderer.listitem(body);
58741       }
58742       case 'html': {
58743         // TODO parse inline content if parameter markdown=1
58744         return this.renderer.html(this.token.text);
58745       }
58746       case 'paragraph': {
58747         return this.renderer.paragraph(this.inline.output(this.token.text));
58748       }
58749       case 'text': {
58750         return this.renderer.paragraph(this.parseText());
58751       }
58752     }
58753   };
58754
58755   /**
58756    * Helpers
58757    */
58758
58759   function escape(html, encode) {
58760     return html
58761       .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
58762       .replace(/</g, '&lt;')
58763       .replace(/>/g, '&gt;')
58764       .replace(/"/g, '&quot;')
58765       .replace(/'/g, '&#39;');
58766   }
58767
58768   function unescape(html) {
58769     // explicitly match decimal, hex, and named HTML entities
58770     return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
58771       n = n.toLowerCase();
58772       if (n === 'colon') return ':';
58773       if (n.charAt(0) === '#') {
58774         return n.charAt(1) === 'x'
58775           ? String.fromCharCode(parseInt(n.substring(2), 16))
58776           : String.fromCharCode(+n.substring(1));
58777       }
58778       return '';
58779     });
58780   }
58781
58782   function edit(regex, opt) {
58783     regex = regex.source || regex;
58784     opt = opt || '';
58785     return {
58786       replace: function(name, val) {
58787         val = val.source || val;
58788         val = val.replace(/(^|[^\[])\^/g, '$1');
58789         regex = regex.replace(name, val);
58790         return this;
58791       },
58792       getRegex: function() {
58793         return new RegExp(regex, opt);
58794       }
58795     };
58796   }
58797
58798   function resolveUrl(base, href) {
58799     if (!baseUrls[' ' + base]) {
58800       // we can ignore everything in base after the last slash of its path component,
58801       // but we might need to add _that_
58802       // https://tools.ietf.org/html/rfc3986#section-3
58803       if (/^[^:]+:\/*[^/]*$/.test(base)) {
58804         baseUrls[' ' + base] = base + '/';
58805       } else {
58806         baseUrls[' ' + base] = rtrim(base, '/', true);
58807       }
58808     }
58809     base = baseUrls[' ' + base];
58810
58811     if (href.slice(0, 2) === '//') {
58812       return base.replace(/:[\s\S]*/, ':') + href;
58813     } else if (href.charAt(0) === '/') {
58814       return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
58815     } else {
58816       return base + href;
58817     }
58818   }
58819   var baseUrls = {};
58820   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
58821
58822   function noop() {}
58823   noop.exec = noop;
58824
58825   function merge(obj) {
58826     var i = 1,
58827         target,
58828         key;
58829
58830     for (; i < arguments.length; i++) {
58831       target = arguments[i];
58832       for (key in target) {
58833         if (Object.prototype.hasOwnProperty.call(target, key)) {
58834           obj[key] = target[key];
58835         }
58836       }
58837     }
58838
58839     return obj;
58840   }
58841
58842   function splitCells(tableRow, count) {
58843     // ensure that every cell-delimiting pipe has a space
58844     // before it to distinguish it from an escaped pipe
58845     var row = tableRow.replace(/\|/g, function (match, offset, str) {
58846           var escaped = false,
58847               curr = offset;
58848           while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
58849           if (escaped) {
58850             // odd number of slashes means | is escaped
58851             // so we leave it alone
58852             return '|';
58853           } else {
58854             // add space before unescaped |
58855             return ' |';
58856           }
58857         }),
58858         cells = row.split(/ \|/),
58859         i = 0;
58860
58861     if (cells.length > count) {
58862       cells.splice(count);
58863     } else {
58864       while (cells.length < count) cells.push('');
58865     }
58866
58867     for (; i < cells.length; i++) {
58868       // leading or trailing whitespace is ignored per the gfm spec
58869       cells[i] = cells[i].trim().replace(/\\\|/g, '|');
58870     }
58871     return cells;
58872   }
58873
58874   // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
58875   // /c*$/ is vulnerable to REDOS.
58876   // invert: Remove suffix of non-c chars instead. Default falsey.
58877   function rtrim(str, c, invert) {
58878     if (str.length === 0) {
58879       return '';
58880     }
58881
58882     // Length of suffix matching the invert condition.
58883     var suffLen = 0;
58884
58885     // Step left until we fail to match the invert condition.
58886     while (suffLen < str.length) {
58887       var currChar = str.charAt(str.length - suffLen - 1);
58888       if (currChar === c && !invert) {
58889         suffLen++;
58890       } else if (currChar !== c && invert) {
58891         suffLen++;
58892       } else {
58893         break;
58894       }
58895     }
58896
58897     return str.substr(0, str.length - suffLen);
58898   }
58899
58900   /**
58901    * Marked
58902    */
58903
58904   function marked(src, opt, callback) {
58905     // throw error in case of non string input
58906     if (typeof src === 'undefined' || src === null) {
58907       throw new Error('marked(): input parameter is undefined or null');
58908     }
58909     if (typeof src !== 'string') {
58910       throw new Error('marked(): input parameter is of type '
58911         + Object.prototype.toString.call(src) + ', string expected');
58912     }
58913
58914     if (callback || typeof opt === 'function') {
58915       if (!callback) {
58916         callback = opt;
58917         opt = null;
58918       }
58919
58920       opt = merge({}, marked.defaults, opt || {});
58921
58922       var highlight = opt.highlight,
58923           tokens,
58924           pending,
58925           i = 0;
58926
58927       try {
58928         tokens = Lexer.lex(src, opt);
58929       } catch (e) {
58930         return callback(e);
58931       }
58932
58933       pending = tokens.length;
58934
58935       var done = function(err) {
58936         if (err) {
58937           opt.highlight = highlight;
58938           return callback(err);
58939         }
58940
58941         var out;
58942
58943         try {
58944           out = Parser.parse(tokens, opt);
58945         } catch (e) {
58946           err = e;
58947         }
58948
58949         opt.highlight = highlight;
58950
58951         return err
58952           ? callback(err)
58953           : callback(null, out);
58954       };
58955
58956       if (!highlight || highlight.length < 3) {
58957         return done();
58958       }
58959
58960       delete opt.highlight;
58961
58962       if (!pending) return done();
58963
58964       for (; i < tokens.length; i++) {
58965         (function(token) {
58966           if (token.type !== 'code') {
58967             return --pending || done();
58968           }
58969           return highlight(token.text, token.lang, function(err, code) {
58970             if (err) return done(err);
58971             if (code == null || code === token.text) {
58972               return --pending || done();
58973             }
58974             token.text = code;
58975             token.escaped = true;
58976             --pending || done();
58977           });
58978         })(tokens[i]);
58979       }
58980
58981       return;
58982     }
58983     try {
58984       if (opt) opt = merge({}, marked.defaults, opt);
58985       return Parser.parse(Lexer.lex(src, opt), opt);
58986     } catch (e) {
58987       e.message += '\nPlease report this to https://github.com/markedjs/marked.';
58988       if ((opt || marked.defaults).silent) {
58989         return '<p>An error occurred:</p><pre>'
58990           + escape(e.message + '', true)
58991           + '</pre>';
58992       }
58993       throw e;
58994     }
58995   }
58996
58997   /**
58998    * Options
58999    */
59000
59001   marked.options =
59002   marked.setOptions = function(opt) {
59003     merge(marked.defaults, opt);
59004     return marked;
59005   };
59006
59007   marked.getDefaults = function () {
59008     return {
59009       baseUrl: null,
59010       breaks: false,
59011       gfm: true,
59012       headerIds: true,
59013       headerPrefix: '',
59014       highlight: null,
59015       langPrefix: 'language-',
59016       mangle: true,
59017       pedantic: false,
59018       renderer: new Renderer(),
59019       sanitize: false,
59020       sanitizer: null,
59021       silent: false,
59022       smartLists: false,
59023       smartypants: false,
59024       tables: true,
59025       xhtml: false
59026     };
59027   };
59028
59029   marked.defaults = marked.getDefaults();
59030
59031   /**
59032    * Expose
59033    */
59034
59035   marked.Parser = Parser;
59036   marked.parser = Parser.parse;
59037
59038   marked.Renderer = Renderer;
59039   marked.TextRenderer = TextRenderer;
59040
59041   marked.Lexer = Lexer;
59042   marked.lexer = Lexer.lex;
59043
59044   marked.InlineLexer = InlineLexer;
59045   marked.inlineLexer = InlineLexer.output;
59046
59047   marked.parse = marked;
59048
59049   {
59050     module.exports = marked;
59051   }
59052   })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
59053   });
59054
59055   function pointBox(loc, context) {
59056       var rect = context.surfaceRect();
59057       var point$$1 = context.curtainProjection(loc);
59058       return {
59059           left: point$$1[0] + rect.left - 40,
59060           top: point$$1[1] + rect.top - 60,
59061           width: 80,
59062           height: 90
59063       };
59064   }
59065
59066
59067   function pad$1(locOrBox, padding, context) {
59068       var box;
59069       if (locOrBox instanceof Array) {
59070           var rect = context.surfaceRect();
59071           var point$$1 = context.curtainProjection(locOrBox);
59072           box = {
59073               left: point$$1[0] + rect.left,
59074               top: point$$1[1] + rect.top
59075           };
59076       } else {
59077           box = locOrBox;
59078       }
59079
59080       return {
59081           left: box.left - padding,
59082           top: box.top - padding,
59083           width: (box.width || 0) + 2 * padding,
59084           height: (box.width || 0) + 2 * padding
59085       };
59086   }
59087
59088
59089   function icon(name, svgklass, useklass) {
59090       return '<svg class="icon ' + (svgklass || '') + '">' +
59091            '<use xlink:href="' + name + '"' +
59092            (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
59093   }
59094
59095
59096   function slugify(text) {
59097       return text.toString().toLowerCase()
59098           .replace(/\s+/g, '-')           // Replace spaces with -
59099           .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
59100           .replace(/\-\-+/g, '-')         // Replace multiple - with single -
59101           .replace(/^-+/, '')             // Trim - from start of text
59102           .replace(/-+$/, '');            // Trim - from end of text
59103   }
59104
59105
59106   // console warning for missing walkthrough names
59107   var missingStrings = {};
59108   function checkKey(key, text) {
59109       if (t(key, { default: undefined}) === undefined) {
59110           if (missingStrings.hasOwnProperty(key)) return;  // warn once
59111           missingStrings[key] = text;
59112           var missing = key + ': ' + text;
59113           if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
59114       }
59115   }
59116
59117
59118   function localize(obj) {
59119       var key;
59120
59121       // Assign name if entity has one..
59122       var name = obj.tags && obj.tags.name;
59123       if (name) {
59124           key = 'intro.graph.name.' + slugify(name);
59125           obj.tags.name = t(key, { default: name });
59126           checkKey(key, name);
59127       }
59128
59129       // Assign street name if entity has one..
59130       var street = obj.tags && obj.tags['addr:street'];
59131       if (street) {
59132           key = 'intro.graph.name.' + slugify(street);
59133           obj.tags['addr:street'] = t(key, { default: street });
59134           checkKey(key, street);
59135
59136           // Add address details common across walkthrough..
59137           var addrTags = [
59138               'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
59139               'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
59140           ];
59141           addrTags.forEach(function(k) {
59142               var key = 'intro.graph.' + k,
59143                   tag = 'addr:' + k,
59144                   val = obj.tags && obj.tags[tag],
59145                   str = t(key, { default: val });
59146
59147               if (str) {
59148                   if (str.match(/^<.*>$/) !== null) {
59149                       delete obj.tags[tag];
59150                   } else {
59151                       obj.tags[tag] = str;
59152                   }
59153               }
59154           });
59155       }
59156
59157       return obj;
59158   }
59159
59160
59161   // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
59162   function isMostlySquare(points) {
59163       // note: uses 15 here instead of the 12 from actionOrthogonalize because
59164       // actionOrthogonalize can actually straighten some larger angles as it iterates
59165       var threshold = 15, // degrees within right or straight
59166           lowerBound = Math.cos((90 - threshold) * Math.PI / 180),  // near right
59167           upperBound = Math.cos(threshold * Math.PI / 180),         // near straight
59168           mag;
59169
59170       for (var i = 0; i < points.length; i++) {
59171           mag = Math.abs(normalizedDotProduct(i, points));
59172           if (mag > lowerBound && mag < upperBound) {
59173               return false;
59174           }
59175       }
59176
59177       return true;
59178
59179
59180       function normalizedDotProduct(i, points) {
59181           var a = points[(i - 1 + points.length) % points.length],
59182               b = points[i],
59183               c = points[(i + 1) % points.length],
59184               p = subtractPoints(a, b),
59185               q = subtractPoints(c, b);
59186
59187           p = normalizePoint(p);
59188           q = normalizePoint(q);
59189
59190           return p[0] * q[0] + p[1] * q[1];
59191
59192
59193           function subtractPoints(a, b) {
59194               return [a[0] - b[0], a[1] - b[1]];
59195           }
59196
59197           function normalizePoint(point$$1) {
59198               var vector = [0, 0];
59199               var length = Math.sqrt(point$$1[0] * point$$1[0] + point$$1[1] * point$$1[1]);
59200               if (length !== 0) {
59201                   vector[0] = point$$1[0] / length;
59202                   vector[1] = point$$1[1] / length;
59203               }
59204               return vector;
59205           }
59206       }
59207   }
59208
59209
59210   function selectMenuItem(operation) {
59211       var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
59212           ', .radial-menu .radial-menu-item-' + operation;
59213       return select(selector$$1);
59214   }
59215
59216
59217   function transitionTime(point1, point2) {
59218       var distance = geoSphericalDistance(point1, point2);
59219       if (distance === 0)
59220           return 0;
59221       else if (distance < 80)
59222           return 500;
59223       else
59224           return 1000;
59225   }
59226
59227   var dataIntroGraph = {n1:{id:"n1",loc:[-85.631039,41.948829]},n10:{id:"n10",loc:[-85.634733,41.941588]},n100:{id:"n100",loc:[-85.637395,41.942252]},n1000:{id:"n1000",loc:[-85.632699,41.944763]},n1001:{id:"n1001",loc:[-85.632685,41.944763]},n1002:{id:"n1002",loc:[-85.632673,41.944755]},n1003:{id:"n1003",loc:[-85.632595,41.944682]},n1004:{id:"n1004",loc:[-85.632576,41.944673]},n1005:{id:"n1005",loc:[-85.632551,41.944667]},n1006:{id:"n1006",loc:[-85.63253,41.944667]},n1007:{id:"n1007",loc:[-85.632502,41.944669]},n1008:{id:"n1008",loc:[-85.632483,41.944677]},n1009:{id:"n1009",loc:[-85.632383,41.944731]},n101:{id:"n101",loc:[-85.637357,41.942252]},n1010:{id:"n1010",loc:[-85.63349,41.944976],tags:{"addr:city":"Three Rivers","addr:housenumber":"31","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Sherwin-Williams",shop:"paint"}},n1011:{id:"n1011",loc:[-85.633548,41.945034],tags:{"addr:city":"Three Rivers","addr:housenumber":"33","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Unique Jewelry",shop:"jewelry"}},n1012:{id:"n1012",loc:[-85.633683,41.945129],tags:{"addr:city":"Three Rivers","addr:housenumber":"37","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"World Fare",shop:"gift"}},n1013:{id:"n1013",loc:[-85.634563,41.945469],tags:{"addr:city":"Three Rivers","addr:housenumber":"62","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Golden Finch Framing",shop:"frame"}},n1014:{id:"n1014",loc:[-85.634469,41.945379],tags:{"addr:city":"Three Rivers","addr:housenumber":"58","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Dollar Tree",shop:"second_hand"}},n1015:{id:"n1015",loc:[-85.634227,41.945159],tags:{"addr:city":"Three Rivers","addr:housenumber":"48","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"theatre",name:"Riviera Theatre"}},n1016:{id:"n1016",loc:[-85.634057,41.945012],tags:{"addr:city":"Three Rivers","addr:housenumber":"42","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"River City Appliance",shop:"appliance"}},n1017:{id:"n1017",loc:[-85.633879,41.945325],tags:{"addr:city":"Three Rivers","addr:housenumber":"45","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Paparazzi Tattoo",shop:"tattoo"}},n1018:{id:"n1018",loc:[-85.634914,41.945839],tags:{"addr:city":"Three Rivers","addr:housenumber":"88","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"bank",name:"Southern Michigan Bank"}},n1019:{id:"n1019",loc:[-85.634514,41.946176]},n102:{id:"n102",loc:[-85.637357,41.942216]},n1020:{id:"n1020",loc:[-85.634087,41.946178]},n1021:{id:"n1021",loc:[-85.634357,41.945805]},n1022:{id:"n1022",loc:[-85.634389,41.945788]},n1023:{id:"n1023",loc:[-85.634491,41.94581]},n1024:{id:"n1024",loc:[-85.634513,41.945853]},n1025:{id:"n1025",loc:[-85.634506,41.94583]},n1026:{id:"n1026",loc:[-85.634762,41.946056],tags:{crossing:"zebra",highway:"crossing"}},n1027:{id:"n1027",loc:[-85.634767,41.946172]},n1028:{id:"n1028",loc:[-85.634622,41.946175],tags:{crossing:"zebra",highway:"crossing"}},n1029:{id:"n1029",loc:[-85.640655,41.942057]},n103:{id:"n103",loc:[-85.637386,41.942054]},n1030:{id:"n1030",loc:[-85.640947,41.942057]},n1031:{id:"n1031",loc:[-85.640957,41.942593]},n1032:{id:"n1032",loc:[-85.630953,41.960873]},n1033:{id:"n1033",loc:[-85.632174,41.960679]},n1034:{id:"n1034",loc:[-85.638785,41.943066]},n1035:{id:"n1035",loc:[-85.638853,41.943065]},n1036:{id:"n1036",loc:[-85.638855,41.943183]},n1037:{id:"n1037",loc:[-85.638552,41.943189]},n1038:{id:"n1038",loc:[-85.63855,41.943149]},n1039:{id:"n1039",loc:[-85.638638,41.943068]},n104:{id:"n104",loc:[-85.637387,41.942125]},n1040:{id:"n1040",loc:[-85.638638,41.943078]},n1041:{id:"n1041",loc:[-85.638813,41.943163]},n1042:{id:"n1042",loc:[-85.638684,41.943165]},n1043:{id:"n1043",loc:[-85.638682,41.943105]},n1044:{id:"n1044",loc:[-85.638706,41.943105]},n1045:{id:"n1045",loc:[-85.638707,41.943117]},n1046:{id:"n1046",loc:[-85.638812,41.943115]},n1047:{id:"n1047",loc:[-85.638769,41.943407]},n1048:{id:"n1048",loc:[-85.638549,41.943407]},n1049:{id:"n1049",loc:[-85.638567,41.943555]},n105:{id:"n105",loc:[-85.637319,41.942125]},n1050:{id:"n1050",loc:[-85.638426,41.943554]},n1051:{id:"n1051",loc:[-85.638427,41.94346]},n1052:{id:"n1052",loc:[-85.638568,41.943461]},n1053:{id:"n1053",loc:[-85.639264,41.943415]},n1054:{id:"n1054",loc:[-85.639082,41.943417]},n1055:{id:"n1055",loc:[-85.63908,41.943331]},n1056:{id:"n1056",loc:[-85.639136,41.94333]},n1057:{id:"n1057",loc:[-85.639158,41.943312]},n1058:{id:"n1058",loc:[-85.639188,41.943313]},n1059:{id:"n1059",loc:[-85.639211,41.943331]},n106:{id:"n106",loc:[-85.637319,41.942137]},n1060:{id:"n1060",loc:[-85.639262,41.943331]},n1061:{id:"n1061",loc:[-85.638986,41.943515]},n1062:{id:"n1062",loc:[-85.63888,41.943521]},n1063:{id:"n1063",loc:[-85.638871,41.943436]},n1064:{id:"n1064",loc:[-85.638958,41.943431]},n1065:{id:"n1065",loc:[-85.638979,41.943443]},n1066:{id:"n1066",loc:[-85.63926,41.943703]},n1067:{id:"n1067",loc:[-85.639152,41.943704]},n1068:{id:"n1068",loc:[-85.639152,41.943691]},n1069:{id:"n1069",loc:[-85.639063,41.943691]},n107:{id:"n107",loc:[-85.637259,41.942137]},n1070:{id:"n1070",loc:[-85.639062,41.943613]},n1071:{id:"n1071",loc:[-85.639259,41.943611]},n1072:{id:"n1072",loc:[-85.639117,41.943726]},n1073:{id:"n1073",loc:[-85.639118,41.943767]},n1074:{id:"n1074",loc:[-85.639051,41.943768]},n1075:{id:"n1075",loc:[-85.63905,41.943727]},n1076:{id:"n1076",loc:[-85.638627,41.943716]},n1077:{id:"n1077",loc:[-85.63863,41.943634]},n1078:{id:"n1078",loc:[-85.63844,41.943631]},n1079:{id:"n1079",loc:[-85.638437,41.943729]},n108:{id:"n108",loc:[-85.637259,41.942126]},n1080:{id:"n1080",loc:[-85.638533,41.94373]},n1081:{id:"n1081",loc:[-85.638534,41.943715]},n1082:{id:"n1082",loc:[-85.638678,41.943941]},n1083:{id:"n1083",loc:[-85.638522,41.943944]},n1084:{id:"n1084",loc:[-85.63852,41.943864]},n1085:{id:"n1085",loc:[-85.638676,41.943861]},n1086:{id:"n1086",loc:[-85.638663,41.944059]},n1087:{id:"n1087",loc:[-85.638513,41.944061]},n1088:{id:"n1088",loc:[-85.638511,41.943991]},n1089:{id:"n1089",loc:[-85.638661,41.943989]},n109:{id:"n109",loc:[-85.637193,41.942126]},n1090:{id:"n1090",loc:[-85.63865,41.944134]},n1091:{id:"n1091",loc:[-85.638429,41.944144]},n1092:{id:"n1092",loc:[-85.638426,41.944106]},n1093:{id:"n1093",loc:[-85.638476,41.944104]},n1094:{id:"n1094",loc:[-85.638475,41.94409]},n1095:{id:"n1095",loc:[-85.638594,41.944084]},n1096:{id:"n1096",loc:[-85.638595,41.944101]},n1097:{id:"n1097",loc:[-85.638647,41.944099]},n1098:{id:"n1098",loc:[-85.63829,41.944154]},n1099:{id:"n1099",loc:[-85.638558,41.944155]},n11:{id:"n11",loc:[-85.634602,41.941523]},n110:{id:"n110",loc:[-85.637192,41.942053]},n1100:{id:"n1100",loc:[-85.638558,41.944338]},n1101:{id:"n1101",loc:[-85.638851,41.944408]},n1102:{id:"n1102",loc:[-85.637771,41.943989]},n1103:{id:"n1103",loc:[-85.639345,41.943964]},n1104:{id:"n1104",loc:[-85.638515,41.94397]},n1105:{id:"n1105",loc:[-85.639256,41.943928]},n1106:{id:"n1106",loc:[-85.639157,41.943929]},n1107:{id:"n1107",loc:[-85.639156,41.9439]},n1108:{id:"n1108",loc:[-85.639118,41.9439]},n1109:{id:"n1109",loc:[-85.639116,41.94382]},n111:{id:"n111",loc:[-85.637248,41.942053]},n1110:{id:"n1110",loc:[-85.639202,41.943819]},n1111:{id:"n1111",loc:[-85.639202,41.943837]},n1112:{id:"n1112",loc:[-85.639293,41.943836]},n1113:{id:"n1113",loc:[-85.639295,41.943898]},n1114:{id:"n1114",loc:[-85.639255,41.943898]},n1115:{id:"n1115",loc:[-85.639296,41.944083]},n1116:{id:"n1116",loc:[-85.639144,41.944084]},n1117:{id:"n1117",loc:[-85.639143,41.944026]},n1118:{id:"n1118",loc:[-85.639162,41.944026]},n1119:{id:"n1119",loc:[-85.639162,41.944]},n112:{id:"n112",loc:[-85.637248,41.942042]},n1120:{id:"n1120",loc:[-85.639295,41.943999]},n1121:{id:"n1121",loc:[-85.639131,41.944139]},n1122:{id:"n1122",loc:[-85.63901,41.94414]},n1123:{id:"n1123",loc:[-85.63901,41.944076]},n1124:{id:"n1124",loc:[-85.63913,41.944075]},n1125:{id:"n1125",loc:[-85.639092,41.944155]},n1126:{id:"n1126",loc:[-85.639093,41.944308]},n1127:{id:"n1127",loc:[-85.639225,41.944308]},n1128:{id:"n1128",loc:[-85.639225,41.94429]},n1129:{id:"n1129",loc:[-85.639253,41.944289]},n113:{id:"n113",loc:[-85.637338,41.942041]},n1130:{id:"n1130",loc:[-85.639253,41.944269]},n1131:{id:"n1131",loc:[-85.639243,41.944269]},n1132:{id:"n1132",loc:[-85.639243,41.944229]},n1133:{id:"n1133",loc:[-85.639224,41.944229]},n1134:{id:"n1134",loc:[-85.639224,41.944196]},n1135:{id:"n1135",loc:[-85.639195,41.944196]},n1136:{id:"n1136",loc:[-85.639195,41.944155]},n1137:{id:"n1137",loc:[-85.639072,41.944154]},n1138:{id:"n1138",loc:[-85.638865,41.944154]},n1139:{id:"n1139",loc:[-85.638863,41.943967]},n114:{id:"n114",loc:[-85.637338,41.942055]},n1140:{id:"n1140",loc:[-85.6386,41.942698]},n1141:{id:"n1141",loc:[-85.639348,41.942698]},n1142:{id:"n1142",loc:[-85.639377,41.944984]},n1143:{id:"n1143",loc:[-85.63937,41.945013]},n1144:{id:"n1144",loc:[-85.639357,41.945033]},n1145:{id:"n1145",loc:[-85.639353,41.945053]},n1146:{id:"n1146",loc:[-85.639352,41.945084]},n1147:{id:"n1147",loc:[-85.638278,41.945516]},n1148:{id:"n1148",loc:[-85.637505,41.945801]},n1149:{id:"n1149",loc:[-85.637327,41.945857]},n115:{id:"n115",loc:[-85.637583,41.941943]},n1150:{id:"n1150",loc:[-85.637168,41.945899]},n1151:{id:"n1151",loc:[-85.637017,41.94593]},n1152:{id:"n1152",loc:[-85.637185,41.945938]},n1153:{id:"n1153",loc:[-85.63682,41.945963]},n1154:{id:"n1154",loc:[-85.636639,41.945984]},n1155:{id:"n1155",loc:[-85.636439,41.945999]},n1156:{id:"n1156",loc:[-85.635801,41.945999]},n1157:{id:"n1157",loc:[-85.635769,41.945908]},n1158:{id:"n1158",loc:[-85.635953,41.946154]},n1159:{id:"n1159",loc:[-85.635472,41.94598]},n116:{id:"n116",loc:[-85.637584,41.941983]},n1160:{id:"n1160",loc:[-85.635409,41.945981]},n1161:{id:"n1161",loc:[-85.635583,41.945987]},n1162:{id:"n1162",loc:[-85.636452,41.945805]},n1163:{id:"n1163",loc:[-85.636425,41.94582]},n1164:{id:"n1164",loc:[-85.636396,41.945817]},n1165:{id:"n1165",loc:[-85.636368,41.945797]},n1166:{id:"n1166",loc:[-85.636346,41.945767]},n1167:{id:"n1167",loc:[-85.636307,41.945745]},n1168:{id:"n1168",loc:[-85.636194,41.94565]},n1169:{id:"n1169",loc:[-85.636121,41.945579]},n117:{id:"n117",loc:[-85.63751,41.941983]},n1170:{id:"n1170",loc:[-85.635995,41.945432]},n1171:{id:"n1171",loc:[-85.637564,41.943538]},n1172:{id:"n1172",loc:[-85.63756,41.943505]},n1173:{id:"n1173",loc:[-85.637435,41.943489]},n1174:{id:"n1174",loc:[-85.637093,41.943556]},n1175:{id:"n1175",loc:[-85.634836,41.941574]},n1176:{id:"n1176",loc:[-85.634692,41.9415]},n1177:{id:"n1177",loc:[-85.634261,41.941337]},n1178:{id:"n1178",loc:[-85.634208,41.940962]},n1179:{id:"n1179",loc:[-85.635247,41.940968]},n118:{id:"n118",loc:[-85.637509,41.941944]},n1180:{id:"n1180",loc:[-85.63514,41.941205]},n1181:{id:"n1181",loc:[-85.634858,41.941511]},n1182:{id:"n1182",loc:[-85.630725,41.943465]},n1183:{id:"n1183",loc:[-85.632591,41.942826]},n1184:{id:"n1184",loc:[-85.634487,41.941928]},n1185:{id:"n1185",loc:[-85.634499,41.942056]},n1186:{id:"n1186",loc:[-85.63433,41.943102]},n1187:{id:"n1187",loc:[-85.634158,41.943151]},n1188:{id:"n1188",loc:[-85.634107,41.94305]},n1189:{id:"n1189",loc:[-85.634279,41.943002]},n119:{id:"n119",loc:[-85.637724,41.941973]},n1190:{id:"n1190",loc:[-85.634362,41.943762]},n1191:{id:"n1191",loc:[-85.634331,41.943731]},n1192:{id:"n1192",loc:[-85.634396,41.943695]},n1193:{id:"n1193",loc:[-85.634426,41.943726]},n1194:{id:"n1194",loc:[-85.621569,41.956021]},n1195:{id:"n1195",loc:[-85.621574,41.956164]},n1196:{id:"n1196",loc:[-85.621489,41.956165]},n1197:{id:"n1197",loc:[-85.621488,41.956136]},n1198:{id:"n1198",loc:[-85.621372,41.956139]},n1199:{id:"n1199",loc:[-85.621369,41.956049]},n12:{id:"n12",loc:[-85.63359,41.941093]},n120:{id:"n120",loc:[-85.637633,41.941973]},n1200:{id:"n1200",loc:[-85.621493,41.956047]},n1201:{id:"n1201",loc:[-85.621492,41.956022]},n1202:{id:"n1202",loc:[-85.619744,41.953192]},n1203:{id:"n1203",loc:[-85.619059,41.953902]},n1204:{id:"n1204",loc:[-85.623984,41.95469]},n1205:{id:"n1205",loc:[-85.630159,41.958208]},n1206:{id:"n1206",loc:[-85.63002,41.958208]},n1207:{id:"n1207",loc:[-85.630021,41.95814]},n1208:{id:"n1208",loc:[-85.63,41.95814]},n1209:{id:"n1209",loc:[-85.63,41.958043]},n121:{id:"n121",loc:[-85.637633,41.941853]},n1210:{id:"n1210",loc:[-85.630159,41.958043]},n1211:{id:"n1211",loc:[-85.630304,41.957566]},n1212:{id:"n1212",loc:[-85.630303,41.957684]},n1213:{id:"n1213",loc:[-85.630073,41.957683]},n1214:{id:"n1214",loc:[-85.630072,41.957721]},n1215:{id:"n1215",loc:[-85.629993,41.95772]},n1216:{id:"n1216",loc:[-85.629993,41.95768]},n1217:{id:"n1217",loc:[-85.629968,41.95768]},n1218:{id:"n1218",loc:[-85.629969,41.957588]},n1219:{id:"n1219",loc:[-85.630219,41.95759]},n122:{id:"n122",loc:[-85.637724,41.941853]},n1220:{id:"n1220",loc:[-85.630219,41.957566]},n1221:{id:"n1221",loc:[-85.630717,41.957744]},n1222:{id:"n1222",loc:[-85.630596,41.957745]},n1223:{id:"n1223",loc:[-85.630598,41.957553]},n1224:{id:"n1224",loc:[-85.630717,41.957555]},n1225:{id:"n1225",loc:[-85.630609,41.957745]},n1226:{id:"n1226",loc:[-85.63061,41.957789]},n1227:{id:"n1227",loc:[-85.630327,41.957791]},n1228:{id:"n1228",loc:[-85.630324,41.95752]},n1229:{id:"n1229",loc:[-85.630325,41.95756]},n123:{id:"n123",loc:[-85.637773,41.941988]},n1230:{id:"n1230",loc:[-85.63057,41.95756]},n1231:{id:"n1231",loc:[-85.63069,41.958016]},n1232:{id:"n1232",loc:[-85.630586,41.958017]},n1233:{id:"n1233",loc:[-85.630584,41.957956]},n1234:{id:"n1234",loc:[-85.630614,41.957956]},n1235:{id:"n1235",loc:[-85.630611,41.957835]},n1236:{id:"n1236",loc:[-85.630737,41.957833]},n1237:{id:"n1237",loc:[-85.630739,41.957921]},n1238:{id:"n1238",loc:[-85.630688,41.957922]},n1239:{id:"n1239",loc:[-85.630719,41.958291]},n124:{id:"n124",loc:[-85.637773,41.942046]},n1240:{id:"n1240",loc:[-85.630592,41.958291]},n1241:{id:"n1241",loc:[-85.630593,41.958108]},n1242:{id:"n1242",loc:[-85.630701,41.958109]},n1243:{id:"n1243",loc:[-85.6307,41.958173]},n1244:{id:"n1244",loc:[-85.630711,41.958173]},n1245:{id:"n1245",loc:[-85.630711,41.958233]},n1246:{id:"n1246",loc:[-85.630719,41.958233]},n1247:{id:"n1247",loc:[-85.630523,41.958329]},n1248:{id:"n1248",loc:[-85.630388,41.958329]},n1249:{id:"n1249",loc:[-85.630387,41.958262]},n125:{id:"n125",loc:[-85.637693,41.942047]},n1250:{id:"n1250",loc:[-85.630523,41.958261]},n1251:{id:"n1251",loc:[-85.63072,41.958636]},n1252:{id:"n1252",loc:[-85.630721,41.958709]},n1253:{id:"n1253",loc:[-85.630503,41.958712]},n1254:{id:"n1254",loc:[-85.630498,41.958511]},n1255:{id:"n1255",loc:[-85.630635,41.95851]},n1256:{id:"n1256",loc:[-85.630638,41.958636]},n1257:{id:"n1257",loc:[-85.630437,41.958822]},n1258:{id:"n1258",loc:[-85.630437,41.958849]},n1259:{id:"n1259",loc:[-85.630393,41.958849]},n126:{id:"n126",loc:[-85.637692,41.941988]},n1260:{id:"n1260",loc:[-85.630393,41.958822]},n1261:{id:"n1261",loc:[-85.630605,41.959102]},n1262:{id:"n1262",loc:[-85.63049,41.959104]},n1263:{id:"n1263",loc:[-85.630487,41.958996]},n1264:{id:"n1264",loc:[-85.630462,41.958996]},n1265:{id:"n1265",loc:[-85.63046,41.958922]},n1266:{id:"n1266",loc:[-85.630562,41.958921]},n1267:{id:"n1267",loc:[-85.630564,41.958992]},n1268:{id:"n1268",loc:[-85.630602,41.958992]},n1269:{id:"n1269",loc:[-85.630126,41.957096]},n127:{id:"n127",loc:[-85.637604,41.941994]},n1270:{id:"n1270",loc:[-85.630129,41.957283]},n1271:{id:"n1271",loc:[-85.629993,41.957284]},n1272:{id:"n1272",loc:[-85.629992,41.957216]},n1273:{id:"n1273",loc:[-85.630015,41.957215]},n1274:{id:"n1274",loc:[-85.630013,41.957097]},n1275:{id:"n1275",loc:[-85.630211,41.956592]},n1276:{id:"n1276",loc:[-85.630211,41.956676]},n1277:{id:"n1277",loc:[-85.630162,41.956676]},n1278:{id:"n1278",loc:[-85.630162,41.95676]},n1279:{id:"n1279",loc:[-85.630037,41.956761]},n128:{id:"n128",loc:[-85.637604,41.942057]},n1280:{id:"n1280",loc:[-85.630037,41.956592]},n1281:{id:"n1281",loc:[-85.630309,41.95653]},n1282:{id:"n1282",loc:[-85.630326,41.957065]},n1283:{id:"n1283",loc:[-85.630118,41.957065]},n1284:{id:"n1284",loc:[-85.630119,41.957096]},n1285:{id:"n1285",loc:[-85.63067,41.957307]},n1286:{id:"n1286",loc:[-85.630536,41.957308]},n1287:{id:"n1287",loc:[-85.630533,41.957111]},n1288:{id:"n1288",loc:[-85.630667,41.95711]},n1289:{id:"n1289",loc:[-85.630676,41.956808]},n129:{id:"n129",loc:[-85.63748,41.942057]},n1290:{id:"n1290",loc:[-85.630551,41.956808]},n1291:{id:"n1291",loc:[-85.630552,41.956982]},n1292:{id:"n1292",loc:[-85.63059,41.956982]},n1293:{id:"n1293",loc:[-85.63059,41.957001]},n1294:{id:"n1294",loc:[-85.630692,41.957001]},n1295:{id:"n1295",loc:[-85.630692,41.956936]},n1296:{id:"n1296",loc:[-85.630676,41.956936]},n1297:{id:"n1297",loc:[-85.630496,41.956889]},n1298:{id:"n1298",loc:[-85.630501,41.956947]},n1299:{id:"n1299",loc:[-85.630377,41.956953]},n13:{id:"n13",loc:[-85.633643,41.941143]},n130:{id:"n130",loc:[-85.63748,41.941994]},n1300:{id:"n1300",loc:[-85.630359,41.956938]},n1301:{id:"n1301",loc:[-85.630359,41.956912]},n1302:{id:"n1302",loc:[-85.63038,41.956894]},n1303:{id:"n1303",loc:[-85.630679,41.956747]},n1304:{id:"n1304",loc:[-85.630572,41.956748]},n1305:{id:"n1305",loc:[-85.63057,41.956668]},n1306:{id:"n1306",loc:[-85.630501,41.956669]},n1307:{id:"n1307",loc:[-85.630499,41.95659]},n1308:{id:"n1308",loc:[-85.630565,41.956589]},n1309:{id:"n1309",loc:[-85.630564,41.956541]},n131:{id:"n131",loc:[-85.637431,41.941832]},n1310:{id:"n1310",loc:[-85.630686,41.956539]},n1311:{id:"n1311",loc:[-85.630688,41.956631]},n1312:{id:"n1312",loc:[-85.630676,41.956631]},n1313:{id:"n1313",loc:[-85.630686,41.956487]},n1314:{id:"n1314",loc:[-85.63059,41.956487]},n1315:{id:"n1315",loc:[-85.63059,41.956396]},n1316:{id:"n1316",loc:[-85.630686,41.956396]},n1317:{id:"n1317",loc:[-85.630643,41.9563]},n1318:{id:"n1318",loc:[-85.630548,41.956301]},n1319:{id:"n1319",loc:[-85.630545,41.956217]},n132:{id:"n132",loc:[-85.637432,41.94189]},n1320:{id:"n1320",loc:[-85.630529,41.956214]},n1321:{id:"n1321",loc:[-85.630521,41.956202]},n1322:{id:"n1322",loc:[-85.63052,41.95618]},n1323:{id:"n1323",loc:[-85.630527,41.956169]},n1324:{id:"n1324",loc:[-85.630544,41.956163]},n1325:{id:"n1325",loc:[-85.630543,41.956094]},n1326:{id:"n1326",loc:[-85.630641,41.956093]},n1327:{id:"n1327",loc:[-85.630642,41.956134]},n1328:{id:"n1328",loc:[-85.630656,41.956134]},n1329:{id:"n1329",loc:[-85.630657,41.956252]},n133:{id:"n133",loc:[-85.637412,41.94189]},n1330:{id:"n1330",loc:[-85.630643,41.956252]},n1331:{id:"n1331",loc:[-85.630409,41.956044]},n1332:{id:"n1332",loc:[-85.630409,41.956075]},n1333:{id:"n1333",loc:[-85.630195,41.956078]},n1334:{id:"n1334",loc:[-85.630195,41.9561]},n1335:{id:"n1335",loc:[-85.630088,41.956101]},n1336:{id:"n1336",loc:[-85.630087,41.956048]},n1337:{id:"n1337",loc:[-85.630345,41.956114]},n1338:{id:"n1338",loc:[-85.630328,41.956113]},n1339:{id:"n1339",loc:[-85.63034,41.956189]},n134:{id:"n134",loc:[-85.637413,41.941938]},n1340:{id:"n1340",loc:[-85.630355,41.956185]},n1341:{id:"n1341",loc:[-85.630311,41.956117]},n1342:{id:"n1342",loc:[-85.630297,41.956125]},n1343:{id:"n1343",loc:[-85.630287,41.956136]},n1344:{id:"n1344",loc:[-85.630283,41.956149]},n1345:{id:"n1345",loc:[-85.630285,41.956162]},n1346:{id:"n1346",loc:[-85.630293,41.956174]},n1347:{id:"n1347",loc:[-85.630306,41.956183]},n1348:{id:"n1348",loc:[-85.630322,41.956188]},n1349:{id:"n1349",loc:[-85.630368,41.956179]},n135:{id:"n135",loc:[-85.637342,41.941939]},n1350:{id:"n1350",loc:[-85.630378,41.95617]},n1351:{id:"n1351",loc:[-85.630384,41.956159]},n1352:{id:"n1352",loc:[-85.630385,41.956147]},n1353:{id:"n1353",loc:[-85.630381,41.956136]},n1354:{id:"n1354",loc:[-85.630372,41.956126]},n1355:{id:"n1355",loc:[-85.63036,41.956118]},n1356:{id:"n1356",loc:[-85.630776,41.956041]},n1357:{id:"n1357",loc:[-85.630195,41.956036]},n1358:{id:"n1358",loc:[-85.630137,41.956037]},n1359:{id:"n1359",loc:[-85.630136,41.956006]},n136:{id:"n136",loc:[-85.637342,41.941914]},n1360:{id:"n1360",loc:[-85.630194,41.956005]},n1361:{id:"n1361",loc:[-85.629864,41.956039]},n1362:{id:"n1362",loc:[-85.629864,41.955862]},n1363:{id:"n1363",loc:[-85.629541,41.958291]},n1364:{id:"n1364",loc:[-85.629419,41.958292]},n1365:{id:"n1365",loc:[-85.629417,41.958168]},n1366:{id:"n1366",loc:[-85.629445,41.958168]},n1367:{id:"n1367",loc:[-85.629444,41.958109]},n1368:{id:"n1368",loc:[-85.629537,41.958108]},n1369:{id:"n1369",loc:[-85.629351,41.958136]},n137:{id:"n137",loc:[-85.637212,41.941916]},n1370:{id:"n1370",loc:[-85.629352,41.958202]},n1371:{id:"n1371",loc:[-85.629365,41.958202]},n1372:{id:"n1372",loc:[-85.629365,41.958223]},n1373:{id:"n1373",loc:[-85.629291,41.958224]},n1374:{id:"n1374",loc:[-85.62929,41.958137]},n1375:{id:"n1375",loc:[-85.629443,41.958073]},n1376:{id:"n1376",loc:[-85.629252,41.958075]},n1377:{id:"n1377",loc:[-85.629253,41.95827]},n1378:{id:"n1378",loc:[-85.629566,41.957585]},n1379:{id:"n1379",loc:[-85.629566,41.957692]},n138:{id:"n138",loc:[-85.637211,41.941835]},n1380:{id:"n1380",loc:[-85.629281,41.957693]},n1381:{id:"n1381",loc:[-85.62928,41.957585]},n1382:{id:"n1382",loc:[-85.629004,41.957599]},n1383:{id:"n1383",loc:[-85.629004,41.957682]},n1384:{id:"n1384",loc:[-85.628902,41.957682]},n1385:{id:"n1385",loc:[-85.628902,41.957723]},n1386:{id:"n1386",loc:[-85.628731,41.957724]},n1387:{id:"n1387",loc:[-85.628731,41.9576]},n1388:{id:"n1388",loc:[-85.62836,41.957679]},n1389:{id:"n1389",loc:[-85.628359,41.957759]},n139:{id:"n139",loc:[-85.637293,41.941834]},n1390:{id:"n1390",loc:[-85.628062,41.957757]},n1391:{id:"n1391",loc:[-85.628063,41.957657]},n1392:{id:"n1392",loc:[-85.628198,41.957657]},n1393:{id:"n1393",loc:[-85.628198,41.957678]},n1394:{id:"n1394",loc:[-85.627775,41.958095]},n1395:{id:"n1395",loc:[-85.627608,41.958095]},n1396:{id:"n1396",loc:[-85.627606,41.957829]},n1397:{id:"n1397",loc:[-85.627774,41.957829]},n1398:{id:"n1398",loc:[-85.626816,41.957636]},n1399:{id:"n1399",loc:[-85.626787,41.957681]},n14:{id:"n14",loc:[-85.633643,41.940122]},n140:{id:"n140",loc:[-85.637293,41.941823]},n1400:{id:"n1400",loc:[-85.626673,41.95764]},n1401:{id:"n1401",loc:[-85.626703,41.957594]},n1402:{id:"n1402",loc:[-85.62694,41.95752]},n1403:{id:"n1403",loc:[-85.62688,41.957611]},n1404:{id:"n1404",loc:[-85.626798,41.957582]},n1405:{id:"n1405",loc:[-85.626793,41.95759]},n1406:{id:"n1406",loc:[-85.626657,41.95754]},n1407:{id:"n1407",loc:[-85.626666,41.957526]},n1408:{id:"n1408",loc:[-85.626584,41.957497]},n1409:{id:"n1409",loc:[-85.626638,41.957415]},n141:{id:"n141",loc:[-85.637363,41.941822]},n1410:{id:"n1410",loc:[-85.626731,41.957449]},n1411:{id:"n1411",loc:[-85.626725,41.957457]},n1412:{id:"n1412",loc:[-85.626843,41.9575]},n1413:{id:"n1413",loc:[-85.626851,41.957487]},n1414:{id:"n1414",loc:[-85.626579,41.957521]},n1415:{id:"n1415",loc:[-85.626537,41.957587]},n1416:{id:"n1416",loc:[-85.626427,41.957551]},n1417:{id:"n1417",loc:[-85.626468,41.957483]},n1418:{id:"n1418",loc:[-85.626592,41.957639]},n1419:{id:"n1419",loc:[-85.626807,41.957713]},n142:{id:"n142",loc:[-85.637364,41.941833]},n1420:{id:"n1420",loc:[-85.627129,41.957401]},n1421:{id:"n1421",loc:[-85.627209,41.95742]},n1422:{id:"n1422",loc:[-85.627302,41.957435]},n1423:{id:"n1423",loc:[-85.629566,41.957048]},n1424:{id:"n1424",loc:[-85.629568,41.957215]},n1425:{id:"n1425",loc:[-85.629383,41.957216]},n1426:{id:"n1426",loc:[-85.629384,41.95727]},n1427:{id:"n1427",loc:[-85.629231,41.957271]},n1428:{id:"n1428",loc:[-85.62923,41.957198]},n1429:{id:"n1429",loc:[-85.629322,41.957198]},n143:{id:"n143",loc:[-85.637559,41.942448]},n1430:{id:"n1430",loc:[-85.629321,41.957108]},n1431:{id:"n1431",loc:[-85.629441,41.957108]},n1432:{id:"n1432",loc:[-85.62944,41.957049]},n1433:{id:"n1433",loc:[-85.629337,41.957018]},n1434:{id:"n1434",loc:[-85.629366,41.957028]},n1435:{id:"n1435",loc:[-85.629375,41.957044]},n1436:{id:"n1436",loc:[-85.629354,41.957071]},n1437:{id:"n1437",loc:[-85.629317,41.957071]},n1438:{id:"n1438",loc:[-85.62929,41.957074]},n1439:{id:"n1439",loc:[-85.62927,41.957084]},n144:{id:"n144",loc:[-85.637036,41.942454]},n1440:{id:"n1440",loc:[-85.629232,41.957081]},n1441:{id:"n1441",loc:[-85.629222,41.957057]},n1442:{id:"n1442",loc:[-85.629259,41.957025]},n1443:{id:"n1443",loc:[-85.629293,41.957017]},n1444:{id:"n1444",loc:[-85.629251,41.957085]},n1445:{id:"n1445",loc:[-85.629235,41.957041]},n1446:{id:"n1446",loc:[-85.62937,41.95706]},n1447:{id:"n1447",loc:[-85.629531,41.956909]},n1448:{id:"n1448",loc:[-85.629408,41.956909]},n1449:{id:"n1449",loc:[-85.629402,41.956681]},n145:{id:"n145",loc:[-85.636692,41.942828]},n1450:{id:"n1450",loc:[-85.62953,41.956681]},n1451:{id:"n1451",loc:[-85.629402,41.956728]},n1452:{id:"n1452",loc:[-85.629408,41.956845]},n1453:{id:"n1453",loc:[-85.629385,41.956845]},n1454:{id:"n1454",loc:[-85.629384,41.956728]},n1455:{id:"n1455",loc:[-85.629063,41.956973]},n1456:{id:"n1456",loc:[-85.629064,41.957009]},n1457:{id:"n1457",loc:[-85.62902,41.957009]},n1458:{id:"n1458",loc:[-85.629019,41.956973]},n1459:{id:"n1459",loc:[-85.629136,41.956633]},n146:{id:"n146",loc:[-85.635929,41.942826]},n1460:{id:"n1460",loc:[-85.629084,41.956632]},n1461:{id:"n1461",loc:[-85.629084,41.956605]},n1462:{id:"n1462",loc:[-85.629136,41.956605]},n1463:{id:"n1463",loc:[-85.629153,41.956657]},n1464:{id:"n1464",loc:[-85.627914,41.956661]},n1465:{id:"n1465",loc:[-85.630096,41.956101]},n1466:{id:"n1466",loc:[-85.630097,41.95612]},n1467:{id:"n1467",loc:[-85.630011,41.956121]},n1468:{id:"n1468",loc:[-85.630015,41.956374]},n1469:{id:"n1469",loc:[-85.629148,41.95626]},n147:{id:"n147",loc:[-85.636433,41.942828]},n1470:{id:"n1470",loc:[-85.629527,41.956591]},n1471:{id:"n1471",loc:[-85.629405,41.956591]},n1472:{id:"n1472",loc:[-85.629405,41.956459]},n1473:{id:"n1473",loc:[-85.629369,41.956459]},n1474:{id:"n1474",loc:[-85.629369,41.956424]},n1475:{id:"n1475",loc:[-85.629413,41.956424]},n1476:{id:"n1476",loc:[-85.629414,41.956326]},n1477:{id:"n1477",loc:[-85.629522,41.956326]},n1478:{id:"n1478",loc:[-85.629522,41.956487]},n1479:{id:"n1479",loc:[-85.629527,41.956487]},n148:{id:"n148",loc:[-85.636435,41.942864],tags:{entrance:"yes"}},n1480:{id:"n1480",loc:[-85.629414,41.95634]},n1481:{id:"n1481",loc:[-85.629149,41.956338]},n1482:{id:"n1482",loc:[-85.62931,41.956531]},n1483:{id:"n1483",loc:[-85.629291,41.95655]},n1484:{id:"n1484",loc:[-85.629255,41.95655]},n1485:{id:"n1485",loc:[-85.629236,41.956533]},n1486:{id:"n1486",loc:[-85.629237,41.956461]},n1487:{id:"n1487",loc:[-85.629257,41.956445]},n1488:{id:"n1488",loc:[-85.629257,41.956428]},n1489:{id:"n1489",loc:[-85.629287,41.956428]},n149:{id:"n149",loc:[-85.637235,41.942622]},n1490:{id:"n1490",loc:[-85.629287,41.956445]},n1491:{id:"n1491",loc:[-85.62931,41.95646]},n1492:{id:"n1492",loc:[-85.629049,41.956425]},n1493:{id:"n1493",loc:[-85.628907,41.956427]},n1494:{id:"n1494",loc:[-85.628907,41.956455]},n1495:{id:"n1495",loc:[-85.628841,41.956455]},n1496:{id:"n1496",loc:[-85.62884,41.956424]},n1497:{id:"n1497",loc:[-85.628764,41.956425]},n1498:{id:"n1498",loc:[-85.628762,41.956323]},n1499:{id:"n1499",loc:[-85.628808,41.956323]},n15:{id:"n15",loc:[-85.633477,41.940187]},n150:{id:"n150",loc:[-85.637247,41.943116]},n1500:{id:"n1500",loc:[-85.628808,41.956314]},n1501:{id:"n1501",loc:[-85.628911,41.956313]},n1502:{id:"n1502",loc:[-85.628911,41.956322]},n1503:{id:"n1503",loc:[-85.62896,41.956322]},n1504:{id:"n1504",loc:[-85.62896,41.956348]},n1505:{id:"n1505",loc:[-85.629047,41.956347]},n1506:{id:"n1506",loc:[-85.628893,41.957263]},n1507:{id:"n1507",loc:[-85.628788,41.957264]},n1508:{id:"n1508",loc:[-85.628786,41.95711]},n1509:{id:"n1509",loc:[-85.628894,41.957109]},n151:{id:"n151",loc:[-85.637564,41.943116]},n1510:{id:"n1510",loc:[-85.628893,41.957075]},n1511:{id:"n1511",loc:[-85.628965,41.957075]},n1512:{id:"n1512",loc:[-85.628965,41.957111]},n1513:{id:"n1513",loc:[-85.629035,41.95711]},n1514:{id:"n1514",loc:[-85.629036,41.957209]},n1515:{id:"n1515",loc:[-85.628893,41.95721]},n1516:{id:"n1516",loc:[-85.631348,41.95773]},n1517:{id:"n1517",loc:[-85.631101,41.957732]},n1518:{id:"n1518",loc:[-85.631099,41.957558]},n1519:{id:"n1519",loc:[-85.63123,41.957557]},n152:{id:"n152",loc:[-85.637552,41.942619]},n1520:{id:"n1520",loc:[-85.631231,41.957618]},n1521:{id:"n1521",loc:[-85.63129,41.957618]},n1522:{id:"n1522",loc:[-85.63129,41.957651]},n1523:{id:"n1523",loc:[-85.631346,41.957651]},n1524:{id:"n1524",loc:[-85.631366,41.95802]},n1525:{id:"n1525",loc:[-85.631141,41.958021]},n1526:{id:"n1526",loc:[-85.63114,41.957943]},n1527:{id:"n1527",loc:[-85.631167,41.957943]},n1528:{id:"n1528",loc:[-85.631166,41.957808]},n1529:{id:"n1529",loc:[-85.631301,41.957807]},n153:{id:"n153",loc:[-85.63763,41.942528]},n1530:{id:"n1530",loc:[-85.631302,41.95789]},n1531:{id:"n1531",loc:[-85.631364,41.95789]},n1532:{id:"n1532",loc:[-85.631539,41.957754]},n1533:{id:"n1533",loc:[-85.631069,41.957756]},n1534:{id:"n1534",loc:[-85.631536,41.957518]},n1535:{id:"n1535",loc:[-85.631543,41.957995]},n1536:{id:"n1536",loc:[-85.631531,41.957748]},n1537:{id:"n1537",loc:[-85.631485,41.957748]},n1538:{id:"n1538",loc:[-85.631484,41.957698]},n1539:{id:"n1539",loc:[-85.631531,41.957698]},n154:{id:"n154",loc:[-85.637151,41.94253]},n1540:{id:"n1540",loc:[-85.631586,41.957742]},n1541:{id:"n1541",loc:[-85.63155,41.957742]},n1542:{id:"n1542",loc:[-85.631551,41.957702]},n1543:{id:"n1543",loc:[-85.631587,41.957702]},n1544:{id:"n1544",loc:[-85.631534,41.95807]},n1545:{id:"n1545",loc:[-85.631534,41.958097]},n1546:{id:"n1546",loc:[-85.631491,41.958097]},n1547:{id:"n1547",loc:[-85.631491,41.95807]},n1548:{id:"n1548",loc:[-85.631304,41.958861]},n1549:{id:"n1549",loc:[-85.631186,41.958862]},n155:{id:"n155",loc:[-85.63715,41.942424]},n1550:{id:"n1550",loc:[-85.631182,41.958653]},n1551:{id:"n1551",loc:[-85.6313,41.958651]},n1552:{id:"n1552",loc:[-85.631293,41.95854]},n1553:{id:"n1553",loc:[-85.631176,41.958539]},n1554:{id:"n1554",loc:[-85.631176,41.958377]},n1555:{id:"n1555",loc:[-85.631297,41.958377]},n1556:{id:"n1556",loc:[-85.631297,41.958422]},n1557:{id:"n1557",loc:[-85.631333,41.958422]},n1558:{id:"n1558",loc:[-85.631333,41.958479]},n1559:{id:"n1559",loc:[-85.631293,41.958479]},n156:{id:"n156",loc:[-85.637629,41.942422]},n1560:{id:"n1560",loc:[-85.631951,41.958908]},n1561:{id:"n1561",loc:[-85.631838,41.958909]},n1562:{id:"n1562",loc:[-85.631837,41.958847]},n1563:{id:"n1563",loc:[-85.631859,41.958847]},n1564:{id:"n1564",loc:[-85.631858,41.958746]},n1565:{id:"n1565",loc:[-85.631961,41.958745]},n1566:{id:"n1566",loc:[-85.631962,41.958812]},n1567:{id:"n1567",loc:[-85.631949,41.958813]},n1568:{id:"n1568",loc:[-85.631579,41.958913]},n1569:{id:"n1569",loc:[-85.631567,41.95864]},n157:{id:"n157",loc:[-85.638232,41.942477]},n1570:{id:"n1570",loc:[-85.631942,41.958639]},n1571:{id:"n1571",loc:[-85.631543,41.958594]},n1572:{id:"n1572",loc:[-85.631543,41.958065]},n1573:{id:"n1573",loc:[-85.631888,41.958546]},n1574:{id:"n1574",loc:[-85.631804,41.958546]},n1575:{id:"n1575",loc:[-85.631803,41.95841]},n1576:{id:"n1576",loc:[-85.631886,41.958409]},n1577:{id:"n1577",loc:[-85.631897,41.958125]},n1578:{id:"n1578",loc:[-85.631755,41.958126]},n1579:{id:"n1579",loc:[-85.631756,41.958174]},n158:{id:"n158",loc:[-85.637775,41.942483]},n1580:{id:"n1580",loc:[-85.63178,41.958174]},n1581:{id:"n1581",loc:[-85.631782,41.958272]},n1582:{id:"n1582",loc:[-85.631922,41.958271]},n1583:{id:"n1583",loc:[-85.631922,41.958244]},n1584:{id:"n1584",loc:[-85.631883,41.958245]},n1585:{id:"n1585",loc:[-85.631882,41.958175]},n1586:{id:"n1586",loc:[-85.631898,41.958175]},n1587:{id:"n1587",loc:[-85.631924,41.958032]},n1588:{id:"n1588",loc:[-85.631762,41.958032]},n1589:{id:"n1589",loc:[-85.63176,41.957827]},n159:{id:"n159",loc:[-85.638107,41.942512]},n1590:{id:"n1590",loc:[-85.631888,41.957826]},n1591:{id:"n1591",loc:[-85.631888,41.957892]},n1592:{id:"n1592",loc:[-85.631871,41.957892]},n1593:{id:"n1593",loc:[-85.631872,41.957949]},n1594:{id:"n1594",loc:[-85.631923,41.957949]},n1595:{id:"n1595",loc:[-85.631695,41.95795]},n1596:{id:"n1596",loc:[-85.631666,41.957975]},n1597:{id:"n1597",loc:[-85.63163,41.957975]},n1598:{id:"n1598",loc:[-85.6316,41.957951]},n1599:{id:"n1599",loc:[-85.6316,41.95785]},n16:{id:"n16",loc:[-85.63341,41.94032]},n160:{id:"n160",loc:[-85.637763,41.942514]},n1600:{id:"n1600",loc:[-85.63166,41.95785]},n1601:{id:"n1601",loc:[-85.631696,41.957873]},n1602:{id:"n1602",loc:[-85.631924,41.957762]},n1603:{id:"n1603",loc:[-85.631762,41.957762]},n1604:{id:"n1604",loc:[-85.631762,41.957708]},n1605:{id:"n1605",loc:[-85.631785,41.957708]},n1606:{id:"n1606",loc:[-85.631785,41.957606]},n1607:{id:"n1607",loc:[-85.631734,41.957606]},n1608:{id:"n1608",loc:[-85.631734,41.957538]},n1609:{id:"n1609",loc:[-85.631821,41.957538]},n161:{id:"n161",loc:[-85.637763,41.942445]},n1610:{id:"n1610",loc:[-85.631935,41.957545]},n1611:{id:"n1611",loc:[-85.631821,41.957544]},n1612:{id:"n1612",loc:[-85.631935,41.957645]},n1613:{id:"n1613",loc:[-85.631924,41.957645]},n1614:{id:"n1614",loc:[-85.627135,41.953828]},n1615:{id:"n1615",loc:[-85.633517,41.941353],tags:{man_made:"lighthouse"}},n1616:{id:"n1616",loc:[-85.633659,41.942041],tags:{amenity:"bbq"}},n1617:{id:"n1617",loc:[-85.63662,41.942911],tags:{amenity:"toilets"}},n1618:{id:"n1618",loc:[-85.637487,41.943876],tags:{amenity:"toilets"}},n1619:{id:"n1619",loc:[-85.634938,41.941917],tags:{amenity:"toilets"}},n162:{id:"n162",loc:[-85.638107,41.942443]},n1620:{id:"n1620",loc:[-85.632427,41.941678],tags:{amenity:"bbq"}},n1621:{id:"n1621",loc:[-85.638033,41.944568],tags:{amenity:"bbq"}},n1622:{id:"n1622",loc:[-85.638052,41.944522],tags:{amenity:"bbq"}},n1623:{id:"n1623",loc:[-85.635001,41.941965]},n1624:{id:"n1624",loc:[-85.634635,41.941884]},n1625:{id:"n1625",loc:[-85.634667,41.941894]},n1626:{id:"n1626",loc:[-85.634791,41.942011]},n1627:{id:"n1627",loc:[-85.634749,41.941938]},n1628:{id:"n1628",loc:[-85.627295,41.953946],tags:{barrier:"gate"}},n1629:{id:"n1629",loc:[-85.629076,41.954689]},n163:{id:"n163",loc:[-85.638813,41.942475]},n1630:{id:"n1630",loc:[-85.640667,41.942595]},n1631:{id:"n1631",loc:[-85.639455,41.94261]},n1632:{id:"n1632",loc:[-85.643407,41.942336]},n1633:{id:"n1633",loc:[-85.641845,41.941316]},n1634:{id:"n1634",loc:[-85.643322,41.942224]},n1635:{id:"n1635",loc:[-85.643301,41.942124]},n1636:{id:"n1636",loc:[-85.640639,41.941326]},n1637:{id:"n1637",loc:[-85.640614,41.940058]},n1638:{id:"n1638",loc:[-85.639428,41.941335]},n1639:{id:"n1639",loc:[-85.643078,41.941293]},n164:{id:"n164",loc:[-85.63883,41.942422]},n1640:{id:"n1640",loc:[-85.64371,41.942302]},n1641:{id:"n1641",loc:[-85.643056,41.94001]},n1642:{id:"n1642",loc:[-85.643097,41.942575],tags:{highway:"traffic_signals",traffic_signals:"signal","traffic_signals:direction":"both"}},n1643:{id:"n1643",loc:[-85.641855,41.942586]},n1644:{id:"n1644",loc:[-85.643549,41.942209]},n1645:{id:"n1645",loc:[-85.639359,41.94007]},n1646:{id:"n1646",loc:[-85.642797,41.940522]},n1647:{id:"n1647",loc:[-85.642589,41.940523]},n1648:{id:"n1648",loc:[-85.642587,41.940287]},n1649:{id:"n1649",loc:[-85.642797,41.940286]},n165:{id:"n165",loc:[-85.63883,41.942508]},n1650:{id:"n1650",loc:[-85.642571,41.940523]},n1651:{id:"n1651",loc:[-85.642568,41.940286]},n1652:{id:"n1652",loc:[-85.642316,41.940289]},n1653:{id:"n1653",loc:[-85.642321,41.940436]},n1654:{id:"n1654",loc:[-85.642292,41.940458]},n1655:{id:"n1655",loc:[-85.642287,41.940483]},n1656:{id:"n1656",loc:[-85.642323,41.940509]},n1657:{id:"n1657",loc:[-85.642385,41.940511]},n1658:{id:"n1658",loc:[-85.642408,41.940526]},n1659:{id:"n1659",loc:[-85.641962,41.94109]},n166:{id:"n166",loc:[-85.638364,41.942508]},n1660:{id:"n1660",loc:[-85.642753,41.941084]},n1661:{id:"n1661",loc:[-85.642752,41.941004]},n1662:{id:"n1662",loc:[-85.642806,41.941003]},n1663:{id:"n1663",loc:[-85.642803,41.940731]},n1664:{id:"n1664",loc:[-85.642741,41.940732]},n1665:{id:"n1665",loc:[-85.64274,41.940645]},n1666:{id:"n1666",loc:[-85.641957,41.940651]},n1667:{id:"n1667",loc:[-85.642937,41.941241]},n1668:{id:"n1668",loc:[-85.641776,41.941253]},n1669:{id:"n1669",loc:[-85.641766,41.940598]},n167:{id:"n167",loc:[-85.638836,41.942167]},n1670:{id:"n1670",loc:[-85.64198,41.940598]},n1671:{id:"n1671",loc:[-85.641961,41.940137]},n1672:{id:"n1672",loc:[-85.642934,41.94012]},n1673:{id:"n1673",loc:[-85.643074,41.941173]},n1674:{id:"n1674",loc:[-85.642841,41.940997]},n1675:{id:"n1675",loc:[-85.642839,41.940721]},n1676:{id:"n1676",loc:[-85.643065,41.940552]},n1677:{id:"n1677",loc:[-85.642732,41.94124]},n1678:{id:"n1678",loc:[-85.641815,41.941246]},n1679:{id:"n1679",loc:[-85.641813,41.941132]},n168:{id:"n168",loc:[-85.638836,41.94229]},n1680:{id:"n1680",loc:[-85.641839,41.941111]},n1681:{id:"n1681",loc:[-85.641884,41.941098]},n1682:{id:"n1682",loc:[-85.642732,41.941092]},n1683:{id:"n1683",loc:[-85.642776,41.941302]},n1684:{id:"n1684",loc:[-85.632788,41.946236]},n1685:{id:"n1685",loc:[-85.622342,41.953127]},n1686:{id:"n1686",loc:[-85.641848,41.941167]},n1687:{id:"n1687",loc:[-85.643753,41.941503]},n1688:{id:"n1688",loc:[-85.643762,41.942119]},n1689:{id:"n1689",loc:[-85.64238,41.942262]},n169:{id:"n169",loc:[-85.638594,41.94229]},n1690:{id:"n1690",loc:[-85.642374,41.941944]},n1691:{id:"n1691",loc:[-85.642518,41.941943]},n1692:{id:"n1692",loc:[-85.642519,41.94198]},n1693:{id:"n1693",loc:[-85.642831,41.941977]},n1694:{id:"n1694",loc:[-85.642837,41.942312]},n1695:{id:"n1695",loc:[-85.642495,41.942315]},n1696:{id:"n1696",loc:[-85.642494,41.942261]},n1697:{id:"n1697",loc:[-85.641087,41.942433]},n1698:{id:"n1698",loc:[-85.641081,41.942006]},n1699:{id:"n1699",loc:[-85.641244,41.942005]},n17:{id:"n17",loc:[-85.633478,41.94081]},n170:{id:"n170",loc:[-85.638594,41.942422]},n1700:{id:"n1700",loc:[-85.64125,41.942431]},n1701:{id:"n1701",loc:[-85.641331,41.942968]},n1702:{id:"n1702",loc:[-85.641328,41.942713]},n1703:{id:"n1703",loc:[-85.641521,41.942712]},n1704:{id:"n1704",loc:[-85.641523,41.942924]},n1705:{id:"n1705",loc:[-85.641504,41.942924]},n1706:{id:"n1706",loc:[-85.641505,41.942967]},n1707:{id:"n1707",loc:[-85.638612,41.942408]},n1708:{id:"n1708",loc:[-85.638612,41.942327]},n1709:{id:"n1709",loc:[-85.638775,41.942327]},n171:{id:"n171",loc:[-85.638364,41.942356]},n1710:{id:"n1710",loc:[-85.638775,41.942299]},n1711:{id:"n1711",loc:[-85.638835,41.942298]},n1712:{id:"n1712",loc:[-85.638835,41.942407]},n1713:{id:"n1713",loc:[-85.639116,41.942444]},n1714:{id:"n1714",loc:[-85.639114,41.942362]},n1715:{id:"n1715",loc:[-85.639294,41.94236]},n1716:{id:"n1716",loc:[-85.639296,41.942442]},n1717:{id:"n1717",loc:[-85.639808,41.942385]},n1718:{id:"n1718",loc:[-85.639805,41.942285]},n1719:{id:"n1719",loc:[-85.639988,41.942283]},n172:{id:"n172",loc:[-85.638364,41.942167]},n1720:{id:"n1720",loc:[-85.63999,41.942383]},n1721:{id:"n1721",loc:[-85.639633,41.943023]},n1722:{id:"n1722",loc:[-85.639867,41.943019]},n1723:{id:"n1723",loc:[-85.639866,41.942964]},n1724:{id:"n1724",loc:[-85.639888,41.942963]},n1725:{id:"n1725",loc:[-85.639883,41.942779]},n1726:{id:"n1726",loc:[-85.639851,41.94278]},n1727:{id:"n1727",loc:[-85.63985,41.94274]},n1728:{id:"n1728",loc:[-85.639789,41.942741]},n1729:{id:"n1729",loc:[-85.639789,41.942753]},n173:{id:"n173",loc:[-85.639038,41.942463]},n1730:{id:"n1730",loc:[-85.639698,41.942754]},n1731:{id:"n1731",loc:[-85.639699,41.942788]},n1732:{id:"n1732",loc:[-85.639675,41.942789]},n1733:{id:"n1733",loc:[-85.639676,41.94283]},n1734:{id:"n1734",loc:[-85.639701,41.942829]},n1735:{id:"n1735",loc:[-85.639702,41.942869]},n1736:{id:"n1736",loc:[-85.639629,41.94287]},n1737:{id:"n1737",loc:[-85.643568,41.942946]},n1738:{id:"n1738",loc:[-85.643568,41.942777]},n1739:{id:"n1739",loc:[-85.643401,41.942777]},n174:{id:"n174",loc:[-85.638897,41.942464]},n1740:{id:"n1740",loc:[-85.643401,41.942863]},n1741:{id:"n1741",loc:[-85.643448,41.942863]},n1742:{id:"n1742",loc:[-85.643448,41.942946]},n1743:{id:"n1743",loc:[-85.642836,41.942981]},n1744:{id:"n1744",loc:[-85.642917,41.942979]},n1745:{id:"n1745",loc:[-85.642914,41.942904]},n1746:{id:"n1746",loc:[-85.642938,41.942903]},n1747:{id:"n1747",loc:[-85.642935,41.942813]},n1748:{id:"n1748",loc:[-85.642775,41.942816]},n1749:{id:"n1749",loc:[-85.642778,41.942906]},n175:{id:"n175",loc:[-85.638897,41.942423]},n1750:{id:"n1750",loc:[-85.642833,41.942905]},n1751:{id:"n1751",loc:[-85.642302,41.942886]},n1752:{id:"n1752",loc:[-85.642299,41.942721]},n1753:{id:"n1753",loc:[-85.642422,41.94272]},n1754:{id:"n1754",loc:[-85.642425,41.942868]},n1755:{id:"n1755",loc:[-85.642385,41.942869]},n1756:{id:"n1756",loc:[-85.642385,41.942885]},n1757:{id:"n1757",loc:[-85.641533,41.942939]},n1758:{id:"n1758",loc:[-85.64161,41.942877]},n1759:{id:"n1759",loc:[-85.641676,41.942922]},n176:{id:"n176",loc:[-85.638853,41.942423]},n1760:{id:"n1760",loc:[-85.6416,41.942985]},n1761:{id:"n1761",loc:[-85.64206,41.942802]},n1762:{id:"n1762",loc:[-85.642059,41.942741]},n1763:{id:"n1763",loc:[-85.642196,41.942741]},n1764:{id:"n1764",loc:[-85.642196,41.942818]},n1765:{id:"n1765",loc:[-85.642128,41.942819]},n1766:{id:"n1766",loc:[-85.642128,41.942801]},n1767:{id:"n1767",loc:[-85.640943,41.942934]},n1768:{id:"n1768",loc:[-85.641035,41.942933]},n1769:{id:"n1769",loc:[-85.641032,41.942797]},n177:{id:"n177",loc:[-85.638852,41.94237]},n1770:{id:"n1770",loc:[-85.640997,41.942798]},n1771:{id:"n1771",loc:[-85.640996,41.942764]},n1772:{id:"n1772",loc:[-85.640861,41.942766]},n1773:{id:"n1773",loc:[-85.640862,41.942848]},n1774:{id:"n1774",loc:[-85.640941,41.942847]},n1775:{id:"n1775",loc:[-85.643766,41.942226]},n1776:{id:"n1776",loc:[-85.643768,41.942407]},n1777:{id:"n1777",loc:[-85.643218,41.94177]},n1778:{id:"n1778",loc:[-85.64321,41.941327]},n1779:{id:"n1779",loc:[-85.643649,41.941323]},n178:{id:"n178",loc:[-85.638892,41.94237]},n1780:{id:"n1780",loc:[-85.643656,41.941716]},n1781:{id:"n1781",loc:[-85.64358,41.941717]},n1782:{id:"n1782",loc:[-85.64358,41.941767]},n1783:{id:"n1783",loc:[-85.64382,41.941495]},n1784:{id:"n1784",loc:[-85.643817,41.941317]},n1785:{id:"n1785",loc:[-85.643235,41.941833]},n1786:{id:"n1786",loc:[-85.64335,41.941842]},n1787:{id:"n1787",loc:[-85.643504,41.941903]},n1788:{id:"n1788",loc:[-85.643554,41.941946]},n1789:{id:"n1789",loc:[-85.643618,41.942015]},n179:{id:"n179",loc:[-85.638891,41.942334]},n1790:{id:"n1790",loc:[-85.64346,41.941971]},n1791:{id:"n1791",loc:[-85.643528,41.942468]},n1792:{id:"n1792",loc:[-85.643621,41.942363]},n1793:{id:"n1793",loc:[-85.643496,41.942297]},n1794:{id:"n1794",loc:[-85.643446,41.942246]},n1795:{id:"n1795",loc:[-85.643398,41.942177]},n1796:{id:"n1796",loc:[-85.643398,41.942031]},n1797:{id:"n1797",loc:[-85.621531,41.952693]},n1798:{id:"n1798",loc:[-85.643221,41.942028]},n1799:{id:"n1799",loc:[-85.643225,41.942276]},n18:{id:"n18",loc:[-85.63345,41.94071]},n180:{id:"n180",loc:[-85.639037,41.942334]},n1800:{id:"n1800",loc:[-85.643265,41.942347]},n1801:{id:"n1801",loc:[-85.643323,41.942413]},n1802:{id:"n1802",loc:[-85.643411,41.94247]},n1803:{id:"n1803",loc:[-85.643459,41.942435]},n1804:{id:"n1804",loc:[-85.643767,41.942307]},n1805:{id:"n1805",loc:[-85.643661,41.942293]},n1806:{id:"n1806",loc:[-85.643578,41.942247]},n1807:{id:"n1807",loc:[-85.643522,41.942125]},n1808:{id:"n1808",loc:[-85.643515,41.942061]},n1809:{id:"n1809",loc:[-85.643346,41.941924]},n181:{id:"n181",loc:[-85.638074,41.941839]},n1810:{id:"n1810",loc:[-85.643086,41.94192]},n1811:{id:"n1811",loc:[-85.643529,41.94217]},n1812:{id:"n1812",loc:[-85.643489,41.942003]},n1813:{id:"n1813",loc:[-85.643295,41.941919]},n1814:{id:"n1814",loc:[-85.643305,41.942163]},n1815:{id:"n1815",loc:[-85.643354,41.942285]},n1816:{id:"n1816",loc:[-85.643472,41.942389]},n1817:{id:"n1817",loc:[-85.643608,41.942271]},n1818:{id:"n1818",loc:[-85.643876,41.941402]},n1819:{id:"n1819",loc:[-85.643818,41.941369]},n182:{id:"n182",loc:[-85.638076,41.941942]},n1820:{id:"n1820",loc:[-85.643682,41.941304]},n1821:{id:"n1821",loc:[-85.64359,41.941286]},n1822:{id:"n1822",loc:[-85.643317,41.941727]},n1823:{id:"n1823",loc:[-85.643301,41.941286]},n1824:{id:"n1824",loc:[-85.643553,41.941698]},n1825:{id:"n1825",loc:[-85.643543,41.941286]},n1826:{id:"n1826",loc:[-85.636967,41.940118]},n1827:{id:"n1827",loc:[-85.63378,41.940114]},n1828:{id:"n1828",loc:[-85.637254,41.940075]},n1829:{id:"n1829",loc:[-85.637002,41.941355]},n183:{id:"n183",loc:[-85.637955,41.941944]},n1830:{id:"n1830",loc:[-85.643532,41.94204]},n1831:{id:"n1831",loc:[-85.638235,41.942615]},n1832:{id:"n1832",loc:[-85.637039,41.942624]},n1833:{id:"n1833",loc:[-85.636369,41.94266]},n1834:{id:"n1834",loc:[-85.63582,41.942771],tags:{highway:"traffic_signals",traffic_signals:"emergency","traffic_signals:direction":"both"}},n1835:{id:"n1835",loc:[-85.634873,41.943044]},n1836:{id:"n1836",loc:[-85.643482,41.941976]},n1837:{id:"n1837",loc:[-85.64345,41.941945]},n1838:{id:"n1838",loc:[-85.641885,41.943851]},n1839:{id:"n1839",loc:[-85.641915,41.945121]},n184:{id:"n184",loc:[-85.637953,41.94184]},n1840:{id:"n1840",loc:[-85.639454,41.943871]},n1841:{id:"n1841",loc:[-85.639491,41.945191]},n1842:{id:"n1842",loc:[-85.635768,41.940113]},n1843:{id:"n1843",loc:[-85.638206,41.941345]},n1844:{id:"n1844",loc:[-85.640721,41.94513]},n1845:{id:"n1845",loc:[-85.643137,41.945103]},n1846:{id:"n1846",loc:[-85.638199,41.940079]},n1847:{id:"n1847",loc:[-85.640688,41.943861]},n1848:{id:"n1848",loc:[-85.643397,41.941924]},n1849:{id:"n1849",loc:[-85.643117,41.943841]},n185:{id:"n185",loc:[-85.637953,41.941866]},n1850:{id:"n1850",loc:[-85.636731,41.94263]},n1851:{id:"n1851",loc:[-85.63518,41.942955],tags:{highway:"crossing"}},n1852:{id:"n1852",loc:[-85.636152,41.942695]},n1853:{id:"n1853",loc:[-85.644202,41.941499]},n1854:{id:"n1854",loc:[-85.644211,41.942116]},n1855:{id:"n1855",loc:[-85.644233,41.942404]},n1856:{id:"n1856",loc:[-85.644231,41.942223]},n1857:{id:"n1857",loc:[-85.644133,41.941315]},n1858:{id:"n1858",loc:[-85.644136,41.941493]},n1859:{id:"n1859",loc:[-85.644345,41.942307]},n186:{id:"n186",loc:[-85.637873,41.941867]},n1860:{id:"n1860",loc:[-85.644232,41.942304]},n1861:{id:"n1861",loc:[-85.644134,41.941403]},n1862:{id:"n1862",loc:[-85.63607,41.943005],tags:{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"fire_station",name:"Three Rivers Fire Department"}},n1863:{id:"n1863",loc:[-85.637,41.941236]},n1864:{id:"n1864",loc:[-85.634476,41.941475]},n1865:{id:"n1865",loc:[-85.635036,41.941858]},n1866:{id:"n1866",loc:[-85.635362,41.941962]},n1867:{id:"n1867",loc:[-85.635796,41.941962]},n1868:{id:"n1868",loc:[-85.63295,41.943006]},n1869:{id:"n1869",loc:[-85.634692,41.943098]},n187:{id:"n187",loc:[-85.637877,41.941975]},n1870:{id:"n1870",loc:[-85.633128,41.940484]},n1871:{id:"n1871",loc:[-85.633117,41.942798]},n1872:{id:"n1872",loc:[-85.633303,41.942412]},n1873:{id:"n1873",loc:[-85.633482,41.941912]},n1874:{id:"n1874",loc:[-85.633455,41.941359]},n1875:{id:"n1875",loc:[-85.633162,41.942679]},n1876:{id:"n1876",loc:[-85.634274,41.943479]},n1877:{id:"n1877",loc:[-85.634678,41.942909]},n1878:{id:"n1878",loc:[-85.6339,41.941453]},n1879:{id:"n1879",loc:[-85.634571,41.942774]},n188:{id:"n188",loc:[-85.636855,41.942488]},n1880:{id:"n1880",loc:[-85.63419,41.941732]},n1881:{id:"n1881",loc:[-85.634067,41.941565]},n1882:{id:"n1882",loc:[-85.63436,41.942358]},n1883:{id:"n1883",loc:[-85.634327,41.942247]},n1884:{id:"n1884",loc:[-85.633391,41.941231]},n1885:{id:"n1885",loc:[-85.634303,41.941972]},n1886:{id:"n1886",loc:[-85.633541,41.940147]},n1887:{id:"n1887",loc:[-85.633433,41.940252]},n1888:{id:"n1888",loc:[-85.633402,41.940411]},n1889:{id:"n1889",loc:[-85.633551,41.941023]},n189:{id:"n189",loc:[-85.636702,41.942488]},n1890:{id:"n1890",loc:[-85.633719,41.941186]},n1891:{id:"n1891",loc:[-85.633067,41.941845]},n1892:{id:"n1892",loc:[-85.634902,41.942766]},n1893:{id:"n1893",loc:[-85.634603,41.942202]},n1894:{id:"n1894",loc:[-85.634858,41.942152]},n1895:{id:"n1895",loc:[-85.634842,41.942269]},n1896:{id:"n1896",loc:[-85.634907,41.942313]},n1897:{id:"n1897",loc:[-85.635049,41.942331]},n1898:{id:"n1898",loc:[-85.635101,41.942281]},n1899:{id:"n1899",loc:[-85.635129,41.942144]},n19:{id:"n19",loc:[-85.633009,41.942229]},n190:{id:"n190",loc:[-85.636702,41.942434]},n1900:{id:"n1900",loc:[-85.635531,41.942143]},n1901:{id:"n1901",loc:[-85.635534,41.942577]},n1902:{id:"n1902",loc:[-85.635158,41.942656]},n1903:{id:"n1903",loc:[-85.635121,41.942703]},n1904:{id:"n1904",loc:[-85.635087,41.941508]},n1905:{id:"n1905",loc:[-85.63536,41.941106]},n1906:{id:"n1906",loc:[-85.635442,41.941094]},n1907:{id:"n1907",loc:[-85.635508,41.941104]},n1908:{id:"n1908",loc:[-85.635569,41.941125]},n1909:{id:"n1909",loc:[-85.635583,41.941106]},n191:{id:"n191",loc:[-85.636761,41.942434]},n1910:{id:"n1910",loc:[-85.635555,41.940976]},n1911:{id:"n1911",loc:[-85.635501,41.940915]},n1912:{id:"n1912",loc:[-85.635392,41.940922]},n1913:{id:"n1913",loc:[-85.635276,41.940974]},n1914:{id:"n1914",loc:[-85.63517,41.941204]},n1915:{id:"n1915",loc:[-85.634888,41.941517]},n1916:{id:"n1916",loc:[-85.634897,41.941576]},n1917:{id:"n1917",loc:[-85.634961,41.94164]},n1918:{id:"n1918",loc:[-85.635028,41.941659]},n1919:{id:"n1919",loc:[-85.635118,41.941621]},n192:{id:"n192",loc:[-85.636761,41.942369]},n1920:{id:"n1920",loc:[-85.635085,41.941558]},n1921:{id:"n1921",loc:[-85.63504,41.94136]},n1922:{id:"n1922",loc:[-85.635221,41.941077]},n1923:{id:"n1923",loc:[-85.634387,41.941559]},n1924:{id:"n1924",loc:[-85.634351,41.941587]},n1925:{id:"n1925",loc:[-85.634416,41.941756]},n1926:{id:"n1926",loc:[-85.634461,41.941797]},n1927:{id:"n1927",loc:[-85.634501,41.941819]},n1928:{id:"n1928",loc:[-85.634597,41.941816]},n1929:{id:"n1929",loc:[-85.634732,41.941724]},n193:{id:"n193",loc:[-85.636855,41.942369]},n1930:{id:"n1930",loc:[-85.634672,41.941775]},n1931:{id:"n1931",loc:[-85.633403,41.939101]},n1932:{id:"n1932",loc:[-85.633297,41.939397]},n1933:{id:"n1933",loc:[-85.633205,41.939674]},n1934:{id:"n1934",loc:[-85.63322,41.939777]},n1935:{id:"n1935",loc:[-85.633345,41.939936]},n1936:{id:"n1936",loc:[-85.633376,41.940002]},n1937:{id:"n1937",loc:[-85.633266,41.940228]},n1938:{id:"n1938",loc:[-85.633236,41.940352]},n1939:{id:"n1939",loc:[-85.633282,41.94063]},n194:{id:"n194",loc:[-85.636645,41.94249]},n1940:{id:"n1940",loc:[-85.633364,41.940874]},n1941:{id:"n1941",loc:[-85.633439,41.941052]},n1942:{id:"n1942",loc:[-85.633582,41.941172]},n1943:{id:"n1943",loc:[-85.633748,41.941273]},n1944:{id:"n1944",loc:[-85.634317,41.941527]},n1945:{id:"n1945",loc:[-85.634389,41.94174]},n1946:{id:"n1946",loc:[-85.634441,41.941801]},n1947:{id:"n1947",loc:[-85.634514,41.941837]},n1948:{id:"n1948",loc:[-85.634485,41.942005]},n1949:{id:"n1949",loc:[-85.63457,41.942202]},n195:{id:"n195",loc:[-85.636565,41.94249]},n1950:{id:"n1950",loc:[-85.634869,41.942769]},n1951:{id:"n1951",loc:[-85.634943,41.942792]},n1952:{id:"n1952",loc:[-85.635139,41.942882]},n1953:{id:"n1953",loc:[-85.634962,41.943161]},n1954:{id:"n1954",loc:[-85.635002,41.943131]},n1955:{id:"n1955",loc:[-85.635005,41.943091]},n1956:{id:"n1956",loc:[-85.635216,41.943033]},n1957:{id:"n1957",loc:[-85.634817,41.94267]},n1958:{id:"n1958",loc:[-85.634614,41.942599]},n1959:{id:"n1959",loc:[-85.634494,41.942381]},n196:{id:"n196",loc:[-85.636565,41.942474]},n1960:{id:"n1960",loc:[-85.634486,41.9423]},n1961:{id:"n1961",loc:[-85.634671,41.941795]},n1962:{id:"n1962",loc:[-85.634595,41.941831]},n1963:{id:"n1963",loc:[-85.634332,41.941866]},n1964:{id:"n1964",loc:[-85.634207,41.941885]},n1965:{id:"n1965",loc:[-85.634133,41.941892]},n1966:{id:"n1966",loc:[-85.634131,41.942203]},n1967:{id:"n1967",loc:[-85.634047,41.942327]},n1968:{id:"n1968",loc:[-85.634219,41.942793]},n1969:{id:"n1969",loc:[-85.634061,41.942392]},n197:{id:"n197",loc:[-85.636514,41.942474]},n1970:{id:"n1970",loc:[-85.633989,41.942407]},n1971:{id:"n1971",loc:[-85.633971,41.942356]},n1972:{id:"n1972",loc:[-85.63361,41.942423]},n1973:{id:"n1973",loc:[-85.633714,41.942682]},n1974:{id:"n1974",loc:[-85.633698,41.942863]},n1975:{id:"n1975",loc:[-85.633882,41.942865]},n1976:{id:"n1976",loc:[-85.633941,41.943007]},n1977:{id:"n1977",loc:[-85.633887,41.943035]},n1978:{id:"n1978",loc:[-85.633768,41.942815]},n1979:{id:"n1979",loc:[-85.633682,41.942351]},n198:{id:"n198",loc:[-85.636514,41.942326]},n1980:{id:"n1980",loc:[-85.634037,41.942273]},n1981:{id:"n1981",loc:[-85.634029,41.942252]},n1982:{id:"n1982",loc:[-85.633673,41.942331]},n1983:{id:"n1983",loc:[-85.634219,41.942571]},n1984:{id:"n1984",loc:[-85.634252,41.942565]},n1985:{id:"n1985",loc:[-85.634144,41.942299]},n1986:{id:"n1986",loc:[-85.634115,41.942306]},n1987:{id:"n1987",loc:[-85.634059,41.943094]},n1988:{id:"n1988",loc:[-85.633944,41.942903]},n1989:{id:"n1989",loc:[-85.634311,41.942821]},n199:{id:"n199",loc:[-85.636561,41.942326]},n1990:{id:"n1990",loc:[-85.634351,41.94277]},n1991:{id:"n1991",loc:[-85.634153,41.942254]},n1992:{id:"n1992",loc:[-85.634092,41.94222]},n1993:{id:"n1993",loc:[-85.633571,41.942336]},n1994:{id:"n1994",loc:[-85.633513,41.942387]},n1995:{id:"n1995",loc:[-85.633509,41.942455]},n1996:{id:"n1996",loc:[-85.63363,41.942665]},n1997:{id:"n1997",loc:[-85.63414,41.94286]},n1998:{id:"n1998",loc:[-85.63397,41.942449]},n1999:{id:"n1999",loc:[-85.633551,41.942529]},n2:{id:"n2",loc:[-85.627421,41.953877]},n20:{id:"n20",loc:[-85.633013,41.941438]},n200:{id:"n200",loc:[-85.636561,41.942311]},n2000:{id:"n2000",loc:[-85.633741,41.942493]},n2001:{id:"n2001",loc:[-85.633894,41.942869]},n2002:{id:"n2002",loc:[-85.634132,41.941954]},n2003:{id:"n2003",loc:[-85.634032,41.942038]},n2004:{id:"n2004",loc:[-85.633765,41.942238]},n2005:{id:"n2005",loc:[-85.63376,41.942268]},n2006:{id:"n2006",loc:[-85.633768,41.942293]},n2007:{id:"n2007",loc:[-85.633808,41.942386]},n2008:{id:"n2008",loc:[-85.634946,41.941663]},n2009:{id:"n2009",loc:[-85.63511,41.941697]},n201:{id:"n201",loc:[-85.636621,41.942311]},n2010:{id:"n2010",loc:[-85.635337,41.94168]},n2011:{id:"n2011",loc:[-85.634997,41.942251]},n2012:{id:"n2012",loc:[-85.635013,41.942173]},n2013:{id:"n2013",loc:[-85.634876,41.942157]},n2014:{id:"n2014",loc:[-85.634859,41.942235]},n2015:{id:"n2015",loc:[-85.634992,41.941951]},n2016:{id:"n2016",loc:[-85.634952,41.941877]},n2017:{id:"n2017",loc:[-85.634844,41.94191]},n2018:{id:"n2018",loc:[-85.634884,41.941983]},n2019:{id:"n2019",loc:[-85.635189,41.941691]},n202:{id:"n202",loc:[-85.636621,41.942351]},n2020:{id:"n2020",loc:[-85.635089,41.941896]},n2021:{id:"n2021",loc:[-85.635077,41.941964]},n2022:{id:"n2022",loc:[-85.635058,41.942147]},n2023:{id:"n2023",loc:[-85.635099,41.942161]},n2024:{id:"n2024",loc:[-85.635099,41.942213]},n2025:{id:"n2025",loc:[-85.635079,41.942285]},n2026:{id:"n2026",loc:[-85.635047,41.942316]},n2027:{id:"n2027",loc:[-85.634925,41.9423]},n2028:{id:"n2028",loc:[-85.634911,41.942276]},n2029:{id:"n2029",loc:[-85.634917,41.942242]},n203:{id:"n203",loc:[-85.63666,41.942351]},n2030:{id:"n2030",loc:[-85.634698,41.941898]},n2031:{id:"n2031",loc:[-85.634964,41.941878]},n2032:{id:"n2032",loc:[-85.635025,41.941929]},n2033:{id:"n2033",loc:[-85.634862,41.941887]},n2034:{id:"n2034",loc:[-85.634811,41.94181]},n2035:{id:"n2035",loc:[-85.634731,41.941745]},n2036:{id:"n2036",loc:[-85.634933,41.94176]},n2037:{id:"n2037",loc:[-85.634942,41.942145]},n2038:{id:"n2038",loc:[-85.634944,41.942065]},n2039:{id:"n2039",loc:[-85.634914,41.941996]},n204:{id:"n204",loc:[-85.63666,41.942453]},n2040:{id:"n2040",loc:[-85.634981,41.941979]},n2041:{id:"n2041",loc:[-85.633419,41.942172]},n2042:{id:"n2042",loc:[-85.633509,41.941631]},n2043:{id:"n2043",loc:[-85.633686,41.942937]},n2044:{id:"n2044",loc:[-85.633371,41.942722]},n2045:{id:"n2045",loc:[-85.633291,41.942538]},n2046:{id:"n2046",loc:[-85.633902,41.940941]},n2047:{id:"n2047",loc:[-85.635254,41.940939]},n2048:{id:"n2048",loc:[-85.635686,41.940829]},n2049:{id:"n2049",loc:[-85.635712,41.942681]},n205:{id:"n205",loc:[-85.636645,41.942453]},n2050:{id:"n2050",loc:[-85.633721,41.942118]},n2051:{id:"n2051",loc:[-85.633698,41.942057]},n2052:{id:"n2052",loc:[-85.633591,41.942079]},n2053:{id:"n2053",loc:[-85.633614,41.94214]},n2054:{id:"n2054",loc:[-85.633968,41.941099]},n2055:{id:"n2055",loc:[-85.633907,41.941138]},n2056:{id:"n2056",loc:[-85.633968,41.941197]},n2057:{id:"n2057",loc:[-85.63404,41.941162]},n2058:{id:"n2058",loc:[-85.634839,41.941665]},n2059:{id:"n2059",loc:[-85.635314,41.943035]},n206:{id:"n206",loc:[-85.636394,41.942471]},n2060:{id:"n2060",loc:[-85.634919,41.943142]},n2061:{id:"n2061",loc:[-85.636433,41.942959],tags:{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"townhall",name:"Three Rivers City Hall"}},n2062:{id:"n2062",loc:[-85.637039,41.942789]},n2063:{id:"n2063",loc:[-85.636333,41.94279]},n2064:{id:"n2064",loc:[-85.634484,41.940726]},n2065:{id:"n2065",loc:[-85.634483,41.940603]},n2066:{id:"n2066",loc:[-85.634908,41.940601]},n2067:{id:"n2067",loc:[-85.634908,41.94053]},n2068:{id:"n2068",loc:[-85.634934,41.94053]},n2069:{id:"n2069",loc:[-85.634934,41.940496]},n207:{id:"n207",loc:[-85.636262,41.942472]},n2070:{id:"n2070",loc:[-85.63504,41.940495]},n2071:{id:"n2071",loc:[-85.63504,41.940531]},n2072:{id:"n2072",loc:[-85.635068,41.940531]},n2073:{id:"n2073",loc:[-85.635071,41.940794]},n2074:{id:"n2074",loc:[-85.635183,41.940793]},n2075:{id:"n2075",loc:[-85.635185,41.940916]},n2076:{id:"n2076",loc:[-85.634799,41.940919]},n2077:{id:"n2077",loc:[-85.634798,41.940798]},n2078:{id:"n2078",loc:[-85.634925,41.940797]},n2079:{id:"n2079",loc:[-85.634924,41.940724]},n208:{id:"n208",loc:[-85.636261,41.94233]},n2080:{id:"n2080",loc:[-85.637448,41.938233]},n2081:{id:"n2081",loc:[-85.634168,41.943279]},n2082:{id:"n2082",loc:[-85.635744,41.938248]},n2083:{id:"n2083",loc:[-85.638744,41.951211]},n2084:{id:"n2084",loc:[-85.636421,41.946392]},n2085:{id:"n2085",loc:[-85.635965,41.945809]},n2086:{id:"n2086",loc:[-85.635683,41.945449]},n2087:{id:"n2087",loc:[-85.635281,41.945025]},n2088:{id:"n2088",loc:[-85.632443,41.942574]},n2089:{id:"n2089",loc:[-85.638243,41.943674]},n209:{id:"n209",loc:[-85.636353,41.942329]},n2090:{id:"n2090",loc:[-85.638228,41.943747]},n2091:{id:"n2091",loc:[-85.638163,41.943797]},n2092:{id:"n2092",loc:[-85.638089,41.943832]},n2093:{id:"n2093",loc:[-85.637969,41.943841]},n2094:{id:"n2094",loc:[-85.637841,41.943833]},n2095:{id:"n2095",loc:[-85.637342,41.943734]},n2096:{id:"n2096",loc:[-85.637232,41.943707]},n2097:{id:"n2097",loc:[-85.637163,41.943668]},n2098:{id:"n2098",loc:[-85.637118,41.943615]},n2099:{id:"n2099",loc:[-85.637078,41.943494]},n21:{id:"n21",loc:[-85.634126,41.942228]},n210:{id:"n210",loc:[-85.636354,41.94239]},n2100:{id:"n2100",loc:[-85.632903,41.998429],tags:{railway:"level_crossing"}},n2101:{id:"n2101",loc:[-85.633616,41.943581],tags:{railway:"level_crossing"}},n2102:{id:"n2102",loc:[-85.636943,41.947311]},n2103:{id:"n2103",loc:[-85.6376,41.94854]},n2104:{id:"n2104",loc:[-85.634565,41.93631]},n2105:{id:"n2105",loc:[-85.629597,41.942562]},n2106:{id:"n2106",loc:[-85.630821,41.943077]},n2107:{id:"n2107",loc:[-85.627473,41.940659]},n2108:{id:"n2108",loc:[-85.629708,41.942872]},n2109:{id:"n2109",loc:[-85.634093,41.935448]},n211:{id:"n211",loc:[-85.636393,41.94239]},n2110:{id:"n2110",loc:[-85.630413,41.94366]},n2111:{id:"n2111",loc:[-85.630488,41.942662]},n2112:{id:"n2112",loc:[-85.63361,41.936749]},n2113:{id:"n2113",loc:[-85.630038,41.941808]},n2114:{id:"n2114",loc:[-85.632016,41.942922]},n2115:{id:"n2115",loc:[-85.631525,41.944303]},n2116:{id:"n2116",loc:[-85.626862,41.94022]},n2117:{id:"n2117",loc:[-85.629673,41.94121]},n2118:{id:"n2118",loc:[-85.632752,41.943101]},n2119:{id:"n2119",loc:[-85.631147,41.943201]},n212:{id:"n212",loc:[-85.63444,41.943176]},n2120:{id:"n2120",loc:[-85.624974,41.940579]},n2121:{id:"n2121",loc:[-85.629518,41.941783]},n2122:{id:"n2122",loc:[-85.632349,41.942699]},n2123:{id:"n2123",loc:[-85.628418,41.940356]},n2124:{id:"n2124",loc:[-85.629147,41.94129]},n2125:{id:"n2125",loc:[-85.631111,41.943979]},n2126:{id:"n2126",loc:[-85.632087,41.940013]},n2127:{id:"n2127",loc:[-85.634469,41.935057]},n2128:{id:"n2128",loc:[-85.630097,41.943449]},n2129:{id:"n2129",loc:[-85.6331,41.937878]},n213:{id:"n213",loc:[-85.63375,41.942814]},n2130:{id:"n2130",loc:[-85.625274,41.941114]},n2131:{id:"n2131",loc:[-85.632632,41.941217]},n2132:{id:"n2132",loc:[-85.632739,41.941926]},n2133:{id:"n2133",loc:[-85.631647,41.94366]},n2134:{id:"n2134",loc:[-85.635059,41.935456]},n2135:{id:"n2135",loc:[-85.631259,41.944349]},n2136:{id:"n2136",loc:[-85.626336,41.940811]},n2137:{id:"n2137",loc:[-85.631507,41.943875]},n2138:{id:"n2138",loc:[-85.625081,41.940859]},n2139:{id:"n2139",loc:[-85.625778,41.940093]},n214:{id:"n214",loc:[-85.633674,41.942869]},n2140:{id:"n2140",loc:[-85.632641,41.942436]},n2141:{id:"n2141",loc:[-85.628825,41.941034]},n2142:{id:"n2142",loc:[-85.627913,41.940292]},n2143:{id:"n2143",loc:[-85.628943,41.940516]},n2144:{id:"n2144",loc:[-85.63139,41.943941]},n2145:{id:"n2145",loc:[-85.630081,41.94204]},n2146:{id:"n2146",loc:[-85.632194,41.93963]},n2147:{id:"n2147",loc:[-85.632913,41.93939]},n2148:{id:"n2148",loc:[-85.632001,41.943492]},n2149:{id:"n2149",loc:[-85.63149,41.943154]},n215:{id:"n215",loc:[-85.633542,41.942768]},n2150:{id:"n2150",loc:[-85.625167,41.940117]},n2151:{id:"n2151",loc:[-85.63287,41.939941]},n2152:{id:"n2152",loc:[-85.630789,41.943732]},n2153:{id:"n2153",loc:[-85.632173,41.940348]},n2154:{id:"n2154",loc:[-85.626587,41.940113]},n2155:{id:"n2155",loc:[-85.62684,41.940667]},n2156:{id:"n2156",loc:[-85.632527,41.938904]},n2157:{id:"n2157",loc:[-85.624866,41.94018]},n2158:{id:"n2158",loc:[-85.633267,41.93872]},n2159:{id:"n2159",loc:[-85.62934,41.940843]},n216:{id:"n216",loc:[-85.633618,41.942714]},n2160:{id:"n2160",loc:[-85.62272,41.953817]},n2161:{id:"n2161",loc:[-85.622555,41.954453]},n2162:{id:"n2162",loc:[-85.637225,41.944128]},n2163:{id:"n2163",loc:[-85.622628,41.953683]},n2164:{id:"n2164",loc:[-85.635441,41.943989]},n2165:{id:"n2165",loc:[-85.622629,41.953807]},n2166:{id:"n2166",loc:[-85.62262,41.953807]},n2167:{id:"n2167",loc:[-85.62262,41.953837]},n2168:{id:"n2168",loc:[-85.622532,41.953838]},n2169:{id:"n2169",loc:[-85.637469,41.944579]},n217:{id:"n217",loc:[-85.634001,41.942336]},n2170:{id:"n2170",loc:[-85.63688,41.943935]},n2171:{id:"n2171",loc:[-85.638263,41.946367]},n2172:{id:"n2172",loc:[-85.622532,41.953807]},n2173:{id:"n2173",loc:[-85.622353,41.953808]},n2174:{id:"n2174",loc:[-85.622352,41.953685]},n2175:{id:"n2175",loc:[-85.622464,41.953684]},n2176:{id:"n2176",loc:[-85.622464,41.953648]},n2177:{id:"n2177",loc:[-85.637136,41.94576]},n2178:{id:"n2178",loc:[-85.622521,41.953648]},n2179:{id:"n2179",loc:[-85.637129,41.945415]},n218:{id:"n218",loc:[-85.633825,41.942376]},n2180:{id:"n2180",loc:[-85.637473,41.94607]},n2181:{id:"n2181",loc:[-85.622521,41.953683]},n2182:{id:"n2182",loc:[-85.622717,41.954104]},n2183:{id:"n2183",loc:[-85.637769,41.946095]},n2184:{id:"n2184",loc:[-85.623872,41.953515]},n2185:{id:"n2185",loc:[-85.623851,41.953588]},n2186:{id:"n2186",loc:[-85.631385,41.94433]},n2187:{id:"n2187",loc:[-85.623608,41.953543]},n2188:{id:"n2188",loc:[-85.637308,41.944882]},n2189:{id:"n2189",loc:[-85.634898,41.944041]},n219:{id:"n219",loc:[-85.633807,41.942334]},n2190:{id:"n2190",loc:[-85.623604,41.953442]},n2191:{id:"n2191",loc:[-85.623705,41.953442]},n2192:{id:"n2192",loc:[-85.623708,41.953493]},n2193:{id:"n2193",loc:[-85.624064,41.952655]},n2194:{id:"n2194",loc:[-85.62395,41.952654]},n2195:{id:"n2195",loc:[-85.623951,41.952579]},n2196:{id:"n2196",loc:[-85.637435,41.944342]},n2197:{id:"n2197",loc:[-85.624064,41.952579]},n2198:{id:"n2198",loc:[-85.623812,41.952648]},n2199:{id:"n2199",loc:[-85.623813,41.952705]},n22:{id:"n22",loc:[-85.633531,41.942357]},n220:{id:"n220",loc:[-85.633983,41.942294]},n2200:{id:"n2200",loc:[-85.637169,41.945098]},n2201:{id:"n2201",loc:[-85.623552,41.952707]},n2202:{id:"n2202",loc:[-85.623551,41.95263]},n2203:{id:"n2203",loc:[-85.623701,41.952629]},n2204:{id:"n2204",loc:[-85.635894,41.943719]},n2205:{id:"n2205",loc:[-85.637297,41.945992]},n2206:{id:"n2206",loc:[-85.623724,41.952648]},n2207:{id:"n2207",loc:[-85.623812,41.952438]},n2208:{id:"n2208",loc:[-85.625239,41.952197]},n2209:{id:"n2209",loc:[-85.625232,41.952257]},n221:{id:"n221",loc:[-85.634182,41.942495]},n2210:{id:"n2210",loc:[-85.635175,41.94408]},n2211:{id:"n2211",loc:[-85.636381,41.943761]},n2212:{id:"n2212",loc:[-85.625115,41.952249]},n2213:{id:"n2213",loc:[-85.638578,41.946644]},n2214:{id:"n2214",loc:[-85.625122,41.952189]},n2215:{id:"n2215",loc:[-85.625085,41.952031]},n2216:{id:"n2216",loc:[-85.636126,41.943713]},n2217:{id:"n2217",loc:[-85.635005,41.944041]},n2218:{id:"n2218",loc:[-85.63714,41.945328]},n2219:{id:"n2219",loc:[-85.634871,41.943292]},n222:{id:"n222",loc:[-85.634149,41.942503]},n2220:{id:"n2220",loc:[-85.635705,41.943799]},n2221:{id:"n2221",loc:[-85.634995,41.943576]},n2222:{id:"n2222",loc:[-85.635026,41.943829]},n2223:{id:"n2223",loc:[-85.632874,41.941031]},n2224:{id:"n2224",loc:[-85.632531,41.940233]},n2225:{id:"n2225",loc:[-85.634247,41.936003]},n2226:{id:"n2226",loc:[-85.62929,41.941127]},n2227:{id:"n2227",loc:[-85.630428,41.943266]},n2228:{id:"n2228",loc:[-85.631608,41.943425]},n2229:{id:"n2229",loc:[-85.632316,41.943042]},n223:{id:"n223",loc:[-85.634098,41.942373]},n2230:{id:"n2230",loc:[-85.628711,41.940744]},n2231:{id:"n2231",loc:[-85.627831,41.940536]},n2232:{id:"n2232",loc:[-85.625514,41.94052]},n2233:{id:"n2233",loc:[-85.631127,41.943545]},n2234:{id:"n2234",loc:[-85.632909,41.942531]},n2235:{id:"n2235",loc:[-85.632917,41.938796]},n2236:{id:"n2236",loc:[-85.626716,41.94044]},n2237:{id:"n2237",loc:[-85.630122,41.942852]},n2238:{id:"n2238",loc:[-85.632509,41.939674]},n2239:{id:"n2239",loc:[-85.634762,41.935237]},n224:{id:"n224",loc:[-85.634131,41.942366]},n2240:{id:"n2240",loc:[-85.63384,41.937025]},n2241:{id:"n2241",loc:[-85.629741,41.941909]},n2242:{id:"n2242",loc:[-85.635254,41.945001],tags:{railway:"level_crossing"}},n2243:{id:"n2243",loc:[-85.634005,41.938168]},n2244:{id:"n2244",loc:[-85.63393,41.938335]},n2245:{id:"n2245",loc:[-85.633859,41.93846]},n2246:{id:"n2246",loc:[-85.633663,41.938776]},n2247:{id:"n2247",loc:[-85.633513,41.938936]},n2248:{id:"n2248",loc:[-85.635295,41.943225]},n2249:{id:"n2249",loc:[-85.635393,41.943293]},n225:{id:"n225",loc:[-85.635986,41.94177]},n2250:{id:"n2250",loc:[-85.635645,41.94332]},n2251:{id:"n2251",loc:[-85.63629,41.943328]},n2252:{id:"n2252",loc:[-85.636554,41.943372]},n2253:{id:"n2253",loc:[-85.636869,41.943526]},n2254:{id:"n2254",loc:[-85.637099,41.943704]},n2255:{id:"n2255",loc:[-85.637268,41.943773]},n2256:{id:"n2256",loc:[-85.637483,41.943821]},n2257:{id:"n2257",loc:[-85.637616,41.943929]},n2258:{id:"n2258",loc:[-85.637752,41.944114]},n2259:{id:"n2259",loc:[-85.638399,41.944308]},n226:{id:"n226",loc:[-85.635982,41.941523]},n2260:{id:"n2260",loc:[-85.638573,41.944451]},n2261:{id:"n2261",loc:[-85.638702,41.944574]},n2262:{id:"n2262",loc:[-85.638718,41.944652]},n2263:{id:"n2263",loc:[-85.638715,41.944809]},n2264:{id:"n2264",loc:[-85.638766,41.944988]},n2265:{id:"n2265",loc:[-85.638773,41.945136]},n2266:{id:"n2266",loc:[-85.638705,41.945251]},n2267:{id:"n2267",loc:[-85.638335,41.944291]},n2268:{id:"n2268",loc:[-85.638474,41.944352]},n2269:{id:"n2269",loc:[-85.635408,41.943429]},n227:{id:"n227",loc:[-85.636108,41.941521]},n2270:{id:"n2270",loc:[-85.635271,41.943654]},n2271:{id:"n2271",loc:[-85.635266,41.943744]},n2272:{id:"n2272",loc:[-85.635271,41.943819]},n2273:{id:"n2273",loc:[-85.635192,41.943876]},n2274:{id:"n2274",loc:[-85.635129,41.943857]},n2275:{id:"n2275",loc:[-85.635122,41.943764]},n2276:{id:"n2276",loc:[-85.635124,41.943664]},n2277:{id:"n2277",loc:[-85.63515,41.943611]},n2278:{id:"n2278",loc:[-85.635106,41.943534]},n2279:{id:"n2279",loc:[-85.634972,41.943197]},n228:{id:"n228",loc:[-85.636109,41.941559]},n2280:{id:"n2280",loc:[-85.633978,41.938227]},n2281:{id:"n2281",loc:[-85.634216,41.943255]},n2282:{id:"n2282",loc:[-85.634434,41.943622]},n2283:{id:"n2283",loc:[-85.632406,41.940854]},n2284:{id:"n2284",loc:[-85.632488,41.941063],tags:{leisure:"slipway"}},n2285:{id:"n2285",loc:[-85.632726,41.941537]},n2286:{id:"n2286",loc:[-85.632639,41.94136]},n2287:{id:"n2287",loc:[-85.632704,41.941439]},n2288:{id:"n2288",loc:[-85.632289,41.940601]},n2289:{id:"n2289",loc:[-85.632541,41.942526]},n229:{id:"n229",loc:[-85.636145,41.941559]},n2290:{id:"n2290",loc:[-85.634058,41.943173]},n2291:{id:"n2291",loc:[-85.636175,41.945974]},n2292:{id:"n2292",loc:[-85.636528,41.945975]},n2293:{id:"n2293",loc:[-85.637092,41.945893]},n2294:{id:"n2294",loc:[-85.637881,41.945647]},n2295:{id:"n2295",loc:[-85.639329,41.945162]},n2296:{id:"n2296",loc:[-85.639323,41.945026]},n2297:{id:"n2297",loc:[-85.638826,41.945032]},n2298:{id:"n2298",loc:[-85.638817,41.944174]},n2299:{id:"n2299",loc:[-85.638291,41.94418]},n23:{id:"n23",loc:[-85.633504,41.942418]},n230:{id:"n230",loc:[-85.636145,41.941551]},n2300:{id:"n2300",loc:[-85.63828,41.943811]},n2301:{id:"n2301",loc:[-85.638195,41.943601]},n2302:{id:"n2302",loc:[-85.63719,41.943592]},n2303:{id:"n2303",loc:[-85.636697,41.943273]},n2304:{id:"n2304",loc:[-85.635375,41.943274]},n2305:{id:"n2305",loc:[-85.635091,41.943547]},n2306:{id:"n2306",loc:[-85.63442,41.944117]},n2307:{id:"n2307",loc:[-85.635117,41.943717]},n2308:{id:"n2308",loc:[-85.635601,41.945177]},n2309:{id:"n2309",loc:[-85.635819,41.945494]},n231:{id:"n231",loc:[-85.636312,41.941549]},n2310:{id:"n2310",loc:[-85.635303,41.944891]},n2311:{id:"n2311",loc:[-85.637674,41.943802]},n2312:{id:"n2312",loc:[-85.638263,41.944272]},n2313:{id:"n2313",loc:[-85.634267,41.935266]},n2314:{id:"n2314",loc:[-85.639788,41.945152]},n2315:{id:"n2315",loc:[-85.639645,41.945167]},n2316:{id:"n2316",loc:[-85.639362,41.945233]},n2317:{id:"n2317",loc:[-85.638616,41.945163]},n2318:{id:"n2318",loc:[-85.638514,41.944936]},n2319:{id:"n2319",loc:[-85.638578,41.94503]},n232:{id:"n232",loc:[-85.636314,41.941649]},n2320:{id:"n2320",loc:[-85.638578,41.945215]},n2321:{id:"n2321",loc:[-85.640495,41.947015]},n2322:{id:"n2322",loc:[-85.639577,41.946495]},n2323:{id:"n2323",loc:[-85.638935,41.946087]},n2324:{id:"n2324",loc:[-85.637535,41.94584]},n2325:{id:"n2325",loc:[-85.638357,41.945404]},n2326:{id:"n2326",loc:[-85.638051,41.94553]},n2327:{id:"n2327",loc:[-85.637732,41.945555]},n2328:{id:"n2328",loc:[-85.637657,41.945524]},n2329:{id:"n2329",loc:[-85.637598,41.945467]},n233:{id:"n233",loc:[-85.636152,41.94165]},n2330:{id:"n2330",loc:[-85.637669,41.945318]},n2331:{id:"n2331",loc:[-85.637894,41.945171]},n2332:{id:"n2332",loc:[-85.637923,41.945082]},n2333:{id:"n2333",loc:[-85.63793,41.944756]},n2334:{id:"n2334",loc:[-85.637976,41.944696]},n2335:{id:"n2335",loc:[-85.638044,41.944671]},n2336:{id:"n2336",loc:[-85.638129,41.944597]},n2337:{id:"n2337",loc:[-85.638252,41.944413]},n2338:{id:"n2338",loc:[-85.638092,41.945442]},n2339:{id:"n2339",loc:[-85.638409,41.945315]},n234:{id:"n234",loc:[-85.636152,41.941628]},n2340:{id:"n2340",loc:[-85.638325,41.944771]},n2341:{id:"n2341",loc:[-85.638103,41.944744]},n2342:{id:"n2342",loc:[-85.637976,41.944781]},n2343:{id:"n2343",loc:[-85.637983,41.944865]},n2344:{id:"n2344",loc:[-85.638063,41.945074]},n2345:{id:"n2345",loc:[-85.638041,41.945206]},n2346:{id:"n2346",loc:[-85.637907,41.945309]},n2347:{id:"n2347",loc:[-85.637925,41.94539]},n2348:{id:"n2348",loc:[-85.637998,41.94545]},n2349:{id:"n2349",loc:[-85.637135,41.946254]},n235:{id:"n235",loc:[-85.63611,41.941628]},n2350:{id:"n2350",loc:[-85.636837,41.946615]},n2351:{id:"n2351",loc:[-85.637954,41.948909]},n2352:{id:"n2352",loc:[-85.638382,41.949786]},n2353:{id:"n2353",loc:[-85.639367,41.951242]},n2354:{id:"n2354",loc:[-85.640554,41.951777]},n2355:{id:"n2355",loc:[-85.6411,41.952234]},n2356:{id:"n2356",loc:[-85.641742,41.952657]},n2357:{id:"n2357",loc:[-85.642321,41.952941]},n2358:{id:"n2358",loc:[-85.64277,41.953228]},n2359:{id:"n2359",loc:[-85.643333,41.953825]},n236:{id:"n236",loc:[-85.636113,41.941768]},n2360:{id:"n2360",loc:[-85.643579,41.954365]},n2361:{id:"n2361",loc:[-85.644439,41.954105]},n2362:{id:"n2362",loc:[-85.64506,41.954]},n2363:{id:"n2363",loc:[-85.645483,41.953911]},n2364:{id:"n2364",loc:[-85.646046,41.953853]},n2365:{id:"n2365",loc:[-85.646318,41.953717]},n2366:{id:"n2366",loc:[-85.646276,41.953414]},n2367:{id:"n2367",loc:[-85.631063,41.957478],tags:{emergency:"fire_hydrant"}},n2368:{id:"n2368",loc:[-85.630996,41.955857],tags:{emergency:"fire_hydrant"}},n2369:{id:"n2369",loc:[-85.630976,41.954608],tags:{emergency:"fire_hydrant"}},n237:{id:"n237",loc:[-85.635983,41.941589],tags:{entrance:"yes"}},n2370:{id:"n2370",loc:[-85.646,41.953154]},n2371:{id:"n2371",loc:[-85.645222,41.953193]},n2372:{id:"n2372",loc:[-85.644732,41.953181]},n2373:{id:"n2373",loc:[-85.644064,41.953298]},n2374:{id:"n2374",loc:[-85.643818,41.953177]},n2375:{id:"n2375",loc:[-85.644001,41.95284]},n2376:{id:"n2376",loc:[-85.628174,41.95456],tags:{emergency:"fire_hydrant"}},n2377:{id:"n2377",loc:[-85.644267,41.952591]},n2378:{id:"n2378",loc:[-85.644288,41.952328]},n2379:{id:"n2379",loc:[-85.627276,41.953987],tags:{emergency:"fire_hydrant"}},n238:{id:"n238",loc:[-85.635906,41.94159]},n2380:{id:"n2380",loc:[-85.644262,41.952153]},n2381:{id:"n2381",loc:[-85.644168,41.95204]},n2382:{id:"n2382",loc:[-85.64421,41.951749]},n2383:{id:"n2383",loc:[-85.64385,41.951586]},n2384:{id:"n2384",loc:[-85.62736,41.955964],tags:{emergency:"fire_hydrant"}},n2385:{id:"n2385",loc:[-85.626307,41.957198],tags:{emergency:"fire_hydrant"}},n2386:{id:"n2386",loc:[-85.643589,41.951323]},n2387:{id:"n2387",loc:[-85.62747,41.957509],tags:{emergency:"fire_hydrant"}},n2388:{id:"n2388",loc:[-85.628665,41.957492],tags:{emergency:"fire_hydrant"}},n2389:{id:"n2389",loc:[-85.642535,41.951031]},n239:{id:"n239",loc:[-85.635883,41.940182]},n2390:{id:"n2390",loc:[-85.642269,41.95088]},n2391:{id:"n2391",loc:[-85.641878,41.950814]},n2392:{id:"n2392",loc:[-85.641549,41.950806]},n2393:{id:"n2393",loc:[-85.641103,41.950549]},n2394:{id:"n2394",loc:[-85.630864,41.959046],tags:{emergency:"fire_hydrant"}},n2395:{id:"n2395",loc:[-85.632249,41.958969],tags:{emergency:"fire_hydrant"}},n2396:{id:"n2396",loc:[-85.641037,41.949821]},n2397:{id:"n2397",loc:[-85.641006,41.949433]},n2398:{id:"n2398",loc:[-85.632232,41.95859],tags:{emergency:"fire_hydrant"}},n2399:{id:"n2399",loc:[-85.632071,41.958345],tags:{emergency:"fire_hydrant"}},n24:{id:"n24",loc:[-85.634346,41.942792]},n240:{id:"n240",loc:[-85.635916,41.94264]},n2400:{id:"n2400",loc:[-85.632228,41.9573],tags:{emergency:"fire_hydrant"}},n2401:{id:"n2401",loc:[-85.641152,41.948257]},n2402:{id:"n2402",loc:[-85.641055,41.947304]},n2403:{id:"n2403",loc:[-85.638022,41.945897]},n2404:{id:"n2404",loc:[-85.638672,41.950778]},n2405:{id:"n2405",loc:[-85.63666,41.944492],tags:{name:"Memory Isle",place:"island"}},n2406:{id:"n2406",loc:[-85.635,41.946389],tags:{amenity:"post_office",name:"Three Rivers Post Office"}},n2407:{id:"n2407",loc:[-85.633676,41.946036]},n2408:{id:"n2408",loc:[-85.633736,41.946078]},n2409:{id:"n2409",loc:[-85.633997,41.946185]},n241:{id:"n241",loc:[-85.635795,41.941906]},n2410:{id:"n2410",loc:[-85.634448,41.945626],tags:{highway:"traffic_signals",traffic_signals:"signal"}},n2411:{id:"n2411",loc:[-85.63456,41.945731],tags:{crossing:"zebra",highway:"crossing"}},n2412:{id:"n2412",loc:[-85.634592,41.94578]},n2413:{id:"n2413",loc:[-85.634607,41.945815]},n2414:{id:"n2414",loc:[-85.634614,41.945864]},n2415:{id:"n2415",loc:[-85.636066,41.946185]},n2416:{id:"n2416",loc:[-85.636128,41.946352]},n2417:{id:"n2417",loc:[-85.636142,41.946452]},n2418:{id:"n2418",loc:[-85.635327,41.945292]},n2419:{id:"n2419",loc:[-85.635648,41.94558]},n242:{id:"n242",loc:[-85.635909,41.941906]},n2420:{id:"n2420",loc:[-85.635769,41.945729]},n2421:{id:"n2421",loc:[-85.637349,41.945897]},n2422:{id:"n2422",loc:[-85.632211,41.95596],tags:{emergency:"fire_hydrant"}},n2423:{id:"n2423",loc:[-85.635942,41.94598]},n2424:{id:"n2424",loc:[-85.636443,41.946042]},n2425:{id:"n2425",loc:[-85.635819,41.946052]},n2426:{id:"n2426",loc:[-85.636669,41.946025]},n2427:{id:"n2427",loc:[-85.636832,41.946005]},n2428:{id:"n2428",loc:[-85.637039,41.945968]},n2429:{id:"n2429",loc:[-85.636291,41.946046]},n243:{id:"n243",loc:[-85.636359,41.941904]},n2430:{id:"n2430",loc:[-85.634005,41.943367]},n2431:{id:"n2431",loc:[-85.633366,41.943724]},n2432:{id:"n2432",loc:[-85.634617,41.946057]},n2433:{id:"n2433",loc:[-85.636534,41.944793]},n2434:{id:"n2434",loc:[-85.637055,41.945188]},n2435:{id:"n2435",loc:[-85.636153,41.944618]},n2436:{id:"n2436",loc:[-85.636803,41.944944]},n2437:{id:"n2437",loc:[-85.633389,41.945735]},n2438:{id:"n2438",loc:[-85.633536,41.94585]},n2439:{id:"n2439",loc:[-85.63363,41.945993]},n244:{id:"n244",loc:[-85.636351,41.941438]},n2440:{id:"n2440",loc:[-85.633268,41.94568]},n2441:{id:"n2441",loc:[-85.635947,41.94546]},n2442:{id:"n2442",loc:[-85.636277,41.945268]},n2443:{id:"n2443",loc:[-85.635203,41.944287]},n2444:{id:"n2444",loc:[-85.634876,41.944477]},n2445:{id:"n2445",loc:[-85.634975,41.944419]},n2446:{id:"n2446",loc:[-85.633877,41.943438]},n2447:{id:"n2447",loc:[-85.63508,41.945113]},n2448:{id:"n2448",loc:[-85.635372,41.944932]},n2449:{id:"n2449",loc:[-85.636594,41.945935]},n245:{id:"n245",loc:[-85.635903,41.941436]},n2450:{id:"n2450",loc:[-85.636901,41.945747]},n2451:{id:"n2451",loc:[-85.636329,41.945228]},n2452:{id:"n2452",loc:[-85.636025,41.945417]},n2453:{id:"n2453",loc:[-85.634002,41.944644]},n2454:{id:"n2454",loc:[-85.63407,41.944692]},n2455:{id:"n2455",loc:[-85.634114,41.944756]},n2456:{id:"n2456",loc:[-85.633762,41.944809]},n2457:{id:"n2457",loc:[-85.634184,41.944807]},n2458:{id:"n2458",loc:[-85.634291,41.944819]},n2459:{id:"n2459",loc:[-85.634639,41.944845]},n246:{id:"n246",loc:[-85.635788,41.941436]},n2460:{id:"n2460",loc:[-85.633822,41.944861]},n2461:{id:"n2461",loc:[-85.63411,41.944855]},n2462:{id:"n2462",loc:[-85.63435,41.944872]},n2463:{id:"n2463",loc:[-85.63441,41.944903]},n2464:{id:"n2464",loc:[-85.633883,41.944913]},n2465:{id:"n2465",loc:[-85.634164,41.944896]},n2466:{id:"n2466",loc:[-85.633487,41.944926]},n2467:{id:"n2467",loc:[-85.634736,41.944929]},n2468:{id:"n2468",loc:[-85.633944,41.944965]},n2469:{id:"n2469",loc:[-85.633555,41.944983]},n247:{id:"n247",loc:[-85.635929,41.941511]},n2470:{id:"n2470",loc:[-85.633995,41.945013]},n2471:{id:"n2471",loc:[-85.633614,41.945037]},n2472:{id:"n2472",loc:[-85.634848,41.945031]},n2473:{id:"n2473",loc:[-85.634049,41.945061]},n2474:{id:"n2474",loc:[-85.633678,41.945094]},n2475:{id:"n2475",loc:[-85.63317,41.945111]},n2476:{id:"n2476",loc:[-85.633357,41.945103]},n2477:{id:"n2477",loc:[-85.633728,41.945136]},n2478:{id:"n2478",loc:[-85.634146,41.945148]},n2479:{id:"n2479",loc:[-85.633416,41.945157]},n248:{id:"n248",loc:[-85.635929,41.941317]},n2480:{id:"n2480",loc:[-85.634625,41.945172]},n2481:{id:"n2481",loc:[-85.633239,41.945174]},n2482:{id:"n2482",loc:[-85.63469,41.945185]},n2483:{id:"n2483",loc:[-85.634661,41.945203]},n2484:{id:"n2484",loc:[-85.63348,41.945214]},n2485:{id:"n2485",loc:[-85.633578,41.945221]},n2486:{id:"n2486",loc:[-85.634742,41.945231]},n2487:{id:"n2487",loc:[-85.634251,41.94525]},n2488:{id:"n2488",loc:[-85.633524,41.945254]},n2489:{id:"n2489",loc:[-85.63468,41.945271]},n249:{id:"n249",loc:[-85.636414,41.941316]},n2490:{id:"n2490",loc:[-85.633885,41.945272]},n2491:{id:"n2491",loc:[-85.634795,41.945288]},n2492:{id:"n2492",loc:[-85.634742,41.94532]},n2493:{id:"n2493",loc:[-85.633946,41.945327]},n2494:{id:"n2494",loc:[-85.634844,41.945331]},n2495:{id:"n2495",loc:[-85.63435,41.945349]},n2496:{id:"n2496",loc:[-85.633733,41.945357]},n2497:{id:"n2497",loc:[-85.633987,41.945375]},n2498:{id:"n2498",loc:[-85.634911,41.945419]},n2499:{id:"n2499",loc:[-85.634049,41.945431]},n25:{id:"n25",loc:[-85.634333,41.942809]},n250:{id:"n250",loc:[-85.636414,41.941511]},n2500:{id:"n2500",loc:[-85.633705,41.945461]},n2501:{id:"n2501",loc:[-85.633642,41.945408]},n2502:{id:"n2502",loc:[-85.634493,41.945475]},n2503:{id:"n2503",loc:[-85.634106,41.945484]},n2504:{id:"n2504",loc:[-85.635008,41.945505]},n2505:{id:"n2505",loc:[-85.633757,41.945506]},n2506:{id:"n2506",loc:[-85.634542,41.945519]},n2507:{id:"n2507",loc:[-85.634162,41.945536]},n2508:{id:"n2508",loc:[-85.633843,41.945547]},n2509:{id:"n2509",loc:[-85.634919,41.94556]},n251:{id:"n251",loc:[-85.636819,41.941617]},n2510:{id:"n2510",loc:[-85.633818,41.945561]},n2511:{id:"n2511",loc:[-85.634638,41.94559]},n2512:{id:"n2512",loc:[-85.633901,41.945598]},n2513:{id:"n2513",loc:[-85.634257,41.945626]},n2514:{id:"n2514",loc:[-85.633967,41.945652]},n2515:{id:"n2515",loc:[-85.634735,41.945676]},n2516:{id:"n2516",loc:[-85.635057,41.945683]},n2517:{id:"n2517",loc:[-85.635296,41.945703]},n2518:{id:"n2518",loc:[-85.635112,41.945703]},n2519:{id:"n2519",loc:[-85.634782,41.945729]},n252:{id:"n252",loc:[-85.636718,41.941619]},n2520:{id:"n2520",loc:[-85.634052,41.945747]},n2521:{id:"n2521",loc:[-85.635296,41.945757]},n2522:{id:"n2522",loc:[-85.635314,41.945757]},n2523:{id:"n2523",loc:[-85.635112,41.945761]},n2524:{id:"n2524",loc:[-85.63484,41.945778]},n2525:{id:"n2525",loc:[-85.635314,41.945938]},n2526:{id:"n2526",loc:[-85.63484,41.945922]},n2527:{id:"n2527",loc:[-85.635461,41.944879]},n2528:{id:"n2528",loc:[-85.636024,41.945384]},n2529:{id:"n2529",loc:[-85.636145,41.945312]},n253:{id:"n253",loc:[-85.636716,41.941509]},n2530:{id:"n2530",loc:[-85.6356,41.944797]},n2531:{id:"n2531",loc:[-85.635135,41.944354]},n2532:{id:"n2532",loc:[-85.632988,41.945369]},n2533:{id:"n2533",loc:[-85.633376,41.94563]},n2534:{id:"n2534",loc:[-85.633539,41.945534]},n2535:{id:"n2535",loc:[-85.633238,41.945248]},n2536:{id:"n2536",loc:[-85.633166,41.945216]},n2537:{id:"n2537",loc:[-85.633114,41.945188]},n2538:{id:"n2538",loc:[-85.633078,41.945127]},n2539:{id:"n2539",loc:[-85.633066,41.94508]},n254:{id:"n254",loc:[-85.636732,41.941509]},n2540:{id:"n2540",loc:[-85.633222,41.945358]},n2541:{id:"n2541",loc:[-85.633425,41.945541]},n2542:{id:"n2542",loc:[-85.63299,41.9455]},n2543:{id:"n2543",loc:[-85.634374,41.944327]},n2544:{id:"n2544",loc:[-85.633648,41.943697]},n2545:{id:"n2545",loc:[-85.633533,41.943764]},n2546:{id:"n2546",loc:[-85.634239,41.944417]},n2547:{id:"n2547",loc:[-85.634122,41.944395]},n2548:{id:"n2548",loc:[-85.634235,41.944326]},n2549:{id:"n2549",loc:[-85.633613,41.943787]},n255:{id:"n255",loc:[-85.636731,41.941461]},n2550:{id:"n2550",loc:[-85.633915,41.943613]},n2551:{id:"n2551",loc:[-85.634015,41.943555]},n2552:{id:"n2552",loc:[-85.63433,41.943839]},n2553:{id:"n2553",loc:[-85.634236,41.943894]},n2554:{id:"n2554",loc:[-85.635413,41.946052]},n2555:{id:"n2555",loc:[-85.635405,41.94569]},n2556:{id:"n2556",loc:[-85.635684,41.945925]},n2557:{id:"n2557",loc:[-85.635614,41.945742]},n2558:{id:"n2558",loc:[-85.635401,41.945745]},n2559:{id:"n2559",loc:[-85.635406,41.945928]},n256:{id:"n256",loc:[-85.636799,41.941461]},n2560:{id:"n2560",loc:[-85.633478,41.943663]},n2561:{id:"n2561",loc:[-85.633291,41.943526]},n2562:{id:"n2562",loc:[-85.633094,41.943541]},n2563:{id:"n2563",loc:[-85.633302,41.943492]},n2564:{id:"n2564",loc:[-85.633047,41.943623]},n2565:{id:"n2565",loc:[-85.633275,41.943562]},n2566:{id:"n2566",loc:[-85.633351,41.943518]},n2567:{id:"n2567",loc:[-85.633224,41.9434]},n2568:{id:"n2568",loc:[-85.633235,41.943369]},n2569:{id:"n2569",loc:[-85.635179,41.943911]},n257:{id:"n257",loc:[-85.6368,41.9415]},n2570:{id:"n2570",loc:[-85.635146,41.943918]},n2571:{id:"n2571",loc:[-85.634888,41.943905]},n2572:{id:"n2572",loc:[-85.634832,41.943911]},n2573:{id:"n2573",loc:[-85.634638,41.944007]},n2574:{id:"n2574",loc:[-85.634568,41.94405]},n2575:{id:"n2575",loc:[-85.635994,41.94501]},n2576:{id:"n2576",loc:[-85.636388,41.944608]},n2577:{id:"n2577",loc:[-85.636215,41.944787]},n2578:{id:"n2578",loc:[-85.637948,41.944587]},n2579:{id:"n2579",loc:[-85.637849,41.944567]},n258:{id:"n258",loc:[-85.636814,41.9415]},n2580:{id:"n2580",loc:[-85.637895,41.944455]},n2581:{id:"n2581",loc:[-85.637996,41.944477]},n2582:{id:"n2582",loc:[-85.635525,41.94337]},n2583:{id:"n2583",loc:[-85.637847,41.943923]},n2584:{id:"n2584",loc:[-85.637891,41.944124]},n2585:{id:"n2585",loc:[-85.638167,41.944229]},n2586:{id:"n2586",loc:[-85.638236,41.944097]},n2587:{id:"n2587",loc:[-85.638207,41.944025]},n2588:{id:"n2588",loc:[-85.638141,41.943997]},n2589:{id:"n2589",loc:[-85.638057,41.944015]},n259:{id:"n259",loc:[-85.636815,41.941538]},n2590:{id:"n2590",loc:[-85.637902,41.944231]},n2591:{id:"n2591",loc:[-85.638134,41.944307]},n2592:{id:"n2592",loc:[-85.638242,41.944294]},n2593:{id:"n2593",loc:[-85.638274,41.944222]},n2594:{id:"n2594",loc:[-85.638236,41.944174]},n2595:{id:"n2595",loc:[-85.638207,41.944157]},n2596:{id:"n2596",loc:[-85.637818,41.943984]},n2597:{id:"n2597",loc:[-85.634996,41.944439]},n2598:{id:"n2598",loc:[-85.633946,41.945804]},n2599:{id:"n2599",loc:[-85.634102,41.945864]},n26:{id:"n26",loc:[-85.634346,41.942744]},n260:{id:"n260",loc:[-85.636827,41.941538]},n2600:{id:"n2600",loc:[-85.633819,41.945756]},n2601:{id:"n2601",loc:[-85.634025,41.945975]},n2602:{id:"n2602",loc:[-85.633742,41.945867]},n2603:{id:"n2603",loc:[-85.63373,41.946004]},n2604:{id:"n2604",loc:[-85.633947,41.946081]},n2605:{id:"n2605",loc:[-85.633872,41.945917]},n2606:{id:"n2606",loc:[-85.633825,41.945985]},n2607:{id:"n2607",loc:[-85.633762,41.94596]},n2608:{id:"n2608",loc:[-85.634224,41.946037]},n2609:{id:"n2609",loc:[-85.634357,41.945851]},n261:{id:"n261",loc:[-85.636828,41.941584]},n2610:{id:"n2610",loc:[-85.634398,41.945813]},n2611:{id:"n2611",loc:[-85.634461,41.945812]},n2612:{id:"n2612",loc:[-85.634501,41.945852]},n2613:{id:"n2613",loc:[-85.634503,41.94597]},n2614:{id:"n2614",loc:[-85.634462,41.945971]},n2615:{id:"n2615",loc:[-85.634465,41.946036]},n2616:{id:"n2616",loc:[-85.634235,41.946072]},n2617:{id:"n2617",loc:[-85.634447,41.946036]},n2618:{id:"n2618",loc:[-85.634448,41.946052]},n2619:{id:"n2619",loc:[-85.634494,41.946051]},n262:{id:"n262",loc:[-85.636819,41.941585]},n2620:{id:"n2620",loc:[-85.634497,41.946144]},n2621:{id:"n2621",loc:[-85.634453,41.946144]},n2622:{id:"n2622",loc:[-85.634454,41.94616]},n2623:{id:"n2623",loc:[-85.634393,41.946161]},n2624:{id:"n2624",loc:[-85.634394,41.94618]},n2625:{id:"n2625",loc:[-85.634345,41.94618]},n2626:{id:"n2626",loc:[-85.634344,41.946162]},n2627:{id:"n2627",loc:[-85.63427,41.946163]},n2628:{id:"n2628",loc:[-85.634266,41.946071]},n2629:{id:"n2629",loc:[-85.634148,41.946163]},n263:{id:"n263",loc:[-85.636854,41.941714]},n2630:{id:"n2630",loc:[-85.634213,41.946072]},n2631:{id:"n2631",loc:[-85.633293,41.946309]},n2632:{id:"n2632",loc:[-85.633122,41.946239]},n2633:{id:"n2633",loc:[-85.633295,41.946005]},n2634:{id:"n2634",loc:[-85.633395,41.946047]},n2635:{id:"n2635",loc:[-85.633404,41.946035]},n2636:{id:"n2636",loc:[-85.633459,41.946057]},n2637:{id:"n2637",loc:[-85.633387,41.946154]},n2638:{id:"n2638",loc:[-85.633403,41.946161]},n2639:{id:"n2639",loc:[-85.634176,41.946415]},n264:{id:"n264",loc:[-85.636855,41.941774]},n2640:{id:"n2640",loc:[-85.634179,41.946339]},n2641:{id:"n2641",loc:[-85.634455,41.946345]},n2642:{id:"n2642",loc:[-85.634452,41.946422]},n2643:{id:"n2643",loc:[-85.63437,41.946421]},n2644:{id:"n2644",loc:[-85.634367,41.946497]},n2645:{id:"n2645",loc:[-85.634289,41.946495]},n2646:{id:"n2646",loc:[-85.634291,41.946448]},n2647:{id:"n2647",loc:[-85.634269,41.946448]},n2648:{id:"n2648",loc:[-85.63427,41.946417]},n2649:{id:"n2649",loc:[-85.63484,41.946328]},n265:{id:"n265",loc:[-85.636822,41.941774]},n2650:{id:"n2650",loc:[-85.634839,41.946187]},n2651:{id:"n2651",loc:[-85.635148,41.946186]},n2652:{id:"n2652",loc:[-85.635148,41.946216]},n2653:{id:"n2653",loc:[-85.63521,41.946216]},n2654:{id:"n2654",loc:[-85.63521,41.946348]},n2655:{id:"n2655",loc:[-85.635154,41.946348]},n2656:{id:"n2656",loc:[-85.635153,41.946327]},n2657:{id:"n2657",loc:[-85.634037,41.946957]},n2658:{id:"n2658",loc:[-85.634253,41.946953]},n2659:{id:"n2659",loc:[-85.63481,41.946543]},n266:{id:"n266",loc:[-85.636822,41.941778]},n2660:{id:"n2660",loc:[-85.634809,41.946459]},n2661:{id:"n2661",loc:[-85.635154,41.946458]},n2662:{id:"n2662",loc:[-85.635155,41.946554]},n2663:{id:"n2663",loc:[-85.635022,41.946547]},n2664:{id:"n2664",loc:[-85.635022,41.946573]},n2665:{id:"n2665",loc:[-85.634909,41.946574]},n2666:{id:"n2666",loc:[-85.634909,41.946561]},n2667:{id:"n2667",loc:[-85.634896,41.947159]},n2668:{id:"n2668",loc:[-85.634894,41.947032]},n2669:{id:"n2669",loc:[-85.635024,41.947031]},n267:{id:"n267",loc:[-85.636756,41.941779]},n2670:{id:"n2670",loc:[-85.635026,41.947158]},n2671:{id:"n2671",loc:[-85.635233,41.947105]},n2672:{id:"n2672",loc:[-85.635236,41.946991]},n2673:{id:"n2673",loc:[-85.635369,41.946993]},n2674:{id:"n2674",loc:[-85.635366,41.947107]},n2675:{id:"n2675",loc:[-85.634824,41.946929]},n2676:{id:"n2676",loc:[-85.634825,41.946818]},n2677:{id:"n2677",loc:[-85.63512,41.946819]},n2678:{id:"n2678",loc:[-85.635119,41.94693]},n2679:{id:"n2679",loc:[-85.634796,41.946806]},n268:{id:"n268",loc:[-85.636756,41.941774]},n2680:{id:"n2680",loc:[-85.634792,41.946604]},n2681:{id:"n2681",loc:[-85.634948,41.946602]},n2682:{id:"n2682",loc:[-85.634949,41.946645]},n2683:{id:"n2683",loc:[-85.634975,41.946644]},n2684:{id:"n2684",loc:[-85.634974,41.946599]},n2685:{id:"n2685",loc:[-85.635117,41.946598]},n2686:{id:"n2686",loc:[-85.635122,41.946801]},n2687:{id:"n2687",loc:[-85.634981,41.946803]},n2688:{id:"n2688",loc:[-85.634979,41.946752]},n2689:{id:"n2689",loc:[-85.634952,41.946752]},n269:{id:"n269",loc:[-85.636721,41.941774]},n2690:{id:"n2690",loc:[-85.634953,41.946804]},n2691:{id:"n2691",loc:[-85.634649,41.946841]},n2692:{id:"n2692",loc:[-85.634331,41.94684]},n2693:{id:"n2693",loc:[-85.634183,41.946809]},n2694:{id:"n2694",loc:[-85.633699,41.946607]},n2695:{id:"n2695",loc:[-85.634487,41.946664]},n2696:{id:"n2696",loc:[-85.634486,41.946598]},n2697:{id:"n2697",loc:[-85.63423,41.946599]},n2698:{id:"n2698",loc:[-85.634231,41.946662]},n2699:{id:"n2699",loc:[-85.634284,41.946662]},n27:{id:"n27",loc:[-85.634136,41.943183]},n270:{id:"n270",loc:[-85.63672,41.941714]},n2700:{id:"n2700",loc:[-85.634284,41.946679]},n2701:{id:"n2701",loc:[-85.634365,41.946679]},n2702:{id:"n2702",loc:[-85.634365,41.946664]},n2703:{id:"n2703",loc:[-85.635443,41.947015]},n2704:{id:"n2704",loc:[-85.635442,41.946801]},n2705:{id:"n2705",loc:[-85.63603,41.9468]},n2706:{id:"n2706",loc:[-85.636028,41.947016]},n2707:{id:"n2707",loc:[-85.635457,41.946582]},n2708:{id:"n2708",loc:[-85.635455,41.946211]},n2709:{id:"n2709",loc:[-85.635636,41.946579]},n271:{id:"n271",loc:[-85.636767,41.941713]},n2710:{id:"n2710",loc:[-85.635716,41.9468]},n2711:{id:"n2711",loc:[-85.635969,41.9468]},n2712:{id:"n2712",loc:[-85.635973,41.946295]},n2713:{id:"n2713",loc:[-85.636019,41.946484]},n2714:{id:"n2714",loc:[-85.636022,41.946388]},n2715:{id:"n2715",loc:[-85.635961,41.946493]},n2716:{id:"n2716",loc:[-85.635713,41.94621]},n2717:{id:"n2717",loc:[-85.635416,41.946142]},n2718:{id:"n2718",loc:[-85.635759,41.946203]},n2719:{id:"n2719",loc:[-85.636153,41.946747]},n272:{id:"n272",loc:[-85.636767,41.941706]},n2720:{id:"n2720",loc:[-85.635417,41.946915]},n2721:{id:"n2721",loc:[-85.636154,41.946915]},n2722:{id:"n2722",loc:[-85.635866,41.946473]},n2723:{id:"n2723",loc:[-85.635717,41.946633]},n2724:{id:"n2724",loc:[-85.635556,41.946166]},n2725:{id:"n2725",loc:[-85.63556,41.946556]},n2726:{id:"n2726",loc:[-85.635731,41.946594]},n2727:{id:"n2727",loc:[-85.635866,41.946595]},n2728:{id:"n2728",loc:[-85.635456,41.947028]},n2729:{id:"n2729",loc:[-85.635796,41.947023]},n273:{id:"n273",loc:[-85.636779,41.941698]},n2730:{id:"n2730",loc:[-85.635798,41.947091]},n2731:{id:"n2731",loc:[-85.63573,41.947092]},n2732:{id:"n2732",loc:[-85.635733,41.947233]},n2733:{id:"n2733",loc:[-85.636283,41.946863]},n2734:{id:"n2734",loc:[-85.63628,41.946706]},n2735:{id:"n2735",loc:[-85.636341,41.946705]},n2736:{id:"n2736",loc:[-85.636273,41.946584]},n2737:{id:"n2737",loc:[-85.636396,41.946545]},n2738:{id:"n2738",loc:[-85.636474,41.946684]},n2739:{id:"n2739",loc:[-85.636511,41.946861]},n274:{id:"n274",loc:[-85.636798,41.941697]},n2740:{id:"n2740",loc:[-85.633713,41.947184]},n2741:{id:"n2741",loc:[-85.633651,41.94716]},n2742:{id:"n2742",loc:[-85.633704,41.947085]},n2743:{id:"n2743",loc:[-85.6336,41.947044]},n2744:{id:"n2744",loc:[-85.633506,41.947177]},n2745:{id:"n2745",loc:[-85.629586,41.952469]},n2746:{id:"n2746",loc:[-85.634723,41.953681]},n2747:{id:"n2747",loc:[-85.63478,41.959007]},n2748:{id:"n2748",loc:[-85.632793,41.94405],tags:{highway:"traffic_signals",traffic_signals:"signal","traffic_signals:direction":"both"}},n2749:{id:"n2749",loc:[-85.634648,41.947325]},n275:{id:"n275",loc:[-85.63681,41.941705]},n2750:{id:"n2750",loc:[-85.625078,41.952097]},n2751:{id:"n2751",loc:[-85.633195,41.94734]},n2752:{id:"n2752",loc:[-85.626447,41.957168]},n2753:{id:"n2753",loc:[-85.632023,41.949012]},n2754:{id:"n2754",loc:[-85.630835,41.950656]},n2755:{id:"n2755",loc:[-85.634655,41.948612]},n2756:{id:"n2756",loc:[-85.636182,41.948605]},n2757:{id:"n2757",loc:[-85.634729,41.954667]},n2758:{id:"n2758",loc:[-85.634686,41.951159]},n2759:{id:"n2759",loc:[-85.636206,41.951146]},n276:{id:"n276",loc:[-85.63681,41.941714]},n2760:{id:"n2760",loc:[-85.634668,41.949891]},n2761:{id:"n2761",loc:[-85.634701,41.952422]},n2762:{id:"n2762",loc:[-85.634747,41.955907]},n2763:{id:"n2763",loc:[-85.627975,41.954695]},n2764:{id:"n2764",loc:[-85.626832,41.954698]},n2765:{id:"n2765",loc:[-85.632278,41.948624]},n2766:{id:"n2766",loc:[-85.628639,41.953725]},n2767:{id:"n2767",loc:[-85.636233,41.95241]},n2768:{id:"n2768",loc:[-85.631385,41.949913]},n2769:{id:"n2769",loc:[-85.630486,41.951194]},n277:{id:"n277",loc:[-85.636861,41.942041]},n2770:{id:"n2770",loc:[-85.624937,41.952088]},n2771:{id:"n2771",loc:[-85.624945,41.952022]},n2772:{id:"n2772",loc:[-85.636162,41.94731]},n2773:{id:"n2773",loc:[-85.636188,41.949881]},n2774:{id:"n2774",loc:[-85.631422,41.948294]},n2775:{id:"n2775",loc:[-85.632844,41.945547]},n2776:{id:"n2776",loc:[-85.632484,41.945344]},n2777:{id:"n2777",loc:[-85.631775,41.944636]},n2778:{id:"n2778",loc:[-85.632656,41.945471]},n2779:{id:"n2779",loc:[-85.631959,41.944827]},n278:{id:"n278",loc:[-85.636862,41.942099]},n2780:{id:"n2780",loc:[-85.631679,41.94438]},n2781:{id:"n2781",loc:[-85.625129,41.959272]},n2782:{id:"n2782",loc:[-85.632446,41.944861]},n2783:{id:"n2783",loc:[-85.632804,41.945477]},n2784:{id:"n2784",loc:[-85.632255,41.944962]},n2785:{id:"n2785",loc:[-85.632736,41.944757]},n2786:{id:"n2786",loc:[-85.632543,41.94486]},n2787:{id:"n2787",loc:[-85.632889,41.945561]},n2788:{id:"n2788",loc:[-85.632091,41.944949]},n2789:{id:"n2789",loc:[-85.632537,41.944713]},n279:{id:"n279",loc:[-85.636807,41.942099]},n2790:{id:"n2790",loc:[-85.632279,41.94485]},n2791:{id:"n2791",loc:[-85.632749,41.943247]},n2792:{id:"n2792",loc:[-85.632824,41.943152]},n2793:{id:"n2793",loc:[-85.632929,41.94317]},n2794:{id:"n2794",loc:[-85.632897,41.943078]},n2795:{id:"n2795",loc:[-85.632626,41.943231]},n2796:{id:"n2796",loc:[-85.634048,41.947257]},n2797:{id:"n2797",loc:[-85.634264,41.947252]},n2798:{id:"n2798",loc:[-85.635418,41.947317]},n2799:{id:"n2799",loc:[-85.635461,41.947237]},n28:{id:"n28",loc:[-85.63821,41.944308]},n280:{id:"n280",loc:[-85.636807,41.942126]},n2800:{id:"n2800",loc:[-85.632868,41.946229]},n2801:{id:"n2801",loc:[-85.633673,41.947242]},n2802:{id:"n2802",loc:[-85.623604,41.945881],tags:{amenity:"school",name:"Barrows School"}},n2803:{id:"n2803",loc:[-85.627401,41.943496]},n2804:{id:"n2804",loc:[-85.627403,41.943625]},n2805:{id:"n2805",loc:[-85.626409,41.943215]},n2806:{id:"n2806",loc:[-85.624884,41.943508]},n2807:{id:"n2807",loc:[-85.625191,41.943509]},n2808:{id:"n2808",loc:[-85.624882,41.94382]},n2809:{id:"n2809",loc:[-85.624893,41.945618]},n281:{id:"n281",loc:[-85.636726,41.942126]},n2810:{id:"n2810",loc:[-85.624912,41.946524]},n2811:{id:"n2811",loc:[-85.622721,41.946535]},n2812:{id:"n2812",loc:[-85.627399,41.94469]},n2813:{id:"n2813",loc:[-85.622716,41.945622]},n2814:{id:"n2814",loc:[-85.624886,41.944724]},n2815:{id:"n2815",loc:[-85.622674,41.944737]},n2816:{id:"n2816",loc:[-85.625092,41.945063]},n2817:{id:"n2817",loc:[-85.625233,41.945064]},n2818:{id:"n2818",loc:[-85.625229,41.944871]},n2819:{id:"n2819",loc:[-85.625066,41.944871]},n282:{id:"n282",loc:[-85.636726,41.942098]},n2820:{id:"n2820",loc:[-85.625024,41.944901]},n2821:{id:"n2821",loc:[-85.625025,41.944924]},n2822:{id:"n2822",loc:[-85.625087,41.944926]},n2823:{id:"n2823",loc:[-85.625349,41.944506]},n2824:{id:"n2824",loc:[-85.625347,41.944388]},n2825:{id:"n2825",loc:[-85.625152,41.94439]},n2826:{id:"n2826",loc:[-85.625152,41.944431]},n2827:{id:"n2827",loc:[-85.625134,41.944431]},n2828:{id:"n2828",loc:[-85.625136,41.944508]},n2829:{id:"n2829",loc:[-85.623236,41.946341]},n283:{id:"n283",loc:[-85.636708,41.942098]},n2830:{id:"n2830",loc:[-85.623241,41.946067]},n2831:{id:"n2831",loc:[-85.623207,41.946067]},n2832:{id:"n2832",loc:[-85.623212,41.945827]},n2833:{id:"n2833",loc:[-85.622981,41.945825]},n2834:{id:"n2834",loc:[-85.622976,41.946063]},n2835:{id:"n2835",loc:[-85.623006,41.946063]},n2836:{id:"n2836",loc:[-85.623002,41.946256]},n2837:{id:"n2837",loc:[-85.623075,41.946256]},n2838:{id:"n2838",loc:[-85.623074,41.946339]},n2839:{id:"n2839",loc:[-85.624574,41.951755]},n284:{id:"n284",loc:[-85.636708,41.942041]},n2840:{id:"n2840",loc:[-85.62498,41.951844]},n2841:{id:"n2841",loc:[-85.625086,41.95188]},n2842:{id:"n2842",loc:[-85.625135,41.951922]},n2843:{id:"n2843",loc:[-85.615273,41.945637]},n2844:{id:"n2844",loc:[-85.620172,41.945627]},n2845:{id:"n2845",loc:[-85.625167,41.951985]},n2846:{id:"n2846",loc:[-85.622741,41.947437]},n2847:{id:"n2847",loc:[-85.624907,41.947428]},n2848:{id:"n2848",loc:[-85.627046,41.940995]},n2849:{id:"n2849",loc:[-85.627295,41.941304]},n285:{id:"n285",loc:[-85.635618,41.941852]},n2850:{id:"n2850",loc:[-85.627352,41.94148]},n2851:{id:"n2851",loc:[-85.62737,41.942261]},n2852:{id:"n2852",loc:[-85.6264,41.942263]},n2853:{id:"n2853",loc:[-85.622769,41.949228]},n2854:{id:"n2854",loc:[-85.624937,41.949218]},n2855:{id:"n2855",loc:[-85.630001,41.944664]},n2856:{id:"n2856",loc:[-85.624873,41.942022]},n2857:{id:"n2857",loc:[-85.622761,41.948333]},n2858:{id:"n2858",loc:[-85.624924,41.948334]},n2859:{id:"n2859",loc:[-85.620051,41.94383]},n286:{id:"n286",loc:[-85.635621,41.94202]},n2860:{id:"n2860",loc:[-85.627629,41.946498]},n2861:{id:"n2861",loc:[-85.622757,41.950111]},n2862:{id:"n2862",loc:[-85.623685,41.954624]},n2863:{id:"n2863",loc:[-85.621459,41.944756]},n2864:{id:"n2864",loc:[-85.628637,41.944676]},n2865:{id:"n2865",loc:[-85.630125,41.944654]},n2866:{id:"n2866",loc:[-85.625196,41.952097]},n2867:{id:"n2867",loc:[-85.630257,41.944637]},n2868:{id:"n2868",loc:[-85.631247,41.944459]},n2869:{id:"n2869",loc:[-85.624867,41.94159]},n287:{id:"n287",loc:[-85.63524,41.942023]},n2870:{id:"n2870",loc:[-85.624958,41.950343]},n2871:{id:"n2871",loc:[-85.624948,41.950484]},n2872:{id:"n2872",loc:[-85.624813,41.950983]},n2873:{id:"n2873",loc:[-85.624723,41.951789]},n2874:{id:"n2874",loc:[-85.624262,41.9512]},n2875:{id:"n2875",loc:[-85.62414,41.951201]},n2876:{id:"n2876",loc:[-85.624139,41.95112]},n2877:{id:"n2877",loc:[-85.628481,41.945611]},n2878:{id:"n2878",loc:[-85.620072,41.946538]},n2879:{id:"n2879",loc:[-85.622763,41.95099]},n288:{id:"n288",loc:[-85.635237,41.941855]},n2880:{id:"n2880",loc:[-85.62814,41.946963]},n2881:{id:"n2881",loc:[-85.628245,41.947031]},n2882:{id:"n2882",loc:[-85.628331,41.947066]},n2883:{id:"n2883",loc:[-85.629722,41.944444],tags:{leisure:"park",name:"Scouter Park"}},n2884:{id:"n2884",loc:[-85.629977,41.943907]},n2885:{id:"n2885",loc:[-85.629947,41.943775]},n2886:{id:"n2886",loc:[-85.629899,41.943625]},n2887:{id:"n2887",loc:[-85.632286,41.944257]},n2888:{id:"n2888",loc:[-85.632523,41.944179]},n2889:{id:"n2889",loc:[-85.632141,41.944293]},n289:{id:"n289",loc:[-85.635568,41.940475]},n2890:{id:"n2890",loc:[-85.631571,41.9444]},n2891:{id:"n2891",loc:[-85.643236,41.941895]},n2892:{id:"n2892",loc:[-85.62865,41.945353]},n2893:{id:"n2893",loc:[-85.628594,41.945481]},n2894:{id:"n2894",loc:[-85.628581,41.947169]},n2895:{id:"n2895",loc:[-85.631843,41.943793]},n2896:{id:"n2896",loc:[-85.632299,41.943472]},n2897:{id:"n2897",loc:[-85.631519,41.944881]},n2898:{id:"n2898",loc:[-85.628429,41.947219]},n2899:{id:"n2899",loc:[-85.63145,41.945162]},n29:{id:"n29",loc:[-85.637963,41.944263]},n290:{id:"n290",loc:[-85.634584,41.940477]},n2900:{id:"n2900",loc:[-85.630939,41.945519]},n2901:{id:"n2901",loc:[-85.62903,41.945719]},n2902:{id:"n2902",loc:[-85.630521,41.945559]},n2903:{id:"n2903",loc:[-85.629294,41.945585]},n2904:{id:"n2904",loc:[-85.629845,41.945543]},n2905:{id:"n2905",loc:[-85.631497,41.944625]},n2906:{id:"n2906",loc:[-85.630281,41.945553]},n2907:{id:"n2907",loc:[-85.628553,41.946973]},n2908:{id:"n2908",loc:[-85.631383,41.945338]},n2909:{id:"n2909",loc:[-85.628843,41.946103]},n291:{id:"n291",loc:[-85.634583,41.940203]},n2910:{id:"n2910",loc:[-85.631193,41.945473]},n2911:{id:"n2911",loc:[-85.628897,41.945944]},n2912:{id:"n2912",loc:[-85.628789,41.946454]},n2913:{id:"n2913",loc:[-85.632548,41.944563]},n2914:{id:"n2914",loc:[-85.627527,41.944555]},n2915:{id:"n2915",loc:[-85.62752,41.943726]},n2916:{id:"n2916",loc:[-85.627894,41.943723]},n2917:{id:"n2917",loc:[-85.627897,41.943919]},n2918:{id:"n2918",loc:[-85.627991,41.943934]},n2919:{id:"n2919",loc:[-85.628082,41.943966]},n292:{id:"n292",loc:[-85.635567,41.940201]},n2920:{id:"n2920",loc:[-85.628177,41.944015]},n2921:{id:"n2921",loc:[-85.628193,41.944048]},n2922:{id:"n2922",loc:[-85.628167,41.944054]},n2923:{id:"n2923",loc:[-85.628193,41.944094]},n2924:{id:"n2924",loc:[-85.628213,41.944144]},n2925:{id:"n2925",loc:[-85.628214,41.944199]},n2926:{id:"n2926",loc:[-85.62833,41.944196]},n2927:{id:"n2927",loc:[-85.628328,41.944262]},n2928:{id:"n2928",loc:[-85.628173,41.944262]},n2929:{id:"n2929",loc:[-85.628171,41.944293]},n293:{id:"n293",loc:[-85.635816,41.942673],tags:{crossing:"zebra",highway:"crossing"}},n2930:{id:"n2930",loc:[-85.628039,41.944296]},n2931:{id:"n2931",loc:[-85.62804,41.944329]},n2932:{id:"n2932",loc:[-85.627829,41.944335]},n2933:{id:"n2933",loc:[-85.627835,41.94455]},n2936:{id:"n2936",loc:[-85.632823,41.945994]},n294:{id:"n294",loc:[-85.635696,41.942712]},n2940:{id:"n2940",loc:[-85.632192,41.945973]},n2941:{id:"n2941",loc:[-85.63226,41.94587]},n2942:{id:"n2942",loc:[-85.632721,41.946036]},n2943:{id:"n2943",loc:[-85.632641,41.946142]},n2944:{id:"n2944",loc:[-85.62937,41.947467]},n2945:{id:"n2945",loc:[-85.62959,41.942936]},n2946:{id:"n2946",loc:[-85.629551,41.94284]},n2947:{id:"n2947",loc:[-85.629501,41.942704]},n2948:{id:"n2948",loc:[-85.629472,41.942578]},n2949:{id:"n2949",loc:[-85.629361,41.941801]},n295:{id:"n295",loc:[-85.635679,41.941962]},n2950:{id:"n2950",loc:[-85.629339,41.941716]},n2951:{id:"n2951",loc:[-85.629315,41.94166]},n2952:{id:"n2952",loc:[-85.629279,41.941602]},n2953:{id:"n2953",loc:[-85.629227,41.941556]},n2954:{id:"n2954",loc:[-85.624261,41.95112]},n2955:{id:"n2955",loc:[-85.629153,41.941524]},n2956:{id:"n2956",loc:[-85.626904,41.941098]},n2957:{id:"n2957",loc:[-85.624588,41.951294]},n2958:{id:"n2958",loc:[-85.631844,41.942945]},n2959:{id:"n2959",loc:[-85.625854,41.949222]},n296:{id:"n296",loc:[-85.635672,41.941337]},n2960:{id:"n2960",loc:[-85.625146,41.955238]},n2961:{id:"n2961",loc:[-85.626745,41.948296]},n2962:{id:"n2962",loc:[-85.625721,41.95524]},n2963:{id:"n2963",loc:[-85.624706,41.952317]},n2964:{id:"n2964",loc:[-85.62609,41.956147]},n2965:{id:"n2965",loc:[-85.624401,41.954928]},n2966:{id:"n2966",loc:[-85.626558,41.955367]},n2967:{id:"n2967",loc:[-85.62468,41.955096]},n2968:{id:"n2968",loc:[-85.624159,41.953929]},n2969:{id:"n2969",loc:[-85.62506,41.951113]},n297:{id:"n297",loc:[-85.635658,41.941284]},n2970:{id:"n2970",loc:[-85.624942,41.951591]},n2971:{id:"n2971",loc:[-85.627399,41.947546]},n2972:{id:"n2972",loc:[-85.627695,41.947404]},n2973:{id:"n2973",loc:[-85.625925,41.94896]},n2974:{id:"n2974",loc:[-85.625725,41.950211]},n2975:{id:"n2975",loc:[-85.627008,41.947963]},n2976:{id:"n2976",loc:[-85.624373,41.953458]},n2977:{id:"n2977",loc:[-85.624137,41.954392]},n2978:{id:"n2978",loc:[-85.628257,41.947307]},n2979:{id:"n2979",loc:[-85.625281,41.95066]},n298:{id:"n298",loc:[-85.635602,41.941166]},n2980:{id:"n2980",loc:[-85.625865,41.949804]},n2981:{id:"n2981",loc:[-85.626508,41.955932]},n2982:{id:"n2982",loc:[-85.626333,41.955216]},n2983:{id:"n2983",loc:[-85.626637,41.955676]},n2984:{id:"n2984",loc:[-85.624223,41.954599]},n2985:{id:"n2985",loc:[-85.626219,41.948671]},n2986:{id:"n2986",loc:[-85.624556,41.953043]},n2987:{id:"n2987",loc:[-85.625598,41.956302]},n2988:{id:"n2988",loc:[-85.624571,41.952971]},n2989:{id:"n2989",loc:[-85.627141,41.940727]},n299:{id:"n299",loc:[-85.635598,41.941138]},n2990:{id:"n2990",loc:[-85.627102,41.939144]},n2991:{id:"n2991",loc:[-85.627127,41.940086]},n2992:{id:"n2992",loc:[-85.627116,41.940843]},n2993:{id:"n2993",loc:[-85.627132,41.9402]},n2994:{id:"n2994",loc:[-85.629734,41.940078]},n2995:{id:"n2995",loc:[-85.6276,41.937412]},n2996:{id:"n2996",loc:[-85.627451,41.937549]},n2997:{id:"n2997",loc:[-85.627375,41.937618]},n2998:{id:"n2998",loc:[-85.627278,41.937728]},n2999:{id:"n2999",loc:[-85.627199,41.937842]},n3:{id:"n3",loc:[-85.627345,41.953983]},n30:{id:"n30",loc:[-85.637882,41.944205]},n300:{id:"n300",loc:[-85.635614,41.941076]},n3000:{id:"n3000",loc:[-85.627141,41.937981]},n3001:{id:"n3001",loc:[-85.627109,41.938153]},n3002:{id:"n3002",loc:[-85.627101,41.938699]},n3003:{id:"n3003",loc:[-85.628311,41.942261]},n3004:{id:"n3004",loc:[-85.628439,41.940082]},n3005:{id:"n3005",loc:[-85.619538,41.942622],tags:{leisure:"slipway"}},n3006:{id:"n3006",loc:[-85.619872,41.942618]},n3007:{id:"n3007",loc:[-85.619755,41.942612]},n3008:{id:"n3008",loc:[-85.619647,41.942628]},n3009:{id:"n3009",loc:[-85.619415,41.942626]},n301:{id:"n301",loc:[-85.635659,41.940956]},n3010:{id:"n3010",loc:[-85.619212,41.942623]},n3011:{id:"n3011",loc:[-85.631485,41.942472]},n3012:{id:"n3012",loc:[-85.630986,41.941786]},n3013:{id:"n3013",loc:[-85.631797,41.942006]},n3014:{id:"n3014",loc:[-85.630972,41.941162]},n3015:{id:"n3015",loc:[-85.631396,41.941611],tags:{railway:"level_crossing"}},n3016:{id:"n3016",loc:[-85.631878,41.941545]},n3017:{id:"n3017",loc:[-85.630461,41.94055]},n3018:{id:"n3018",loc:[-85.629751,41.939539],tags:{railway:"level_crossing"}},n3019:{id:"n3019",loc:[-85.631663,41.941513]},n302:{id:"n302",loc:[-85.635666,41.940922]},n3020:{id:"n3020",loc:[-85.631328,41.941375]},n3021:{id:"n3021",loc:[-85.632554,41.941779]},n3022:{id:"n3022",loc:[-85.63245,41.941769]},n3023:{id:"n3023",loc:[-85.632475,41.941644]},n3024:{id:"n3024",loc:[-85.632581,41.941654]},n3025:{id:"n3025",loc:[-85.631957,41.941352]},n3026:{id:"n3026",loc:[-85.632293,41.941139]},n3027:{id:"n3027",loc:[-85.632315,41.941153]},n3028:{id:"n3028",loc:[-85.632302,41.941262]},n3029:{id:"n3029",loc:[-85.63237,41.941267]},n303:{id:"n303",loc:[-85.635667,41.940877]},n3030:{id:"n3030",loc:[-85.632356,41.941538]},n3031:{id:"n3031",loc:[-85.632134,41.941678]},n3032:{id:"n3032",loc:[-85.631942,41.941687]},n3033:{id:"n3033",loc:[-85.63203,41.941694]},n3034:{id:"n3034",loc:[-85.632166,41.941555]},n3035:{id:"n3035",loc:[-85.632412,41.941416]},n3036:{id:"n3036",loc:[-85.63248,41.941342]},n3037:{id:"n3037",loc:[-85.632502,41.941259]},n3038:{id:"n3038",loc:[-85.632453,41.941161]},n3039:{id:"n3039",loc:[-85.63235,41.941103]},n304:{id:"n304",loc:[-85.635668,41.940655]},n3040:{id:"n3040",loc:[-85.632236,41.941118]},n3041:{id:"n3041",loc:[-85.631894,41.941355]},n3042:{id:"n3042",loc:[-85.631859,41.941411]},n3043:{id:"n3043",loc:[-85.632011,41.941587]},n3044:{id:"n3044",loc:[-85.632446,41.941379]},n3045:{id:"n3045",loc:[-85.632511,41.941416]},n3046:{id:"n3046",loc:[-85.632545,41.941634]},n3047:{id:"n3047",loc:[-85.632612,41.94164]},n3048:{id:"n3048",loc:[-85.632595,41.942197]},n3049:{id:"n3049",loc:[-85.632565,41.942241]},n305:{id:"n305",loc:[-85.635628,41.940617]},n3050:{id:"n3050",loc:[-85.632515,41.942256]},n3051:{id:"n3051",loc:[-85.63245,41.94223]},n3052:{id:"n3052",loc:[-85.632401,41.942174]},n3053:{id:"n3053",loc:[-85.632391,41.942115]},n3054:{id:"n3054",loc:[-85.632029,41.941859]},n3055:{id:"n3055",loc:[-85.631828,41.941639]},n3056:{id:"n3056",loc:[-85.631829,41.941508]},n3057:{id:"n3057",loc:[-85.631281,41.94312]},n3058:{id:"n3058",loc:[-85.631421,41.943065]},n3059:{id:"n3059",loc:[-85.631339,41.942949]},n306:{id:"n306",loc:[-85.635623,41.940272]},n3060:{id:"n3060",loc:[-85.631199,41.943004]},n3061:{id:"n3061",loc:[-85.631102,41.942931]},n3062:{id:"n3062",loc:[-85.631009,41.942809]},n3063:{id:"n3063",loc:[-85.631383,41.94265]},n3064:{id:"n3064",loc:[-85.631477,41.942773]},n3065:{id:"n3065",loc:[-85.630638,41.942809]},n3066:{id:"n3066",loc:[-85.630738,41.942943]},n3067:{id:"n3067",loc:[-85.630841,41.9429]},n3068:{id:"n3068",loc:[-85.630741,41.942766]},n3069:{id:"n3069",loc:[-85.63054,41.942603]},n307:{id:"n307",loc:[-85.635651,41.940183]},n3070:{id:"n3070",loc:[-85.630498,41.942619]},n3071:{id:"n3071",loc:[-85.630567,41.942718]},n3072:{id:"n3072",loc:[-85.630616,41.942698]},n3073:{id:"n3073",loc:[-85.630642,41.94273]},n3074:{id:"n3074",loc:[-85.630686,41.942714]},n3075:{id:"n3075",loc:[-85.630715,41.942754]},n3076:{id:"n3076",loc:[-85.6309,41.942681]},n3077:{id:"n3077",loc:[-85.630843,41.942605]},n3078:{id:"n3078",loc:[-85.6309,41.942581]},n3079:{id:"n3079",loc:[-85.630832,41.942487]},n308:{id:"n308",loc:[-85.63577,41.940183],tags:{crossing:"zebra",highway:"crossing"}},n3080:{id:"n3080",loc:[-85.630773,41.942509]},n3081:{id:"n3081",loc:[-85.630718,41.942436]},n3082:{id:"n3082",loc:[-85.630485,41.942524]},n3083:{id:"n3083",loc:[-85.631468,41.941233]},n3084:{id:"n3084",loc:[-85.631334,41.94114]},n3085:{id:"n3085",loc:[-85.632052,41.940568]},n3086:{id:"n3086",loc:[-85.63219,41.940663]},n3087:{id:"n3087",loc:[-85.631323,41.940834]},n3088:{id:"n3088",loc:[-85.631122,41.941002]},n3089:{id:"n3089",loc:[-85.631321,41.941133]},n309:{id:"n309",loc:[-85.636939,41.942544]},n3090:{id:"n3090",loc:[-85.631521,41.940966]},n3091:{id:"n3091",loc:[-85.631103,41.940253]},n3092:{id:"n3092",loc:[-85.631226,41.940211]},n3093:{id:"n3093",loc:[-85.631597,41.940805]},n3094:{id:"n3094",loc:[-85.631474,41.940847]},n3095:{id:"n3095",loc:[-85.631811,41.940534]},n3096:{id:"n3096",loc:[-85.631588,41.94061]},n3097:{id:"n3097",loc:[-85.631438,41.940366]},n3098:{id:"n3098",loc:[-85.631661,41.94029]},n3099:{id:"n3099",loc:[-85.630621,41.940041]},n31:{id:"n31",loc:[-85.63827,41.944203]},n310:{id:"n310",loc:[-85.636323,41.942552]},n3100:{id:"n3100",loc:[-85.630436,41.939773]},n3101:{id:"n3101",loc:[-85.63059,41.939714]},n3102:{id:"n3102",loc:[-85.630775,41.939983]},n3103:{id:"n3103",loc:[-85.63047,41.940167]},n3104:{id:"n3104",loc:[-85.63013,41.939686]},n3105:{id:"n3105",loc:[-85.630302,41.939618]},n3106:{id:"n3106",loc:[-85.630641,41.9401]},n3107:{id:"n3107",loc:[-85.630966,41.940619]},n3108:{id:"n3108",loc:[-85.630874,41.940493]},n3109:{id:"n3109",loc:[-85.630933,41.940469]},n311:{id:"n311",loc:[-85.636257,41.942555]},n3110:{id:"n3110",loc:[-85.630763,41.940236]},n3111:{id:"n3111",loc:[-85.63088,41.940189]},n3112:{id:"n3112",loc:[-85.631142,41.940548]},n3113:{id:"n3113",loc:[-85.630958,41.940871]},n3114:{id:"n3114",loc:[-85.630874,41.940778]},n3115:{id:"n3115",loc:[-85.631062,41.940684]},n3116:{id:"n3116",loc:[-85.631146,41.940777]},n3117:{id:"n3117",loc:[-85.632031,41.940575]},n3118:{id:"n3118",loc:[-85.631777,41.940186]},n3119:{id:"n3119",loc:[-85.631346,41.940179]},n312:{id:"n312",loc:[-85.636208,41.942561]},n3120:{id:"n3120",loc:[-85.631342,41.94012]},n3121:{id:"n3121",loc:[-85.631831,41.940118]},n3122:{id:"n3122",loc:[-85.632115,41.940543]},n3123:{id:"n3123",loc:[-85.631031,41.941683]},n3124:{id:"n3124",loc:[-85.630981,41.941608]},n3125:{id:"n3125",loc:[-85.631209,41.941516]},n3126:{id:"n3126",loc:[-85.631264,41.941586]},n3127:{id:"n3127",loc:[-85.630938,41.94155]},n3128:{id:"n3128",loc:[-85.631156,41.941462]},n3129:{id:"n3129",loc:[-85.631197,41.94152]},n313:{id:"n313",loc:[-85.636159,41.942573]},n3130:{id:"n3130",loc:[-85.630895,41.941485]},n3131:{id:"n3131",loc:[-85.630824,41.941389]},n3132:{id:"n3132",loc:[-85.630986,41.941323]},n3133:{id:"n3133",loc:[-85.631057,41.941419]},n3134:{id:"n3134",loc:[-85.630777,41.941328]},n3135:{id:"n3135",loc:[-85.630907,41.941274]},n3136:{id:"n3136",loc:[-85.630953,41.941335]},n3137:{id:"n3137",loc:[-85.630797,41.941247]},n3138:{id:"n3138",loc:[-85.630701,41.94117]},n3139:{id:"n3139",loc:[-85.630829,41.941113]},n314:{id:"n314",loc:[-85.635743,41.942881]},n3140:{id:"n3140",loc:[-85.6309,41.941201]},n3141:{id:"n3141",loc:[-85.630765,41.941206]},n3142:{id:"n3142",loc:[-85.630739,41.941218]},n3143:{id:"n3143",loc:[-85.630582,41.941039]},n3144:{id:"n3144",loc:[-85.630412,41.940818]},n3145:{id:"n3145",loc:[-85.630509,41.940777]},n3146:{id:"n3146",loc:[-85.630678,41.941004]},n3147:{id:"n3147",loc:[-85.630773,41.942166]},n3148:{id:"n3148",loc:[-85.630708,41.942074]},n3149:{id:"n3149",loc:[-85.630863,41.942013]},n315:{id:"n315",loc:[-85.635452,41.942966]},n3150:{id:"n3150",loc:[-85.630928,41.942105]},n3151:{id:"n3151",loc:[-85.630701,41.942026]},n3152:{id:"n3152",loc:[-85.630665,41.941971]},n3153:{id:"n3153",loc:[-85.630793,41.941918]},n3154:{id:"n3154",loc:[-85.630837,41.94197]},n3155:{id:"n3155",loc:[-85.630757,41.941871]},n3156:{id:"n3156",loc:[-85.630629,41.941923]},n3157:{id:"n3157",loc:[-85.630694,41.941783]},n3158:{id:"n3158",loc:[-85.630534,41.941847]},n3159:{id:"n3159",loc:[-85.630598,41.941935]},n316:{id:"n316",loc:[-85.634911,41.943118]},n3160:{id:"n3160",loc:[-85.631548,41.93938]},n3161:{id:"n3161",loc:[-85.631525,41.939919]},n3162:{id:"n3162",loc:[-85.631648,41.940043]},n3163:{id:"n3163",loc:[-85.624586,41.951121]},n3164:{id:"n3164",loc:[-85.622139,41.952064]},n3165:{id:"n3165",loc:[-85.622141,41.952144]},n3166:{id:"n3166",loc:[-85.621977,41.952146]},n3167:{id:"n3167",loc:[-85.621978,41.952211]},n3168:{id:"n3168",loc:[-85.62191,41.952212]},n3169:{id:"n3169",loc:[-85.633628,41.935437]},n317:{id:"n317",loc:[-85.634743,41.943167]},n3170:{id:"n3170",loc:[-85.632849,41.935518]},n3171:{id:"n3171",loc:[-85.632376,41.93574]},n3172:{id:"n3172",loc:[-85.631517,41.935897]},n3173:{id:"n3173",loc:[-85.630433,41.936124]},n3174:{id:"n3174",loc:[-85.630207,41.936427]},n3175:{id:"n3175",loc:[-85.630346,41.936795]},n3176:{id:"n3176",loc:[-85.62996,41.936974]},n3177:{id:"n3177",loc:[-85.629916,41.937488]},n3178:{id:"n3178",loc:[-85.629946,41.937802]},n3179:{id:"n3179",loc:[-85.629977,41.937905]},n318:{id:"n318",loc:[-85.634401,41.94328]},n3180:{id:"n3180",loc:[-85.63016,41.937909]},n3181:{id:"n3181",loc:[-85.630804,41.937791]},n3182:{id:"n3182",loc:[-85.631688,41.937808]},n3183:{id:"n3183",loc:[-85.631685,41.938008]},n3184:{id:"n3184",loc:[-85.631845,41.938116]},n3185:{id:"n3185",loc:[-85.63207,41.938181]},n3186:{id:"n3186",loc:[-85.632143,41.938371]},n3187:{id:"n3187",loc:[-85.632056,41.938435]},n3188:{id:"n3188",loc:[-85.631787,41.938457]},n3189:{id:"n3189",loc:[-85.631657,41.938728]},n319:{id:"n319",loc:[-85.634345,41.943299]},n3190:{id:"n3190",loc:[-85.631595,41.93775]},n3191:{id:"n3191",loc:[-85.630264,41.937839]},n3192:{id:"n3192",loc:[-85.628591,41.948536]},n3193:{id:"n3193",loc:[-85.63205,41.951181]},n3194:{id:"n3194",loc:[-85.632034,41.949909]},n3195:{id:"n3195",loc:[-85.630841,41.951191]},n3196:{id:"n3196",loc:[-85.632083,41.9537]},n3197:{id:"n3197",loc:[-85.630929,41.959037]},n3198:{id:"n3198",loc:[-85.632151,41.959028]},n3199:{id:"n3199",loc:[-85.630911,41.957428]},n32:{id:"n32",loc:[-85.638273,41.944246]},n320:{id:"n320",loc:[-85.634287,41.943326]},n3200:{id:"n3200",loc:[-85.63213,41.957427]},n3201:{id:"n3201",loc:[-85.632072,41.952447]},n3202:{id:"n3202",loc:[-85.632095,41.954677]},n3203:{id:"n3203",loc:[-85.632111,41.955911]},n3204:{id:"n3204",loc:[-85.630855,41.952457]},n3205:{id:"n3205",loc:[-85.630869,41.953709]},n3206:{id:"n3206",loc:[-85.63088,41.954682]},n3207:{id:"n3207",loc:[-85.630894,41.955913]},n3208:{id:"n3208",loc:[-85.633214,41.948619]},n3209:{id:"n3209",loc:[-85.633253,41.951171]},n321:{id:"n321",loc:[-85.634233,41.943354]},n3210:{id:"n3210",loc:[-85.633234,41.949901]},n3211:{id:"n3211",loc:[-85.633922,41.948616]},n3212:{id:"n3212",loc:[-85.625188,41.947832]},n3213:{id:"n3213",loc:[-85.625208,41.947775]},n3214:{id:"n3214",loc:[-85.625229,41.94776]},n3215:{id:"n3215",loc:[-85.625201,41.947749]},n3216:{id:"n3216",loc:[-85.625168,41.947707]},n3217:{id:"n3217",loc:[-85.625171,41.947609]},n3218:{id:"n3218",loc:[-85.625213,41.947564]},n3219:{id:"n3219",loc:[-85.62529,41.94756]},n322:{id:"n322",loc:[-85.634099,41.943429]},n3220:{id:"n3220",loc:[-85.625303,41.947533]},n3221:{id:"n3221",loc:[-85.625344,41.947482]},n3222:{id:"n3222",loc:[-85.625442,41.947468]},n3223:{id:"n3223",loc:[-85.62565,41.947494]},n3224:{id:"n3224",loc:[-85.625726,41.947613]},n3225:{id:"n3225",loc:[-85.625703,41.947728]},n3226:{id:"n3226",loc:[-85.625534,41.94781]},n3227:{id:"n3227",loc:[-85.625391,41.947822]},n3228:{id:"n3228",loc:[-85.625304,41.947859]},n3229:{id:"n3229",loc:[-85.625203,41.947885]},n323:{id:"n323",loc:[-85.633958,41.943507],tags:{highway:"crossing"}},n3230:{id:"n3230",loc:[-85.624691,41.948659]},n3231:{id:"n3231",loc:[-85.624328,41.948661]},n3232:{id:"n3232",loc:[-85.624331,41.949046]},n3233:{id:"n3233",loc:[-85.624694,41.949045]},n3234:{id:"n3234",loc:[-85.623623,41.949606]},n3235:{id:"n3235",loc:[-85.623623,41.9497]},n3236:{id:"n3236",loc:[-85.623357,41.9497]},n3237:{id:"n3237",loc:[-85.623357,41.949614]},n3238:{id:"n3238",loc:[-85.623974,41.949429]},n3239:{id:"n3239",loc:[-85.623974,41.949605]},n324:{id:"n324",loc:[-85.633698,41.943651],tags:{railway:"crossing"}},n3240:{id:"n3240",loc:[-85.624501,41.951226]},n3241:{id:"n3241",loc:[-85.624501,41.951123]},n3242:{id:"n3242",loc:[-85.624319,41.951123]},n3243:{id:"n3243",loc:[-85.624319,41.951226]},n3244:{id:"n3244",loc:[-85.624121,41.950866]},n3245:{id:"n3245",loc:[-85.624115,41.950525]},n3246:{id:"n3246",loc:[-85.624315,41.950523]},n3247:{id:"n3247",loc:[-85.62432,41.950865]},n3248:{id:"n3248",loc:[-85.624393,41.950867]},n3249:{id:"n3249",loc:[-85.62439,41.950596]},n325:{id:"n325",loc:[-85.633508,41.943757]},n3250:{id:"n3250",loc:[-85.624673,41.950594]},n3251:{id:"n3251",loc:[-85.624675,41.95082]},n3252:{id:"n3252",loc:[-85.62451,41.950821]},n3253:{id:"n3253",loc:[-85.62451,41.950866]},n3254:{id:"n3254",loc:[-85.624101,41.949346]},n3255:{id:"n3255",loc:[-85.624244,41.949346]},n3256:{id:"n3256",loc:[-85.624244,41.949368]},n3257:{id:"n3257",loc:[-85.62434,41.949368]},n3258:{id:"n3258",loc:[-85.624342,41.949351]},n3259:{id:"n3259",loc:[-85.624725,41.949348]},n326:{id:"n326",loc:[-85.634839,41.942974]},n3260:{id:"n3260",loc:[-85.624755,41.950495]},n3261:{id:"n3261",loc:[-85.624121,41.950502]},n3262:{id:"n3262",loc:[-85.625453,41.950163]},n3263:{id:"n3263",loc:[-85.625454,41.949976]},n3264:{id:"n3264",loc:[-85.625549,41.949977]},n3265:{id:"n3265",loc:[-85.62555,41.949833]},n3266:{id:"n3266",loc:[-85.625577,41.949833]},n3267:{id:"n3267",loc:[-85.625578,41.949656]},n3268:{id:"n3268",loc:[-85.625195,41.949655]},n3269:{id:"n3269",loc:[-85.625192,41.950162]},n327:{id:"n327",loc:[-85.634657,41.943028]},n3270:{id:"n3270",loc:[-85.622992,41.949614]},n3271:{id:"n3271",loc:[-85.622991,41.949431]},n3272:{id:"n3272",loc:[-85.620103,41.951]},n3273:{id:"n3273",loc:[-85.605644,41.947468]},n3274:{id:"n3274",loc:[-85.617421,41.947457]},n3275:{id:"n3275",loc:[-85.620078,41.947444]},n3276:{id:"n3276",loc:[-85.620087,41.94924]},n3277:{id:"n3277",loc:[-85.62156,41.948333]},n3278:{id:"n3278",loc:[-85.620106,41.950132]},n3279:{id:"n3279",loc:[-85.637412,41.951136]},n328:{id:"n328",loc:[-85.634222,41.943152]},n3280:{id:"n3280",loc:[-85.635429,41.948608]},n3281:{id:"n3281",loc:[-85.635047,41.947788]},n3282:{id:"n3282",loc:[-85.635048,41.947796]},n3283:{id:"n3283",loc:[-85.635002,41.947797]},n3284:{id:"n3284",loc:[-85.635002,41.947788]},n3285:{id:"n3285",loc:[-85.634914,41.94779]},n3286:{id:"n3286",loc:[-85.634913,41.947753]},n3287:{id:"n3287",loc:[-85.63494,41.947753]},n3288:{id:"n3288",loc:[-85.634938,41.947708]},n3289:{id:"n3289",loc:[-85.635124,41.947705]},n329:{id:"n329",loc:[-85.634099,41.943202]},n3290:{id:"n3290",loc:[-85.635126,41.947787]},n3291:{id:"n3291",loc:[-85.634972,41.947599]},n3292:{id:"n3292",loc:[-85.634921,41.9476]},n3293:{id:"n3293",loc:[-85.63485,41.947546]},n3294:{id:"n3294",loc:[-85.63485,41.947508]},n3295:{id:"n3295",loc:[-85.634924,41.947457]},n3296:{id:"n3296",loc:[-85.634967,41.947456]},n3297:{id:"n3297",loc:[-85.635041,41.947512]},n3298:{id:"n3298",loc:[-85.635041,41.947542]},n3299:{id:"n3299",loc:[-85.634244,41.947839]},n33:{id:"n33",loc:[-85.638257,41.944188]},n330:{id:"n330",loc:[-85.634093,41.943138]},n3300:{id:"n3300",loc:[-85.634243,41.947793]},n3301:{id:"n3301",loc:[-85.634244,41.947686]},n3302:{id:"n3302",loc:[-85.634243,41.947657]},n3303:{id:"n3303",loc:[-85.634462,41.947653]},n3304:{id:"n3304",loc:[-85.634468,41.947835]},n3305:{id:"n3305",loc:[-85.634416,41.948006]},n3306:{id:"n3306",loc:[-85.634415,41.947898]},n3307:{id:"n3307",loc:[-85.634275,41.947899]},n3308:{id:"n3308",loc:[-85.634275,41.947927]},n3309:{id:"n3309",loc:[-85.63425,41.947927]},n331:{id:"n331",loc:[-85.633938,41.943291]},n3310:{id:"n3310",loc:[-85.63425,41.947976]},n3311:{id:"n3311",loc:[-85.634274,41.947976]},n3312:{id:"n3312",loc:[-85.634275,41.948007]},n3313:{id:"n3313",loc:[-85.634342,41.947635]},n3314:{id:"n3314",loc:[-85.634339,41.947497]},n3315:{id:"n3315",loc:[-85.634313,41.94748]},n3316:{id:"n3316",loc:[-85.634287,41.947474]},n3317:{id:"n3317",loc:[-85.63498,41.94815]},n3318:{id:"n3318",loc:[-85.634891,41.94815]},n3319:{id:"n3319",loc:[-85.634892,41.948169]},n332:{id:"n332",loc:[-85.633535,41.943511],tags:{railway:"crossing"}},n3320:{id:"n3320",loc:[-85.634852,41.948169]},n3321:{id:"n3321",loc:[-85.634853,41.948268]},n3322:{id:"n3322",loc:[-85.634832,41.948268]},n3323:{id:"n3323",loc:[-85.634832,41.948296]},n3324:{id:"n3324",loc:[-85.634965,41.948295]},n3325:{id:"n3325",loc:[-85.634966,41.948321]},n3326:{id:"n3326",loc:[-85.634999,41.948321]},n3327:{id:"n3327",loc:[-85.634999,41.948295]},n3328:{id:"n3328",loc:[-85.635175,41.948293]},n3329:{id:"n3329",loc:[-85.635175,41.948262]},n333:{id:"n333",loc:[-85.63339,41.943596]},n3330:{id:"n3330",loc:[-85.635159,41.948262]},n3331:{id:"n3331",loc:[-85.635158,41.948152]},n3332:{id:"n3332",loc:[-85.635067,41.948152]},n3333:{id:"n3333",loc:[-85.635065,41.947966]},n3334:{id:"n3334",loc:[-85.634979,41.947966]},n3335:{id:"n3335",loc:[-85.634307,41.948326]},n3336:{id:"n3336",loc:[-85.634305,41.948298]},n3337:{id:"n3337",loc:[-85.634331,41.948055]},n3338:{id:"n3338",loc:[-85.634331,41.948046]},n3339:{id:"n3339",loc:[-85.634435,41.948047]},n334:{id:"n334",loc:[-85.632842,41.943895]},n3340:{id:"n3340",loc:[-85.634434,41.948375]},n3341:{id:"n3341",loc:[-85.634463,41.948373]},n3342:{id:"n3342",loc:[-85.634464,41.948456]},n3343:{id:"n3343",loc:[-85.63443,41.948457]},n3344:{id:"n3344",loc:[-85.634432,41.948505]},n3345:{id:"n3345",loc:[-85.637386,41.94906]},n3346:{id:"n3346",loc:[-85.637113,41.9486]},n3347:{id:"n3347",loc:[-85.635448,41.949424]},n335:{id:"n335",loc:[-85.633856,41.943315]},n3352:{id:"n3352",loc:[-85.635457,41.949787]},n3353:{id:"n3353",loc:[-85.635459,41.949886]},n336:{id:"n336",loc:[-85.633697,41.943405]},n337:{id:"n337",loc:[-85.63347,41.943181]},n3372:{id:"n3372",loc:[-85.634423,41.950964]},n3373:{id:"n3373",loc:[-85.634424,41.95074]},n3374:{id:"n3374",loc:[-85.634394,41.950284]},n3375:{id:"n3375",loc:[-85.634398,41.950626]},n3376:{id:"n3376",loc:[-85.63452,41.951063]},n3377:{id:"n3377",loc:[-85.634511,41.949977]},n3378:{id:"n3378",loc:[-85.637409,41.949873]},n3379:{id:"n3379",loc:[-85.634824,41.94996]},n338:{id:"n338",loc:[-85.633597,41.943109]},n3380:{id:"n3380",loc:[-85.635437,41.949954]},n3381:{id:"n3381",loc:[-85.634844,41.951064]},n3382:{id:"n3382",loc:[-85.635458,41.951058]},n3383:{id:"n3383",loc:[-85.633921,41.947333]},n3384:{id:"n3384",loc:[-85.634208,41.947793]},n3385:{id:"n3385",loc:[-85.634204,41.947687]},n3386:{id:"n3386",loc:[-85.63424,41.947475]},n3387:{id:"n3387",loc:[-85.63424,41.947635]},n3388:{id:"n3388",loc:[-85.634089,41.948328]},n3389:{id:"n3389",loc:[-85.63424,41.948299]},n339:{id:"n339",loc:[-85.633673,41.943184]},n3390:{id:"n3390",loc:[-85.634239,41.948212]},n3391:{id:"n3391",loc:[-85.634086,41.948214]},n3392:{id:"n3392",loc:[-85.63408,41.948056]},n3393:{id:"n3393",loc:[-85.634093,41.948506]},n3394:{id:"n3394",loc:[-85.64344,41.941866]},n3395:{id:"n3395",loc:[-85.63378,41.95099]},n3396:{id:"n3396",loc:[-85.633779,41.950967]},n3397:{id:"n3397",loc:[-85.63375,41.950746]},n3398:{id:"n3398",loc:[-85.63375,41.950697]},n3399:{id:"n3399",loc:[-85.633903,41.950696]},n34:{id:"n34",loc:[-85.638176,41.944312]},n340:{id:"n340",loc:[-85.633714,41.94316]},n3400:{id:"n3400",loc:[-85.633901,41.950436]},n3401:{id:"n3401",loc:[-85.633492,41.950438]},n3402:{id:"n3402",loc:[-85.633494,41.950756]},n3403:{id:"n3403",loc:[-85.633454,41.950756]},n3404:{id:"n3404",loc:[-85.633456,41.950992]},n3405:{id:"n3405",loc:[-85.633994,41.950284]},n3406:{id:"n3406",loc:[-85.633998,41.950628]},n3407:{id:"n3407",loc:[-85.633364,41.951068]},n3408:{id:"n3408",loc:[-85.633356,41.949982]},n3409:{id:"n3409",loc:[-85.643327,41.941903]},n341:{id:"n341",loc:[-85.633811,41.943256]},n3410:{id:"n3410",loc:[-85.633292,41.953691]},n3411:{id:"n3411",loc:[-85.637432,41.952399]},n3412:{id:"n3412",loc:[-85.633349,41.957422]},n3413:{id:"n3413",loc:[-85.633326,41.955909]},n3414:{id:"n3414",loc:[-85.633307,41.954673]},n3415:{id:"n3415",loc:[-85.633273,41.952436]},n3416:{id:"n3416",loc:[-85.633361,41.95823],tags:{highway:"turning_circle"}},n3417:{id:"n3417",loc:[-85.619899,41.945527]},n3418:{id:"n3418",loc:[-85.643422,41.941946]},n3419:{id:"n3419",loc:[-85.643505,41.942033]},n342:{id:"n342",loc:[-85.633801,41.943261]},n3420:{id:"n3420",loc:[-85.620088,41.945571]},n3421:{id:"n3421",loc:[-85.620051,41.945505]},n3422:{id:"n3422",loc:[-85.62001,41.94541]},n3423:{id:"n3423",loc:[-85.620982,41.944742]},n3424:{id:"n3424",loc:[-85.621305,41.944782]},n3425:{id:"n3425",loc:[-85.621174,41.944819]},n3426:{id:"n3426",loc:[-85.621029,41.944871]},n3427:{id:"n3427",loc:[-85.620741,41.945011]},n3428:{id:"n3428",loc:[-85.620616,41.945085]},n3429:{id:"n3429",loc:[-85.620506,41.945172]},n343:{id:"n343",loc:[-85.63374,41.943514]},n3430:{id:"n3430",loc:[-85.620394,41.945273]},n3431:{id:"n3431",loc:[-85.620316,41.94536]},n3432:{id:"n3432",loc:[-85.620257,41.945452]},n3433:{id:"n3433",loc:[-85.620212,41.945535]},n3434:{id:"n3434",loc:[-85.620101,41.945811]},n3435:{id:"n3435",loc:[-85.620081,41.945937]},n3436:{id:"n3436",loc:[-85.619899,41.943718]},n3437:{id:"n3437",loc:[-85.619969,41.943211]},n3438:{id:"n3438",loc:[-85.619894,41.943292]},n3439:{id:"n3439",loc:[-85.620047,41.944738]},n344:{id:"n344",loc:[-85.633665,41.943441]},n3440:{id:"n3440",loc:[-85.620226,41.946088]},n3441:{id:"n3441",loc:[-85.620225,41.945864]},n3442:{id:"n3442",loc:[-85.620518,41.945863]},n3443:{id:"n3443",loc:[-85.620519,41.945944]},n3444:{id:"n3444",loc:[-85.620388,41.945944]},n3445:{id:"n3445",loc:[-85.620389,41.946088]},n3446:{id:"n3446",loc:[-85.618405,41.946566]},n3447:{id:"n3447",loc:[-85.619156,41.946562]},n3448:{id:"n3448",loc:[-85.619154,41.946319]},n3449:{id:"n3449",loc:[-85.618736,41.946322]},n345:{id:"n345",loc:[-85.633162,41.942947]},n3450:{id:"n3450",loc:[-85.618733,41.94612]},n3451:{id:"n3451",loc:[-85.619317,41.946116]},n3452:{id:"n3452",loc:[-85.619316,41.946023]},n3453:{id:"n3453",loc:[-85.619622,41.946021]},n3454:{id:"n3454",loc:[-85.619624,41.946171]},n3455:{id:"n3455",loc:[-85.61977,41.94617]},n3456:{id:"n3456",loc:[-85.619769,41.94602]},n3457:{id:"n3457",loc:[-85.619732,41.94602]},n3458:{id:"n3458",loc:[-85.619731,41.945856]},n3459:{id:"n3459",loc:[-85.619617,41.945857]},n346:{id:"n346",loc:[-85.633598,41.943083]},n3460:{id:"n3460",loc:[-85.619616,41.945776]},n3461:{id:"n3461",loc:[-85.619447,41.945777]},n3462:{id:"n3462",loc:[-85.619415,41.945778]},n3463:{id:"n3463",loc:[-85.618378,41.945788]},n3464:{id:"n3464",loc:[-85.618384,41.946132]},n3465:{id:"n3465",loc:[-85.618503,41.94613]},n3466:{id:"n3466",loc:[-85.618506,41.946319]},n3467:{id:"n3467",loc:[-85.6184,41.94632]},n3468:{id:"n3468",loc:[-85.618248,41.946416]},n3469:{id:"n3469",loc:[-85.618247,41.946319]},n347:{id:"n347",loc:[-85.63343,41.943179]},n3470:{id:"n3470",loc:[-85.618039,41.946321]},n3471:{id:"n3471",loc:[-85.61804,41.946418]},n3472:{id:"n3472",loc:[-85.620118,41.951895]},n3473:{id:"n3473",loc:[-85.617075,41.95469]},n3474:{id:"n3474",loc:[-85.620107,41.952113]},n3475:{id:"n3475",loc:[-85.620091,41.95232]},n3476:{id:"n3476",loc:[-85.620047,41.952505]},n3477:{id:"n3477",loc:[-85.61998,41.952715]},n3478:{id:"n3478",loc:[-85.619861,41.952986]},n3479:{id:"n3479",loc:[-85.619622,41.953365]},n348:{id:"n348",loc:[-85.633669,41.94341]},n3480:{id:"n3480",loc:[-85.619441,41.953567]},n3481:{id:"n3481",loc:[-85.619259,41.953741]},n3482:{id:"n3482",loc:[-85.618835,41.954056]},n3483:{id:"n3483",loc:[-85.618602,41.954194]},n3484:{id:"n3484",loc:[-85.618305,41.954347]},n3485:{id:"n3485",loc:[-85.618006,41.954466]},n3486:{id:"n3486",loc:[-85.617611,41.954587]},n3487:{id:"n3487",loc:[-85.615094,41.943412]},n3488:{id:"n3488",loc:[-85.619337,41.943025]},n3489:{id:"n3489",loc:[-85.610477,41.945527]},n349:{id:"n349",loc:[-85.633566,41.943466]},n3490:{id:"n3490",loc:[-85.610477,41.943718]},n3491:{id:"n3491",loc:[-85.619804,41.942976]},n3492:{id:"n3492",loc:[-85.61921,41.942672]},n3493:{id:"n3493",loc:[-85.619862,41.942836]},n3494:{id:"n3494",loc:[-85.616326,41.942769]},n3495:{id:"n3495",loc:[-85.617953,41.942917]},n3496:{id:"n3496",loc:[-85.61972,41.942728]},n3497:{id:"n3497",loc:[-85.61944,41.942784]},n3498:{id:"n3498",loc:[-85.615323,41.942841]},n3499:{id:"n3499",loc:[-85.612923,41.943718]},n35:{id:"n35",loc:[-85.637928,41.944249]},n350:{id:"n350",loc:[-85.633031,41.942986]},n3500:{id:"n3500",loc:[-85.61958,41.942756]},n3501:{id:"n3501",loc:[-85.619643,41.942647],tags:{leisure:"fishing"}},n3502:{id:"n3502",loc:[-85.619935,41.942962]},n3503:{id:"n3503",loc:[-85.629677,41.954687]},n3504:{id:"n3504",loc:[-85.629083,41.953722]},n3505:{id:"n3505",loc:[-85.621907,41.952067]},n3506:{id:"n3506",loc:[-85.621788,41.952058]},n3507:{id:"n3507",loc:[-85.629665,41.953718]},n3508:{id:"n3508",loc:[-85.624454,41.954707]},n3509:{id:"n3509",loc:[-85.634609,41.954585]},n351:{id:"n351",loc:[-85.633238,41.94283]},n3510:{id:"n3510",loc:[-85.634595,41.953772]},n3511:{id:"n3511",loc:[-85.633425,41.953783]},n3512:{id:"n3512",loc:[-85.633439,41.954596]},n3517:{id:"n3517",loc:[-85.621789,41.952179]},n3518:{id:"n3518",loc:[-85.624105,41.954704]},n3519:{id:"n3519",loc:[-85.623306,41.954542]},n352:{id:"n352",loc:[-85.633173,41.943556]},n3520:{id:"n3520",loc:[-85.623123,41.954502]},n3521:{id:"n3521",loc:[-85.622965,41.954473]},n3522:{id:"n3522",loc:[-85.622822,41.954455]},n3523:{id:"n3523",loc:[-85.62269,41.954448]},n3524:{id:"n3524",loc:[-85.622388,41.954467]},n3525:{id:"n3525",loc:[-85.62403,41.954895]},n3526:{id:"n3526",loc:[-85.623579,41.954855]},n3527:{id:"n3527",loc:[-85.623836,41.954951]},n3528:{id:"n3528",loc:[-85.622473,41.954592]},n3529:{id:"n3529",loc:[-85.622753,41.95458]},n353:{id:"n353",loc:[-85.633127,41.943552]},n3530:{id:"n3530",loc:[-85.62404,41.955078]},n3531:{id:"n3531",loc:[-85.624126,41.954999]},n3532:{id:"n3532",loc:[-85.623171,41.954687]},n3533:{id:"n3533",loc:[-85.624276,41.955206]},n3534:{id:"n3534",loc:[-85.62491,41.952801]},n3535:{id:"n3535",loc:[-85.625186,41.952756]},n3536:{id:"n3536",loc:[-85.625552,41.952792]},n3537:{id:"n3537",loc:[-85.626001,41.952948]},n3538:{id:"n3538",loc:[-85.626528,41.952984]},n3539:{id:"n3539",loc:[-85.626942,41.952886]},n354:{id:"n354",loc:[-85.632745,41.943222]},n3540:{id:"n3540",loc:[-85.627092,41.952685]},n3541:{id:"n3541",loc:[-85.627212,41.95244]},n3542:{id:"n3542",loc:[-85.627158,41.952226]},n3543:{id:"n3543",loc:[-85.627002,41.951972]},n3544:{id:"n3544",loc:[-85.626822,41.951838]},n3545:{id:"n3545",loc:[-85.626528,41.951807]},n3546:{id:"n3546",loc:[-85.625653,41.951852]},n3547:{id:"n3547",loc:[-85.625348,41.951834]},n3548:{id:"n3548",loc:[-85.625114,41.951767]},n3549:{id:"n3549",loc:[-85.620627,41.954682]},n355:{id:"n355",loc:[-85.632756,41.943199]},n3550:{id:"n3550",loc:[-85.622758,41.951884]},n3551:{id:"n3551",loc:[-85.618135,41.954734]},n3552:{id:"n3552",loc:[-85.620229,41.95472]},n3553:{id:"n3553",loc:[-85.624491,41.955573]},n3554:{id:"n3554",loc:[-85.621792,41.958314]},n3555:{id:"n3555",loc:[-85.623395,41.960001]},n3556:{id:"n3556",loc:[-85.620461,41.956212]},n3557:{id:"n3557",loc:[-85.62109,41.956766]},n3558:{id:"n3558",loc:[-85.620246,41.956224]},n3559:{id:"n3559",loc:[-85.625017,41.956068]},n356:{id:"n356",loc:[-85.632855,41.943147]},n3560:{id:"n3560",loc:[-85.622795,41.959702]},n3561:{id:"n3561",loc:[-85.621573,41.958457]},n3562:{id:"n3562",loc:[-85.619631,41.9573]},n3563:{id:"n3563",loc:[-85.62095,41.956311]},n3564:{id:"n3564",loc:[-85.619694,41.957408]},n3565:{id:"n3565",loc:[-85.621079,41.957751]},n3566:{id:"n3566",loc:[-85.622426,41.961142]},n3567:{id:"n3567",loc:[-85.623251,41.960484]},n3568:{id:"n3568",loc:[-85.619084,41.956291]},n3569:{id:"n3569",loc:[-85.622227,41.959303]},n357:{id:"n357",loc:[-85.632888,41.94315]},n3570:{id:"n3570",loc:[-85.620976,41.959104]},n3571:{id:"n3571",loc:[-85.621208,41.95653]},n3572:{id:"n3572",loc:[-85.623531,41.95951]},n3573:{id:"n3573",loc:[-85.623556,41.957935]},n3574:{id:"n3574",loc:[-85.623037,41.95746]},n3575:{id:"n3575",loc:[-85.621175,41.956427]},n3576:{id:"n3576",loc:[-85.622651,41.960109]},n3577:{id:"n3577",loc:[-85.621803,41.960747]},n3578:{id:"n3578",loc:[-85.620791,41.961874]},n3579:{id:"n3579",loc:[-85.625295,41.956786]},n358:{id:"n358",loc:[-85.633232,41.943547]},n3580:{id:"n3580",loc:[-85.619662,41.956894]},n3581:{id:"n3581",loc:[-85.622442,41.958708]},n3582:{id:"n3582",loc:[-85.621744,41.955864]},n3583:{id:"n3583",loc:[-85.621336,41.959212]},n3584:{id:"n3584",loc:[-85.622801,41.957304]},n3585:{id:"n3585",loc:[-85.619973,41.957433]},n3586:{id:"n3586",loc:[-85.619556,41.955717]},n3587:{id:"n3587",loc:[-85.622978,41.958601]},n3588:{id:"n3588",loc:[-85.625396,41.956264]},n3589:{id:"n3589",loc:[-85.623525,41.958034]},n359:{id:"n359",loc:[-85.633302,41.94351]},n3590:{id:"n3590",loc:[-85.623299,41.959631]},n3591:{id:"n3591",loc:[-85.622678,41.959873]},n3592:{id:"n3592",loc:[-85.625553,41.956179]},n3593:{id:"n3593",loc:[-85.623557,41.959231]},n3594:{id:"n3594",loc:[-85.622843,41.957373]},n3595:{id:"n3595",loc:[-85.619378,41.955677]},n3596:{id:"n3596",loc:[-85.620092,41.955425]},n3597:{id:"n3597",loc:[-85.622666,41.96044]},n3598:{id:"n3598",loc:[-85.621996,41.960256]},n3599:{id:"n3599",loc:[-85.623273,41.959997]},n36:{id:"n36",loc:[-85.637894,41.945551]},n360:{id:"n360",loc:[-85.633442,41.943794],tags:{highway:"crossing"}},n3600:{id:"n3600",loc:[-85.62477,41.95689]},n3601:{id:"n3601",loc:[-85.621641,41.955015]},n3602:{id:"n3602",loc:[-85.622495,41.960392]},n3603:{id:"n3603",loc:[-85.61918,41.955565]},n3604:{id:"n3604",loc:[-85.620017,41.955505]},n3605:{id:"n3605",loc:[-85.621739,41.956315]},n3606:{id:"n3606",loc:[-85.622957,41.959837]},n3607:{id:"n3607",loc:[-85.620912,41.960919]},n3608:{id:"n3608",loc:[-85.625231,41.956235]},n3609:{id:"n3609",loc:[-85.620976,41.961868]},n361:{id:"n361",loc:[-85.633381,41.94383]},n3610:{id:"n3610",loc:[-85.620956,41.958908]},n3611:{id:"n3611",loc:[-85.619035,41.956139]},n3612:{id:"n3612",loc:[-85.623643,41.958669]},n3613:{id:"n3613",loc:[-85.61949,41.956539]},n3614:{id:"n3614",loc:[-85.621927,41.958242]},n3615:{id:"n3615",loc:[-85.620826,41.955721]},n3616:{id:"n3616",loc:[-85.621202,41.961321]},n3617:{id:"n3617",loc:[-85.624877,41.95594]},n3618:{id:"n3618",loc:[-85.62065,41.958369]},n3619:{id:"n3619",loc:[-85.621524,41.956279]},n362:{id:"n362",loc:[-85.632977,41.944053]},n3620:{id:"n3620",loc:[-85.624662,41.955932]},n3621:{id:"n3621",loc:[-85.623048,41.958509]},n3622:{id:"n3622",loc:[-85.62111,41.95754]},n3623:{id:"n3623",loc:[-85.621508,41.954847]},n3624:{id:"n3624",loc:[-85.620655,41.958601]},n3625:{id:"n3625",loc:[-85.62154,41.954971]},n3626:{id:"n3626",loc:[-85.621691,41.955521]},n3627:{id:"n3627",loc:[-85.62154,41.954739]},n3628:{id:"n3628",loc:[-85.621996,41.959913]},n3629:{id:"n3629",loc:[-85.622286,41.960699]},n363:{id:"n363",loc:[-85.632915,41.943981],tags:{crossing:"zebra",highway:"crossing"}},n3630:{id:"n3630",loc:[-85.622844,41.9572]},n3631:{id:"n3631",loc:[-85.620252,41.955446]},n3632:{id:"n3632",loc:[-85.623434,41.957528]},n3633:{id:"n3633",loc:[-85.623429,41.956858]},n3634:{id:"n3634",loc:[-85.622957,41.957137]},n3635:{id:"n3635",loc:[-85.622554,41.959027]},n3636:{id:"n3636",loc:[-85.623289,41.958314]},n3637:{id:"n3637",loc:[-85.622977,41.960855]},n3638:{id:"n3638",loc:[-85.624008,41.956953]},n3639:{id:"n3639",loc:[-85.621278,41.960855]},n364:{id:"n364",loc:[-85.632724,41.943969],tags:{crossing:"zebra",highway:"crossing"}},n3640:{id:"n3640",loc:[-85.623128,41.956993]},n3641:{id:"n3641",loc:[-85.622452,41.959183]},n3642:{id:"n3642",loc:[-85.621095,41.961082]},n3643:{id:"n3643",loc:[-85.622011,41.960544]},n3644:{id:"n3644",loc:[-85.621637,41.955385]},n3645:{id:"n3645",loc:[-85.620999,41.959271]},n3646:{id:"n3646",loc:[-85.620044,41.956347]},n3647:{id:"n3647",loc:[-85.621936,41.959682]},n3648:{id:"n3648",loc:[-85.623761,41.95685]},n3649:{id:"n3649",loc:[-85.621239,41.959343]},n365:{id:"n365",loc:[-85.632621,41.944034]},n3650:{id:"n3650",loc:[-85.621073,41.956012]},n3651:{id:"n3651",loc:[-85.621271,41.956184]},n3652:{id:"n3652",loc:[-85.623444,41.95778]},n3653:{id:"n3653",loc:[-85.62125,41.96186]},n3654:{id:"n3654",loc:[-85.62169,41.961059]},n3655:{id:"n3655",loc:[-85.620012,41.955637]},n3656:{id:"n3656",loc:[-85.621058,41.9573]},n3657:{id:"n3657",loc:[-85.621138,41.957663]},n3658:{id:"n3658",loc:[-85.620773,41.957895]},n3659:{id:"n3659",loc:[-85.62007,41.957157]},n366:{id:"n366",loc:[-85.632684,41.944109],tags:{crossing:"zebra",highway:"crossing"}},n3660:{id:"n3660",loc:[-85.624534,41.955844]},n3661:{id:"n3661",loc:[-85.621932,41.960807]},n3662:{id:"n3662",loc:[-85.623358,41.958138]},n3663:{id:"n3663",loc:[-85.620456,41.955514]},n3664:{id:"n3664",loc:[-85.623504,41.957607]},n3665:{id:"n3665",loc:[-85.621444,41.960751]},n3666:{id:"n3666",loc:[-85.623492,41.960213]},n3667:{id:"n3667",loc:[-85.621669,41.954655]},n3668:{id:"n3668",loc:[-85.623106,41.958685]},n3669:{id:"n3669",loc:[-85.620922,41.957867]},n367:{id:"n367",loc:[-85.632738,41.944172]},n3670:{id:"n3670",loc:[-85.620092,41.957296]},n3671:{id:"n3671",loc:[-85.621669,41.955222]},n3672:{id:"n3672",loc:[-85.621614,41.960967]},n3673:{id:"n3673",loc:[-85.621691,41.955732]},n3674:{id:"n3674",loc:[-85.619207,41.956419]},n3675:{id:"n3675",loc:[-85.621116,41.956603]},n3676:{id:"n3676",loc:[-85.623311,41.956929]},n3677:{id:"n3677",loc:[-85.625671,41.956499]},n3678:{id:"n3678",loc:[-85.623525,41.956738]},n3679:{id:"n3679",loc:[-85.625381,41.956634]},n368:{id:"n368",loc:[-85.63287,41.944135],tags:{crossing:"zebra",highway:"crossing"}},n3680:{id:"n3680",loc:[-85.620096,41.95677]},n3681:{id:"n3681",loc:[-85.623803,41.958745]},n3682:{id:"n3682",loc:[-85.623498,41.958457]},n3683:{id:"n3683",loc:[-85.624223,41.957009]},n3684:{id:"n3684",loc:[-85.620026,41.956946]},n3685:{id:"n3685",loc:[-85.623005,41.960124]},n3686:{id:"n3686",loc:[-85.619073,41.955832]},n3687:{id:"n3687",loc:[-85.621744,41.95501]},n3688:{id:"n3688",loc:[-85.620804,41.958781]},n3689:{id:"n3689",loc:[-85.619844,41.957448]},n369:{id:"n369",loc:[-85.63298,41.944076]},n3690:{id:"n3690",loc:[-85.623713,41.958872]},n3691:{id:"n3691",loc:[-85.622329,41.960507]},n3692:{id:"n3692",loc:[-85.620804,41.956244]},n3693:{id:"n3693",loc:[-85.621818,41.955968]},n3694:{id:"n3694",loc:[-85.621405,41.958697]},n3695:{id:"n3695",loc:[-85.620998,41.960996]},n3696:{id:"n3696",loc:[-85.621621,41.960444]},n3697:{id:"n3697",loc:[-85.620941,41.961637]},n3698:{id:"n3698",loc:[-85.622195,41.958333]},n3699:{id:"n3699",loc:[-85.621668,41.961529]},n37:{id:"n37",loc:[-85.637611,41.945383]},n370:{id:"n370",loc:[-85.633191,41.944471]},n3700:{id:"n3700",loc:[-85.621015,41.957049]},n3701:{id:"n3701",loc:[-85.619368,41.955521]},n3702:{id:"n3702",loc:[-85.651578,41.942534]},n3703:{id:"n3703",loc:[-85.651541,41.943847]},n3704:{id:"n3704",loc:[-85.651365,41.944817]},n3705:{id:"n3705",loc:[-85.651076,41.945985]},n3706:{id:"n3706",loc:[-85.650626,41.947213]},n3707:{id:"n3707",loc:[-85.649669,41.949161]},n3708:{id:"n3708",loc:[-85.641802,41.961801]},n3709:{id:"n3709",loc:[-85.623333,41.961987]},n371:{id:"n371",loc:[-85.633132,41.94372]},n3710:{id:"n3710",loc:[-85.620621,41.965658]},n3711:{id:"n3711",loc:[-85.605673,41.965764]},n3712:{id:"n3712",loc:[-85.605664,41.962094]},n3713:{id:"n3713",loc:[-85.583774,41.962178]},n3714:{id:"n3714",loc:[-85.583774,41.961789]},n3715:{id:"n3715",loc:[-85.581303,41.961783]},n3716:{id:"n3716",loc:[-85.581245,41.958394]},n3717:{id:"n3717",loc:[-85.585299,41.955483]},n3718:{id:"n3718",loc:[-85.585588,41.955331]},n3719:{id:"n3719",loc:[-85.586053,41.955163]},n372:{id:"n372",loc:[-85.633011,41.943788]},n3720:{id:"n3720",loc:[-85.58632,41.955076]},n3721:{id:"n3721",loc:[-85.586478,41.955025]},n3722:{id:"n3722",loc:[-85.58692,41.954947]},n3723:{id:"n3723",loc:[-85.587345,41.954913]},n3724:{id:"n3724",loc:[-85.605592,41.954766]},n3725:{id:"n3725",loc:[-85.605303,41.936236]},n3726:{id:"n3726",loc:[-85.606941,41.936117]},n3727:{id:"n3727",loc:[-85.60876,41.935856]},n3728:{id:"n3728",loc:[-85.610092,41.935451]},n3729:{id:"n3729",loc:[-85.610681,41.935247]},n373:{id:"n373",loc:[-85.632854,41.943632]},n3730:{id:"n3730",loc:[-85.611446,41.934955]},n3731:{id:"n3731",loc:[-85.612057,41.934696]},n3732:{id:"n3732",loc:[-85.613256,41.934084]},n3733:{id:"n3733",loc:[-85.613948,41.933682]},n3734:{id:"n3734",loc:[-85.614638,41.933212]},n3735:{id:"n3735",loc:[-85.619801,41.929305]},n3736:{id:"n3736",loc:[-85.619768,41.925548]},n3737:{id:"n3737",loc:[-85.625761,41.925597]},n3738:{id:"n3738",loc:[-85.6263,41.927323]},n3739:{id:"n3739",loc:[-85.633708,41.927402]},n374:{id:"n374",loc:[-85.632974,41.943565]},n3740:{id:"n3740",loc:[-85.633927,41.929109]},n3741:{id:"n3741",loc:[-85.639213,41.929088]},n3742:{id:"n3742",loc:[-85.639204,41.925488]},n3743:{id:"n3743",loc:[-85.651425,41.925406]},n3744:{id:"n3744",loc:[-85.643386,41.941933]},n3745:{id:"n3745",loc:[-85.642776,41.941161]},n3746:{id:"n3746",loc:[-85.637277,41.948812]},n3747:{id:"n3747",loc:[-85.637366,41.94897]},n3748:{id:"n3748",loc:[-85.637329,41.94889]},n3749:{id:"n3749",loc:[-85.629649,41.952596]},n375:{id:"n375",loc:[-85.632741,41.943351]},n3750:{id:"n3750",loc:[-85.630291,41.954684]},n3751:{id:"n3751",loc:[-85.630284,41.953713]},n3752:{id:"n3752",loc:[-85.630269,41.952463]},n3753:{id:"n3753",loc:[-85.633933,41.949896]},n3754:{id:"n3754",loc:[-85.629339,41.941467]},n3755:{id:"n3755",loc:[-85.629857,41.94316]},n3756:{id:"n3756",loc:[-85.629987,41.944025]},n3757:{id:"n3757",loc:[-85.628538,41.948604]},n3758:{id:"n3758",loc:[-85.627415,41.957442]},n3759:{id:"n3759",loc:[-85.627019,41.957369]},n376:{id:"n376",loc:[-85.63251,41.943481]},n3760:{id:"n3760",loc:[-85.62167,41.952179]},n3761:{id:"n3761",loc:[-85.62167,41.952138]},n3762:{id:"n3762",loc:[-85.621562,41.952139]},n3763:{id:"n3763",loc:[-85.621562,41.952058]},n3764:{id:"n3764",loc:[-85.621476,41.952043]},n3765:{id:"n3765",loc:[-85.621477,41.952132]},n3766:{id:"n3766",loc:[-85.621386,41.952132]},n3767:{id:"n3767",loc:[-85.621387,41.95214]},n3768:{id:"n3768",loc:[-85.621262,41.95214]},n3769:{id:"n3769",loc:[-85.621261,41.952038]},n377:{id:"n377",loc:[-85.632706,41.943715]},n3770:{id:"n3770",loc:[-85.621389,41.952038]},n3771:{id:"n3771",loc:[-85.621389,41.952043]},n3772:{id:"n3772",loc:[-85.620898,41.952024]},n3773:{id:"n3773",loc:[-85.620898,41.952085]},n3774:{id:"n3774",loc:[-85.620774,41.952084]},n3775:{id:"n3775",loc:[-85.620774,41.952023]},n3776:{id:"n3776",loc:[-85.620749,41.952036]},n3777:{id:"n3777",loc:[-85.620723,41.952097]},n3778:{id:"n3778",loc:[-85.626158,41.958996]},n3779:{id:"n3779",loc:[-85.626319,41.958686]},n378:{id:"n378",loc:[-85.638683,41.943295]},n3780:{id:"n3780",loc:[-85.626119,41.958629]},n3781:{id:"n3781",loc:[-85.626064,41.958733]},n3782:{id:"n3782",loc:[-85.626155,41.958759]},n3783:{id:"n3783",loc:[-85.626048,41.958965]},n3784:{id:"n3784",loc:[-85.620648,41.952079]},n3785:{id:"n3785",loc:[-85.63826,41.961213]},n3786:{id:"n3786",loc:[-85.638003,41.961614]},n3787:{id:"n3787",loc:[-85.638817,41.961902]},n3788:{id:"n3788",loc:[-85.639073,41.961501]},n3789:{id:"n3789",loc:[-85.620674,41.952018]},n379:{id:"n379",loc:[-85.638684,41.94323]},n3790:{id:"n3790",loc:[-85.62082,41.952106]},n3791:{id:"n3791",loc:[-85.620819,41.952143]},n3792:{id:"n3792",loc:[-85.620778,41.952143]},n3793:{id:"n3793",loc:[-85.620778,41.952106]},n3794:{id:"n3794",loc:[-85.620563,41.952276]},n3795:{id:"n3795",loc:[-85.620543,41.95238]},n3796:{id:"n3796",loc:[-85.620422,41.952367]},n3797:{id:"n3797",loc:[-85.620441,41.952263]},n3798:{id:"n3798",loc:[-85.620561,41.952266]},n3799:{id:"n3799",loc:[-85.620444,41.952254]},n38:{id:"n38",loc:[-85.63879,41.943295]},n380:{id:"n380",loc:[-85.638627,41.94322]},n3800:{id:"n3800",loc:[-85.620773,41.955585]},n3801:{id:"n3801",loc:[-85.621265,41.955989]},n3802:{id:"n3802",loc:[-85.620692,41.954969]},n3803:{id:"n3803",loc:[-85.620691,41.955367]},n3804:{id:"n3804",loc:[-85.620458,41.952178]},n3805:{id:"n3805",loc:[-85.620575,41.95219]},n3806:{id:"n3806",loc:[-85.617609,41.952712]},n3807:{id:"n3807",loc:[-85.617533,41.952801],tags:{entrance:"yes"}},n3808:{id:"n3808",loc:[-85.616816,41.952911]},n3809:{id:"n3809",loc:[-85.616797,41.952901]},n381:{id:"n381",loc:[-85.638624,41.943294]},n3810:{id:"n3810",loc:[-85.616343,41.952694]},n3811:{id:"n3811",loc:[-85.616336,41.952729]},n3812:{id:"n3812",loc:[-85.616343,41.952772]},n3813:{id:"n3813",loc:[-85.628479,41.948649]},n3814:{id:"n3814",loc:[-85.628413,41.948679]},n3815:{id:"n3815",loc:[-85.628336,41.948694]},n3816:{id:"n3816",loc:[-85.62826,41.948694]},n3817:{id:"n3817",loc:[-85.628185,41.948679]},n3818:{id:"n3818",loc:[-85.628103,41.948649]},n3819:{id:"n3819",loc:[-85.627482,41.948395]},n382:{id:"n382",loc:[-85.638437,41.943291]},n3820:{id:"n3820",loc:[-85.619957,41.951168]},n3821:{id:"n3821",loc:[-85.619955,41.952077]},n3822:{id:"n3822",loc:[-85.619843,41.952666]},n3823:{id:"n3823",loc:[-85.619513,41.95324]},n3824:{id:"n3824",loc:[-85.619163,41.953668]},n3825:{id:"n3825",loc:[-85.618813,41.953947]},n3826:{id:"n3826",loc:[-85.618265,41.954252]},n3827:{id:"n3827",loc:[-85.617691,41.954458]},n3828:{id:"n3828",loc:[-85.616978,41.95459]},n3829:{id:"n3829",loc:[-85.615408,41.954628]},n383:{id:"n383",loc:[-85.63844,41.943209]},n3830:{id:"n3830",loc:[-85.615374,41.951076]},n3831:{id:"n3831",loc:[-85.61932,41.947564]},n3832:{id:"n3832",loc:[-85.610553,41.94755]},n3833:{id:"n3833",loc:[-85.610572,41.951065]},n3834:{id:"n3834",loc:[-85.617548,41.94757]},n3835:{id:"n3835",loc:[-85.619842,41.947939]},n3836:{id:"n3836",loc:[-85.619874,41.950905]},n3837:{id:"n3837",loc:[-85.619695,41.950911]},n3838:{id:"n3838",loc:[-85.617591,41.951078]},n3839:{id:"n3839",loc:[-85.619551,41.951065]},n384:{id:"n384",loc:[-85.632616,41.944021]},n3840:{id:"n3840",loc:[-85.626813,41.947337]},n3841:{id:"n3841",loc:[-85.616371,41.952814]},n3842:{id:"n3842",loc:[-85.617205,41.951308]},n3843:{id:"n3843",loc:[-85.616795,41.950953]},n3844:{id:"n3844",loc:[-85.617441,41.950889]},n3845:{id:"n3845",loc:[-85.619155,41.949377]},n3846:{id:"n3846",loc:[-85.618556,41.949377]},n3847:{id:"n3847",loc:[-85.618557,41.948372]},n3848:{id:"n3848",loc:[-85.619156,41.948372]},n3849:{id:"n3849",loc:[-85.61927,41.949796]},n385:{id:"n385",loc:[-85.632319,41.944172]},n3850:{id:"n3850",loc:[-85.61926,41.948344]},n3851:{id:"n3851",loc:[-85.619219,41.948264]},n3852:{id:"n3852",loc:[-85.619147,41.948196]},n3853:{id:"n3853",loc:[-85.619049,41.948144]},n3854:{id:"n3854",loc:[-85.618942,41.948116]},n3855:{id:"n3855",loc:[-85.618822,41.948109]},n3856:{id:"n3856",loc:[-85.618699,41.94813]},n3857:{id:"n3857",loc:[-85.618937,41.951943]},n3858:{id:"n3858",loc:[-85.616762,41.952222]},n3859:{id:"n3859",loc:[-85.616799,41.95472]},n386:{id:"n386",loc:[-85.63221,41.944066]},n3860:{id:"n3860",loc:[-85.616458,41.954735]},n3861:{id:"n3861",loc:[-85.61763,41.951515]},n3862:{id:"n3862",loc:[-85.617735,41.951572]},n3863:{id:"n3863",loc:[-85.61929,41.951573]},n3864:{id:"n3864",loc:[-85.617134,41.951348]},n3865:{id:"n3865",loc:[-85.616598,41.95192]},n3866:{id:"n3866",loc:[-85.616557,41.951997]},n3867:{id:"n3867",loc:[-85.61658,41.952093]},n3868:{id:"n3868",loc:[-85.616636,41.952145]},n3869:{id:"n3869",loc:[-85.616918,41.952276]},n387:{id:"n387",loc:[-85.632524,41.943912]},n3870:{id:"n3870",loc:[-85.617098,41.952235]},n3871:{id:"n3871",loc:[-85.61892,41.951467]},n3872:{id:"n3872",loc:[-85.618035,41.951473]},n3873:{id:"n3873",loc:[-85.618036,41.951572]},n3874:{id:"n3874",loc:[-85.61892,41.951573]},n3875:{id:"n3875",loc:[-85.618919,41.951957]},n3876:{id:"n3876",loc:[-85.619457,41.952237]},n3877:{id:"n3877",loc:[-85.618178,41.953618]},n3878:{id:"n3878",loc:[-85.617658,41.953366]},n3879:{id:"n3879",loc:[-85.617987,41.953024]},n388:{id:"n388",loc:[-85.632268,41.943621]},n3880:{id:"n3880",loc:[-85.618429,41.953248]},n3881:{id:"n3881",loc:[-85.618554,41.953119]},n3882:{id:"n3882",loc:[-85.618077,41.952868]},n3883:{id:"n3883",loc:[-85.618039,41.952886]},n3884:{id:"n3884",loc:[-85.619375,41.952169]},n3885:{id:"n3885",loc:[-85.618137,41.953538]},n3886:{id:"n3886",loc:[-85.61799,41.953555]},n3887:{id:"n3887",loc:[-85.617729,41.953423]},n3888:{id:"n3888",loc:[-85.618101,41.953029]},n3889:{id:"n3889",loc:[-85.618516,41.953119]},n389:{id:"n389",loc:[-85.631951,41.943773]},n3890:{id:"n3890",loc:[-85.619132,41.952042]},n3891:{id:"n3891",loc:[-85.618235,41.952981]},n3892:{id:"n3892",loc:[-85.618485,41.952425]},n3893:{id:"n3893",loc:[-85.618676,41.952519]},n3894:{id:"n3894",loc:[-85.618942,41.952648]},n3895:{id:"n3895",loc:[-85.618287,41.953122]},n3896:{id:"n3896",loc:[-85.617914,41.953516]},n3897:{id:"n3897",loc:[-85.617836,41.953573]},n3898:{id:"n3898",loc:[-85.616477,41.95289]},n3899:{id:"n3899",loc:[-85.618441,41.953201]},n39:{id:"n39",loc:[-85.619931,41.951013]},n390:{id:"n390",loc:[-85.631981,41.943654]},n3900:{id:"n3900",loc:[-85.617537,41.953335]},n3901:{id:"n3901",loc:[-85.617221,41.953166]},n3902:{id:"n3902",loc:[-85.617253,41.953135]},n3903:{id:"n3903",loc:[-85.617211,41.953114]},n3904:{id:"n3904",loc:[-85.617197,41.95313]},n3905:{id:"n3905",loc:[-85.616802,41.952925]},n3906:{id:"n3906",loc:[-85.616771,41.952928]},n3907:{id:"n3907",loc:[-85.616493,41.952785]},n3908:{id:"n3908",loc:[-85.616823,41.952426]},n3909:{id:"n3909",loc:[-85.617191,41.952616]},n391:{id:"n391",loc:[-85.631886,41.943699]},n3910:{id:"n3910",loc:[-85.61724,41.952559]},n3911:{id:"n3911",loc:[-85.61721,41.952542]},n3912:{id:"n3912",loc:[-85.617395,41.952351]},n3913:{id:"n3913",loc:[-85.617426,41.952368]},n3914:{id:"n3914",loc:[-85.617483,41.952309]},n3915:{id:"n3915",loc:[-85.617332,41.952229]},n3916:{id:"n3916",loc:[-85.617451,41.952102]},n3917:{id:"n3917",loc:[-85.617477,41.952115]},n3918:{id:"n3918",loc:[-85.617658,41.951923]},n3919:{id:"n3919",loc:[-85.617634,41.95191]},n392:{id:"n392",loc:[-85.631807,41.943606]},n3920:{id:"n3920",loc:[-85.617747,41.951786]},n3921:{id:"n3921",loc:[-85.618268,41.952056]},n3922:{id:"n3922",loc:[-85.618211,41.952122]},n3923:{id:"n3923",loc:[-85.618386,41.95222]},n3924:{id:"n3924",loc:[-85.618098,41.952527]},n3925:{id:"n3925",loc:[-85.617916,41.95243]},n3926:{id:"n3926",loc:[-85.617854,41.952498]},n3927:{id:"n3927",loc:[-85.617769,41.952453]},n3928:{id:"n3928",loc:[-85.617476,41.952773]},n3929:{id:"n3929",loc:[-85.617876,41.952973]},n393:{id:"n393",loc:[-85.631902,41.943561]},n3930:{id:"n3930",loc:[-85.617174,41.953638]},n3931:{id:"n3931",loc:[-85.618016,41.953578]},n3932:{id:"n3932",loc:[-85.618107,41.953628]},n3933:{id:"n3933",loc:[-85.618067,41.954268]},n3934:{id:"n3934",loc:[-85.617864,41.954263]},n3935:{id:"n3935",loc:[-85.61762,41.954205]},n3936:{id:"n3936",loc:[-85.617437,41.954103]},n3937:{id:"n3937",loc:[-85.617294,41.953978]},n3938:{id:"n3938",loc:[-85.617217,41.95384]},n3939:{id:"n3939",loc:[-85.616814,41.954327]},n394:{id:"n394",loc:[-85.63236,41.943543]},n3940:{id:"n3940",loc:[-85.616778,41.95381]},n3941:{id:"n3941",loc:[-85.616585,41.953707]},n3942:{id:"n3942",loc:[-85.616458,41.954318]},n3943:{id:"n3943",loc:[-85.616643,41.954345]},n3944:{id:"n3944",loc:[-85.618133,41.951412]},n3945:{id:"n3945",loc:[-85.618326,41.951411]},n3946:{id:"n3946",loc:[-85.618503,41.95141]},n3947:{id:"n3947",loc:[-85.618681,41.951409]},n3948:{id:"n3948",loc:[-85.618868,41.951408]},n3949:{id:"n3949",loc:[-85.617047,41.95136]},n395:{id:"n395",loc:[-85.633839,41.944082]},n3950:{id:"n3950",loc:[-85.616502,41.951946]},n3951:{id:"n3951",loc:[-85.616497,41.952072]},n3952:{id:"n3952",loc:[-85.616565,41.952165]},n3953:{id:"n3953",loc:[-85.616663,41.952218]},n3954:{id:"n3954",loc:[-85.616733,41.952255]},n3955:{id:"n3955",loc:[-85.617238,41.952512],tags:{entrance:"yes"}},n3956:{id:"n3956",loc:[-85.617043,41.952406]},n3957:{id:"n3957",loc:[-85.617691,41.951711]},n3958:{id:"n3958",loc:[-85.617773,41.951679]},n3959:{id:"n3959",loc:[-85.619085,41.951681]},n396:{id:"n396",loc:[-85.63376,41.944097]},n3960:{id:"n3960",loc:[-85.617943,41.952895]},n3961:{id:"n3961",loc:[-85.618039,41.952938]},n3962:{id:"n3962",loc:[-85.61763,41.95336]},n3963:{id:"n3963",loc:[-85.617554,41.95344]},n3964:{id:"n3964",loc:[-85.617381,41.952366],tags:{entrance:"yes"}},n3965:{id:"n3965",loc:[-85.617184,41.952254]},n3966:{id:"n3966",loc:[-85.617208,41.952496]},n3967:{id:"n3967",loc:[-85.617124,41.952581],tags:{entrance:"yes"}},n3968:{id:"n3968",loc:[-85.618094,41.952735]},n3969:{id:"n3969",loc:[-85.617702,41.952525],tags:{entrance:"yes"}},n397:{id:"n397",loc:[-85.63361,41.943957]},n3970:{id:"n3970",loc:[-85.617554,41.952686],tags:{entrance:"yes"}},n3971:{id:"n3971",loc:[-85.617959,41.952878]},n3972:{id:"n3972",loc:[-85.616367,41.952655]},n3973:{id:"n3973",loc:[-85.616416,41.952851]},n3974:{id:"n3974",loc:[-85.619777,41.951075]},n3975:{id:"n3975",loc:[-85.618611,41.94817]},n3976:{id:"n3976",loc:[-85.618538,41.948229]},n3977:{id:"n3977",loc:[-85.617421,41.947559]},n3978:{id:"n3978",loc:[-85.617395,41.951039]},n3979:{id:"n3979",loc:[-85.618488,41.94829]},n398:{id:"n398",loc:[-85.633309,41.943886]},n3980:{id:"n3980",loc:[-85.610238,41.954774]},n3981:{id:"n3981",loc:[-85.617449,41.950756]},n3982:{id:"n3982",loc:[-85.617288,41.951286]},n3983:{id:"n3983",loc:[-85.61745,41.950197]},n3984:{id:"n3984",loc:[-85.617436,41.948908]},n3985:{id:"n3985",loc:[-85.615915,41.953804]},n3986:{id:"n3986",loc:[-85.615953,41.953968]},n3987:{id:"n3987",loc:[-85.616031,41.954085]},n3988:{id:"n3988",loc:[-85.616135,41.954181]},n3989:{id:"n3989",loc:[-85.616273,41.954263]},n399:{id:"n399",loc:[-85.633226,41.943931]},n3990:{id:"n3990",loc:[-85.618327,41.951083]},n3991:{id:"n3991",loc:[-85.618135,41.951084]},n3992:{id:"n3992",loc:[-85.618503,41.951082]},n3993:{id:"n3993",loc:[-85.618682,41.951081]},n3994:{id:"n3994",loc:[-85.618864,41.951082]},n3995:{id:"n3995",loc:[-85.616761,41.950101]},n3996:{id:"n3996",loc:[-85.617317,41.947558]},n3997:{id:"n3997",loc:[-85.617336,41.948883]},n3998:{id:"n3998",loc:[-85.616779,41.949295]},n3999:{id:"n3999",loc:[-85.616754,41.949349]},n4:{id:"n4",loc:[-85.622764,41.950892],tags:{highway:"stop",direction:"forward",stop:"minor"}},n40:{id:"n40",loc:[-85.619841,41.951037]},n400:{id:"n400",loc:[-85.63326,41.943966]},n4000:{id:"n4000",loc:[-85.616761,41.950865]},n4001:{id:"n4001",loc:[-85.616883,41.951041]},n4002:{id:"n4002",loc:[-85.617004,41.951142]},n4003:{id:"n4003",loc:[-85.617062,41.951248]},n4004:{id:"n4004",loc:[-85.616809,41.949273]},n4005:{id:"n4005",loc:[-85.616755,41.949489]},n4006:{id:"n4006",loc:[-85.616759,41.949971]},n4007:{id:"n4007",loc:[-85.616757,41.949702]},n4008:{id:"n4008",loc:[-85.618456,41.94836]},n4009:{id:"n4009",loc:[-85.618447,41.948428]},n401:{id:"n401",loc:[-85.63324,41.943976]},n4010:{id:"n4010",loc:[-85.618437,41.949322]},n4011:{id:"n4011",loc:[-85.618447,41.949418]},n4012:{id:"n4012",loc:[-85.618478,41.949491]},n4013:{id:"n4013",loc:[-85.618535,41.949559]},n4014:{id:"n4014",loc:[-85.618623,41.94962]},n4015:{id:"n4015",loc:[-85.618721,41.94966]},n4016:{id:"n4016",loc:[-85.618838,41.949674]},n4017:{id:"n4017",loc:[-85.618967,41.949667]},n4018:{id:"n4018",loc:[-85.619065,41.949632]},n4019:{id:"n4019",loc:[-85.61915,41.949578]},n402:{id:"n402",loc:[-85.63327,41.944006]},n4020:{id:"n4020",loc:[-85.619216,41.949507]},n4021:{id:"n4021",loc:[-85.61927,41.949399]},n4022:{id:"n4022",loc:[-85.619074,41.947639]},n4023:{id:"n4023",loc:[-85.619073,41.947793]},n4024:{id:"n4024",loc:[-85.618912,41.947793]},n4025:{id:"n4025",loc:[-85.618911,41.947947]},n4026:{id:"n4026",loc:[-85.618752,41.947947]},n4027:{id:"n4027",loc:[-85.618754,41.947637]},n4028:{id:"n4028",loc:[-85.617896,41.947599]},n4029:{id:"n4029",loc:[-85.617898,41.947811]},n403:{id:"n403",loc:[-85.633278,41.944002]},n4030:{id:"n4030",loc:[-85.617717,41.947812]},n4031:{id:"n4031",loc:[-85.617715,41.9476]},n4032:{id:"n4032",loc:[-85.619003,41.949828]},n4033:{id:"n4033",loc:[-85.619003,41.949882]},n4034:{id:"n4034",loc:[-85.618926,41.949882]},n4035:{id:"n4035",loc:[-85.618926,41.949828]},n4036:{id:"n4036",loc:[-85.618861,41.949809]},n4037:{id:"n4037",loc:[-85.618861,41.949898]},n4038:{id:"n4038",loc:[-85.618688,41.949898]},n4039:{id:"n4039",loc:[-85.618687,41.94981]},n404:{id:"n404",loc:[-85.63331,41.944036]},n4040:{id:"n4040",loc:[-85.618349,41.949473]},n4041:{id:"n4041",loc:[-85.618287,41.949473]},n4042:{id:"n4042",loc:[-85.618287,41.94942]},n4043:{id:"n4043",loc:[-85.618348,41.949419]},n4044:{id:"n4044",loc:[-85.62316,41.951604]},n4045:{id:"n4045",loc:[-85.623026,41.951605]},n4046:{id:"n4046",loc:[-85.623023,41.951466]},n4047:{id:"n4047",loc:[-85.623134,41.951465]},n4048:{id:"n4048",loc:[-85.623136,41.951539]},n4049:{id:"n4049",loc:[-85.623159,41.951539]},n405:{id:"n405",loc:[-85.633348,41.944015]},n4050:{id:"n4050",loc:[-85.623025,41.95155]},n4051:{id:"n4051",loc:[-85.622955,41.951551]},n4052:{id:"n4052",loc:[-85.622953,41.951507]},n4053:{id:"n4053",loc:[-85.623024,41.951506]},n4054:{id:"n4054",loc:[-85.623318,41.951242]},n4055:{id:"n4055",loc:[-85.623175,41.951241]},n4056:{id:"n4056",loc:[-85.623176,41.951153]},n4057:{id:"n4057",loc:[-85.623319,41.951154]},n4058:{id:"n4058",loc:[-85.623077,41.951191]},n4059:{id:"n4059",loc:[-85.622973,41.951191]},n406:{id:"n406",loc:[-85.63338,41.944048]},n4060:{id:"n4060",loc:[-85.622972,41.951349]},n4061:{id:"n4061",loc:[-85.623059,41.95135]},n4062:{id:"n4062",loc:[-85.62306,41.951301]},n4063:{id:"n4063",loc:[-85.623077,41.951301]},n4064:{id:"n4064",loc:[-85.623117,41.951405]},n4065:{id:"n4065",loc:[-85.62312,41.951087]},n4066:{id:"n4066",loc:[-85.623118,41.951274]},n4067:{id:"n4067",loc:[-85.62328,41.951275]},n4068:{id:"n4068",loc:[-85.62328,41.951242]},n4069:{id:"n4069",loc:[-85.623179,41.951392]},n407:{id:"n407",loc:[-85.633431,41.94402]},n4070:{id:"n4070",loc:[-85.623141,41.951392]},n4071:{id:"n4071",loc:[-85.623142,41.95136]},n4072:{id:"n4072",loc:[-85.623179,41.951361]},n4073:{id:"n4073",loc:[-85.622565,41.951639]},n4074:{id:"n4074",loc:[-85.622565,41.951741]},n4075:{id:"n4075",loc:[-85.622463,41.95174]},n4076:{id:"n4076",loc:[-85.622463,41.95173]},n4077:{id:"n4077",loc:[-85.622442,41.95173]},n4078:{id:"n4078",loc:[-85.622442,41.951742]},n4079:{id:"n4079",loc:[-85.622361,41.951742]},n408:{id:"n408",loc:[-85.633425,41.944014]},n4080:{id:"n4080",loc:[-85.622362,41.951667]},n4081:{id:"n4081",loc:[-85.622441,41.951667]},n4082:{id:"n4082",loc:[-85.622441,41.951688]},n4083:{id:"n4083",loc:[-85.622461,41.951688]},n4084:{id:"n4084",loc:[-85.622461,41.951638]},n4085:{id:"n4085",loc:[-85.62255,41.951587]},n4086:{id:"n4086",loc:[-85.622449,41.95159]},n4087:{id:"n4087",loc:[-85.622441,41.951448]},n4088:{id:"n4088",loc:[-85.62253,41.951445]},n4089:{id:"n4089",loc:[-85.622532,41.951486]},n409:{id:"n409",loc:[-85.633457,41.943997]},n4090:{id:"n4090",loc:[-85.622555,41.951485]},n4091:{id:"n4091",loc:[-85.622558,41.951531]},n4092:{id:"n4092",loc:[-85.622547,41.951531]},n4093:{id:"n4093",loc:[-85.622451,41.95159]},n4094:{id:"n4094",loc:[-85.622452,41.95161]},n4095:{id:"n4095",loc:[-85.622106,41.951617]},n4096:{id:"n4096",loc:[-85.622133,41.951443]},n4097:{id:"n4097",loc:[-85.622552,41.951379]},n4098:{id:"n4098",loc:[-85.622443,41.95138]},n4099:{id:"n4099",loc:[-85.622441,41.951281]},n41:{id:"n41",loc:[-85.636233,41.942764]},n410:{id:"n410",loc:[-85.633429,41.943969]},n4100:{id:"n4100",loc:[-85.62255,41.95128]},n4101:{id:"n4101",loc:[-85.622541,41.951437]},n4102:{id:"n4102",loc:[-85.622441,41.951438]},n4103:{id:"n4103",loc:[-85.621561,41.951444]},n4104:{id:"n4104",loc:[-85.622302,41.951479]},n4105:{id:"n4105",loc:[-85.6223,41.95152]},n4106:{id:"n4106",loc:[-85.622169,41.951517]},n4107:{id:"n4107",loc:[-85.622171,41.951476]},n4108:{id:"n4108",loc:[-85.622543,41.951228]},n4109:{id:"n4109",loc:[-85.622433,41.951228]},n411:{id:"n411",loc:[-85.633442,41.943962]},n4110:{id:"n4110",loc:[-85.622433,41.951133]},n4111:{id:"n4111",loc:[-85.622543,41.951133]},n4112:{id:"n4112",loc:[-85.622356,41.951256]},n4113:{id:"n4113",loc:[-85.622293,41.951256]},n4114:{id:"n4114",loc:[-85.622292,41.9512]},n4115:{id:"n4115",loc:[-85.622313,41.9512]},n4116:{id:"n4116",loc:[-85.622312,41.951173]},n4117:{id:"n4117",loc:[-85.622364,41.951173]},n4118:{id:"n4118",loc:[-85.622365,41.951231]},n4119:{id:"n4119",loc:[-85.622355,41.951231]},n412:{id:"n412",loc:[-85.633411,41.943932]},n4120:{id:"n4120",loc:[-85.62197,41.951155]},n4121:{id:"n4121",loc:[-85.62197,41.951213]},n4122:{id:"n4122",loc:[-85.621848,41.951213]},n4123:{id:"n4123",loc:[-85.621848,41.951155]},n4124:{id:"n4124",loc:[-85.622193,41.951268]},n4125:{id:"n4125",loc:[-85.622194,41.951305]},n4126:{id:"n4126",loc:[-85.622121,41.951306]},n4127:{id:"n4127",loc:[-85.622121,41.951322]},n4128:{id:"n4128",loc:[-85.621984,41.951324]},n4129:{id:"n4129",loc:[-85.621983,41.951271]},n413:{id:"n413",loc:[-85.633421,41.943926]},n4130:{id:"n4130",loc:[-85.622171,41.9514]},n4131:{id:"n4131",loc:[-85.622148,41.951382]},n4132:{id:"n4132",loc:[-85.6221,41.951414]},n4133:{id:"n4133",loc:[-85.622122,41.951433]},n4134:{id:"n4134",loc:[-85.621782,41.951148]},n4135:{id:"n4135",loc:[-85.621783,41.951219]},n4136:{id:"n4136",loc:[-85.62164,41.951221]},n4137:{id:"n4137",loc:[-85.62164,41.951236]},n4138:{id:"n4138",loc:[-85.621556,41.951237]},n4139:{id:"n4139",loc:[-85.621555,41.95117]},n414:{id:"n414",loc:[-85.633376,41.94388]},n4140:{id:"n4140",loc:[-85.621644,41.951169]},n4141:{id:"n4141",loc:[-85.621643,41.951139]},n4142:{id:"n4142",loc:[-85.621719,41.951138]},n4143:{id:"n4143",loc:[-85.621719,41.951148]},n4144:{id:"n4144",loc:[-85.621409,41.951322]},n4145:{id:"n4145",loc:[-85.621338,41.951322]},n4146:{id:"n4146",loc:[-85.621336,41.95115]},n4147:{id:"n4147",loc:[-85.621521,41.951149]},n4148:{id:"n4148",loc:[-85.621522,41.951228]},n4149:{id:"n4149",loc:[-85.621408,41.951228]},n415:{id:"n415",loc:[-85.633348,41.943895]},n4150:{id:"n4150",loc:[-85.621284,41.951219]},n4151:{id:"n4151",loc:[-85.621153,41.951219]},n4152:{id:"n4152",loc:[-85.621152,41.951152]},n4153:{id:"n4153",loc:[-85.621283,41.951152]},n4154:{id:"n4154",loc:[-85.621159,41.951241]},n4155:{id:"n4155",loc:[-85.62116,41.951301]},n4156:{id:"n4156",loc:[-85.621088,41.951302]},n4157:{id:"n4157",loc:[-85.621088,41.951241]},n4158:{id:"n4158",loc:[-85.621049,41.951158]},n4159:{id:"n4159",loc:[-85.62105,41.951229]},n416:{id:"n416",loc:[-85.633341,41.943888]},n4160:{id:"n4160",loc:[-85.620976,41.951229]},n4161:{id:"n4161",loc:[-85.620977,41.951295]},n4162:{id:"n4162",loc:[-85.620887,41.951296]},n4163:{id:"n4163",loc:[-85.620886,41.951229]},n4164:{id:"n4164",loc:[-85.620862,41.951229]},n4165:{id:"n4165",loc:[-85.620861,41.951159]},n4166:{id:"n4166",loc:[-85.620626,41.951133]},n4167:{id:"n4167",loc:[-85.620626,41.951205]},n4168:{id:"n4168",loc:[-85.620412,41.951206]},n4169:{id:"n4169",loc:[-85.620411,41.951134]},n417:{id:"n417",loc:[-85.633321,41.943898]},n4170:{id:"n4170",loc:[-85.621775,41.951443]},n4171:{id:"n4171",loc:[-85.621777,41.951264]},n4172:{id:"n4172",loc:[-85.621565,41.951654]},n4173:{id:"n4173",loc:[-85.621331,41.951439]},n4174:{id:"n4174",loc:[-85.621031,41.951443]},n4175:{id:"n4175",loc:[-85.621836,41.951724]},n4176:{id:"n4176",loc:[-85.621834,41.951621]},n4177:{id:"n4177",loc:[-85.62197,41.951619]},n4178:{id:"n4178",loc:[-85.621972,41.951722]},n4179:{id:"n4179",loc:[-85.621772,41.951638]},n418:{id:"n418",loc:[-85.633547,41.943896]},n4180:{id:"n4180",loc:[-85.621772,41.951715]},n4181:{id:"n4181",loc:[-85.621699,41.951716]},n4182:{id:"n4182",loc:[-85.6217,41.951722]},n4183:{id:"n4183",loc:[-85.621641,41.951722]},n4184:{id:"n4184",loc:[-85.62164,41.951639]},n4185:{id:"n4185",loc:[-85.621505,41.951655]},n4186:{id:"n4186",loc:[-85.621505,41.951729]},n4187:{id:"n4187",loc:[-85.621389,41.951729]},n4188:{id:"n4188",loc:[-85.62139,41.951654]},n4189:{id:"n4189",loc:[-85.621105,41.951635]},n419:{id:"n419",loc:[-85.633467,41.944075]},n4190:{id:"n4190",loc:[-85.621104,41.951576]},n4191:{id:"n4191",loc:[-85.621168,41.951576]},n4192:{id:"n4192",loc:[-85.621168,41.951595]},n4193:{id:"n4193",loc:[-85.621261,41.951595]},n4194:{id:"n4194",loc:[-85.621261,41.951646]},n4195:{id:"n4195",loc:[-85.621294,41.951646]},n4196:{id:"n4196",loc:[-85.621294,41.951732]},n4197:{id:"n4197",loc:[-85.621251,41.951732]},n4198:{id:"n4198",loc:[-85.621251,41.95174]},n4199:{id:"n4199",loc:[-85.621175,41.951741]},n42:{id:"n42",loc:[-85.635996,41.942727]},n420:{id:"n420",loc:[-85.633578,41.944055]},n4200:{id:"n4200",loc:[-85.621175,41.951651]},n4201:{id:"n4201",loc:[-85.621189,41.951651]},n4202:{id:"n4202",loc:[-85.621189,41.951635]},n4203:{id:"n4203",loc:[-85.620554,41.951641]},n4204:{id:"n4204",loc:[-85.620555,41.951742]},n4205:{id:"n4205",loc:[-85.620719,41.951742]},n4206:{id:"n4206",loc:[-85.620719,41.951731]},n4207:{id:"n4207",loc:[-85.620803,41.95173]},n4208:{id:"n4208",loc:[-85.620803,41.951603]},n4209:{id:"n4209",loc:[-85.62072,41.951603]},n421:{id:"n421",loc:[-85.633462,41.944125]},n4210:{id:"n4210",loc:[-85.620721,41.951641]},n4211:{id:"n4211",loc:[-85.620269,41.953053]},n4212:{id:"n4212",loc:[-85.620229,41.953051]},n4213:{id:"n4213",loc:[-85.620231,41.953013]},n4214:{id:"n4214",loc:[-85.620271,41.953015]},n4215:{id:"n4215",loc:[-85.620215,41.953133]},n4216:{id:"n4216",loc:[-85.62013,41.953134]},n4217:{id:"n4217",loc:[-85.620129,41.953083]},n4218:{id:"n4218",loc:[-85.620214,41.953082]},n4219:{id:"n4219",loc:[-85.62016,41.953272]},n422:{id:"n422",loc:[-85.633372,41.944061]},n4220:{id:"n4220",loc:[-85.620046,41.953273]},n4221:{id:"n4221",loc:[-85.620045,41.953171]},n4222:{id:"n4222",loc:[-85.620088,41.953171]},n4223:{id:"n4223",loc:[-85.620087,41.953162]},n4224:{id:"n4224",loc:[-85.620121,41.953162]},n4225:{id:"n4225",loc:[-85.620121,41.953173]},n4226:{id:"n4226",loc:[-85.620157,41.953173]},n4227:{id:"n4227",loc:[-85.620158,41.953196]},n4228:{id:"n4228",loc:[-85.620189,41.953196]},n4229:{id:"n4229",loc:[-85.620189,41.953246]},n423:{id:"n423",loc:[-85.633509,41.943981]},n4230:{id:"n4230",loc:[-85.62016,41.953246]},n4231:{id:"n4231",loc:[-85.6195,41.954012]},n4232:{id:"n4232",loc:[-85.619438,41.954057]},n4233:{id:"n4233",loc:[-85.619418,41.954043]},n4234:{id:"n4234",loc:[-85.619381,41.954069]},n4235:{id:"n4235",loc:[-85.619399,41.954083]},n4236:{id:"n4236",loc:[-85.619339,41.954126]},n4237:{id:"n4237",loc:[-85.619584,41.954313]},n4238:{id:"n4238",loc:[-85.619743,41.954198]},n4239:{id:"n4239",loc:[-85.619453,41.954727]},n424:{id:"n424",loc:[-85.635421,41.945367]},n4240:{id:"n4240",loc:[-85.619503,41.954581]},n4241:{id:"n4241",loc:[-85.619597,41.954472]},n4242:{id:"n4242",loc:[-85.619862,41.95419]},n4243:{id:"n4243",loc:[-85.619506,41.953907]},n4244:{id:"n4244",loc:[-85.619261,41.9541]},n4245:{id:"n4245",loc:[-85.619246,41.954139]},n4246:{id:"n4246",loc:[-85.619244,41.9542]},n4247:{id:"n4247",loc:[-85.619259,41.954243]},n4248:{id:"n4248",loc:[-85.619285,41.954274]},n4249:{id:"n4249",loc:[-85.619123,41.954381]},n425:{id:"n425",loc:[-85.634425,41.943552]},n4250:{id:"n4250",loc:[-85.619641,41.954607]},n4251:{id:"n4251",loc:[-85.619383,41.954615]},n4252:{id:"n4252",loc:[-85.61896,41.954391]},n4253:{id:"n4253",loc:[-85.619211,41.954178]},n4254:{id:"n4254",loc:[-85.619115,41.954102]},n4255:{id:"n4255",loc:[-85.619519,41.953821]},n4256:{id:"n4256",loc:[-85.619956,41.954156]},n4257:{id:"n4257",loc:[-85.619851,41.954266]},n4258:{id:"n4258",loc:[-85.619779,41.95436]},n4259:{id:"n4259",loc:[-85.620525,41.954364]},n426:{id:"n426",loc:[-85.634248,41.943654]},n4260:{id:"n4260",loc:[-85.620398,41.954365]},n4261:{id:"n4261",loc:[-85.620398,41.954324]},n4262:{id:"n4262",loc:[-85.620525,41.954323]},n4263:{id:"n4263",loc:[-85.620359,41.954588]},n4264:{id:"n4264",loc:[-85.620321,41.954588]},n4265:{id:"n4265",loc:[-85.620321,41.954599]},n4266:{id:"n4266",loc:[-85.620296,41.954599]},n4267:{id:"n4267",loc:[-85.620296,41.954587]},n4268:{id:"n4268",loc:[-85.620262,41.954588]},n4269:{id:"n4269",loc:[-85.620261,41.954516]},n427:{id:"n427",loc:[-85.634177,41.943585]},n4270:{id:"n4270",loc:[-85.620282,41.954516]},n4271:{id:"n4271",loc:[-85.620282,41.954373]},n4272:{id:"n4272",loc:[-85.620378,41.954373]},n4273:{id:"n4273",loc:[-85.620379,41.954486]},n4274:{id:"n4274",loc:[-85.620348,41.954486]},n4275:{id:"n4275",loc:[-85.620348,41.954537]},n4276:{id:"n4276",loc:[-85.620359,41.954537]},n4277:{id:"n4277",loc:[-85.620463,41.95521]},n4278:{id:"n4278",loc:[-85.620409,41.955273]},n4279:{id:"n4279",loc:[-85.620205,41.955177]},n428:{id:"n428",loc:[-85.634354,41.943484]},n4280:{id:"n4280",loc:[-85.620288,41.955079]},n4281:{id:"n4281",loc:[-85.620379,41.955121]},n4282:{id:"n4282",loc:[-85.620349,41.955157]},n4283:{id:"n4283",loc:[-85.620083,41.955101]},n4284:{id:"n4284",loc:[-85.620083,41.954986]},n4285:{id:"n4285",loc:[-85.620016,41.954986]},n4286:{id:"n4286",loc:[-85.620016,41.954999]},n4287:{id:"n4287",loc:[-85.619941,41.954999]},n4288:{id:"n4288",loc:[-85.619941,41.954988]},n4289:{id:"n4289",loc:[-85.619815,41.954988]},n429:{id:"n429",loc:[-85.638577,41.943212]},n4290:{id:"n4290",loc:[-85.619815,41.955075]},n4291:{id:"n4291",loc:[-85.619948,41.955075]},n4292:{id:"n4292",loc:[-85.619948,41.955082]},n4293:{id:"n4293",loc:[-85.620004,41.955082]},n4294:{id:"n4294",loc:[-85.620004,41.955101]},n4295:{id:"n4295",loc:[-85.619293,41.955127]},n4296:{id:"n4296",loc:[-85.619208,41.955124]},n4297:{id:"n4297",loc:[-85.619212,41.955061]},n4298:{id:"n4298",loc:[-85.619297,41.955064]},n4299:{id:"n4299",loc:[-85.619068,41.954936]},n43:{id:"n43",loc:[-85.637047,41.943054]},n430:{id:"n430",loc:[-85.638576,41.943219]},n4300:{id:"n4300",loc:[-85.619003,41.954936]},n4301:{id:"n4301",loc:[-85.619004,41.955003]},n4302:{id:"n4302",loc:[-85.618994,41.955003]},n4303:{id:"n4303",loc:[-85.618994,41.955016]},n4304:{id:"n4304",loc:[-85.618973,41.955016]},n4305:{id:"n4305",loc:[-85.618973,41.955071]},n4306:{id:"n4306",loc:[-85.619061,41.955071]},n4307:{id:"n4307",loc:[-85.61906,41.955024]},n4308:{id:"n4308",loc:[-85.619105,41.955024]},n4309:{id:"n4309",loc:[-85.619105,41.954956]},n431:{id:"n431",loc:[-85.638653,41.943078]},n4310:{id:"n4310",loc:[-85.619068,41.954956]},n4311:{id:"n4311",loc:[-85.618294,41.954596]},n4312:{id:"n4312",loc:[-85.618235,41.954602]},n4313:{id:"n4313",loc:[-85.618222,41.954535]},n4314:{id:"n4314",loc:[-85.618281,41.954529]},n4315:{id:"n4315",loc:[-85.618593,41.954556]},n4316:{id:"n4316",loc:[-85.618551,41.954565]},n4317:{id:"n4317",loc:[-85.618545,41.954552]},n4318:{id:"n4318",loc:[-85.618493,41.954563]},n4319:{id:"n4319",loc:[-85.618449,41.954455]},n432:{id:"n432",loc:[-85.638654,41.943148]},n4320:{id:"n4320",loc:[-85.618544,41.954434]},n4321:{id:"n4321",loc:[-85.622545,41.950775]},n4322:{id:"n4322",loc:[-85.622546,41.950843]},n4323:{id:"n4323",loc:[-85.622503,41.950844]},n4324:{id:"n4324",loc:[-85.622503,41.950853]},n4325:{id:"n4325",loc:[-85.622479,41.950853]},n4326:{id:"n4326",loc:[-85.622478,41.950843]},n4327:{id:"n4327",loc:[-85.622425,41.950843]},n4328:{id:"n4328",loc:[-85.622425,41.950808]},n4329:{id:"n4329",loc:[-85.622366,41.950809]},n433:{id:"n433",loc:[-85.638387,41.943151]},n4330:{id:"n4330",loc:[-85.622364,41.950673]},n4331:{id:"n4331",loc:[-85.622448,41.950673]},n4332:{id:"n4332",loc:[-85.622449,41.950732]},n4333:{id:"n4333",loc:[-85.622479,41.950731]},n4334:{id:"n4334",loc:[-85.622479,41.950775]},n4335:{id:"n4335",loc:[-85.621909,41.950641]},n4336:{id:"n4336",loc:[-85.621864,41.950641]},n4337:{id:"n4337",loc:[-85.621865,41.950567]},n4338:{id:"n4338",loc:[-85.62191,41.950567]},n4339:{id:"n4339",loc:[-85.621787,41.950829]},n434:{id:"n434",loc:[-85.638386,41.94308]},n4340:{id:"n4340",loc:[-85.621786,41.950775]},n4341:{id:"n4341",loc:[-85.621588,41.950776]},n4342:{id:"n4342",loc:[-85.621589,41.950848]},n4343:{id:"n4343",loc:[-85.621737,41.950847]},n4344:{id:"n4344",loc:[-85.621737,41.950829]},n4345:{id:"n4345",loc:[-85.621509,41.950846]},n4346:{id:"n4346",loc:[-85.621399,41.950846]},n4347:{id:"n4347",loc:[-85.621398,41.95073]},n4348:{id:"n4348",loc:[-85.621509,41.95073]},n4349:{id:"n4349",loc:[-85.621217,41.950841]},n435:{id:"n435",loc:[-85.634427,41.943533]},n4350:{id:"n4350",loc:[-85.6211,41.95084]},n4351:{id:"n4351",loc:[-85.6211,41.950777]},n4352:{id:"n4352",loc:[-85.621218,41.950778]},n4353:{id:"n4353",loc:[-85.621055,41.950764]},n4354:{id:"n4354",loc:[-85.621054,41.950826]},n4355:{id:"n4355",loc:[-85.620988,41.950826]},n4356:{id:"n4356",loc:[-85.620988,41.950843]},n4357:{id:"n4357",loc:[-85.620842,41.950843]},n4358:{id:"n4358",loc:[-85.620842,41.950764]},n4359:{id:"n4359",loc:[-85.620825,41.950922]},n436:{id:"n436",loc:[-85.63428,41.943229]},n4360:{id:"n4360",loc:[-85.620824,41.950553]},n4361:{id:"n4361",loc:[-85.620543,41.950771]},n4362:{id:"n4362",loc:[-85.620431,41.950772]},n4363:{id:"n4363",loc:[-85.62043,41.950585]},n4364:{id:"n4364",loc:[-85.620542,41.950585]},n4365:{id:"n4365",loc:[-85.62068,41.950505]},n4366:{id:"n4366",loc:[-85.620681,41.950552]},n4367:{id:"n4367",loc:[-85.620589,41.950553]},n4368:{id:"n4368",loc:[-85.620588,41.950506]},n4369:{id:"n4369",loc:[-85.620539,41.950407]},n437:{id:"n437",loc:[-85.634499,41.943461]},n4370:{id:"n4370",loc:[-85.62054,41.950504]},n4371:{id:"n4371",loc:[-85.620416,41.950504]},n4372:{id:"n4372",loc:[-85.620416,41.950408]},n4373:{id:"n4373",loc:[-85.620742,41.95038]},n4374:{id:"n4374",loc:[-85.620527,41.95038]},n4375:{id:"n4375",loc:[-85.620528,41.950408]},n4376:{id:"n4376",loc:[-85.622449,41.950373]},n4377:{id:"n4377",loc:[-85.622452,41.950397]},n4378:{id:"n4378",loc:[-85.622336,41.950404]},n4379:{id:"n4379",loc:[-85.622333,41.950379]},n438:{id:"n438",loc:[-85.634514,41.943486]},n4380:{id:"n4380",loc:[-85.622263,41.950324]},n4381:{id:"n4381",loc:[-85.622261,41.950256]},n4382:{id:"n4382",loc:[-85.62236,41.950254]},n4383:{id:"n4383",loc:[-85.62236,41.95027]},n4384:{id:"n4384",loc:[-85.622402,41.950281]},n4385:{id:"n4385",loc:[-85.622403,41.9503]},n4386:{id:"n4386",loc:[-85.622439,41.950299]},n4387:{id:"n4387",loc:[-85.62244,41.950334]},n4388:{id:"n4388",loc:[-85.622414,41.950335]},n4389:{id:"n4389",loc:[-85.622414,41.95036]},n439:{id:"n439",loc:[-85.63452,41.943511]},n4390:{id:"n4390",loc:[-85.62231,41.950362]},n4391:{id:"n4391",loc:[-85.622309,41.950323]},n4392:{id:"n4392",loc:[-85.622015,41.950539]},n4393:{id:"n4393",loc:[-85.621909,41.95054]},n4394:{id:"n4394",loc:[-85.621909,41.950472]},n4395:{id:"n4395",loc:[-85.622015,41.950471]},n4396:{id:"n4396",loc:[-85.62199,41.950439]},n4397:{id:"n4397",loc:[-85.621956,41.95044]},n4398:{id:"n4398",loc:[-85.621955,41.950405]},n4399:{id:"n4399",loc:[-85.621988,41.950404]},n44:{id:"n44",loc:[-85.636799,41.943055]},n440:{id:"n440",loc:[-85.63451,41.943534]},n4400:{id:"n4400",loc:[-85.621668,41.950418]},n4401:{id:"n4401",loc:[-85.621667,41.950343]},n4402:{id:"n4402",loc:[-85.621745,41.950342]},n4403:{id:"n4403",loc:[-85.621744,41.950306]},n4404:{id:"n4404",loc:[-85.621764,41.950306]},n4405:{id:"n4405",loc:[-85.621763,41.950254]},n4406:{id:"n4406",loc:[-85.621861,41.950253]},n4407:{id:"n4407",loc:[-85.621861,41.950274]},n4408:{id:"n4408",loc:[-85.621896,41.950273]},n4409:{id:"n4409",loc:[-85.621898,41.950389]},n441:{id:"n441",loc:[-85.634483,41.943556]},n4410:{id:"n4410",loc:[-85.621843,41.95039]},n4411:{id:"n4411",loc:[-85.621843,41.950425]},n4412:{id:"n4412",loc:[-85.621789,41.950425]},n4413:{id:"n4413",loc:[-85.621789,41.950386]},n4414:{id:"n4414",loc:[-85.621752,41.950387]},n4415:{id:"n4415",loc:[-85.621753,41.950417]},n4416:{id:"n4416",loc:[-85.621556,41.950562]},n4417:{id:"n4417",loc:[-85.621552,41.950217]},n4418:{id:"n4418",loc:[-85.621788,41.950562]},n4419:{id:"n4419",loc:[-85.621155,41.950562]},n442:{id:"n442",loc:[-85.63419,41.943713]},n4420:{id:"n4420",loc:[-85.622473,41.950551]},n4421:{id:"n4421",loc:[-85.622043,41.950551]},n4422:{id:"n4422",loc:[-85.62142,41.950454]},n4423:{id:"n4423",loc:[-85.621315,41.950455]},n4424:{id:"n4424",loc:[-85.621313,41.950311]},n4425:{id:"n4425",loc:[-85.621388,41.950311]},n4426:{id:"n4426",loc:[-85.621387,41.950261]},n4427:{id:"n4427",loc:[-85.621468,41.95026]},n4428:{id:"n4428",loc:[-85.621468,41.950271]},n4429:{id:"n4429",loc:[-85.621503,41.95027]},n443:{id:"n443",loc:[-85.634462,41.943294]},n4430:{id:"n4430",loc:[-85.621505,41.950353]},n4431:{id:"n4431",loc:[-85.621483,41.950354]},n4432:{id:"n4432",loc:[-85.621483,41.950392]},n4433:{id:"n4433",loc:[-85.621419,41.950393]},n4434:{id:"n4434",loc:[-85.621213,41.95039]},n4435:{id:"n4435",loc:[-85.621127,41.950391]},n4436:{id:"n4436",loc:[-85.621126,41.950357]},n4437:{id:"n4437",loc:[-85.621094,41.950357]},n4438:{id:"n4438",loc:[-85.621094,41.950391]},n4439:{id:"n4439",loc:[-85.620977,41.950392]},n444:{id:"n444",loc:[-85.634298,41.943389]},n4440:{id:"n4440",loc:[-85.620975,41.950278]},n4441:{id:"n4441",loc:[-85.621087,41.950277]},n4442:{id:"n4442",loc:[-85.621088,41.950331]},n4443:{id:"n4443",loc:[-85.621211,41.950312]},n4444:{id:"n4444",loc:[-85.621104,41.950313]},n4445:{id:"n4445",loc:[-85.621105,41.950331]},n4446:{id:"n4446",loc:[-85.620706,41.950328]},n4447:{id:"n4447",loc:[-85.620606,41.950327]},n4448:{id:"n4448",loc:[-85.620607,41.950261]},n4449:{id:"n4449",loc:[-85.620707,41.950262]},n445:{id:"n445",loc:[-85.634527,41.943623]},n4450:{id:"n4450",loc:[-85.620599,41.950336]},n4451:{id:"n4451",loc:[-85.620559,41.950336]},n4452:{id:"n4452",loc:[-85.620559,41.950299]},n4453:{id:"n4453",loc:[-85.620599,41.950299]},n4454:{id:"n4454",loc:[-85.620545,41.950357]},n4455:{id:"n4455",loc:[-85.620418,41.950357]},n4456:{id:"n4456",loc:[-85.620417,41.950257]},n4457:{id:"n4457",loc:[-85.620544,41.950256]},n4458:{id:"n4458",loc:[-85.620246,41.950131],tags:{highway:"crossing"}},n4459:{id:"n4459",loc:[-85.620252,41.950956]},n446:{id:"n446",loc:[-85.634608,41.943577]},n4460:{id:"n4460",loc:[-85.620245,41.950179]},n4461:{id:"n4461",loc:[-85.620246,41.950088]},n4462:{id:"n4462",loc:[-85.620251,41.950885]},n4463:{id:"n4463",loc:[-85.620103,41.950884],tags:{crossing:"zebra",highway:"crossing"}},n4464:{id:"n4464",loc:[-85.619992,41.950884]},n4465:{id:"n4465",loc:[-85.619704,41.951008]},n4466:{id:"n4466",loc:[-85.619599,41.951122]},n4467:{id:"n4467",loc:[-85.619264,41.951486]},n4468:{id:"n4468",loc:[-85.619179,41.951573],tags:{highway:"crossing"}},n4469:{id:"n4469",loc:[-85.620251,41.950999],tags:{highway:"crossing"}},n447:{id:"n447",loc:[-85.634555,41.943531]},n4470:{id:"n4470",loc:[-85.620249,41.951066]},n4471:{id:"n4471",loc:[-85.620256,41.951374]},n4472:{id:"n4472",loc:[-85.620249,41.951389]},n4473:{id:"n4473",loc:[-85.620249,41.951407]},n4474:{id:"n4474",loc:[-85.620255,41.951423]},n4475:{id:"n4475",loc:[-85.62026,41.951853]},n4476:{id:"n4476",loc:[-85.620262,41.951894],tags:{highway:"crossing"}},n4477:{id:"n4477",loc:[-85.620265,41.951957]},n4478:{id:"n4478",loc:[-85.620262,41.952135]},n4479:{id:"n4479",loc:[-85.620241,41.952424]},n448:{id:"n448",loc:[-85.634555,41.943482]},n4480:{id:"n4480",loc:[-85.620213,41.952583]},n4481:{id:"n4481",loc:[-85.620158,41.952754]},n4482:{id:"n4482",loc:[-85.620065,41.952942]},n4483:{id:"n4483",loc:[-85.619753,41.953439]},n4484:{id:"n4484",loc:[-85.619605,41.953626]},n4485:{id:"n4485",loc:[-85.619381,41.953834]},n4486:{id:"n4486",loc:[-85.619069,41.954066]},n4487:{id:"n4487",loc:[-85.618674,41.95429]},n4488:{id:"n4488",loc:[-85.621816,41.952389]},n4489:{id:"n4489",loc:[-85.6217,41.952386]},n449:{id:"n449",loc:[-85.634509,41.943427]},n4490:{id:"n4490",loc:[-85.621705,41.952306]},n4491:{id:"n4491",loc:[-85.621821,41.95231]},n4492:{id:"n4492",loc:[-85.621819,41.952272]},n4493:{id:"n4493",loc:[-85.621778,41.952272]},n4494:{id:"n4494",loc:[-85.621778,41.952199]},n4495:{id:"n4495",loc:[-85.621818,41.952199]},n4496:{id:"n4496",loc:[-85.621754,41.952281]},n4497:{id:"n4497",loc:[-85.621701,41.95228]},n4498:{id:"n4498",loc:[-85.621702,41.952197]},n4499:{id:"n4499",loc:[-85.621755,41.952197]},n45:{id:"n45",loc:[-85.636791,41.942792]},n450:{id:"n450",loc:[-85.63453,41.943365]},n4500:{id:"n4500",loc:[-85.628201,41.954694],tags:{highway:"stop",stop:"all",direction:"forward"}},n4501:{id:"n4501",loc:[-85.627921,41.954783],tags:{highway:"stop",stop:"all",direction:"backward"}},n4502:{id:"n4502",loc:[-85.62775,41.954696],tags:{highway:"stop",stop:"all",direction:"backward"}},n4503:{id:"n4503",loc:[-85.628046,41.954591],tags:{highway:"stop",stop:"all",direction:"forward"}},n4504:{id:"n4504",loc:[-85.631074,41.957428],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4505:{id:"n4505",loc:[-85.630768,41.957429],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4506:{id:"n4506",loc:[-85.629888,41.957432],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4507:{id:"n4507",loc:[-85.629565,41.957433],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4508:{id:"n4508",loc:[-85.629559,41.957343]},n4509:{id:"n4509",loc:[-85.628723,41.95735]},n451:{id:"n451",loc:[-85.634356,41.943468]},n4510:{id:"n4510",loc:[-85.62842,41.957515]},n4511:{id:"n4511",loc:[-85.627561,41.957525]},n4512:{id:"n4512",loc:[-85.630323,41.957508]},n4513:{id:"n4513",loc:[-85.630811,41.957506]},n4514:{id:"n4514",loc:[-85.630839,41.960874]},n4515:{id:"n4515",loc:[-85.631035,41.957506]},n4516:{id:"n4516",loc:[-85.632027,41.9575]},n4517:{id:"n4517",loc:[-85.631038,41.958066]},n4518:{id:"n4518",loc:[-85.630787,41.954769]},n4519:{id:"n4519",loc:[-85.630806,41.957342]},n452:{id:"n452",loc:[-85.634123,41.943596]},n4520:{id:"n4520",loc:[-85.630809,41.957428],tags:{highway:"crossing"}},n4521:{id:"n4521",loc:[-85.630912,41.957506],tags:{highway:"crossing"}},n4522:{id:"n4522",loc:[-85.631033,41.957428],tags:{highway:"crossing"}},n4523:{id:"n4523",loc:[-85.631032,41.957341]},n4524:{id:"n4524",loc:[-85.63091,41.957341],tags:{highway:"crossing"}},n4525:{id:"n4525",loc:[-85.631027,41.95597]},n4526:{id:"n4526",loc:[-85.631027,41.955913],tags:{highway:"crossing"}},n4527:{id:"n4527",loc:[-85.631025,41.955873]},n4528:{id:"n4528",loc:[-85.631073,41.955913],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4529:{id:"n4529",loc:[-85.631007,41.954766]},n453:{id:"n453",loc:[-85.634709,41.943926]},n4530:{id:"n4530",loc:[-85.630881,41.954768],tags:{highway:"crossing"}},n4531:{id:"n4531",loc:[-85.628022,41.954776]},n4532:{id:"n4532",loc:[-85.627385,41.95584]},n4533:{id:"n4533",loc:[-85.627329,41.955937]},n4534:{id:"n4534",loc:[-85.626583,41.957153]},n4535:{id:"n4535",loc:[-85.629675,41.954564],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4536:{id:"n4536",loc:[-85.630881,41.954806],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4537:{id:"n4537",loc:[-85.630879,41.954564],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4538:{id:"n4538",loc:[-85.630784,41.954682],tags:{highway:"crossing"}},n4539:{id:"n4539",loc:[-85.63078,41.954595]},n454:{id:"n454",loc:[-85.63525,41.943855]},n4540:{id:"n4540",loc:[-85.630879,41.954595],tags:{highway:"crossing"}},n4541:{id:"n4541",loc:[-85.631004,41.954594]},n4542:{id:"n4542",loc:[-85.631006,41.954681],tags:{highway:"crossing"}},n4543:{id:"n4543",loc:[-85.631045,41.959036],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4544:{id:"n4544",loc:[-85.632071,41.959029],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4545:{id:"n4545",loc:[-85.632257,41.959027],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4546:{id:"n4546",loc:[-85.631966,41.957427],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4547:{id:"n4547",loc:[-85.632297,41.957426],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4548:{id:"n4548",loc:[-85.631976,41.955911],tags:{highway:"give_way",direction:"forward"}},n4549:{id:"n4549",loc:[-85.632272,41.955911],tags:{highway:"give_way",direction:"backward"}},n455:{id:"n455",loc:[-85.635224,41.943869]},n4550:{id:"n4550",loc:[-85.632097,41.954805],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4551:{id:"n4551",loc:[-85.632094,41.954566],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4552:{id:"n4552",loc:[-85.626519,41.957256]},n4553:{id:"n4553",loc:[-85.625334,41.959165]},n4554:{id:"n4554",loc:[-85.626483,41.95806]},n4555:{id:"n4555",loc:[-85.626481,41.958175]},n4556:{id:"n4556",loc:[-85.626412,41.958174]},n4557:{id:"n4557",loc:[-85.626412,41.958202]},n4558:{id:"n4558",loc:[-85.62628,41.958201]},n4559:{id:"n4559",loc:[-85.626283,41.958057]},n456:{id:"n456",loc:[-85.638854,41.943104]},n4560:{id:"n4560",loc:[-85.622763,41.95109],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4561:{id:"n4561",loc:[-85.622858,41.950876],tags:{emergency:"fire_hydrant"}},n4562:{id:"n4562",loc:[-85.624073,41.950393]},n4563:{id:"n4563",loc:[-85.624077,41.950924]},n4564:{id:"n4564",loc:[-85.624599,41.950984],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4565:{id:"n4565",loc:[-85.624831,41.95119],tags:{emergency:"fire_hydrant"}},n4566:{id:"n4566",loc:[-85.624437,41.952568],tags:{emergency:"fire_hydrant"}},n4567:{id:"n4567",loc:[-85.624077,41.954606],tags:{emergency:"fire_hydrant"}},n4568:{id:"n4568",loc:[-85.624263,41.954888]},n4569:{id:"n4569",loc:[-85.624206,41.954919]},n457:{id:"n457",loc:[-85.635186,41.943901]},n4570:{id:"n4570",loc:[-85.624154,41.954865]},n4571:{id:"n4571",loc:[-85.624212,41.954835]},n4572:{id:"n4572",loc:[-85.622442,41.954401],tags:{emergency:"fire_hydrant"}},n4573:{id:"n4573",loc:[-85.619751,41.954658],tags:{emergency:"fire_hydrant"}},n4574:{id:"n4574",loc:[-85.617785,41.954534]},n4575:{id:"n4575",loc:[-85.617416,41.954721]},n4576:{id:"n4576",loc:[-85.617662,41.95474]},n4577:{id:"n4577",loc:[-85.618014,41.954717]},n4578:{id:"n4578",loc:[-85.617886,41.954671]},n4579:{id:"n4579",loc:[-85.617831,41.954612]},n458:{id:"n458",loc:[-85.635162,41.943917]},n4580:{id:"n4580",loc:[-85.617968,41.954752]},n4581:{id:"n4581",loc:[-85.617815,41.954752]},n4582:{id:"n4582",loc:[-85.617938,41.954695]},n4583:{id:"n4583",loc:[-85.617856,41.954642],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4584:{id:"n4584",loc:[-85.619116,41.954164],tags:{man_made:"flagpole"}},n4585:{id:"n4585",loc:[-85.619569,41.953255],tags:{emergency:"fire_hydrant"}},n4586:{id:"n4586",loc:[-85.620352,41.951894],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4587:{id:"n4587",loc:[-85.620485,41.951948],tags:{emergency:"fire_hydrant"}},n4588:{id:"n4588",loc:[-85.620316,41.950999],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4589:{id:"n4589",loc:[-85.620311,41.950131],tags:{highway:"stop",direction:"backward",stop:"minor"}},n459:{id:"n459",loc:[-85.634856,41.943905]},n4590:{id:"n4590",loc:[-85.620374,41.95018],tags:{emergency:"fire_hydrant"}},n4591:{id:"n4591",loc:[-85.620301,41.949239],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4592:{id:"n4592",loc:[-85.620278,41.947443],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4593:{id:"n4593",loc:[-85.619844,41.947444],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4594:{id:"n4594",loc:[-85.620191,41.947352],tags:{emergency:"fire_hydrant"}},n4595:{id:"n4595",loc:[-85.622819,41.947493],tags:{emergency:"fire_hydrant"}},n4596:{id:"n4596",loc:[-85.622744,41.947541],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4597:{id:"n4597",loc:[-85.622739,41.947316],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4598:{id:"n4598",loc:[-85.622909,41.948333],tags:{highway:"give_way"}},n4599:{id:"n4599",loc:[-85.622593,41.948333],tags:{highway:"give_way"}},n46:{id:"n46",loc:[-85.637131,41.94307]},n460:{id:"n460",loc:[-85.634811,41.944007]},n4600:{id:"n4600",loc:[-85.622835,41.948387],tags:{emergency:"fire_hydrant"}},n4601:{id:"n4601",loc:[-85.622768,41.949125],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4602:{id:"n4602",loc:[-85.622769,41.949325],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4603:{id:"n4603",loc:[-85.622837,41.949329],tags:{emergency:"fire_hydrant"}},n4604:{id:"n4604",loc:[-85.622614,41.950113],tags:{highway:"give_way",direction:"forward"}},n4605:{id:"n4605",loc:[-85.624777,41.949219],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4606:{id:"n4606",loc:[-85.624849,41.949106],tags:{emergency:"fire_hydrant"}},n4607:{id:"n4607",loc:[-85.624858,41.950119],tags:{emergency:"fire_hydrant"}},n4608:{id:"n4608",loc:[-85.624752,41.948334],tags:{highway:"give_way"}},n4609:{id:"n4609",loc:[-85.624845,41.948422],tags:{emergency:"fire_hydrant"}},n461:{id:"n461",loc:[-85.634987,41.943112]},n4610:{id:"n4610",loc:[-85.62484,41.947539],tags:{emergency:"fire_hydrant"}},n4611:{id:"n4611",loc:[-85.62476,41.947428],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4612:{id:"n4612",loc:[-85.620286,41.950926]},n4613:{id:"n4613",loc:[-85.618237,41.950963]},n4614:{id:"n4614",loc:[-85.618107,41.950876]},n4615:{id:"n4615",loc:[-85.618131,41.950393]},n4616:{id:"n4616",loc:[-85.618232,41.949913]},n4617:{id:"n4617",loc:[-85.619138,41.950212]},n4618:{id:"n4618",loc:[-85.619299,41.950388]},n4619:{id:"n4619",loc:[-85.619306,41.950897]},n462:{id:"n462",loc:[-85.634698,41.943194]},n4620:{id:"n4620",loc:[-85.619155,41.950958]},n4621:{id:"n4621",loc:[-85.620079,41.947715]},n4622:{id:"n4622",loc:[-85.619674,41.947728]},n4623:{id:"n4623",loc:[-85.619634,41.947735]},n4624:{id:"n4624",loc:[-85.619587,41.947756],tags:{barrier:"gate"}},n4625:{id:"n4625",loc:[-85.61953,41.947796]},n4626:{id:"n4626",loc:[-85.619475,41.947847]},n4627:{id:"n4627",loc:[-85.619433,41.947903]},n4628:{id:"n4628",loc:[-85.619402,41.947982]},n4629:{id:"n4629",loc:[-85.619394,41.948043]},n463:{id:"n463",loc:[-85.634632,41.943219]},n4630:{id:"n4630",loc:[-85.619395,41.948476]},n4631:{id:"n4631",loc:[-85.618367,41.947452]},n4632:{id:"n4632",loc:[-85.618371,41.947567],tags:{barrier:"gate"}},n4633:{id:"n4633",loc:[-85.618341,41.947622]},n4634:{id:"n4634",loc:[-85.618138,41.94773]},n4635:{id:"n4635",loc:[-85.618078,41.947814]},n4636:{id:"n4636",loc:[-85.618072,41.948009]},n4637:{id:"n4637",loc:[-85.618269,41.947666]},n4638:{id:"n4638",loc:[-85.618099,41.947765]},n4639:{id:"n4639",loc:[-85.618378,41.954453]},n464:{id:"n464",loc:[-85.63459,41.943239]},n4640:{id:"n4640",loc:[-85.618198,41.95453]},n4641:{id:"n4641",loc:[-85.618212,41.954623]},n4642:{id:"n4642",loc:[-85.635211,41.943103],tags:{leisure:"picnic_table"}},n4643:{id:"n4643",loc:[-85.635345,41.943448],tags:{leisure:"picnic_table"}},n4644:{id:"n4644",loc:[-85.635901,41.943353],tags:{amenity:"bench"}},n4645:{id:"n4645",loc:[-85.635815,41.942638],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4646:{id:"n4646",loc:[-85.635355,41.942044],tags:{leisure:"picnic_table"}},n4647:{id:"n4647",loc:[-85.635206,41.942045],tags:{leisure:"picnic_table"}},n4648:{id:"n4648",loc:[-85.63504,41.941992],tags:{leisure:"picnic_table"}},n4649:{id:"n4649",loc:[-85.635185,41.942001]},n465:{id:"n465",loc:[-85.634555,41.943263]},n4650:{id:"n4650",loc:[-85.635176,41.942021]},n4651:{id:"n4651",loc:[-85.635127,41.942008]},n4652:{id:"n4652",loc:[-85.635136,41.941988]},n4653:{id:"n4653",loc:[-85.635,41.941709],tags:{emergency:"fire_hydrant"}},n4654:{id:"n4654",loc:[-85.634893,41.941801]},n4655:{id:"n4655",loc:[-85.634937,41.941843]},n4656:{id:"n4656",loc:[-85.634963,41.941859]},n4657:{id:"n4657",loc:[-85.635027,41.941904]},n4658:{id:"n4658",loc:[-85.63494,41.94187]},n4659:{id:"n4659",loc:[-85.634951,41.941871]},n466:{id:"n466",loc:[-85.634526,41.943289]},n4660:{id:"n4660",loc:[-85.634753,41.941701],tags:{amenity:"drinking_water"}},n4661:{id:"n4661",loc:[-85.634717,41.941804],tags:{amenity:"bench"}},n4662:{id:"n4662",loc:[-85.634554,41.941883],tags:{amenity:"bench"}},n4663:{id:"n4663",loc:[-85.635002,41.941579],tags:{amenity:"fountain"}},n4664:{id:"n4664",loc:[-85.635258,41.94188],tags:{amenity:"waste_basket"}},n4665:{id:"n4665",loc:[-85.635262,41.941581],tags:{amenity:"bench"}},n4666:{id:"n4666",loc:[-85.635319,41.941744],tags:{amenity:"bench"}},n4667:{id:"n4667",loc:[-85.634702,41.941473],tags:{amenity:"waste_basket"}},n4668:{id:"n4668",loc:[-85.633981,41.941966],tags:{amenity:"bench"}},n4669:{id:"n4669",loc:[-85.63388,41.941743]},n467:{id:"n467",loc:[-85.635163,41.944985]},n4670:{id:"n4670",loc:[-85.633746,41.941741]},n4671:{id:"n4671",loc:[-85.633749,41.941664]},n4672:{id:"n4672",loc:[-85.633883,41.941667]},n4673:{id:"n4673",loc:[-85.634283,41.941183],tags:{leisure:"picnic_table"}},n4674:{id:"n4674",loc:[-85.634046,41.941102],tags:{amenity:"bbq"}},n4675:{id:"n4675",loc:[-85.63401,41.941093],tags:{amenity:"bbq"}},n4676:{id:"n4676",loc:[-85.633408,41.940862],tags:{amenity:"bench"}},n4677:{id:"n4677",loc:[-85.633359,41.940651],tags:{amenity:"bench"}},n4678:{id:"n4678",loc:[-85.634109,41.940831]},n4679:{id:"n4679",loc:[-85.63396,41.940867]},n468:{id:"n468",loc:[-85.635095,41.945035]},n4680:{id:"n4680",loc:[-85.633816,41.940913]},n4681:{id:"n4681",loc:[-85.633237,41.940455]},n4682:{id:"n4682",loc:[-85.634453,41.940025],tags:{emergency:"fire_hydrant"}},n4683:{id:"n4683",loc:[-85.635692,41.940218],tags:{emergency:"fire_hydrant"}},n4684:{id:"n4684",loc:[-85.635566,41.940102],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4685:{id:"n4685",loc:[-85.635961,41.940125],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4686:{id:"n4686",loc:[-85.635883,41.94012],tags:{crossing:"zebra",highway:"crossing"}},n4687:{id:"n4687",loc:[-85.635883,41.94006]},n4688:{id:"n4688",loc:[-85.635768,41.940051],tags:{crossing:"zebra",highway:"crossing"}},n4689:{id:"n4689",loc:[-85.635669,41.940043]},n469:{id:"n469",loc:[-85.634269,41.944431]},n4690:{id:"n4690",loc:[-85.635661,41.940107],tags:{crossing:"zebra",highway:"crossing"}},n4691:{id:"n4691",loc:[-85.635424,41.941005],tags:{amenity:"fountain"}},n4692:{id:"n4692",loc:[-85.635542,41.941371],tags:{amenity:"bench"}},n4693:{id:"n4693",loc:[-85.635709,41.941341],tags:{emergency:"fire_hydrant"}},n4694:{id:"n4694",loc:[-85.637038,41.942513],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4695:{id:"n4695",loc:[-85.637174,41.941354],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4696:{id:"n4696",loc:[-85.637091,41.941273],tags:{emergency:"fire_hydrant"}},n4697:{id:"n4697",loc:[-85.638058,41.941346],tags:{highway:"give_way",direction:"forward"}},n4698:{id:"n4698",loc:[-85.638359,41.941344],tags:{highway:"give_way",direction:"backward"}},n4699:{id:"n4699",loc:[-85.638288,41.941236],tags:{emergency:"fire_hydrant"}},n47:{id:"n47",loc:[-85.636693,41.943073]},n470:{id:"n470",loc:[-85.634352,41.944376]},n4700:{id:"n4700",loc:[-85.63935,41.94128],tags:{emergency:"fire_hydrant"}},n4701:{id:"n4701",loc:[-85.639277,41.941337],tags:{highway:"give_way",direction:"forward"}},n4702:{id:"n4702",loc:[-85.639548,41.941334],tags:{highway:"give_way",direction:"backward"}},n4703:{id:"n4703",loc:[-85.642191,41.940039]},n4704:{id:"n4704",loc:[-85.640585,41.941263],tags:{emergency:"fire_hydrant"}},n4705:{id:"n4705",loc:[-85.64049,41.941327],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4706:{id:"n4706",loc:[-85.640803,41.941324],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4707:{id:"n4707",loc:[-85.641717,41.941317],tags:{highway:"stop",direction:"forward",stop:"all"}},n4708:{id:"n4708",loc:[-85.641846,41.941415],tags:{highway:"stop",direction:"backward",stop:"all"}},n4709:{id:"n4709",loc:[-85.641756,41.941392],tags:{emergency:"fire_hydrant"}},n471:{id:"n471",loc:[-85.634747,41.944561],tags:{railway:"crossing"}},n4710:{id:"n4710",loc:[-85.642014,41.941313],tags:{highway:"stop",direction:"forward",stop:"all"}},n4711:{id:"n4711",loc:[-85.641854,41.942455],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4712:{id:"n4712",loc:[-85.641859,41.942739],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4713:{id:"n4713",loc:[-85.640754,41.942707],tags:{emergency:"fire_hydrant"}},n4714:{id:"n4714",loc:[-85.640669,41.942716],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4715:{id:"n4715",loc:[-85.640664,41.942478],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4716:{id:"n4716",loc:[-85.63964,41.94274],tags:{man_made:"flagpole"}},n4717:{id:"n4717",loc:[-85.639455,41.942731],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4718:{id:"n4718",loc:[-85.63945,41.942492],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4719:{id:"n4719",loc:[-85.639527,41.942505],tags:{emergency:"fire_hydrant"}},n472:{id:"n472",loc:[-85.634667,41.944613]},n4720:{id:"n4720",loc:[-85.638238,41.942745],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4721:{id:"n4721",loc:[-85.638233,41.942511],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4722:{id:"n4722",loc:[-85.638018,41.94299],tags:{amenity:"waste_disposal"}},n4723:{id:"n4723",loc:[-85.637918,41.944152],tags:{amenity:"waste_basket"}},n4724:{id:"n4724",loc:[-85.635902,41.943291],tags:{leisure:"picnic_table"}},n4725:{id:"n4725",loc:[-85.63704,41.942741],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4726:{id:"n4726",loc:[-85.633467,41.943818],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4727:{id:"n4727",loc:[-85.633987,41.943531],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4728:{id:"n4728",loc:[-85.632154,41.943539],tags:{emergency:"fire_hydrant"}},n4729:{id:"n4729",loc:[-85.633567,41.944641],tags:{amenity:"bench"}},n473:{id:"n473",loc:[-85.634161,41.944371]},n4730:{id:"n4730",loc:[-85.633127,41.944574],tags:{amenity:"bench"}},n4731:{id:"n4731",loc:[-85.633439,41.944871],tags:{amenity:"bench"}},n4732:{id:"n4732",loc:[-85.633676,41.944799],tags:{amenity:"waste_basket"}},n4733:{id:"n4733",loc:[-85.633466,41.944862],tags:{amenity:"waste_basket"}},n4734:{id:"n4734",loc:[-85.633451,41.944847],tags:{emergency:"fire_hydrant"}},n4735:{id:"n4735",loc:[-85.634202,41.945543],tags:{amenity:"waste_basket"}},n4736:{id:"n4736",loc:[-85.634652,41.945472],tags:{leisure:"picnic_table"}},n4737:{id:"n4737",loc:[-85.6347,41.945445],tags:{leisure:"picnic_table"}},n4738:{id:"n4738",loc:[-85.634646,41.945662],tags:{emergency:"fire_hydrant"}},n4739:{id:"n4739",loc:[-85.634673,41.945687],tags:{amenity:"waste_basket"}},n474:{id:"n474",loc:[-85.633861,41.944117]},n4740:{id:"n4740",loc:[-85.63449,41.945827],tags:{amenity:"clock",display:"analog"}},n4741:{id:"n4741",loc:[-85.63481,41.946056],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4742:{id:"n4742",loc:[-85.634814,41.946176],tags:{amenity:"post_box"}},n4743:{id:"n4743",loc:[-85.638744,41.945328]},n4744:{id:"n4744",loc:[-85.63867,41.945228],tags:{amenity:"bench"}},n4745:{id:"n4745",loc:[-85.639487,41.945042],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4746:{id:"n4746",loc:[-85.639635,41.94387],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4747:{id:"n4747",loc:[-85.639549,41.943756],tags:{emergency:"fire_hydrant"}},n4748:{id:"n4748",loc:[-85.64055,41.943862],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4749:{id:"n4749",loc:[-85.640864,41.943859],tags:{highway:"stop",stop:"minor",direction:"backward"}},n475:{id:"n475",loc:[-85.633906,41.943535]},n4750:{id:"n4750",loc:[-85.640718,41.945022],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4751:{id:"n4751",loc:[-85.640664,41.945076],tags:{emergency:"fire_hydrant"}},n4752:{id:"n4752",loc:[-85.641913,41.94502],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4753:{id:"n4753",loc:[-85.641838,41.945076],tags:{emergency:"fire_hydrant"}},n4754:{id:"n4754",loc:[-85.642045,41.94385],tags:{highway:"give_way",direction:"backward"}},n4755:{id:"n4755",loc:[-85.641738,41.943852],tags:{highway:"give_way",direction:"forward"}},n4756:{id:"n4756",loc:[-85.642928,41.943843],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4757:{id:"n4757",loc:[-85.64305,41.943902],tags:{emergency:"fire_hydrant"}},n4758:{id:"n4758",loc:[-85.642986,41.945105],tags:{highway:"stop",direction:"backward",stop:"all"}},n4759:{id:"n4759",loc:[-85.643136,41.94502],tags:{highway:"stop",stop:"all",direction:"forward"}},n476:{id:"n476",loc:[-85.63423,41.943692]},n4760:{id:"n4760",loc:[-85.63169,41.947812]},n4761:{id:"n4761",loc:[-85.631307,41.947655]},n4762:{id:"n4762",loc:[-85.631407,41.947413]},n4763:{id:"n4763",loc:[-85.631173,41.947306]},n4764:{id:"n4764",loc:[-85.631316,41.947145]},n4765:{id:"n4765",loc:[-85.631476,41.947087]},n4766:{id:"n4766",loc:[-85.631793,41.946871]},n4767:{id:"n4767",loc:[-85.631884,41.946723]},n4768:{id:"n4768",loc:[-85.631814,41.946397]},n4769:{id:"n4769",loc:[-85.631382,41.947685]},n477:{id:"n477",loc:[-85.635096,41.942814]},n4770:{id:"n4770",loc:[-85.63109,41.947819]},n4771:{id:"n4771",loc:[-85.630921,41.947961]},n4772:{id:"n4772",loc:[-85.630249,41.947709]},n4773:{id:"n4773",loc:[-85.630149,41.947451]},n4774:{id:"n4774",loc:[-85.629733,41.947339]},n4775:{id:"n4775",loc:[-85.629755,41.946948]},n4776:{id:"n4776",loc:[-85.630457,41.947103]},n4777:{id:"n4777",loc:[-85.630934,41.946939]},n4778:{id:"n4778",loc:[-85.631277,41.946852]},n4779:{id:"n4779",loc:[-85.63142,41.946781]},n478:{id:"n478",loc:[-85.635058,41.942795]},n4780:{id:"n4780",loc:[-85.631116,41.946474]},n4781:{id:"n4781",loc:[-85.63073,41.945965]},n4782:{id:"n4782",loc:[-85.631337,41.94571]},n4783:{id:"n4783",loc:[-85.631589,41.945487]},n4784:{id:"n4784",loc:[-85.632278,41.945784]},n4785:{id:"n4785",loc:[-85.632105,41.946034]},n4786:{id:"n4786",loc:[-85.632532,41.946198]},n4787:{id:"n4787",loc:[-85.632566,41.946151]},n4788:{id:"n4788",loc:[-85.632684,41.946196]},n4789:{id:"n4789",loc:[-85.628676,41.947106]},n479:{id:"n479",loc:[-85.635002,41.94279]},n4790:{id:"n4790",loc:[-85.628973,41.946476]},n4791:{id:"n4791",loc:[-85.629094,41.946079]},n4792:{id:"n4792",loc:[-85.629226,41.94578]},n4793:{id:"n4793",loc:[-85.629479,41.945682]},n4794:{id:"n4794",loc:[-85.630606,41.94569]},n4795:{id:"n4795",loc:[-85.631255,41.945588]},n4796:{id:"n4796",loc:[-85.631546,41.945281]},n4797:{id:"n4797",loc:[-85.631629,41.944823]},n4798:{id:"n4798",loc:[-85.631766,41.944958]},n4799:{id:"n4799",loc:[-85.631689,41.945318]},n48:{id:"n48",loc:[-85.636689,41.94276]},n480:{id:"n480",loc:[-85.634908,41.94279]},n4800:{id:"n4800",loc:[-85.615069,41.945527]},n4801:{id:"n4801",loc:[-85.615058,41.946677]},n4802:{id:"n4802",loc:[-85.613692,41.946689]},n4803:{id:"n4803",loc:[-85.613475,41.946531]},n4804:{id:"n4804",loc:[-85.611717,41.946252]},n4805:{id:"n4805",loc:[-85.611353,41.946385]},n4806:{id:"n4806",loc:[-85.611304,41.947397]},n4807:{id:"n4807",loc:[-85.610564,41.947401]},n4808:{id:"n4808",loc:[-85.610553,41.947122]},n4809:{id:"n4809",loc:[-85.610194,41.946992]},n481:{id:"n481",loc:[-85.634478,41.942342]},n4810:{id:"n4810",loc:[-85.609976,41.946628]},n4811:{id:"n4811",loc:[-85.609769,41.946523]},n4812:{id:"n4812",loc:[-85.609307,41.946523]},n4813:{id:"n4813",loc:[-85.609035,41.946462]},n4814:{id:"n4814",loc:[-85.609018,41.943277]},n4815:{id:"n4815",loc:[-85.609617,41.943423]},n4816:{id:"n4816",loc:[-85.610471,41.943447]},n4817:{id:"n4817",loc:[-85.621491,41.949168]},n4818:{id:"n4818",loc:[-85.620266,41.94917]},n4819:{id:"n4819",loc:[-85.620262,41.947557]},n482:{id:"n482",loc:[-85.634521,41.942254]},n4820:{id:"n4820",loc:[-85.620825,41.947556]},n4821:{id:"n4821",loc:[-85.620827,41.948371]},n4822:{id:"n4822",loc:[-85.621489,41.94837]},n4823:{id:"n4823",loc:[-85.622865,41.950928]},n4824:{id:"n4824",loc:[-85.622858,41.949744]},n4825:{id:"n4825",loc:[-85.623696,41.949714]},n4826:{id:"n4826",loc:[-85.623696,41.949647]},n4827:{id:"n4827",loc:[-85.624019,41.949647]},n4828:{id:"n4828",loc:[-85.624024,41.950093]},n4829:{id:"n4829",loc:[-85.622885,41.949711]},n483:{id:"n483",loc:[-85.63425,41.941819]},n4830:{id:"n4830",loc:[-85.624584,41.951049]},n4831:{id:"n4831",loc:[-85.624669,41.9511]},n4832:{id:"n4832",loc:[-85.624316,41.952218]},n4833:{id:"n4833",loc:[-85.623819,41.952094]},n4834:{id:"n4834",loc:[-85.623385,41.952101]},n4835:{id:"n4835",loc:[-85.623456,41.951238]},n4836:{id:"n4836",loc:[-85.623535,41.951051]},n4837:{id:"n4837",loc:[-85.624693,41.950921]},n4838:{id:"n4838",loc:[-85.624727,41.950897]},n4839:{id:"n4839",loc:[-85.624869,41.950341]},n484:{id:"n484",loc:[-85.634324,41.942131]},n4840:{id:"n4840",loc:[-85.624859,41.949284]},n4841:{id:"n4841",loc:[-85.624788,41.949262]},n4842:{id:"n4842",loc:[-85.62402,41.949265]},n4843:{id:"n4843",loc:[-85.610382,41.954663]},n4844:{id:"n4844",loc:[-85.605675,41.954667]},n4845:{id:"n4845",loc:[-85.605669,41.949407]},n4846:{id:"n4846",loc:[-85.610376,41.949404]},n4847:{id:"n4847",loc:[-85.605552,41.958536]},n4848:{id:"n4848",loc:[-85.595755,41.958588]},n4849:{id:"n4849",loc:[-85.595732,41.956419]},n485:{id:"n485",loc:[-85.634211,41.941374]},n4850:{id:"n4850",loc:[-85.596908,41.955605]},n4851:{id:"n4851",loc:[-85.597723,41.955596]},n4852:{id:"n4852",loc:[-85.597715,41.954967]},n4853:{id:"n4853",loc:[-85.5874,41.955018]},n4854:{id:"n4854",loc:[-85.586615,41.955124]},n4855:{id:"n4855",loc:[-85.58613,41.955293]},n4856:{id:"n4856",loc:[-85.586166,41.962122]},n4857:{id:"n4857",loc:[-85.587008,41.955052]},n4858:{id:"n4858",loc:[-85.591685,41.95499]},n4859:{id:"n4859",loc:[-85.591718,41.956649]},n486:{id:"n486",loc:[-85.634085,41.940704]},n4860:{id:"n4860",loc:[-85.591133,41.956649]},n4861:{id:"n4861",loc:[-85.591061,41.95582]},n4862:{id:"n4862",loc:[-85.590677,41.95613]},n4863:{id:"n4863",loc:[-85.590826,41.956369]},n4864:{id:"n4864",loc:[-85.591016,41.954991]},n4865:{id:"n4865",loc:[-85.587656,41.954855]},n4866:{id:"n4866",loc:[-85.5964,41.955274]},n4867:{id:"n4867",loc:[-85.58776,41.96178]},n4868:{id:"n4868",loc:[-85.601172,41.960448]},n4869:{id:"n4869",loc:[-85.589489,41.960478]},n487:{id:"n487",loc:[-85.635567,41.940944]},n4870:{id:"n4870",loc:[-85.586664,41.960493]},n4871:{id:"n4871",loc:[-85.591227,41.95676]},n4872:{id:"n4872",loc:[-85.589424,41.958093]},n4873:{id:"n4873",loc:[-85.588779,41.957611]},n4874:{id:"n4874",loc:[-85.590583,41.956278]},n4875:{id:"n4875",loc:[-85.590759,41.957106]},n4876:{id:"n4876",loc:[-85.592213,41.958218]},n4877:{id:"n4877",loc:[-85.592262,41.958279]},n4878:{id:"n4878",loc:[-85.592304,41.958358]},n4879:{id:"n4879",loc:[-85.592351,41.95849]},n488:{id:"n488",loc:[-85.635542,41.940919]},n4880:{id:"n4880",loc:[-85.592363,41.958605]},n4881:{id:"n4881",loc:[-85.592383,41.96047]},n4882:{id:"n4882",loc:[-85.592376,41.959808]},n4883:{id:"n4883",loc:[-85.600825,41.959779]},n4884:{id:"n4884",loc:[-85.601084,41.959844]},n4885:{id:"n4885",loc:[-85.601144,41.959908]},n4886:{id:"n4886",loc:[-85.601164,41.960008]},n4887:{id:"n4887",loc:[-85.601162,41.960125]},n4888:{id:"n4888",loc:[-85.601134,41.960221]},n4889:{id:"n4889",loc:[-85.600993,41.960353]},n489:{id:"n489",loc:[-85.635514,41.940906]},n4890:{id:"n4890",loc:[-85.600794,41.960449]},n4891:{id:"n4891",loc:[-85.60098,41.959792]},n4892:{id:"n4892",loc:[-85.601067,41.960294]},n4893:{id:"n4893",loc:[-85.596829,41.959793]},n4894:{id:"n4894",loc:[-85.596839,41.960459]},n4895:{id:"n4895",loc:[-85.589364,41.958048]},n4896:{id:"n4896",loc:[-85.587374,41.959511]},n4897:{id:"n4897",loc:[-85.587286,41.959564]},n4898:{id:"n4898",loc:[-85.587163,41.959632]},n4899:{id:"n4899",loc:[-85.586694,41.959865]},n49:{id:"n49",loc:[-85.637127,41.942757]},n490:{id:"n490",loc:[-85.635469,41.940896]},n4900:{id:"n4900",loc:[-85.586634,41.959921]},n4901:{id:"n4901",loc:[-85.586607,41.960001]},n4902:{id:"n4902",loc:[-85.586599,41.960099]},n4903:{id:"n4903",loc:[-85.586602,41.96034]},n4904:{id:"n4904",loc:[-85.586669,41.960439]},n4905:{id:"n4905",loc:[-85.586758,41.960493]},n4906:{id:"n4906",loc:[-85.586618,41.960391]},n4907:{id:"n4907",loc:[-85.591201,41.956352]},n4908:{id:"n4908",loc:[-85.59112,41.954843]},n4909:{id:"n4909",loc:[-85.591536,41.956349]},n491:{id:"n491",loc:[-85.635667,41.940826]},n4910:{id:"n4910",loc:[-85.590953,41.956354]},n4911:{id:"n4911",loc:[-85.591468,41.956406]},n4912:{id:"n4912",loc:[-85.591469,41.956478]},n4913:{id:"n4913",loc:[-85.591123,41.956481]},n4914:{id:"n4914",loc:[-85.591121,41.956409]},n4915:{id:"n4915",loc:[-85.590826,41.955954]},n4916:{id:"n4916",loc:[-85.590612,41.956115]},n4917:{id:"n4917",loc:[-85.590402,41.955962]},n4918:{id:"n4918",loc:[-85.590622,41.955804]},n4919:{id:"n4919",loc:[-85.59011,41.956502]},n492:{id:"n492",loc:[-85.636197,41.940599]},n4920:{id:"n4920",loc:[-85.589877,41.956668]},n4921:{id:"n4921",loc:[-85.589777,41.95659]},n4922:{id:"n4922",loc:[-85.59001,41.956424]},n4923:{id:"n4923",loc:[-85.589595,41.956427]},n4924:{id:"n4924",loc:[-85.589434,41.956549]},n4925:{id:"n4925",loc:[-85.589262,41.956424]},n4926:{id:"n4926",loc:[-85.589422,41.956302]},n4927:{id:"n4927",loc:[-85.589358,41.956286]},n4928:{id:"n4928",loc:[-85.5892,41.956408]},n4929:{id:"n4929",loc:[-85.589032,41.956288]},n493:{id:"n493",loc:[-85.6362,41.940686]},n4930:{id:"n4930",loc:[-85.58919,41.956166]},n4931:{id:"n4931",loc:[-85.589165,41.956132]},n4932:{id:"n4932",loc:[-85.589002,41.956253]},n4933:{id:"n4933",loc:[-85.588826,41.956122]},n4934:{id:"n4934",loc:[-85.588989,41.956001]},n4935:{id:"n4935",loc:[-85.588673,41.955757]},n4936:{id:"n4936",loc:[-85.588502,41.955882]},n4937:{id:"n4937",loc:[-85.588339,41.955759]},n4938:{id:"n4938",loc:[-85.58851,41.955633]},n4939:{id:"n4939",loc:[-85.590382,41.955892]},n494:{id:"n494",loc:[-85.635969,41.94069]},n4940:{id:"n4940",loc:[-85.589923,41.956231]},n4941:{id:"n4941",loc:[-85.58984,41.956168]},n4942:{id:"n4942",loc:[-85.5903,41.95583]},n4943:{id:"n4943",loc:[-85.589636,41.956038]},n4944:{id:"n4944",loc:[-85.589546,41.956105]},n4945:{id:"n4945",loc:[-85.589045,41.955729]},n4946:{id:"n4946",loc:[-85.589135,41.955662]},n4947:{id:"n4947",loc:[-85.590718,41.955293]},n4948:{id:"n4948",loc:[-85.590718,41.955374]},n4949:{id:"n4949",loc:[-85.589211,41.955369]},n495:{id:"n495",loc:[-85.635965,41.940561]},n4950:{id:"n4950",loc:[-85.589212,41.955287]},n4951:{id:"n4951",loc:[-85.589675,41.956817]},n4952:{id:"n4952",loc:[-85.58947,41.95697]},n4953:{id:"n4953",loc:[-85.589219,41.956784]},n4954:{id:"n4954",loc:[-85.589425,41.95663]},n4955:{id:"n4955",loc:[-85.589373,41.95702]},n4956:{id:"n4956",loc:[-85.589171,41.957172]},n4957:{id:"n4957",loc:[-85.588962,41.957019]},n4958:{id:"n4958",loc:[-85.589164,41.956867]},n4959:{id:"n4959",loc:[-85.588881,41.955006]},n496:{id:"n496",loc:[-85.636031,41.94056]},n4960:{id:"n4960",loc:[-85.588804,41.955006]},n4961:{id:"n4961",loc:[-85.604773,41.954521]},n4962:{id:"n4962",loc:[-85.601603,41.954527]},n4963:{id:"n4963",loc:[-85.600823,41.954169]},n4964:{id:"n4964",loc:[-85.600828,41.950191]},n4965:{id:"n4965",loc:[-85.601673,41.949457]},n4966:{id:"n4966",loc:[-85.604464,41.949488]},n4967:{id:"n4967",loc:[-85.60538,41.950212]},n4968:{id:"n4968",loc:[-85.605395,41.954108]},n4969:{id:"n4969",loc:[-85.604771,41.954109]},n497:{id:"n497",loc:[-85.636032,41.940602]},n4970:{id:"n4970",loc:[-85.600613,41.953916]},n4971:{id:"n4971",loc:[-85.599758,41.954649]},n4972:{id:"n4972",loc:[-85.591194,41.954663]},n4973:{id:"n4973",loc:[-85.591182,41.950465]},n4974:{id:"n4974",loc:[-85.591871,41.950464]},n4975:{id:"n4975",loc:[-85.591868,41.949209]},n4976:{id:"n4976",loc:[-85.592155,41.949209]},n4977:{id:"n4977",loc:[-85.592155,41.94848]},n4978:{id:"n4978",loc:[-85.600615,41.948482]},n4979:{id:"n4979",loc:[-85.605421,41.949378]},n498:{id:"n498",loc:[-85.635776,41.940583]},n4980:{id:"n4980",loc:[-85.600614,41.949373]},n4981:{id:"n4981",loc:[-85.601316,41.94849]},n4982:{id:"n4982",loc:[-85.601592,41.947641]},n4983:{id:"n4983",loc:[-85.60395,41.947618]},n4984:{id:"n4984",loc:[-85.603973,41.948114]},n4985:{id:"n4985",loc:[-85.605398,41.948103]},n4986:{id:"n4986",loc:[-85.614017,41.965566]},n4987:{id:"n4987",loc:[-85.605787,41.965619]},n4988:{id:"n4988",loc:[-85.60577,41.963821]},n4989:{id:"n4989",loc:[-85.612886,41.963808]},n499:{id:"n499",loc:[-85.63589,41.940578]},n4990:{id:"n4990",loc:[-85.613207,41.963705]},n4991:{id:"n4991",loc:[-85.613511,41.963525]},n4992:{id:"n4992",loc:[-85.613667,41.963305]},n4993:{id:"n4993",loc:[-85.613779,41.962983]},n4994:{id:"n4994",loc:[-85.613797,41.959709]},n4995:{id:"n4995",loc:[-85.613663,41.95936]},n4996:{id:"n4996",loc:[-85.61339,41.959064]},n4997:{id:"n4997",loc:[-85.610503,41.956898]},n4998:{id:"n4998",loc:[-85.610485,41.956595]},n4999:{id:"n4999",loc:[-85.613892,41.956621]},n5:{id:"n5",loc:[-85.622744,41.95268]},n50:{id:"n50",loc:[-85.636673,41.943143]},n500:{id:"n500",loc:[-85.636198,41.940578]},n5000:{id:"n5000",loc:[-85.613866,41.958574]},n5001:{id:"n5001",loc:[-85.615262,41.958561]},n5002:{id:"n5002",loc:[-85.615279,41.959541]},n5003:{id:"n5003",loc:[-85.615314,41.95597]},n5004:{id:"n5004",loc:[-85.613887,41.955988]},n5005:{id:"n5005",loc:[-85.613074,41.962244]},n5006:{id:"n5006",loc:[-85.611678,41.963354]},n5007:{id:"n5007",loc:[-85.611678,41.963487]},n5008:{id:"n5008",loc:[-85.606906,41.963502]},n5009:{id:"n5009",loc:[-85.605777,41.962657]},n501:{id:"n501",loc:[-85.636251,41.940584]},n5010:{id:"n5010",loc:[-85.605711,41.9599]},n5011:{id:"n5011",loc:[-85.608139,41.9585]},n5012:{id:"n5012",loc:[-85.60814,41.956306]},n5013:{id:"n5013",loc:[-85.608854,41.95581]},n5014:{id:"n5014",loc:[-85.610039,41.955883]},n5015:{id:"n5015",loc:[-85.610068,41.956754]},n5016:{id:"n5016",loc:[-85.613058,41.959411]},n5017:{id:"n5017",loc:[-85.610234,41.957068]},n5018:{id:"n5018",loc:[-85.609826,41.95581]},n5019:{id:"n5019",loc:[-85.606987,41.958505]},n502:{id:"n502",loc:[-85.636279,41.940605]},n5020:{id:"n5020",loc:[-85.606498,41.958846]},n5021:{id:"n5021",loc:[-85.606013,41.959342]},n5022:{id:"n5022",loc:[-85.614553,41.961581]},n5023:{id:"n5023",loc:[-85.61465,41.96214]},n5024:{id:"n5024",loc:[-85.615277,41.962442]},n5025:{id:"n5025",loc:[-85.615451,41.962972]},n5026:{id:"n5026",loc:[-85.614355,41.964826]},n5027:{id:"n5027",loc:[-85.615133,41.964589]},n5028:{id:"n5028",loc:[-85.615342,41.963818]},n5029:{id:"n5029",loc:[-85.615971,41.963792]},n503:{id:"n503",loc:[-85.636285,41.940633]},n5030:{id:"n5030",loc:[-85.615751,41.963122]},n5031:{id:"n5031",loc:[-85.616575,41.963123]},n5032:{id:"n5032",loc:[-85.612527,41.963846]},n5033:{id:"n5033",loc:[-85.630653,41.940709]},n5034:{id:"n5034",loc:[-85.629858,41.939568]},n5035:{id:"n5035",loc:[-85.629847,41.937926]},n504:{id:"n504",loc:[-85.636281,41.940662]},n505:{id:"n505",loc:[-85.636266,41.940688]},n506:{id:"n506",loc:[-85.636236,41.940701]},n507:{id:"n507",loc:[-85.63619,41.940706]},n508:{id:"n508",loc:[-85.635892,41.940707]},n509:{id:"n509",loc:[-85.635777,41.9407]},n51:{id:"n51",loc:[-85.636673,41.942864]},n510:{id:"n510",loc:[-85.636044,41.940578]},n511:{id:"n511",loc:[-85.635946,41.940578]},n512:{id:"n512",loc:[-85.636475,41.940732]},n513:{id:"n513",loc:[-85.636475,41.940777]},n514:{id:"n514",loc:[-85.636405,41.940777]},n515:{id:"n515",loc:[-85.636405,41.940732]},n516:{id:"n516",loc:[-85.636471,41.940916]},n517:{id:"n517",loc:[-85.636471,41.940961]},n518:{id:"n518",loc:[-85.636404,41.940961]},n519:{id:"n519",loc:[-85.636404,41.940916]},n52:{id:"n52",loc:[-85.636227,41.942864]},n520:{id:"n520",loc:[-85.636286,41.941127]},n521:{id:"n521",loc:[-85.636203,41.941126]},n522:{id:"n522",loc:[-85.636204,41.941083]},n523:{id:"n523",loc:[-85.636287,41.941083]},n524:{id:"n524",loc:[-85.636124,41.941064]},n525:{id:"n525",loc:[-85.636,41.941065]},n526:{id:"n526",loc:[-85.636,41.940964]},n527:{id:"n527",loc:[-85.636045,41.940964]},n528:{id:"n528",loc:[-85.636045,41.940928]},n529:{id:"n529",loc:[-85.636111,41.940928]},n53:{id:"n53",loc:[-85.636227,41.943143]},n530:{id:"n530",loc:[-85.636111,41.940961]},n531:{id:"n531",loc:[-85.636123,41.940961]},n532:{id:"n532",loc:[-85.636124,41.940997]},n533:{id:"n533",loc:[-85.636164,41.940997]},n534:{id:"n534",loc:[-85.636164,41.941044]},n535:{id:"n535",loc:[-85.636124,41.941044]},n536:{id:"n536",loc:[-85.636534,41.941256]},n537:{id:"n537",loc:[-85.63645,41.941246]},n538:{id:"n538",loc:[-85.636462,41.941189]},n539:{id:"n539",loc:[-85.636546,41.941199]},n54:{id:"n54",loc:[-85.636198,41.943119]},n540:{id:"n540",loc:[-85.636802,41.941226]},n541:{id:"n541",loc:[-85.636701,41.941215]},n542:{id:"n542",loc:[-85.636709,41.941174]},n543:{id:"n543",loc:[-85.636656,41.941168]},n544:{id:"n544",loc:[-85.636666,41.941122]},n545:{id:"n545",loc:[-85.636781,41.941136]},n546:{id:"n546",loc:[-85.636774,41.94117]},n547:{id:"n547",loc:[-85.636812,41.941175]},n548:{id:"n548",loc:[-85.636803,41.941047]},n549:{id:"n549",loc:[-85.636785,41.941047]},n55:{id:"n55",loc:[-85.635945,41.94312]},n550:{id:"n550",loc:[-85.636785,41.941058]},n551:{id:"n551",loc:[-85.636644,41.941059]},n552:{id:"n552",loc:[-85.636644,41.941038]},n553:{id:"n553",loc:[-85.636581,41.941039]},n554:{id:"n554",loc:[-85.636581,41.940995]},n555:{id:"n555",loc:[-85.636746,41.940995]},n556:{id:"n556",loc:[-85.636746,41.940978]},n557:{id:"n557",loc:[-85.636803,41.940978]},n558:{id:"n558",loc:[-85.636781,41.940768]},n559:{id:"n559",loc:[-85.636783,41.940828]},n56:{id:"n56",loc:[-85.635943,41.942909]},n560:{id:"n560",loc:[-85.636761,41.940828]},n561:{id:"n561",loc:[-85.636762,41.940857]},n562:{id:"n562",loc:[-85.636641,41.940859]},n563:{id:"n563",loc:[-85.63664,41.940805]},n564:{id:"n564",loc:[-85.636676,41.940804]},n565:{id:"n565",loc:[-85.636675,41.940769]},n566:{id:"n566",loc:[-85.636733,41.94033]},n567:{id:"n567",loc:[-85.636471,41.940334]},n568:{id:"n568",loc:[-85.636469,41.940262]},n569:{id:"n569",loc:[-85.636731,41.940257]},n57:{id:"n57",loc:[-85.636227,41.942909]},n570:{id:"n570",loc:[-85.636798,41.940419]},n571:{id:"n571",loc:[-85.6368,41.940524]},n572:{id:"n572",loc:[-85.63664,41.940526]},n573:{id:"n573",loc:[-85.636638,41.940421]},n574:{id:"n574",loc:[-85.636372,41.940551]},n575:{id:"n575",loc:[-85.636338,41.94055]},n576:{id:"n576",loc:[-85.636339,41.940524]},n577:{id:"n577",loc:[-85.636373,41.940525]},n578:{id:"n578",loc:[-85.636388,41.940435]},n579:{id:"n579",loc:[-85.636222,41.940436]},n58:{id:"n58",loc:[-85.63627,41.943175]},n580:{id:"n580",loc:[-85.636222,41.940366]},n581:{id:"n581",loc:[-85.636387,41.940365]},n582:{id:"n582",loc:[-85.636158,41.940482]},n583:{id:"n583",loc:[-85.635963,41.940484]},n584:{id:"n584",loc:[-85.635961,41.940399]},n585:{id:"n585",loc:[-85.636156,41.940397]},n586:{id:"n586",loc:[-85.635987,41.940314]},n587:{id:"n587",loc:[-85.635987,41.940268]},n588:{id:"n588",loc:[-85.635968,41.940268]},n589:{id:"n589",loc:[-85.635967,41.940212]},n59:{id:"n59",loc:[-85.635531,41.943176]},n590:{id:"n590",loc:[-85.636082,41.940211]},n591:{id:"n591",loc:[-85.636083,41.94027]},n592:{id:"n592",loc:[-85.636064,41.94027]},n593:{id:"n593",loc:[-85.636064,41.940313]},n594:{id:"n594",loc:[-85.638071,41.941562]},n595:{id:"n595",loc:[-85.637953,41.941562]},n596:{id:"n596",loc:[-85.637952,41.941522]},n597:{id:"n597",loc:[-85.637876,41.941523]},n598:{id:"n598",loc:[-85.637876,41.941471]},n599:{id:"n599",loc:[-85.638035,41.94147]},n6:{id:"n6",loc:[-85.624925,41.950604]},n60:{id:"n60",loc:[-85.63542,41.942883]},n600:{id:"n600",loc:[-85.638035,41.941513]},n601:{id:"n601",loc:[-85.638071,41.941512]},n602:{id:"n602",loc:[-85.637038,41.942543],tags:{crossing:"zebra",highway:"crossing"}},n603:{id:"n603",loc:[-85.637134,41.942542]},n604:{id:"n604",loc:[-85.638122,41.942532]},n605:{id:"n605",loc:[-85.638121,41.942478]},n606:{id:"n606",loc:[-85.638104,41.941424]},n607:{id:"n607",loc:[-85.637115,41.941438]},n608:{id:"n608",loc:[-85.637133,41.942453]},n609:{id:"n609",loc:[-85.637429,41.942004]},n61:{id:"n61",loc:[-85.635701,41.942802]},n610:{id:"n610",loc:[-85.637125,41.942004]},n611:{id:"n611",loc:[-85.637022,41.942004]},n612:{id:"n612",loc:[-85.635952,41.943579]},n613:{id:"n613",loc:[-85.635872,41.943594]},n614:{id:"n614",loc:[-85.635857,41.943551]},n615:{id:"n615",loc:[-85.635937,41.943535]},n616:{id:"n616",loc:[-85.63671,41.94344]},n617:{id:"n617",loc:[-85.636427,41.94334]},n618:{id:"n618",loc:[-85.635353,41.943279]},n619:{id:"n619",loc:[-85.635319,41.943257]},n62:{id:"n62",loc:[-85.6358,41.942997]},n620:{id:"n620",loc:[-85.638786,41.943105]},n621:{id:"n621",loc:[-85.634957,41.943146]},n622:{id:"n622",loc:[-85.635012,41.943119]},n623:{id:"n623",loc:[-85.632409,41.944222]},n624:{id:"n624",loc:[-85.631863,41.944749]},n625:{id:"n625",loc:[-85.631915,41.944722]},n626:{id:"n626",loc:[-85.631884,41.94464]},n627:{id:"n627",loc:[-85.631792,41.944359]},n628:{id:"n628",loc:[-85.631817,41.944703]},n629:{id:"n629",loc:[-85.633464,41.945787]},n63:{id:"n63",loc:[-85.635808,41.943176]},n630:{id:"n630",loc:[-85.633583,41.945919]},n631:{id:"n631",loc:[-85.63382,41.945698]},n632:{id:"n632",loc:[-85.633681,41.945571]},n633:{id:"n633",loc:[-85.634217,41.946824]},n634:{id:"n634",loc:[-85.634271,41.946836]},n635:{id:"n635",loc:[-85.634319,41.94573]},n636:{id:"n636",loc:[-85.634377,41.945672]},n637:{id:"n637",loc:[-85.634909,41.945354]},n638:{id:"n638",loc:[-85.634726,41.945493],tags:{artwork_type:"mural",tourism:"artwork"}},n639:{id:"n639",loc:[-85.63546,41.945612]},n64:{id:"n64",loc:[-85.63631,41.943253]},n640:{id:"n640",loc:[-85.635561,41.945493]},n641:{id:"n641",loc:[-85.635417,41.945565]},n642:{id:"n642",loc:[-85.635315,41.945583]},n643:{id:"n643",loc:[-85.63506,41.945383]},n644:{id:"n644",loc:[-85.635198,41.945199]},n645:{id:"n645",loc:[-85.635361,41.94558]},n646:{id:"n646",loc:[-85.635017,41.945066]},n647:{id:"n647",loc:[-85.634779,41.945206]},n648:{id:"n648",loc:[-85.63425,41.945655]},n649:{id:"n649",loc:[-85.634247,41.945631]},n65:{id:"n65",loc:[-85.635398,41.943259]},n650:{id:"n650",loc:[-85.634889,41.945921]},n651:{id:"n651",loc:[-85.634889,41.945939]},n652:{id:"n652",loc:[-85.634889,41.945761]},n653:{id:"n653",loc:[-85.634889,41.945778]},n654:{id:"n654",loc:[-85.635112,41.945715]},n655:{id:"n655",loc:[-85.635025,41.945714]},n656:{id:"n656",loc:[-85.635027,41.945761]},n657:{id:"n657",loc:[-85.635438,41.945665]},n658:{id:"n658",loc:[-85.635416,41.945676]},n659:{id:"n659",loc:[-85.635401,41.945709]},n66:{id:"n66",loc:[-85.635336,41.943036]},n660:{id:"n660",loc:[-85.635271,41.945566]},n661:{id:"n661",loc:[-85.636106,41.946268]},n662:{id:"n662",loc:[-85.635867,41.946747]},n663:{id:"n663",loc:[-85.636476,41.946797]},n664:{id:"n664",loc:[-85.63651,41.946796]},n665:{id:"n665",loc:[-85.635367,41.946389]},n666:{id:"n666",loc:[-85.635367,41.946437]},n667:{id:"n667",loc:[-85.634787,41.946441]},n668:{id:"n668",loc:[-85.6358,41.946243]},n669:{id:"n669",loc:[-85.635784,41.94622]},n67:{id:"n67",loc:[-85.635911,41.942899]},n670:{id:"n670",loc:[-85.635727,41.946195]},n671:{id:"n671",loc:[-85.635708,41.946588]},n672:{id:"n672",loc:[-85.635648,41.946561]},n673:{id:"n673",loc:[-85.635624,41.946555]},n674:{id:"n674",loc:[-85.635417,41.946559]},n675:{id:"n675",loc:[-85.634866,41.946561]},n676:{id:"n676",loc:[-85.634866,41.946543]},n677:{id:"n677",loc:[-85.635085,41.946546]},n678:{id:"n678",loc:[-85.635085,41.946554]},n679:{id:"n679",loc:[-85.634584,41.94488]},n68:{id:"n68",loc:[-85.635915,41.943156]},n680:{id:"n680",loc:[-85.634557,41.944882]},n681:{id:"n681",loc:[-85.634455,41.944943]},n682:{id:"n682",loc:[-85.634305,41.944968]},n683:{id:"n683",loc:[-85.634261,41.944927]},n684:{id:"n684",loc:[-85.634132,41.944741]},n685:{id:"n685",loc:[-85.633705,41.944759]},n686:{id:"n686",loc:[-85.633918,41.944616]},n687:{id:"n687",loc:[-85.633974,41.944663]},n688:{id:"n688",loc:[-85.6336,41.944665]},n689:{id:"n689",loc:[-85.633817,41.944528]},n69:{id:"n69",loc:[-85.63631,41.943157]},n690:{id:"n690",loc:[-85.633889,41.944485]},n691:{id:"n691",loc:[-85.633931,41.944525]},n692:{id:"n692",loc:[-85.633864,41.944563]},n693:{id:"n693",loc:[-85.633456,41.944524]},n694:{id:"n694",loc:[-85.633676,41.944399]},n695:{id:"n695",loc:[-85.633352,41.944415]},n696:{id:"n696",loc:[-85.633655,41.944234]},n697:{id:"n697",loc:[-85.633761,41.94435]},n698:{id:"n698",loc:[-85.633254,41.944318]},n699:{id:"n699",loc:[-85.633472,41.944188]},n7:{id:"n7",loc:[-85.638791,41.943231]},n70:{id:"n70",loc:[-85.63579,41.942967]},n700:{id:"n700",loc:[-85.633524,41.944237]},n701:{id:"n701",loc:[-85.633583,41.944202]},n702:{id:"n702",loc:[-85.633632,41.944247]},n703:{id:"n703",loc:[-85.633165,41.944228]},n704:{id:"n704",loc:[-85.633388,41.944105]},n705:{id:"n705",loc:[-85.633117,41.944175]},n706:{id:"n706",loc:[-85.633302,41.944077]},n707:{id:"n707",loc:[-85.633352,41.944126]},n708:{id:"n708",loc:[-85.633052,41.944107]},n709:{id:"n709",loc:[-85.633237,41.944009]},n71:{id:"n71",loc:[-85.637506,41.942824]},n710:{id:"n710",loc:[-85.633187,41.943955]},n711:{id:"n711",loc:[-85.633,41.944054]},n712:{id:"n712",loc:[-85.633155,41.944265]},n713:{id:"n713",loc:[-85.633669,41.944765]},n714:{id:"n714",loc:[-85.634468,41.945503]},n715:{id:"n715",loc:[-85.63455,41.945566]},n716:{id:"n716",loc:[-85.634737,41.945729]},n717:{id:"n717",loc:[-85.634753,41.945752]},n718:{id:"n718",loc:[-85.634756,41.945781]},n719:{id:"n719",loc:[-85.634758,41.945978]},n72:{id:"n72",loc:[-85.637511,41.943056]},n720:{id:"n720",loc:[-85.634363,41.945548],tags:{crossing:"zebra",highway:"crossing"}},n721:{id:"n721",loc:[-85.634245,41.945599]},n722:{id:"n722",loc:[-85.633474,41.944889]},n723:{id:"n723",loc:[-85.632997,41.944418]},n724:{id:"n724",loc:[-85.63278,41.944183]},n725:{id:"n725",loc:[-85.63331,41.944429]},n726:{id:"n726",loc:[-85.633568,41.944829],tags:{crossing:"zebra",highway:"crossing"}},n727:{id:"n727",loc:[-85.634669,41.94567]},n728:{id:"n728",loc:[-85.634462,41.945787]},n729:{id:"n729",loc:[-85.634272,41.945625]},n73:{id:"n73",loc:[-85.637361,41.943058]},n730:{id:"n730",loc:[-85.634344,41.945699],tags:{crossing:"zebra",highway:"crossing"}},n731:{id:"n731",loc:[-85.634426,41.945783]},n732:{id:"n732",loc:[-85.632425,41.944137]},n733:{id:"n733",loc:[-85.632302,41.944192]},n734:{id:"n734",loc:[-85.632762,41.944174]},n735:{id:"n735",loc:[-85.632713,41.944179]},n736:{id:"n736",loc:[-85.632411,41.944327]},n737:{id:"n737",loc:[-85.632362,41.944341]},n738:{id:"n738",loc:[-85.632236,41.944204]},n739:{id:"n739",loc:[-85.634939,41.942165]},n74:{id:"n74",loc:[-85.637356,41.942825]},n740:{id:"n740",loc:[-85.635079,41.941535]},n741:{id:"n741",loc:[-85.635112,41.941595]},n742:{id:"n742",loc:[-85.635113,41.941633]},n743:{id:"n743",loc:[-85.635067,41.941652]},n744:{id:"n744",loc:[-85.634989,41.941651]},n745:{id:"n745",loc:[-85.634921,41.941609]},n746:{id:"n746",loc:[-85.634881,41.941544]},n747:{id:"n747",loc:[-85.635537,41.940939]},n748:{id:"n748",loc:[-85.635573,41.941048]},n749:{id:"n749",loc:[-85.635453,41.94091]},n75:{id:"n75",loc:[-85.638097,41.942833]},n750:{id:"n750",loc:[-85.635319,41.940943]},n751:{id:"n751",loc:[-85.637057,41.943224]},n752:{id:"n752",loc:[-85.636989,41.943296]},n753:{id:"n753",loc:[-85.636851,41.943299]},n754:{id:"n754",loc:[-85.636848,41.94322]},n755:{id:"n755",loc:[-85.636986,41.943217]},n756:{id:"n756",loc:[-85.637569,41.943454]},n757:{id:"n757",loc:[-85.637437,41.943458]},n758:{id:"n758",loc:[-85.637432,41.943384]},n759:{id:"n759",loc:[-85.637564,41.94338]},n76:{id:"n76",loc:[-85.638098,41.942912]},n760:{id:"n760",loc:[-85.637213,41.943378]},n761:{id:"n761",loc:[-85.637217,41.943435]},n762:{id:"n762",loc:[-85.637235,41.943434]},n763:{id:"n763",loc:[-85.637237,41.943465]},n764:{id:"n764",loc:[-85.637424,41.943459]},n765:{id:"n765",loc:[-85.637418,41.943371]},n766:{id:"n766",loc:[-85.638094,41.943149]},n767:{id:"n767",loc:[-85.638096,41.943201]},n768:{id:"n768",loc:[-85.638041,41.943202]},n769:{id:"n769",loc:[-85.638042,41.943216]},n77:{id:"n77",loc:[-85.637705,41.942913]},n770:{id:"n770",loc:[-85.637927,41.943218]},n771:{id:"n771",loc:[-85.637926,41.943201]},n772:{id:"n772",loc:[-85.637897,41.943201]},n773:{id:"n773",loc:[-85.637896,41.943155]},n774:{id:"n774",loc:[-85.637962,41.943153]},n775:{id:"n775",loc:[-85.637962,41.943134]},n776:{id:"n776",loc:[-85.638017,41.943132]},n777:{id:"n777",loc:[-85.638018,41.943151]},n778:{id:"n778",loc:[-85.638045,41.943289]},n779:{id:"n779",loc:[-85.638048,41.943363]},n78:{id:"n78",loc:[-85.637705,41.942834]},n780:{id:"n780",loc:[-85.637842,41.943367]},n781:{id:"n781",loc:[-85.637839,41.943296]},n782:{id:"n782",loc:[-85.637896,41.943295]},n783:{id:"n783",loc:[-85.637897,41.943314]},n784:{id:"n784",loc:[-85.637957,41.943312]},n785:{id:"n785",loc:[-85.637957,41.943291]},n786:{id:"n786",loc:[-85.637816,41.943375]},n787:{id:"n787",loc:[-85.637815,41.943416]},n788:{id:"n788",loc:[-85.637715,41.943415]},n789:{id:"n789",loc:[-85.637716,41.943374]},n79:{id:"n79",loc:[-85.638071,41.942298]},n790:{id:"n790",loc:[-85.637912,41.943545]},n791:{id:"n791",loc:[-85.637909,41.943479]},n792:{id:"n792",loc:[-85.637967,41.943477]},n793:{id:"n793",loc:[-85.637967,41.94346]},n794:{id:"n794",loc:[-85.638077,41.943457]},n795:{id:"n795",loc:[-85.638078,41.943473]},n796:{id:"n796",loc:[-85.638124,41.943471]},n797:{id:"n797",loc:[-85.638126,41.943514]},n798:{id:"n798",loc:[-85.638079,41.943515]},n799:{id:"n799",loc:[-85.638079,41.943532]},n8:{id:"n8",loc:[-85.635241,41.941948]},n80:{id:"n80",loc:[-85.638074,41.942431]},n800:{id:"n800",loc:[-85.638028,41.943534]},n801:{id:"n801",loc:[-85.638028,41.943542]},n802:{id:"n802",loc:[-85.638845,41.942983]},n803:{id:"n803",loc:[-85.638846,41.94305]},n804:{id:"n804",loc:[-85.638661,41.943052]},n805:{id:"n805",loc:[-85.63866,41.942984]},n806:{id:"n806",loc:[-85.638579,41.942753]},n807:{id:"n807",loc:[-85.638445,41.942755]},n808:{id:"n808",loc:[-85.638452,41.942978]},n809:{id:"n809",loc:[-85.638545,41.942976]},n81:{id:"n81",loc:[-85.637836,41.942433]},n810:{id:"n810",loc:[-85.638543,41.942935]},n811:{id:"n811",loc:[-85.638571,41.942934]},n812:{id:"n812",loc:[-85.63857,41.942901]},n813:{id:"n813",loc:[-85.638611,41.9429]},n814:{id:"n814",loc:[-85.638607,41.942769]},n815:{id:"n815",loc:[-85.63858,41.94277]},n816:{id:"n816",loc:[-85.638597,41.942614]},n817:{id:"n817",loc:[-85.638601,41.94273]},n818:{id:"n818",loc:[-85.638686,41.942731]},n819:{id:"n819",loc:[-85.638689,41.942917]},n82:{id:"n82",loc:[-85.637835,41.94242]},n820:{id:"n820",loc:[-85.638558,41.943018]},n821:{id:"n821",loc:[-85.638243,41.943019]},n822:{id:"n822",loc:[-85.637536,41.943887]},n823:{id:"n823",loc:[-85.63749,41.943926]},n824:{id:"n824",loc:[-85.63743,41.943886]},n825:{id:"n825",loc:[-85.637476,41.943847]},n826:{id:"n826",loc:[-85.637527,41.943846]},n827:{id:"n827",loc:[-85.637141,41.943728]},n828:{id:"n828",loc:[-85.637201,41.943755]},n829:{id:"n829",loc:[-85.636987,41.943608]},n83:{id:"n83",loc:[-85.63776,41.942421]},n830:{id:"n830",loc:[-85.637441,41.943807]},n831:{id:"n831",loc:[-85.637673,41.94399]},n832:{id:"n832",loc:[-85.637783,41.944137]},n833:{id:"n833",loc:[-85.63845,41.944333]},n834:{id:"n834",loc:[-85.638159,41.944248]},n835:{id:"n835",loc:[-85.637859,41.94416]},n836:{id:"n836",loc:[-85.638685,41.944542]},n837:{id:"n837",loc:[-85.638714,41.944611]},n838:{id:"n838",loc:[-85.638711,41.944757]},n839:{id:"n839",loc:[-85.638774,41.945069]},n84:{id:"n84",loc:[-85.637758,41.942339]},n840:{id:"n840",loc:[-85.638742,41.945205]},n841:{id:"n841",loc:[-85.640267,41.942403]},n842:{id:"n842",loc:[-85.640154,41.942404]},n843:{id:"n843",loc:[-85.640152,41.942249]},n844:{id:"n844",loc:[-85.640266,41.942248]},n845:{id:"n845",loc:[-85.640366,41.942599]},n846:{id:"n846",loc:[-85.640362,41.942192]},n847:{id:"n847",loc:[-85.640146,41.942191]},n848:{id:"n848",loc:[-85.640122,41.942196]},n849:{id:"n849",loc:[-85.640108,41.942211]},n85:{id:"n85",loc:[-85.637836,41.942339]},n850:{id:"n850",loc:[-85.640101,41.942236]},n851:{id:"n851",loc:[-85.640103,41.94241]},n852:{id:"n852",loc:[-85.64011,41.942435]},n853:{id:"n853",loc:[-85.640126,41.942445]},n854:{id:"n854",loc:[-85.640153,41.942451]},n855:{id:"n855",loc:[-85.640183,41.942452]},n856:{id:"n856",loc:[-85.640364,41.942452]},n857:{id:"n857",loc:[-85.640007,41.942452]},n858:{id:"n858",loc:[-85.639449,41.942461]},n859:{id:"n859",loc:[-85.640049,41.942391]},n86:{id:"n86",loc:[-85.637835,41.942301]},n860:{id:"n860",loc:[-85.640052,41.942503]},n861:{id:"n861",loc:[-85.639575,41.94251]},n862:{id:"n862",loc:[-85.639572,41.942398]},n863:{id:"n863",loc:[-85.638782,41.942227]},n864:{id:"n864",loc:[-85.63843,41.942226]},n865:{id:"n865",loc:[-85.63823,41.942183]},n866:{id:"n866",loc:[-85.638363,41.942216],tags:{barrier:"gate"}},n867:{id:"n867",loc:[-85.6384,41.942223]},n868:{id:"n868",loc:[-85.636042,41.942797]},n869:{id:"n869",loc:[-85.636308,41.942752]},n87:{id:"n87",loc:[-85.637566,41.942367]},n870:{id:"n870",loc:[-85.636516,41.942729]},n871:{id:"n871",loc:[-85.636782,41.942712]},n872:{id:"n872",loc:[-85.636944,41.942706]},n873:{id:"n873",loc:[-85.63704,41.942706]},n874:{id:"n874",loc:[-85.637237,41.942703]},n875:{id:"n875",loc:[-85.637553,41.9427]},n876:{id:"n876",loc:[-85.638236,41.942697]},n877:{id:"n877",loc:[-85.636284,41.942781]},n878:{id:"n878",loc:[-85.636551,41.942641]},n879:{id:"n879",loc:[-85.633914,41.943693]},n88:{id:"n88",loc:[-85.637566,41.94241]},n880:{id:"n880",loc:[-85.63389,41.943708]},n881:{id:"n881",loc:[-85.633866,41.943686]},n882:{id:"n882",loc:[-85.63389,41.943671]},n883:{id:"n883",loc:[-85.633857,41.943609]},n884:{id:"n884",loc:[-85.634858,41.944474]},n885:{id:"n885",loc:[-85.633988,41.943234]},n886:{id:"n886",loc:[-85.633999,41.943485]},n887:{id:"n887",loc:[-85.634109,41.943449],tags:{emergency:"fire_hydrant"}},n888:{id:"n888",loc:[-85.635728,41.942655],tags:{emergency:"fire_hydrant"}},n889:{id:"n889",loc:[-85.636499,41.942845],tags:{man_made:"flagpole"}},n89:{id:"n89",loc:[-85.637455,41.94241]},n890:{id:"n890",loc:[-85.636197,41.943073]},n891:{id:"n891",loc:[-85.636227,41.943073]},n892:{id:"n892",loc:[-85.637433,41.942933],tags:{"addr:city":"Three Rivers","addr:housenumber":"401","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"restaurant",cuisine:"pizza",name:"Pizza Hut"}},n893:{id:"n893",loc:[-85.637907,41.942879],tags:{amenity:"car_wash"}},n894:{id:"n894",loc:[-85.637661,41.943018]},n895:{id:"n895",loc:[-85.636933,41.942733],tags:{emergency:"fire_hydrant"}},n896:{id:"n896",loc:[-85.637661,41.94304]},n897:{id:"n897",loc:[-85.637562,41.943041]},n898:{id:"n898",loc:[-85.637556,41.942725]},n899:{id:"n899",loc:[-85.637656,41.942724]},n9:{id:"n9",loc:[-85.635159,41.941926]},n90:{id:"n90",loc:[-85.637454,41.942367]},n900:{id:"n900",loc:[-85.637657,41.942779]},n901:{id:"n901",loc:[-85.637983,41.942777]},n902:{id:"n902",loc:[-85.637982,41.942616]},n903:{id:"n903",loc:[-85.637777,41.942778]},n904:{id:"n904",loc:[-85.637775,41.942699]},n905:{id:"n905",loc:[-85.637772,41.942618]},n906:{id:"n906",loc:[-85.637982,41.942698]},n907:{id:"n907",loc:[-85.637941,41.942378],tags:{"addr:city":"Three Rivers","addr:housenumber":"416","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"Gem Pawnbroker",shop:"pawnbroker"}},n908:{id:"n908",loc:[-85.637515,41.942394],tags:{second_hand:"only",shop:"car"}},n909:{id:"n909",loc:[-85.638743,41.942374],tags:{"addr:city":"Three Rivers","addr:housenumber":"500","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"William Towing","service:vehicle:towing":"yes","service:vehicle:tyres":"yes",shop:"car_repair"}},n91:{id:"n91",loc:[-85.637565,41.942341]},n910:{id:"n910",loc:[-85.638594,41.942357]},n911:{id:"n911",loc:[-85.634312,41.943562],tags:{"addr:city":"Three Rivers","addr:housenumber":"145","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"cafe",cuisine:"coffee_shop",name:"L.A.'s Coffee Cafe",outdoor_seating:"yes"}},n912:{id:"n912",loc:[-85.634404,41.943512]},n913:{id:"n913",loc:[-85.634391,41.943519],tags:{entrance:"yes"}},n914:{id:"n914",loc:[-85.634259,41.943538],tags:{entrance:"yes"}},n915:{id:"n915",loc:[-85.634247,41.943528]},n916:{id:"n916",loc:[-85.633747,41.943322],tags:{"addr:city":"Three Rivers","addr:housenumber":"132","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"Preferred Insurance Services",office:"insurance"}},n917:{id:"n917",loc:[-85.63299,41.943686],tags:{"addr:city":"Three Rivers","addr:housenumber":"101","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Lynn's Garage","service:vehicle:tyres":"yes",shop:"car_repair"}},n918:{id:"n918",loc:[-85.633438,41.944883]},n919:{id:"n919",loc:[-85.633265,41.944983]},n92:{id:"n92",loc:[-85.637481,41.942341]},n920:{id:"n920",loc:[-85.633315,41.945027]},n921:{id:"n921",loc:[-85.633376,41.944827]},n922:{id:"n922",loc:[-85.633199,41.944922]},n923:{id:"n923",loc:[-85.633316,41.944772]},n924:{id:"n924",loc:[-85.633147,41.944867]},n925:{id:"n925",loc:[-85.633261,41.944719]},n926:{id:"n926",loc:[-85.633096,41.944812]},n927:{id:"n927",loc:[-85.633191,41.944645]},n928:{id:"n928",loc:[-85.632981,41.94476]},n929:{id:"n929",loc:[-85.633062,41.94483]},n93:{id:"n93",loc:[-85.637481,41.94226]},n930:{id:"n930",loc:[-85.633146,41.944602]},n931:{id:"n931",loc:[-85.632969,41.944703]},n932:{id:"n932",loc:[-85.633008,41.944745]},n933:{id:"n933",loc:[-85.633088,41.944545]},n934:{id:"n934",loc:[-85.632868,41.944655]},n935:{id:"n935",loc:[-85.632941,41.944718]},n936:{id:"n936",loc:[-85.633028,41.944483]},n937:{id:"n937",loc:[-85.632817,41.944605]},n938:{id:"n938",loc:[-85.632923,41.944373]},n939:{id:"n939",loc:[-85.632692,41.944485]},n94:{id:"n94",loc:[-85.637565,41.94226]},n940:{id:"n940",loc:[-85.632871,41.944316]},n941:{id:"n941",loc:[-85.632655,41.944421]},n942:{id:"n942",loc:[-85.632711,41.944478]},n943:{id:"n943",loc:[-85.632825,41.94426]},n944:{id:"n944",loc:[-85.632606,41.944363]},n945:{id:"n945",loc:[-85.63275,41.94418]},n946:{id:"n946",loc:[-85.632588,41.944256]},n947:{id:"n947",loc:[-85.632611,41.944279]},n948:{id:"n948",loc:[-85.632548,41.944306]},n949:{id:"n949",loc:[-85.632512,41.944406]},n95:{id:"n95",loc:[-85.637188,41.942217]},n950:{id:"n950",loc:[-85.632565,41.944463]},n951:{id:"n951",loc:[-85.632579,41.944456]},n952:{id:"n952",loc:[-85.632634,41.944518]},n953:{id:"n953",loc:[-85.632686,41.944569]},n954:{id:"n954",loc:[-85.632745,41.944537]},n955:{id:"n955",loc:[-85.632659,41.944587]},n956:{id:"n956",loc:[-85.632778,41.944705]},n957:{id:"n957",loc:[-85.632815,41.944301],tags:{"addr:city":"Three Rivers","addr:housenumber":"5","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Access Point Employment",office:"employment_agency"}},n958:{id:"n958",loc:[-85.6332,41.944174],tags:{"addr:city":"Three Rivers","addr:housenumber":"6","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Paisley Emporium",shop:"second_hand"}},n959:{id:"n959",loc:[-85.633578,41.944568],tags:{"addr:city":"Three Rivers","addr:housenumber":"22","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Lowry's Books",shop:"books"}},n96:{id:"n96",loc:[-85.637189,41.942303]},n960:{id:"n960",loc:[-85.63344,41.944443],tags:{"addr:city":"Three Rivers","addr:housenumber":"16","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"restaurant",cuisine:"pizza",name:"Paisano's Bar and Grill"}},n961:{id:"n961",loc:[-85.633009,41.944542],tags:{"addr:city":"Three Rivers","addr:housenumber":"13","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"cafe",cuisine:"american",internet_access:"yes",name:"Main Street Cafe"}},n962:{id:"n962",loc:[-85.633674,41.944682],tags:{"addr:city":"Three Rivers","addr:housenumber":"28","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",leisure:"fitness_centre",name:"Main Street Fitness"}},n963:{id:"n963",loc:[-85.633376,41.944868],tags:{"addr:city":"Three Rivers","addr:housenumber":"27","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",leisure:"fitness_centre",name:"Main Street Barbell"}},n964:{id:"n964",loc:[-85.633366,41.944783]},n965:{id:"n965",loc:[-85.633296,41.94482]},n966:{id:"n966",loc:[-85.633214,41.94487]},n967:{id:"n967",loc:[-85.633005,41.944988]},n968:{id:"n968",loc:[-85.633269,41.944816]},n969:{id:"n969",loc:[-85.633215,41.944842]},n97:{id:"n97",loc:[-85.637299,41.942302]},n970:{id:"n970",loc:[-85.633245,41.944871]},n971:{id:"n971",loc:[-85.633296,41.944845]},n972:{id:"n972",loc:[-85.633254,41.944845],tags:{natural:"tree"}},n973:{id:"n973",loc:[-85.633557,41.945515]},n974:{id:"n974",loc:[-85.633279,41.945246]},n975:{id:"n975",loc:[-85.63324,41.945226]},n976:{id:"n976",loc:[-85.6332,41.945213]},n977:{id:"n977",loc:[-85.633133,41.945164]},n978:{id:"n978",loc:[-85.63312,41.945132]},n979:{id:"n979",loc:[-85.633095,41.945081]},n98:{id:"n98",loc:[-85.637299,41.942314]},n980:{id:"n980",loc:[-85.633064,41.945047]},n981:{id:"n981",loc:[-85.632739,41.944742]},n982:{id:"n982",loc:[-85.633281,41.945026]},n983:{id:"n983",loc:[-85.633155,41.944903]},n984:{id:"n984",loc:[-85.633079,41.944829]},n985:{id:"n985",loc:[-85.63304,41.944853]},n986:{id:"n986",loc:[-85.632949,41.944776]},n987:{id:"n987",loc:[-85.632921,41.944725]},n988:{id:"n988",loc:[-85.632859,41.944673]},n989:{id:"n989",loc:[-85.632895,41.94505]},n99:{id:"n99",loc:[-85.637396,41.942313]},n990:{id:"n990",loc:[-85.633336,41.945138]},n991:{id:"n991",loc:[-85.633466,41.945265]},n992:{id:"n992",loc:[-85.633367,41.945327]},n993:{id:"n993",loc:[-85.633163,41.945189]},n994:{id:"n994",loc:[-85.633678,41.945309]},n995:{id:"n995",loc:[-85.633619,41.945261]},n996:{id:"n996",loc:[-85.63355,41.945301]},n997:{id:"n997",loc:[-85.633607,41.945352]},n998:{id:"n998",loc:[-85.633579,41.945327],tags:{entrance:"yes"}},n999:{id:"n999",loc:[-85.633445,41.945404]},r2:{id:"r2",members:[{id:"w225",role:"outer",type:"way"}],tags:{type:"multipolygon",waterway:"riverbank"}},r5:{id:"r5",members:[{id:"w642",role:"outer",type:"way"}],tags:{admin_level:"8",border_type:"city",boundary:"administrative",name:"Three Rivers",place:"city",type:"boundary"}},w1:{id:"w1",nodes:["n5","n1797"],tags:{highway:"residential",name:"12th Avenue"}},w10:{id:"w10",nodes:["n54","n55","n56","n57","n891","n890","n54"],tags:{building:"yes"}},w100:{id:"w100",nodes:["n451","n915","n452"],tags:{highway:"footway"}},w101:{id:"w101",nodes:["n461","n462","n463","n464","n465","n466"],tags:{barrier:"fence"}},w102:{id:"w102",nodes:["n467","n468","n469","n470","n472","n467"],tags:{amenity:"parking"}},w103:{id:"w103",nodes:["n2597","n2444","n471","n472"],tags:{highway:"footway"}},w104:{id:"w104",nodes:["n473","n474","n325"],tags:{footway:"sidewalk",highway:"footway"}},w105:{id:"w105",nodes:["n475","n324","n325"],tags:{footway:"sidewalk",highway:"footway"}},w106:{id:"w106",nodes:["n886","n452","n476"],tags:{footway:"sidewalk",highway:"footway"}},w107:{id:"w107",nodes:["n485","n4678","n486","n18"],tags:{highway:"service"}},w108:{id:"w108",nodes:["n300","n487","n488","n489","n490"],tags:{highway:"footway"}},w109:{id:"w109",nodes:["n490","n491"],tags:{highway:"footway"}},w11:{id:"w11",nodes:["n58","n63","n59","n315","n60"],tags:{highway:"service"}},w110:{id:"w110",nodes:["n492","n493","n494","n495","n496","n497","n492"],tags:{building:"yes"}},w111:{id:"w111",nodes:["n498","n499","n511"],tags:{highway:"service"}},w112:{id:"w112",nodes:["n510","n500","n501","n502","n503","n504","n505","n506","n507","n508","n509"],tags:{highway:"service"}},w113:{id:"w113",nodes:["n511","n510"],tags:{covered:"yes",highway:"service"}},w114:{id:"w114",nodes:["n512","n513","n514","n515","n512"],tags:{building:"yes"}},w115:{id:"w115",nodes:["n516","n517","n518","n519","n516"],tags:{building:"yes"}},w116:{id:"w116",nodes:["n520","n521","n522","n523","n520"],tags:{building:"yes"}},w117:{id:"w117",nodes:["n524","n525","n526","n527","n528","n529","n530","n531","n532","n533","n534","n535","n524"],tags:{building:"yes"}},w118:{id:"w118",nodes:["n536","n537","n538","n539","n536"],tags:{building:"yes"}},w119:{id:"w119",nodes:["n540","n541","n542","n543","n544","n545","n546","n547","n540"],tags:{building:"yes"}},w12:{id:"w12",nodes:["n61","n314","n70","n62","n63"],tags:{highway:"service"}},w120:{id:"w120",nodes:["n548","n549","n550","n551","n552","n553","n554","n555","n556","n557","n548"],tags:{building:"yes"}},w121:{id:"w121",nodes:["n558","n559","n560","n561","n562","n563","n564","n565","n558"],tags:{building:"yes"}},w122:{id:"w122",nodes:["n566","n567","n568","n569","n566"],tags:{building:"yes"}},w123:{id:"w123",nodes:["n570","n571","n572","n573","n570"],tags:{building:"yes"}},w124:{id:"w124",nodes:["n574","n575","n576","n577","n574"],tags:{building:"yes"}},w125:{id:"w125",nodes:["n578","n579","n580","n581","n578"],tags:{building:"yes"}},w126:{id:"w126",nodes:["n582","n583","n584","n585","n582"],tags:{building:"yes"}},w127:{id:"w127",nodes:["n586","n587","n588","n589","n590","n591","n592","n593","n586"],tags:{building:"yes"}},w128:{id:"w128",nodes:["n594","n595","n596","n597","n598","n599","n600","n601","n594"],tags:{building:"yes"}},w129:{id:"w129",nodes:["n309","n602","n603"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w13:{id:"w13",nodes:["n64","n65","n66","n67","n68","n69","n64"],tags:{amenity:"parking"}},w130:{id:"w130",nodes:["n603","n604"],tags:{footway:"sidewalk",highway:"footway"}},w131:{id:"w131",nodes:["n604","n605","n606"],tags:{footway:"sidewalk",highway:"footway"}},w132:{id:"w132",nodes:["n606","n607"],tags:{footway:"sidewalk",highway:"footway"}},w133:{id:"w133",nodes:["n607","n610","n608","n603"],tags:{footway:"sidewalk",highway:"footway"}},w134:{id:"w134",nodes:["n609","n610","n611"],tags:{highway:"service",service:"driveway",surface:"unpaved"}},w135:{id:"w135",nodes:["n244","n245","n246"],tags:{highway:"service"}},w136:{id:"w136",nodes:["n612","n613","n614","n615","n612"],tags:{amenity:"shelter",building:"yes"}},w137:{id:"w137",nodes:["n2779","n2788","n2776","n2778","n2775","n2787","n2440","n2437","n629","n2438","n630","n2439","n2407","n2408","n2409"],tags:{highway:"residential",name:"Foster Street"}},w138:{id:"w138",nodes:["n2779","n625","n626","n627"],tags:{highway:"residential",name:"Foster Street",oneway:"yes"}},w139:{id:"w139",nodes:["n630","n631","n632","n2437"],tags:{highway:"service"}},w14:{id:"w14",nodes:["n71","n72","n73","n74","n71"],tags:{building:"yes"}},w140:{id:"w140",nodes:["n643","n637","n715","n2410"],tags:{highway:"footway",name:"Mural Mall"}},w141:{id:"w141",nodes:["n639","n2516"],tags:{barrier:"wall"}},w142:{id:"w142",nodes:["n640","n641","n645","n642","n660","n643","n644"],tags:{highway:"service"}},w143:{id:"w143",nodes:["n646","n647"],tags:{highway:"service"}},w144:{id:"w144",nodes:["n654","n655","n656"],tags:{barrier:"wall"}},w145:{id:"w145",nodes:["n665","n666","n667"],tags:{barrier:"wall"}},w146:{id:"w146",nodes:["n2727","n662","n2719"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w147:{id:"w147",nodes:["n2725","n674"],tags:{highway:"service",oneway:"yes"}},w148:{id:"w148",nodes:["n2464","n2460","n2454","n684","n2455","n2464"],tags:{building:"yes"}},w149:{id:"w149",nodes:["n2456","n685","n686","n687","n2456"],tags:{building:"yes"}},w15:{id:"w15",nodes:["n75","n76","n77","n78","n75"],tags:{building:"yes"}},w150:{id:"w150",nodes:["n685","n688","n689","n690","n691","n692","n686","n685"],tags:{building:"yes"}},w151:{id:"w151",nodes:["n688","n693","n694","n689","n688"],tags:{building:"yes"}},w152:{id:"w152",nodes:["n693","n695","n702","n696","n697","n694","n693"],tags:{building:"yes"}},w153:{id:"w153",nodes:["n695","n698","n699","n700","n701","n702","n695"],tags:{building:"yes"}},w154:{id:"w154",nodes:["n698","n703","n707","n704","n699","n698"],tags:{building:"yes"}},w155:{id:"w155",nodes:["n703","n705","n706","n707","n703"],tags:{building:"yes"}},w156:{id:"w156",nodes:["n705","n708","n709","n706","n705"],tags:{building:"yes"}},w157:{id:"w157",nodes:["n709","n710","n711","n708","n709"],tags:{building:"yes"}},w158:{id:"w158",nodes:["n369","n712","n725","n713","n714","n715","n727","n716","n717","n718","n719"],tags:{footway:"sidewalk",highway:"footway"}},w159:{id:"w159",nodes:["n714","n720","n721"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w16:{id:"w16",nodes:["n79","n80","n81","n82","n83","n84","n85","n86","n79"],tags:{building:"yes"}},w160:{id:"w160",nodes:["n729","n721","n722","n964","n723","n724"],tags:{footway:"sidewalk",highway:"footway"}},w161:{id:"w161",nodes:["n713","n726","n722"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w162:{id:"w162",nodes:["n727","n2411","n728"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w163:{id:"w163",nodes:["n729","n730","n731"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w164:{id:"w164",nodes:["n365","n732","n733","n738"],tags:{footway:"sidewalk",highway:"footway"}},w165:{id:"w165",nodes:["n724","n734","n367","n735","n736","n737"],tags:{footway:"sidewalk",highway:"footway"}},w166:{id:"w166",nodes:["n739","n2037","n2038","n2039","n2040","n1623","n2032"],tags:{highway:"footway"}},w167:{id:"w167",nodes:["n150","n751"],tags:{highway:"service"}},w168:{id:"w168",nodes:["n752","n753","n754","n755","n752"],tags:{building:"yes"}},w169:{id:"w169",nodes:["n756","n757","n758","n759","n756"],tags:{building:"yes"}},w17:{id:"w17",nodes:["n87","n88","n89","n90","n87"],tags:{building:"yes"}},w170:{id:"w170",nodes:["n760","n761","n762","n763","n764","n765","n760"],tags:{building:"yes"}},w171:{id:"w171",nodes:["n766","n767","n768","n769","n770","n771","n772","n773","n774","n775","n776","n777","n766"],tags:{building:"yes"}},w172:{id:"w172",nodes:["n778","n779","n780","n781","n782","n783","n784","n785","n778"],tags:{building:"yes"}},w173:{id:"w173",nodes:["n786","n787","n788","n789","n786"],tags:{building:"yes"}},w174:{id:"w174",nodes:["n790","n791","n792","n793","n794","n795","n796","n797","n798","n799","n800","n801","n790"],tags:{building:"yes"}},w175:{id:"w175",nodes:["n802","n803","n804","n805","n802"],tags:{building:"yes"}},w176:{id:"w176",nodes:["n806","n807","n808","n809","n810","n811","n812","n813","n814","n815","n806"],tags:{building:"yes"}},w177:{id:"w177",nodes:["n816","n1140","n817","n818","n819","n820","n821"],tags:{highway:"service"}},w178:{id:"w178",nodes:["n822","n823","n824","n825","n822"],tags:{building:"yes"}},w179:{id:"w179",nodes:["n841","n842","n843","n844","n841"],tags:{building:"yes"}},w18:{id:"w18",nodes:["n91","n92","n93","n94","n91"],tags:{building:"yes"}},w180:{id:"w180",nodes:["n845","n856","n846"],tags:{highway:"service"}},w181:{id:"w181",nodes:["n846","n847","n848","n849","n850","n851","n852","n853","n854","n855","n856"],tags:{highway:"service",oneway:"yes",service:"drive-through"}},w182:{id:"w182",nodes:["n857","n858"],tags:{highway:"service"}},w183:{id:"w183",nodes:["n859","n860","n861","n862","n859"],tags:{amenity:"parking"}},w184:{id:"w184",nodes:["n863","n864","n867","n866","n865"],tags:{highway:"service"}},w185:{id:"w185",nodes:["n883","n884"],tags:{barrier:"fence"}},w186:{id:"w186",nodes:["n1954","n622","n1955"],tags:{highway:"path",name:"Riverwalk Trail"}},w187:{id:"w187",nodes:["n621","n1954"],tags:{highway:"steps",incline:"up",name:"Riverwalk Trail",surface:"wood"}},w188:{id:"w188",nodes:["n2274","n2275","n2276","n2277","n2278","n2279","n1953","n621"],tags:{highway:"path",name:"Riverwalk Trail",surface:"wood"}},w189:{id:"w189",nodes:["n2273","n2274"],tags:{highway:"steps",incline:"down",name:"Riverwalk Trail",surface:"wood"}},w19:{id:"w19",nodes:["n95","n96","n97","n98","n99","n100","n101","n102","n95"],tags:{building:"yes"}},w190:{id:"w190",nodes:["n821","n894","n900","n903","n901"],tags:{highway:"service"}},w191:{id:"w191",nodes:["n896","n897","n898","n899","n900","n894","n896"],tags:{amenity:"parking"}},w192:{id:"w192",nodes:["n903","n904","n905"],tags:{highway:"service"}},w193:{id:"w193",nodes:["n901","n906","n902"],tags:{highway:"service"}},w194:{id:"w194",nodes:["n912","n913"],tags:{highway:"footway"}},w195:{id:"w195",nodes:["n914","n915"],tags:{highway:"footway"}},w196:{id:"w196",nodes:["n2466","n918","n919","n920","n2466"],tags:{building:"yes"}},w197:{id:"w197",nodes:["n918","n921","n922","n919","n918"],tags:{building:"yes"}},w198:{id:"w198",nodes:["n923","n925","n926","n924","n923"],tags:{building:"yes"}},w199:{id:"w199",nodes:["n925","n927","n932","n928","n929","n926","n925"],tags:{building:"yes"}},w2:{id:"w2",nodes:["n3523","n2182","n2160"],tags:{highway:"service"}},w20:{id:"w20",nodes:["n103","n104","n105","n106","n107","n108","n109","n110","n111","n112","n113","n114","n103"],tags:{building:"yes"}},w200:{id:"w200",nodes:["n927","n930","n931","n932","n927"],tags:{building:"yes"}},w201:{id:"w201",nodes:["n930","n933","n934","n935","n931","n930"],tags:{building:"yes"}},w202:{id:"w202",nodes:["n933","n936","n937","n934","n933"],tags:{building:"yes"}},w203:{id:"w203",nodes:["n936","n938","n942","n939","n954","n937","n936"],tags:{building:"yes"}},w204:{id:"w204",nodes:["n938","n940","n941","n942","n938"],tags:{building:"yes"}},w205:{id:"w205",nodes:["n940","n943","n944","n941","n940"],tags:{building:"yes"}},w206:{id:"w206",nodes:["n943","n945","n946","n947","n948","n944","n943"],tags:{building:"yes"}},w207:{id:"w207",nodes:["n944","n949","n950","n951","n941","n944"],tags:{building:"yes"}},w208:{id:"w208",nodes:["n941","n951","n952","n939","n942","n941"],tags:{building:"yes"}},w209:{id:"w209",nodes:["n952","n953","n954","n939","n952"],tags:{building:"yes"}},w21:{id:"w21",nodes:["n115","n116","n117","n118","n115"],tags:{building:"yes"}},w210:{id:"w210",nodes:["n953","n955","n956","n934","n937","n954","n953"],tags:{building:"yes"}},w211:{id:"w211",nodes:["n964","n965"],tags:{highway:"footway"}},w212:{id:"w212",nodes:["n966","n983","n967","n989"],tags:{highway:"footway"}},w213:{id:"w213",nodes:["n965","n968","n969","n966","n970","n971","n965"],tags:{highway:"footway"}},w214:{id:"w214",nodes:["n973","n999","n992","n974","n975","n976","n993","n977","n978","n979","n980","n967","n981","n1000","n1001","n1002","n1003","n1004","n1005","n1006","n1007","n1008","n1009"],tags:{footway:"sidewalk",highway:"footway"}},w215:{id:"w215",nodes:["n978","n982","n983","n984","n985","n986","n987","n988","n981"],tags:{highway:"footway"}},w216:{id:"w216",nodes:["n976","n990","n991","n992"],tags:{highway:"footway"}},w217:{id:"w217",nodes:["n998","n999"],tags:{highway:"footway"}},w218:{id:"w218",nodes:["n1019","n1020","n1021","n1022","n731","n728","n1023","n1025","n1024","n1019"],tags:{footway:"sidewalk",highway:"footway"}},w219:{id:"w219",nodes:["n719","n1026","n1027"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w22:{id:"w22",nodes:["n119","n120","n121","n122","n119"],tags:{building:"yes"}},w220:{id:"w220",nodes:["n1027","n1028","n1019"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w221:{id:"w221",nodes:["n2080","n1828","n1863","n1829"],tags:{highway:"tertiary",name:"Constantine Street"}},w222:{id:"w222",nodes:["n1029","n1030","n1031"],tags:{highway:"service"}},w223:{id:"w223",nodes:["n2213","n2171","n2183","n2180","n2205","n2177","n2179","n2218","n2200","n2188","n2169","n2196","n2162","n2170","n2211","n2216","n2204","n2220","n2164","n2210","n2217","n2189","n460","n453","n2282"],tags:{name:"Rocky River",waterway:"river"}},w224:{id:"w224",nodes:["n3750","n3751","n3752"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w225:{id:"w225",nodes:["n2134","n2127","n2313","n2109","n2112","n2129","n2156","n2146","n2126","n2153","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n2122","n2114","n2149","n2119","n2106","n2111","n2145","n2113","n2117","n2159","n2143","n2123","n2142","n2116","n2154","n2139","n2150","n2157","n2120","n2138","n2130","n2136","n2155","n2107","n2141","n2124","n3754","n2121","n2105","n2108","n3755","n2128","n2110","n2152","n2125","n2135","n2186","n2115","n2144","n2137","n2133","n2148","n2118","n1871","n1875","n1872","n2041","n1873","n2042","n1874","n1884","n1870","n2151","n2147","n2158","n2104","n2134"]},w226:{id:"w226",nodes:["n2243","n2280","n2244","n2245","n2246","n2247","n1931","n1932","n1933","n1934","n1935","n1936","n1937","n1938","n4681","n1939","n1940","n1941","n1942","n1943","n1944","n1945","n1946","n1947"],tags:{highway:"path",name:"Riverwalk Trail",surface:"asphalt",width:"3"}},w227:{id:"w227",nodes:["n2994","n3012","n3011","n2958"],tags:{highway:"secondary",name:"Main Street"}},w228:{id:"w228",nodes:["n2747","n2762","n2757","n2746","n2761","n2758","n2760","n2755","n2749","n2691","n1028","n2432","n2414","n2413","n2412","n2411","n2410","n720","n726","n370","n368","n2748"],tags:{highway:"primary",name:"Main Street"}},w229:{id:"w229",nodes:["n2083","n2103","n2102","n2084","n2085","n2086","n2087","n2242","n471","n324","n2101","n332","n1868"],tags:{name:"Conrail Railroad",railway:"rail"}},w23:{id:"w23",nodes:["n123","n124","n125","n126","n123"],tags:{building:"yes"}},w230:{id:"w230",nodes:["n2232","n2236","n2231","n2230","n2226","n2241","n2237","n2227","n1182","n2233","n2228","n2229","n1183","n2234","n19","n1891","n20","n2223","n2224","n2238","n2235","n2240","n2225","n2239"],tags:{name:"Saint Joseph River",waterway:"river"}},w231:{id:"w231",nodes:["n456","n1036","n1037","n1038"],tags:{barrier:"wall"}},w232:{id:"w232",nodes:["n1034","n1039","n1040"],tags:{barrier:"wall"}},w233:{id:"w233",nodes:["n1041","n1042","n1043","n1044","n1045","n1046","n1041"],tags:{access:"private",leisure:"swimming_pool"}},w234:{id:"w234",nodes:["n1047","n1048"],tags:{barrier:"hedge"}},w235:{id:"w235",nodes:["n1049","n1050","n1051","n1052","n1049"],tags:{building:"yes"}},w236:{id:"w236",nodes:["n1053","n1054","n1055","n1056","n1057","n1058","n1059","n1060","n1053"],tags:{building:"yes"}},w237:{id:"w237",nodes:["n1061","n1062","n1063","n1064","n1065","n1061"],tags:{building:"yes"}},w238:{id:"w238",nodes:["n1066","n1067","n1068","n1069","n1070","n1071","n1066"],tags:{building:"yes"}},w239:{id:"w239",nodes:["n1072","n1073","n1074","n1075","n1072"],tags:{building:"yes"}},w24:{id:"w24",nodes:["n127","n128","n129","n130","n127"],tags:{building:"yes"}},w240:{id:"w240",nodes:["n1076","n1077","n1078","n1079","n1080","n1081","n1076"],tags:{building:"yes"}},w241:{id:"w241",nodes:["n1082","n1083","n1084","n1085","n1082"],tags:{building:"yes"}},w242:{id:"w242",nodes:["n1086","n1087","n1088","n1089","n1086"],tags:{building:"yes"}},w243:{id:"w243",nodes:["n1090","n1091","n1092","n1093","n1094","n1095","n1096","n1097","n1090"],tags:{building:"yes"}},w244:{id:"w244",nodes:["n1098","n1099","n1100","n1101"],tags:{barrier:"fence"}},w245:{id:"w245",nodes:["n1102","n835","n30","n2590","n35","n29","n2591","n34","n28","n2592","n2312","n32","n2593","n31","n33","n2594","n2595","n1102"],tags:{highway:"service"}},w246:{id:"w246",nodes:["n1103","n1139","n1104"],tags:{barrier:"fence"}},w247:{id:"w247",nodes:["n1105","n1106","n1107","n1108","n1109","n1110","n1111","n1112","n1113","n1114","n1105"],tags:{building:"yes"}},w248:{id:"w248",nodes:["n1115","n1116","n1117","n1118","n1119","n1120","n1115"],tags:{building:"yes"}},w249:{id:"w249",nodes:["n1121","n1122","n1123","n1124","n1121"],tags:{building:"yes"}},w25:{id:"w25",nodes:["n131","n132","n133","n134","n135","n136","n137","n138","n139","n140","n141","n142","n131"],tags:{building:"yes"}},w250:{id:"w250",nodes:["n1125","n1126","n1127","n1128","n1129","n1130","n1131","n1132","n1133","n1134","n1135","n1136","n1125"],tags:{building:"yes"}},w251:{id:"w251",nodes:["n1137","n1138","n1139"],tags:{barrier:"fence"}},w252:{id:"w252",nodes:["n876","n1140","n1141"],tags:{footway:"sidewalk",highway:"footway"}},w253:{id:"w253",nodes:["n1141","n1142","n1143","n1144","n1145","n1146"],tags:{footway:"sidewalk",highway:"footway"}},w254:{id:"w254",nodes:["n1146","n4743","n1147","n1148"],tags:{footway:"sidewalk",highway:"footway"}},w255:{id:"w255",nodes:["n1148","n1149","n1150","n1151"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w256:{id:"w256",nodes:["n1151","n1153","n1154","n1155"],tags:{footway:"sidewalk",highway:"footway"}},w257:{id:"w257",nodes:["n1155","n1156"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w258:{id:"w258",nodes:["n1157","n1158"],tags:{barrier:"retaining_wall"}},w259:{id:"w259",nodes:["n1156","n1161","n1159","n1160","n719"],tags:{footway:"sidewalk",highway:"footway"}},w26:{id:"w26",nodes:["n143","n608","n144"],tags:{highway:"service"}},w260:{id:"w260",nodes:["n1162","n1163","n1164","n1165","n1166","n1167","n1168","n1169","n1170","n2528"],tags:{highway:"footway"}},w261:{id:"w261",nodes:["n1171","n1172","n1173"],tags:{barrier:"wall"}},w262:{id:"w262",nodes:["n1175","n1176","n1177","n1178","n1179","n1180","n1181","n1175"],tags:{natural:"wood"}},w263:{id:"w263",nodes:["n1947","n1184","n1948","n1185","n1949","n1957","n1950","n480","n1951","n479","n478","n477","n1952","n1851","n1956","n2248","n619","n618","n2249","n2250","n2251","n617","n2252","n616","n2253","n829","n2254","n827","n828","n2255","n830","n2256","n826","n2257","n831","n2258","n832","n835","n834","n2312","n2267","n2259","n833","n2268","n2260","n836","n2261","n837","n2262","n838","n2263","n2264","n839","n2265","n840","n2266"],tags:{highway:"path",name:"Riverwalk Trail",surface:"asphalt",width:"3"}},w264:{id:"w264",nodes:["n1186","n1187","n1188","n1189","n1186"],tags:{building:"yes"}},w265:{id:"w265",nodes:["n1190","n1191","n1192","n1193","n1190"],tags:{building:"yes"}},w266:{id:"w266",nodes:["n1194","n1195","n1196","n1197","n1198","n1199","n1200","n1201","n1194"],tags:{building:"yes"}},w267:{id:"w267",nodes:["n1205","n1206","n1207","n1208","n1209","n1210","n1205"],tags:{building:"house"}},w268:{id:"w268",nodes:["n1211","n1212","n1213","n1214","n1215","n1216","n1217","n1218","n1219","n1220","n1211"],tags:{building:"house"}},w269:{id:"w269",nodes:["n1221","n1225","n1222","n1223","n1224","n1221"],tags:{building:"house"}},w27:{id:"w27",nodes:["n145","n147","n146"],tags:{highway:"footway"}},w270:{id:"w270",nodes:["n1225","n1226","n1227","n1229","n1228"],tags:{barrier:"fence"}},w271:{id:"w271",nodes:["n1229","n1230"],tags:{barrier:"fence"}},w272:{id:"w272",nodes:["n1231","n1232","n1233","n1234","n1235","n1236","n1237","n1238","n1231"],tags:{building:"house"}},w273:{id:"w273",nodes:["n1239","n1240","n1241","n1242","n1243","n1244","n1245","n1246","n1239"],tags:{building:"house"}},w274:{id:"w274",nodes:["n1247","n1248","n1249","n1250","n1247"],tags:{building:"house"}},w275:{id:"w275",nodes:["n1251","n1252","n1253","n1254","n1255","n1256","n1251"],tags:{building:"house"}},w276:{id:"w276",nodes:["n1257","n1258","n1259","n1260","n1257"],tags:{building:"shed"}},w277:{id:"w277",nodes:["n1261","n1262","n1263","n1264","n1265","n1266","n1267","n1268","n1261"],tags:{building:"house"}},w278:{id:"w278",nodes:["n1269","n1270","n1271","n1272","n1273","n1274","n1284","n1269"],tags:{building:"house"}},w279:{id:"w279",nodes:["n1275","n1276","n1277","n1278","n1279","n1280","n1275"],tags:{building:"house"}},w28:{id:"w28",nodes:["n147","n148"],tags:{highway:"footway"}},w280:{id:"w280",nodes:["n1281","n1282","n1283","n1284"],tags:{barrier:"fence"}},w281:{id:"w281",nodes:["n1285","n1286","n1287","n1288","n1285"],tags:{building:"house"}},w282:{id:"w282",nodes:["n1289","n1290","n1291","n1292","n1293","n1294","n1295","n1296","n1289"],tags:{building:"house"}},w283:{id:"w283",nodes:["n1297","n1298","n1299","n1300","n1301","n1302","n1297"],tags:{access:"private",leisure:"swimming_pool"}},w284:{id:"w284",nodes:["n1303","n1304","n1305","n1306","n1307","n1308","n1309","n1310","n1311","n1312","n1303"],tags:{building:"house"}},w285:{id:"w285",nodes:["n1313","n1314","n1315","n1316","n1313"],tags:{building:"house"}},w286:{id:"w286",nodes:["n1317","n1318","n1319","n1320","n1321","n1322","n1323","n1324","n1325","n1326","n1327","n1328","n1329","n1330","n1317"],tags:{building:"house"}},w287:{id:"w287",nodes:["n1331","n1332","n1333","n1334","n1465","n1335","n1336","n1331"],tags:{building:"yes"}},w288:{id:"w288",nodes:["n1349","n1350","n1351","n1352","n1353","n1354","n1355","n1337","n1338","n1341","n1342","n1343","n1344","n1345","n1346","n1347","n1348","n1339","n1340","n1349"],tags:{access:"private",leisure:"swimming_pool"}},w289:{id:"w289",nodes:["n1356","n1331"],tags:{barrier:"fence"}},w29:{id:"w29",nodes:["n149","n874","n150","n151","n897","n898","n875","n152"],tags:{highway:"service",oneway:"yes"}},w290:{id:"w290",nodes:["n1357","n1358","n1359","n1360","n1357"],tags:{building:"shed"}},w291:{id:"w291",nodes:["n1358","n1361","n1362"],tags:{barrier:"fence"}},w292:{id:"w292",nodes:["n1363","n1364","n1365","n1366","n1367","n1368","n1363"],tags:{building:"house"}},w293:{id:"w293",nodes:["n1369","n1370","n1371","n1372","n1373","n1374","n1369"],tags:{leisure:"swimming_pool"}},w294:{id:"w294",nodes:["n1367","n1375","n1376","n1377"],tags:{barrier:"fence"}},w295:{id:"w295",nodes:["n1378","n1379","n1380","n1381","n1378"],tags:{building:"house"}},w296:{id:"w296",nodes:["n1382","n1383","n1384","n1385","n1386","n1387","n1382"],tags:{building:"house"}},w297:{id:"w297",nodes:["n1388","n1389","n1390","n1391","n1392","n1393","n1388"],tags:{building:"house"}},w298:{id:"w298",nodes:["n1394","n1395","n1396","n1397","n1394"],tags:{building:"house"}},w299:{id:"w299",nodes:["n1398","n1399","n1400","n1401","n1398"],tags:{access:"private3",leisure:"swimming_pool"}},w3:{id:"w3",nodes:["n1","n2"],tags:{highway:"track",name:"Water Street"}},w30:{id:"w30",nodes:["n153","n154","n155","n156","n153"],tags:{amenity:"parking"}},w300:{id:"w300",nodes:["n1402","n1403","n1404","n1405","n1406","n1407","n1408","n1409","n1410","n1411","n1412","n1413","n1402"],tags:{building:"house"}},w301:{id:"w301",nodes:["n1414","n1415","n1416","n1417","n1414"],tags:{building:"garage"}},w302:{id:"w302",nodes:["n1406","n1418","n1419","n1403"],tags:{barrier:"fence"}},w303:{id:"w303",nodes:["n1423","n1424","n1425","n1426","n1427","n1428","n1429","n1430","n1431","n1432","n1423"],tags:{building:"house"}},w304:{id:"w304",nodes:["n1433","n1434","n1435","n1446","n1436","n1437","n1438","n1439","n1444","n1440","n1441","n1445","n1442","n1443","n1433"],tags:{access:"private",leisure:"swimming_pool"}},w305:{id:"w305",nodes:["n1447","n1448","n1452","n1453","n1454","n1451","n1449","n1450","n1447"],tags:{building:"house"}},w306:{id:"w306",nodes:["n1455","n1456","n1457","n1458","n1455"],tags:{building:"shed"}},w307:{id:"w307",nodes:["n1459","n1460","n1461","n1462","n1459"],tags:{building:"shed"}},w308:{id:"w308",nodes:["n1463","n1464"],tags:{barrier:"fence"}},w309:{id:"w309",nodes:["n1465","n1466","n1467","n1468"],tags:{barrier:"fence"}},w31:{id:"w31",nodes:["n157","n605","n158"],tags:{highway:"service"}},w310:{id:"w310",nodes:["n1469","n1481","n1463"],tags:{barrier:"hedge"}},w311:{id:"w311",nodes:["n1470","n1471","n1472","n1473","n1474","n1475","n1480","n1476","n1477","n1478","n1479","n1470"],tags:{building:"house"}},w312:{id:"w312",nodes:["n1480","n1481"],tags:{barrier:"wall"}},w313:{id:"w313",nodes:["n1482","n1483","n1484","n1485","n1486","n1487","n1488","n1489","n1490","n1491","n1482"],tags:{access:"private",leisure:"swimming_pool"}},w314:{id:"w314",nodes:["n1492","n1493","n1494","n1495","n1496","n1497","n1498","n1499","n1500","n1501","n1502","n1503","n1504","n1505","n1492"],tags:{building:"house"}},w315:{id:"w315",nodes:["n1506","n1507","n1508","n1509","n1510","n1511","n1512","n1513","n1514","n1515","n1506"],tags:{building:"house"}},w316:{id:"w316",nodes:["n1516","n1517","n1518","n1519","n1520","n1521","n1522","n1523","n1516"],tags:{building:"house"}},w317:{id:"w317",nodes:["n1524","n1525","n1526","n1527","n1528","n1529","n1530","n1531","n1524"],tags:{building:"house"}},w318:{id:"w318",nodes:["n1532","n1533"],tags:{barrier:"fence"}},w319:{id:"w319",nodes:["n1534","n1532","n1535"],tags:{barrier:"fence"}},w32:{id:"w32",nodes:["n159","n160","n161","n162","n159"],tags:{amenity:"parking"}},w320:{id:"w320",nodes:["n1536","n1537","n1538","n1539","n1536"],tags:{building:"shed"}},w321:{id:"w321",nodes:["n1540","n1541","n1542","n1543","n1540"],tags:{building:"shed"}},w322:{id:"w322",nodes:["n1544","n1545","n1546","n1547","n1544"],tags:{building:"shed"}},w323:{id:"w323",nodes:["n1548","n1549","n1550","n1551","n1548"],tags:{building:"house"}},w324:{id:"w324",nodes:["n1552","n1553","n1554","n1555","n1556","n1557","n1558","n1559","n1552"],tags:{building:"house"}},w325:{id:"w325",nodes:["n1560","n1561","n1562","n1563","n1564","n1565","n1566","n1567","n1560"],tags:{building:"house"}},w326:{id:"w326",nodes:["n1561","n1568","n1569","n1570"],tags:{barrier:"wall"}},w327:{id:"w327",nodes:["n1571","n1572"],tags:{barrier:"fence"}},w328:{id:"w328",nodes:["n1573","n1574","n1575","n1576","n1573"],tags:{building:"house"}},w329:{id:"w329",nodes:["n1577","n1578","n1579","n1580","n1581","n1582","n1583","n1584","n1585","n1586","n1577"],tags:{building:"house"}},w33:{id:"w33",nodes:["n157","n163"],tags:{highway:"service"}},w330:{id:"w330",nodes:["n1587","n1588","n1589","n1590","n1591","n1592","n1593","n1594","n1587"],tags:{building:"house"}},w331:{id:"w331",nodes:["n1595","n1596","n1597","n1598","n1599","n1600","n1601","n1595"],tags:{access:"private",leisure:"swimming_pool"}},w332:{id:"w332",nodes:["n1602","n1603","n1604","n1605","n1606","n1607","n1608","n1609","n1611","n1610","n1612","n1613","n1602"],tags:{building:"house"}},w333:{id:"w333",nodes:["n2018","n1626","n1627","n2017","n2018"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w334:{id:"w334",nodes:["n2","n3","n2764"],tags:{highway:"service",name:"Water Street"}},w335:{id:"w335",nodes:["n3","n1628","n1614"],tags:{highway:"service"}},w336:{id:"w336",nodes:["n3198","n4545","n2747"],tags:{highway:"residential",name:"Morris Avenue"}},w337:{id:"w337",nodes:["n1629","n3504"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w338:{id:"w338",nodes:["n1813","n1635","n1814","n1634","n1815","n1632","n1816","n1817"],tags:{highway:"service",service:"parking_aisle"}},w339:{id:"w339",nodes:["n1827","n4684","n4690","n1842","n4686","n4685","n1826","n1828","n1846","n1645","n1637","n4703","n1641"],tags:{highway:"residential",name:"Millard Street"}},w34:{id:"w34",nodes:["n164","n165","n166","n171","n866","n172","n167","n168","n169","n910","n170","n164"],tags:{amenity:"parking"}},w340:{id:"w340",nodes:["n1824","n1825"],tags:{highway:"service",service:"parking_aisle"}},w341:{id:"w341",nodes:["n1701","n1702","n1703","n1704","n1705","n1706","n1701"],tags:{building:"yes"}},w342:{id:"w342",nodes:["n1855","n1860","n1856","n1775","n1804","n1776","n1855"],tags:{amenity:"parking",fee:"no"}},w343:{id:"w343",nodes:["n1757","n1758","n1759","n1760","n1757"],tags:{building:"yes"}},w344:{id:"w344",nodes:["n1659","n1660","n1661","n1662","n1663","n1664","n1665","n1666","n1659"],tags:{building:"school"}},w345:{id:"w345",nodes:["n1751","n1752","n1753","n1754","n1755","n1756","n1751"],tags:{building:"yes"}},w346:{id:"w346",nodes:["n1641","n1676","n1673","n1639","n1810","n1642","n1849","n4759","n1845"],tags:{highway:"residential",name:"Douglas Avenue"}},w347:{id:"w347",nodes:["n1642","n1643","n1031","n1630","n845","n1631","n816","n1831","n902","n905","n152","n149","n1832","n1850","n878","n1833","n1852","n42","n1834","n61","n60","n1851","n1835"],tags:{highway:"primary",name:"Michigan Avenue"}},w348:{id:"w348",nodes:["n1650","n1651","n1652","n1653","n1654","n1655","n1656","n1657","n1658","n1650"],tags:{leisure:"playground"}},w349:{id:"w349",nodes:["n1861","n1818","n1819","n1820","n1821","n1825","n1823","n1639"],tags:{highway:"service"}},w35:{id:"w35",nodes:["n168","n167","n172"],tags:{barrier:"fence",fence_type:"chain_link"}},w350:{id:"w350",nodes:["n1783","n1819","n1784","n1857","n1861","n1858","n1783"],tags:{amenity:"parking"}},w351:{id:"w351",nodes:["n1717","n1718","n1719","n1720","n1717"],tags:{building:"yes"}},w352:{id:"w352",nodes:["n1743","n1744","n1745","n1746","n1747","n1748","n1749","n1750","n1743"],tags:{building:"yes"}},w353:{id:"w353",nodes:["n1637","n1636","n1029","n4715","n1630"],tags:{highway:"residential",name:"Lincoln Avenue"}},w354:{id:"w354",nodes:["n1713","n1714","n1715","n1716","n1713"],tags:{building:"yes"}},w355:{id:"w355",nodes:["n1689","n1690","n1691","n1692","n1693","n1694","n1695","n1696","n1689"],tags:{building:"yes"}},w356:{id:"w356",nodes:["n1631","n4717","n1840","n4745","n1841"],tags:{highway:"residential",name:"Hook Avenue"}},w357:{id:"w357",nodes:["n1737","n1738","n1739","n1740","n1741","n1742","n1737"],tags:{building:"yes"}},w358:{id:"w358",nodes:["n1707","n1708","n1709","n1710","n1711","n1712","n1707"],tags:{building:"yes"}},w359:{id:"w359",nodes:["n1829","n4695","n4697","n1843","n4698","n4701","n1638","n4702","n4705","n1636","n4706","n4707","n1633"],tags:{highway:"residential",name:"South Street"}},w36:{id:"w36",nodes:["n910","n171","n866","n172"],tags:{barrier:"fence",fence_type:"chain_link"}},w360:{id:"w360",nodes:["n1767","n1768","n1769","n1770","n1771","n1772","n1773","n1774","n1767"],tags:{building:"yes"}},w361:{id:"w361",nodes:["n1859","n1860","n1804","n1640","n1805","n1817","n1806","n1644","n1811","n1807","n1808","n3419","n1812","n1790","n3418","n3744","n1809","n1813","n1810"],tags:{highway:"service"}},w362:{id:"w362",nodes:["n1639","n1683","n4710","n1633"],tags:{highway:"residential",name:"South Street",oneway:"yes"}},w363:{id:"w363",nodes:["n1646","n1647","n1648","n1649","n1646"],tags:{leisure:"pitch",pitch:"basketball"}},w364:{id:"w364",nodes:["n3820","n3821","n3822","n3823","n3824","n3825","n3826","n3827","n3828","n3829","n3830","n3838","n3839","n3820"],tags:{amenity:"school",name:"Three Rivers Middle School"}},w365:{id:"w365",nodes:["n1721","n1722","n1723","n1724","n1725","n1726","n1727","n1728","n1729","n1730","n1731","n1732","n1733","n1734","n1735","n1736","n1721"],tags:{building:"yes"}},w366:{id:"w366",nodes:["n1791","n1792","n1793","n1794","n1795","n1796","n1798","n1799","n1800","n1801","n1802","n1803","n1791"],tags:{amenity:"parking"}},w367:{id:"w367",nodes:["n1633","n4708","n4711","n1643","n4712","n1838","n4752","n1839"],tags:{highway:"residential",name:"Grant Avenue"}},w368:{id:"w368",nodes:["n1853","n1687","n1688","n1854","n1853"],tags:{amenity:"library",building:"yes",name:"Three Rivers Public Library"}},w369:{id:"w369",nodes:["n1777","n1778","n1779","n1780","n1781","n1782","n1777"],tags:{amenity:"parking"}},w37:{id:"w37",nodes:["n173","n174","n175","n176","n177","n178","n179","n180","n173"],tags:{building:"yes"}},w370:{id:"w370",nodes:["n1645","n1638","n858","n4718","n1631"],tags:{highway:"residential",name:"Hook Avenue"}},w371:{id:"w371",nodes:["n3836","n3835","n4624","n3831","n4632","n3834","n3832","n3833","n3830","n3838","n3839","n3837","n3836"],tags:{amenity:"school",name:"Three Rivers High School"}},w372:{id:"w372",nodes:["n1697","n1698","n1699","n1700","n1697"],tags:{building:"yes"}},w373:{id:"w373",nodes:["n2891","n1785","n1786","n3394","n1787","n1788","n1789","n1830","n1836","n1837","n1848","n3409","n2891"],tags:{amenity:"parking"}},w374:{id:"w374",nodes:["n1761","n1762","n1763","n1764","n1765","n1766","n1761"],tags:{building:"yes"}},w375:{id:"w375",nodes:["n1822","n1823"],tags:{highway:"service",service:"parking_aisle"}},w376:{id:"w376",nodes:["n1677","n1678","n1679","n1680","n1681","n1682","n1677"],tags:{amenity:"parking"}},w377:{id:"w377",nodes:["n1676","n1675","n1674","n1673"],tags:{highway:"service",oneway:"yes"}},w378:{id:"w378",nodes:["n1667","n1668","n1669","n1670","n1671","n1672","n1667"],tags:{amenity:"school",name:"Andrews Elementary School"}},w379:{id:"w379",nodes:["n1630","n4714","n1847","n4750","n1844"],tags:{highway:"residential",name:"Lincoln Avenue"}},w38:{id:"w38",nodes:["n181","n182","n183","n185","n184","n181"],tags:{building:"yes"}},w380:{id:"w380",nodes:["n1683","n3745","n1686","n1633"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w381:{id:"w381",nodes:["n2022","n2037"],tags:{highway:"footway"}},w382:{id:"w382",nodes:["n1826","n1863"],tags:{highway:"residential"}},w383:{id:"w383",nodes:["n2011","n2012","n739","n2013","n2014","n2029","n2011"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w384:{id:"w384",nodes:["n2064","n2065","n2066","n2067","n2068","n2069","n2070","n2071","n2072","n2073","n2074","n2075","n2076","n2077","n2078","n2079","n2064"],tags:{building:"yes"}},w385:{id:"w385",nodes:["n1923","n1924","n1925","n1926","n1927","n1928","n1930","n1929","n1923"],tags:{natural:"water"}},w386:{id:"w386",nodes:["n1827","n14","n1886","n15","n1887","n16","n1888","n18","n17","n1889","n12","n13","n1890","n485","n1864","n11","n10","n2058","n2036","n1865","n2020","n9","n8","n1866","n295","n1867"],tags:{highway:"service"}},w387:{id:"w387",nodes:["n1846","n1843","n865","n157","n4721","n1831"],tags:{highway:"residential",name:"Andrews Street"}},w388:{id:"w388",nodes:["n2019","n2020","n2021","n2022","n2023","n2024","n2025","n2026","n2027","n2028","n2029"],tags:{highway:"footway"}},w389:{id:"w389",nodes:["n2217","n2222","n2221","n2219","n1877","n1879","n1882","n1883","n484","n1885","n483","n1880","n1881","n1878","n1884","n2223"],tags:{name:"Rocky River",waterway:"river"}},w39:{id:"w39",nodes:["n185","n186","n187"],tags:{barrier:"fence"}},w390:{id:"w390",nodes:["n2050","n2051","n2052","n2053","n2050"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w391:{id:"w391",nodes:["n2089","n2090","n2091","n2092","n2093","n2094","n2311","n2095","n2096","n2097","n2098","n1174","n2099","n751","n43","n2062","n4725","n873","n1832"],tags:{highway:"residential",name:"Constantine Street"}},w392:{id:"w392",nodes:["n1869","n212","n436","n2281","n2081"],tags:{highway:"primary",name:"Michigan Avenue"}},w393:{id:"w393",nodes:["n1829","n611","n144","n4694","n602","n1832"],tags:{highway:"tertiary",name:"Constantine Street"}},w394:{id:"w394",nodes:["n1997","n1998","n2000","n1999"],tags:{highway:"service",service:"parking_aisle"}},w395:{id:"w395",nodes:["n1835","n1869"],tags:{bridge:"yes",highway:"primary",name:"Michigan Avenue"}},w396:{id:"w396",nodes:["n2000","n2001"],tags:{highway:"service",service:"parking_aisle"}},w397:{id:"w397",nodes:["n2082","n4688","n1842","n308","n498","n509","n246","n241","n1867","n4645","n293","n1834"],tags:{highway:"residential",name:"Spring Street"}},w398:{id:"w398",nodes:["n2015","n2016","n2017","n2018","n2015"],tags:{building:"yes"}},w399:{id:"w399",nodes:["n2062","n45","n2063","n877","n41","n1852"],tags:{highway:"service"}},w4:{id:"w4",nodes:["n7","n38","n378","n379","n7"],tags:{building:"yes"}},w40:{id:"w40",nodes:["n188","n189","n190","n191","n192","n193","n188"],tags:{building:"house"}},w400:{id:"w400",nodes:["n1968","n1969","n1970","n1971","n2007","n1972","n1973","n1978","n1974","n1977","n1976","n1975","n1968"],tags:{amenity:"parking"}},w401:{id:"w401",nodes:["n1963","n1964"],tags:{bridge:"yes",highway:"footway"}},w402:{id:"w402",nodes:["n1892","n1893","n1894","n1895","n1896","n1897","n1898","n1899","n1900","n1901","n1902","n1903","n1892"],tags:{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street",barrier:"fence",name:"Scidmore Park Petting Zoo",tourism:"zoo",zoo:"petting_zoo"}},w403:{id:"w403",nodes:["n1957","n1958","n1959","n481","n1960","n482","n1949"],tags:{highway:"path"}},w404:{id:"w404",nodes:["n2281","n27","n330","n1987","n1988"],tags:{highway:"service"}},w405:{id:"w405",nodes:["n2249","n2269","n2270","n2271","n2272","n454","n455","n2273"],tags:{highway:"path",name:"Riverwalk Trail"}},w406:{id:"w406",nodes:["n1947","n1624","n1625","n2030","n2033","n4658","n4659","n2031","n2032","n2021"],tags:{highway:"footway"}},w407:{id:"w407",nodes:["n2034","n2036","n2009"],tags:{highway:"footway"}},w408:{id:"w408",nodes:["n1964","n1965","n2002","n1966","n21","n1967","n1969"],tags:{highway:"footway"}},w409:{id:"w409",nodes:["n1904","n1905","n1906","n1907","n1908","n1909","n748","n1910","n747","n1911","n749","n1912","n750","n1913","n1922","n1914","n1921","n1915","n746","n1916","n745","n1917","n744","n1918","n743","n742","n1919","n741","n1920","n740","n1904"],tags:{natural:"water"}},w41:{id:"w41",nodes:["n194","n195","n196","n197","n198","n199","n200","n201","n202","n203","n204","n205","n194"],tags:{building:"house"}},w410:{id:"w410",nodes:["n1868","n2088"],tags:{bridge:"yes",name:"Conrail Railroad",railway:"rail"}},w411:{id:"w411",nodes:["n2010","n2019","n2009","n2008","n2058","n2035","n1961","n1962","n1947","n1963"],tags:{highway:"footway"}},w412:{id:"w412",nodes:["n2290","n2043","n2044","n2045","n1872","n2041","n1873","n2042","n1874","n2046","n2047","n2048","n2049","n2290"],tags:{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street",leisure:"park",name:"Scidmore Park"}},w413:{id:"w413",nodes:["n1831","n876","n4720","n821","n2089"],tags:{highway:"residential",name:"Andrews Street"}},w414:{id:"w414",nodes:["n2002","n2003","n2004","n2005","n2006","n2007"],tags:{highway:"footway"}},w415:{id:"w415",nodes:["n1979","n1980","n1981","n1982","n1979"],tags:{amenity:"parking"}},w416:{id:"w416",nodes:["n2054","n2055","n2056","n2057","n2054"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w417:{id:"w417",nodes:["n2291","n2292","n2293","n2294","n2295","n2296","n2297","n2298","n2299","n1098","n2300","n2301","n2302","n2303","n2304","n2059","n2060","n2305","n2307","n2306","n2310","n2308","n2309","n2291"],tags:{leisure:"park",name:"Memory Isle Park"}},w418:{id:"w418",nodes:["n2033","n2034","n2035"],tags:{highway:"footway"}},w419:{id:"w419",nodes:["n1983","n1984","n1985","n1986","n1983"],tags:{amenity:"parking"}},w42:{id:"w42",nodes:["n206","n207","n208","n209","n210","n211","n206"],tags:{building:"house"}},w420:{id:"w420",nodes:["n1840","n4746","n4748","n1847","n4749","n4755","n1838","n4754","n4756","n1849"],tags:{highway:"residential",name:"French Street"}},w421:{id:"w421",nodes:["n2337","n2268"],tags:{highway:"path"}},w422:{id:"w422",nodes:["n2338","n2339","n2320","n2317","n2319","n2318","n2340","n2341","n2342","n2343","n2344","n2345","n2346","n2347","n2348","n2338"],tags:{natural:"water"}},w423:{id:"w423",nodes:["n2180","n2349","n2350","n2351","n2352","n2404","n2353","n2354","n2355","n2356","n2357","n2358","n2359","n2360","n2361","n2362","n2363","n2364","n2365","n2366","n2370","n2371","n2372","n2373","n2374","n2375","n2377","n2378","n2380","n2381","n2382","n2383","n2386","n2389","n2390","n2391","n2392","n2393","n2396","n2397","n2401","n2402","n2321","n2322","n2323","n2403","n2180"],tags:{natural:"wetland"}},w424:{id:"w424",nodes:["n2324","n2316","n1841","n2315","n2314","n1844","n1839","n4758","n1845"],tags:{highway:"residential",name:"Pealer Street"}},w425:{id:"w425",nodes:["n2267","n2337","n2336","n2335","n2334","n2333","n2332","n2331","n2330","n37","n2329","n2328","n2327","n36","n2326","n2325","n2266"],tags:{highway:"path",name:"Riverwalk Trail"}},w426:{id:"w426",nodes:["n2478","n681","n680","n679","n2459","n2467","n2487","n2478"],tags:{building:"yes"}},w427:{id:"w427",nodes:["n2671","n2672","n2673","n2674","n2671"],tags:{building:"yes"}},w428:{id:"w428",nodes:["n2483","n2482","n2486","n2489","n2492","n2502","n2495","n2480","n2483"],tags:{building:"yes"}},w429:{id:"w429",nodes:["n2707","n2708","n2716","n2712","n2714","n2713","n2715","n2711","n2710","n2723","n2709","n2707"],tags:{amenity:"parking"}},w43:{id:"w43",nodes:["n1955","n1956"],tags:{footway:"sidewalk",highway:"footway",name:"Riverwalk Trail"}},w430:{id:"w430",nodes:["n2471","n2474","n2484","n2479","n2471"],tags:{building:"yes"}},w431:{id:"w431",nodes:["n2218","n2434","n2436","n2433","n2435","n2210"],tags:{name:"Rocky River",waterway:"river"}},w432:{id:"w432",nodes:["n2782","n2532","n2783","n2784","n2782"],tags:{amenity:"parking"}},w433:{id:"w433",nodes:["n2513","n649","n2520","n2514","n2507","n2513"],tags:{building:"yes"}},w434:{id:"w434",nodes:["n2470","n2468","n2461","n2465","n2470"],tags:{building:"yes"}},w435:{id:"w435",nodes:["n2598","n2599","n648","n649","n2520","n2598"],tags:{building:"yes"}},w436:{id:"w436",nodes:["n2639","n2640","n2641","n2642","n2643","n2644","n2645","n2646","n2647","n2648","n2639"],tags:{building:"yes"}},w437:{id:"w437",nodes:["n2503","n2512","n2508","n2499","n2503"],tags:{building:"yes"}},w438:{id:"w438",nodes:["n2440","n2800","n2774","n1"],tags:{highway:"residential",name:"Water Street"}},w439:{id:"w439",nodes:["n2675","n2676","n2677","n2678","n2675"],tags:{building:"yes"}},w44:{id:"w44",nodes:["n213","n214","n215","n216","n213"],tags:{building:"yes"}},w440:{id:"w440",nodes:["n2512","n2503","n2507","n2514","n2512"],tags:{building:"yes"}},w441:{id:"w441",nodes:["n2554","n2717","n674","n2720","n2798"],tags:{highway:"service",oneway:"yes"}},w442:{id:"w442",nodes:["n2583","n2596","n2584","n2585","n2595","n2586","n2587","n2588","n2589","n2583"],tags:{amenity:"parking"}},w443:{id:"w443",nodes:["n2629","n2627","n2628","n2616","n2630","n2629"],tags:{building:"yes"}},w444:{id:"w444",nodes:["n2717","n2724","n670","n2718","n669","n668","n2722","n2727"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w445:{id:"w445",nodes:["n2572","n2573"],tags:{bridge:"yes",highway:"path",name:"Riverwalk Trail"}},w446:{id:"w446",nodes:["n2603","n2604","n2601","n2605","n2606","n2607","n2603"],tags:{building:"yes"}},w447:{id:"w447",nodes:["n2780","n2777","n628","n624","n2779"],tags:{highway:"residential",name:"Foster Street",oneway:"yes"}},w448:{id:"w448",nodes:["n2733","n2734","n2735","n2736","n2737","n2738","n663","n664","n2739","n2733"],tags:{building:"yes"}},w449:{id:"w449",nodes:["n2564","n2565","n2566","n2567","n2568","n2794","n2795","n2564"],tags:{amenity:"parking"}},w45:{id:"w45",nodes:["n217","n218","n219","n220","n217"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w450:{id:"w450",nodes:["n2799","n2728","n2729","n2730","n2731","n2732","n2799"],tags:{building:"yes"}},w451:{id:"w451",nodes:["n2441","n1170","n2442","n2575","n2443","n2445","n2444","n2448","n2441"],tags:{amenity:"parking"}},w452:{id:"w452",nodes:["n2273","n457","n2569","n458","n2570"],tags:{highway:"path",name:"Riverwalk Trail"}},w453:{id:"w453",nodes:["n2447","n2242","n2448","n2527","n2530"],tags:{highway:"service"}},w454:{id:"w454",nodes:["n2560","n333","n2561"],tags:{highway:"service",service:"parking_aisle"}},w455:{id:"w455",nodes:["n2679","n2680","n2681","n2682","n2683","n2684","n2685","n2686","n2687","n2688","n2689","n2690","n2679"],tags:{building:"yes"}},w456:{id:"w456",nodes:["n2425","n2429","n2424"],tags:{bridge:"yes",highway:"residential",name:"Moore Street"}},w457:{id:"w457",nodes:["n2487","n2467","n2472","n2480","n2495","n2487"],tags:{building:"yes"}},w458:{id:"w458",nodes:["n2659","n2660","n2661","n2662","n678","n677","n2663","n2664","n2665","n2666","n675","n676","n2659"],tags:{building:"yes"}},w459:{id:"w459",nodes:["n2600","n2598","n2599","n2601","n2605","n2602","n2600"],tags:{building:"yes"}},w46:{id:"w46",nodes:["n221","n222","n223","n224","n221"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w460:{id:"w460",nodes:["n2468","n2464","n2455","n2457","n2461","n2468"],tags:{building:"yes"}},w461:{id:"w461",nodes:["n2478","n2473","n683","n682","n2463","n681","n2478"],tags:{building:"yes"}},w462:{id:"w462",nodes:["n2547","n473","n2548","n2549"],tags:{highway:"service",service:"parking_aisle"}},w463:{id:"w463",nodes:["n2573","n2574"],tags:{highway:"path",name:"Riverwalk Trail"}},w464:{id:"w464",nodes:["n2445","n2597","n2527","n2528","n2529","n2530","n2531","n2597"],tags:{highway:"service",service:"parking_aisle"}},w465:{id:"w465",nodes:["n2571","n459","n2572"],tags:{highway:"path",name:"Riverwalk Trail"}},w466:{id:"w466",nodes:["n2445","n2574","n2552","n442","n2551","n4727","n323","n2446"],tags:{highway:"service"}},w467:{id:"w467",nodes:["n2484","n2474","n2477","n2485","n2488","n2484"],tags:{building:"yes"}},w468:{id:"w468",nodes:["n2695","n2696","n2697","n2698","n2699","n2700","n2701","n2702","n2695"],tags:{building:"yes"}},w469:{id:"w469",nodes:["n2469","n2476","n2481","n2475","n920","n2466","n2469"],tags:{building:"yes"}},w47:{id:"w47",nodes:["n1988","n1997","n1989","n25","n24","n1990","n26","n1991","n21","n1992","n2006","n1993","n22","n1994","n23","n1995","n1999","n1996","n2001","n1988"],tags:{highway:"service"}},w470:{id:"w470",nodes:["n2473","n2470","n2465","n2458","n2462","n683","n2473"],tags:{building:"yes"}},w471:{id:"w471",nodes:["n2490","n2496","n994","n997","n998","n996","n995","n2485","n2477","n2490"],tags:{building:"yes"}},w472:{id:"w472",nodes:["n2424","n2426","n2427","n2428"],tags:{highway:"residential",name:"Moore Street"}},w473:{id:"w473",nodes:["n2432","n1026","n4741","n2554","n2425"],tags:{highway:"residential",name:"Moore Street"}},w474:{id:"w474",nodes:["n2577","n2576"],tags:{bridge:"yes",highway:"footway"}},w475:{id:"w475",nodes:["n2497","n2505","n2500","n2493","n2497"],tags:{building:"yes"}},w476:{id:"w476",nodes:["n2493","n2500","n2501","n2496","n2490","n2493"],tags:{building:"yes"}},w477:{id:"w477",nodes:["n2431","n360","n4726","n418","n397","n396","n2547","n646","n2447","n644","n2418","n424","n640","n2419","n2420","n2423"],tags:{highway:"residential",name:"Railroad Drive"}},w478:{id:"w478",nodes:["n2515","n2511","n2498","n2504","n2509","n2515"],tags:{building:"yes"}},w479:{id:"w479",nodes:["n2525","n651","n650","n2526","n2524","n653","n652","n656","n2523","n654","n2518","n2517","n2521","n2522","n2525"],tags:{building:"yes"}},w48:{id:"w48",nodes:["n225","n237","n226","n227","n228","n229","n230","n231","n232","n233","n234","n235","n236","n225"],tags:{building:"yes"}},w480:{id:"w480",nodes:["n2703","n2704","n2710","n2711","n2705","n2706","n2703"],tags:{amenity:"parking"}},w481:{id:"w481",nodes:["n2796","n2657","n2658","n2797","n2796"],tags:{building:"yes"}},w482:{id:"w482",nodes:["n2550","n2551","n442","n2552","n2553","n2550"],tags:{amenity:"parking"}},w483:{id:"w483",nodes:["n2790","n2542"],tags:{highway:"service",service:"parking_aisle"}},w484:{id:"w484",nodes:["n2311","n1102"],tags:{highway:"service"}},w485:{id:"w485",nodes:["n2515","n2509","n2516","n2519","n2515"],tags:{building:"yes"}},w486:{id:"w486",nodes:["n2506","n2502","n2492","n2491","n2494","n2506"],tags:{building:"yes"}},w487:{id:"w487",nodes:["n2667","n2668","n2669","n2670","n2667"],tags:{building:"yes"}},w488:{id:"w488",nodes:["n2616","n2608","n2617","n2618","n2619","n2620","n2621","n2622","n2623","n2624","n2625","n2626","n2627","n2628","n2616"],tags:{building:"yes"}},w489:{id:"w489",nodes:["n2081","n2430"],tags:{bridge:"yes",highway:"primary",name:"Michigan Avenue"}},w49:{id:"w49",nodes:["n237","n238"],tags:{highway:"footway"}},w490:{id:"w490",nodes:["n2410","n636","n730","n635","n2409","n2694","n2751","n2765","n2753","n2768","n2754","n2769","n2745","n2766","n4503","n2763","n4501","n2752","n2781"],tags:{highway:"residential",name:"Portage Avenue"}},w491:{id:"w491",nodes:["n2578","n2579","n2580","n2581","n2578"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w492:{id:"w492",nodes:["n2556","n2557","n2558","n2559","n2556"],tags:{amenity:"parking"}},w493:{id:"w493",nodes:["n2460","n2456","n687","n2453","n2454","n2460"],tags:{building:"yes"}},w494:{id:"w494",nodes:["n2471","n2479","n2476","n2469","n2471"],tags:{building:"yes"}},w495:{id:"w495",nodes:["n2724","n2725","n673","n672","n671","n2726","n2727"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w496:{id:"w496",nodes:["n2649","n2650","n2651","n2652","n2653","n2654","n2655","n2656","n2649"],tags:{building:"yes"}},w497:{id:"w497",nodes:["n2430","n2446","n343","n2101","n2560","n2431","n363","n2748"],tags:{highway:"primary",name:"Michigan Avenue"}},w498:{id:"w498",nodes:["n2691","n2692","n634","n633","n2693","n2694"],tags:{highway:"service"}},w499:{id:"w499",nodes:["n2423","n2415","n661","n2416","n2417","n2719","n2721","n2772","n2756","n2773","n2759","n2767"],tags:{highway:"residential",name:"West Street"}},w5:{id:"w5",nodes:["n380","n381","n382","n383","n429","n430","n380"],tags:{building:"yes"}},w50:{id:"w50",nodes:["n239","n499","n508","n245","n238","n242","n240"],tags:{footway:"sidewalk",highway:"footway"}},w500:{id:"w500",nodes:["n2428","n1152","n2421","n2324"],tags:{bridge:"yes",highway:"residential",name:"Moore Street"}},w501:{id:"w501",nodes:["n2608","n2609","n2610","n2611","n2612","n2613","n2614","n2615","n2617","n2608"],tags:{building:"yes"}},w502:{id:"w502",nodes:["n2570","n2571"],tags:{bridge:"yes",highway:"path",name:"Riverwalk Trail"}},w503:{id:"w503",nodes:["n2540","n2542","n2787"],tags:{highway:"service"}},w504:{id:"w504",nodes:["n2269","n2582","n2250"],tags:{highway:"path"}},w505:{id:"w505",nodes:["n2631","n2632","n2633","n2634","n2635","n2636","n2637","n2638","n2631"],tags:{building:"yes"}},w506:{id:"w506",nodes:["n2543","n2544","n2545","n395","n2546","n2543"],tags:{amenity:"parking"}},w507:{id:"w507",nodes:["n2449","n2450","n2451","n2452","n1162","n2449"],tags:{leisure:"pitch",sport:"tennis"}},w508:{id:"w508",nodes:["n2554","n1160","n2559","n2558","n659","n2555","n658","n657","n2419"],tags:{highway:"service"}},w509:{id:"w509",nodes:["n2499","n2508","n2510","n2505","n2497","n2499"],tags:{building:"yes"}},w51:{id:"w51",nodes:["n241","n242","n243","n244"],tags:{highway:"service",surface:"unpaved"}},w510:{id:"w510",nodes:["n2575","n2577"],tags:{highway:"footway"}},w511:{id:"w511",nodes:["n2533","n2534","n2535","n2536","n2537","n2538","n2539","n2785","n2786","n2533"],tags:{amenity:"parking"}},w512:{id:"w512",nodes:["n2801","n2740","n2741","n2742","n2743","n2744","n2801"],tags:{building:"yes"}},w513:{id:"w513",nodes:["n2720","n2721"],tags:{highway:"service",service:"parking_aisle"}},w514:{id:"w514",nodes:["n2788","n2790","n2789","n989","n2540","n2541"],tags:{highway:"service",service:"parking_aisle"}},w515:{id:"w515",nodes:["n2848","n2849","n2850","n2851","n2803","n2804","n2812"],tags:{highway:"residential",name:"Middle Street"}},w516:{id:"w516",nodes:["n2852","n2805"],tags:{access:"private",highway:"service",name:"Battle Street"}},w517:{id:"w517",nodes:["n2863","n2815","n2814","n2812","n2864","n2855","n2865","n2867","n2868"],tags:{highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w518:{id:"w518",nodes:["n2859","n2808"],tags:{highway:"residential",name:"2nd Avenue"}},w519:{id:"w519",nodes:["n2823","n2824","n2825","n2826","n2827","n2828","n2823"],tags:{building:"yes"}},w52:{id:"w52",nodes:["n247","n248","n249","n250","n247"],tags:{amenity:"parking"}},w520:{id:"w520",nodes:["n2806","n2807","n2803"],tags:{highway:"residential",name:"2nd Avenue"}},w521:{id:"w521",nodes:["n2829","n2830","n2831","n2832","n2833","n2834","n2835","n2836","n2837","n2838","n2829"],tags:{building:"yes"}},w522:{id:"w522",nodes:["n2815","n2813","n2811","n4597","n2846","n4596","n2857","n4601","n2853","n4602","n2861","n4","n2879","n4560","n3550","n5","n1685"],tags:{highway:"residential",name:"Washington Street"}},w523:{id:"w523",nodes:["n2878","n2811","n2810","n2860","n2880","n2881","n2882"],tags:{highway:"residential",name:"5th Avenue"}},w524:{id:"w524",nodes:["n2816","n2817","n2818","n2819","n2820","n2821","n2822","n2816"],tags:{building:"yes"}},w525:{id:"w525",nodes:["n2869","n2856","n2806","n2808","n2814","n2809","n2810","n2847","n2858","n2854","n2870","n2871","n6","n2872","n2839","n2862"],tags:{highway:"residential",name:"Wood Street"}},w526:{id:"w526",nodes:["n2877","n2809","n2813","n2844","n2843"],tags:{highway:"residential",name:"4th Avenue"}},w527:{id:"w527",nodes:["n4785","n4784","n2936","n4788","n4787","n4786","n4785"],tags:{amenity:"parking"}},w528:{id:"w528",nodes:["n2864","n2892","n2893","n2877","n2860","n3840"],tags:{highway:"residential",name:"Garden Street"}},w529:{id:"w529",nodes:["n2868","n2890"],tags:{bridge:"yes",highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w53:{id:"w53",nodes:["n251","n252","n253","n254","n255","n256","n257","n258","n259","n260","n261","n262","n251"],tags:{building:"yes"}},w530:{id:"w530",nodes:["n2914","n2915","n2916","n2917","n2918","n2919","n2920","n2921","n2922","n2923","n2924","n2925","n2926","n2927","n2928","n2929","n2930","n2931","n2932","n2933","n2914"],tags:{building:"yes"}},w531:{id:"w531",nodes:["n2958","n2896"],tags:{bridge:"yes",highway:"secondary",name:"Main Street"}},w532:{id:"w532",nodes:["n2896","n394","n364","n2748"],tags:{highway:"secondary",name:"Main Street"}},w533:{id:"w533",nodes:["n2800","n2943","n2940","n2941","n2942","n2943"],tags:{highway:"service",service:"parking_aisle"}},w534:{id:"w534",nodes:["n3836","n3837","n3839","n3838","n3834","n4632","n3831","n4624","n3835","n3836"],tags:{barrier:"fence"}},w535:{id:"w535",nodes:["n2894","n2944","n2774","n2765"],tags:{highway:"residential",name:"5th Avenue"}},w536:{id:"w536",nodes:["n2890","n2780","n627","n2889","n2887","n623","n2888","n366","n2748"],tags:{highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w537:{id:"w537",nodes:["n2895","n738","n2887","n737","n2913"],tags:{highway:"residential",name:"Water Street"}},w538:{id:"w538",nodes:["n2855","n3756","n2884","n2885","n2886","n2945","n2946","n2947","n2948","n2949","n2950","n2951","n2952","n2953","n2955","n2848","n2956","n2856"],tags:{highway:"residential",name:"River Drive"}},w539:{id:"w539",nodes:["n2882","n2894"],tags:{bridge:"yes",highway:"residential",name:"5th Avenue"}},w54:{id:"w54",nodes:["n263","n264","n265","n266","n267","n268","n269","n270","n271","n272","n273","n274","n275","n276","n263"],tags:{building:"yes"}},w540:{id:"w540",nodes:["n2987","n2964","n2981","n2983","n2966","n2982","n2962","n2960","n2967","n2965","n2984","n2977","n2968","n2976","n2986","n2988","n2963","n2970","n2969","n2979","n2974","n2980","n2959","n2973","n2985","n2961","n2975","n2971","n2972","n2978","n2898","n2907","n2912","n2909","n2911","n2901","n2903","n2904","n2906","n2902","n2900","n2910","n2908","n2899","n2897","n2905","n2186","n2233"],tags:{name:"Portage River",waterway:"river"}},w541:{id:"w541",nodes:["n2852","n2851","n3003"],tags:{highway:"residential",name:"1st Avenue"}},w542:{id:"w542",nodes:["n2991","n3004","n2994"],tags:{highway:"residential",name:"River Street"}},w543:{id:"w543",nodes:["n2993","n2989"],tags:{bridge:"yes",highway:"residential",name:"6th Street"}},w544:{id:"w544",nodes:["n2995","n2996","n2997","n2998","n2999","n3000","n3001","n3002","n2990","n2991","n2993"],tags:{highway:"residential",name:"6th Street"}},w545:{id:"w545",nodes:["n2989","n2992","n2848"],tags:{highway:"residential",name:"6th Street"}},w546:{id:"w546",nodes:["n2313","n3169","n3170","n3171","n3172","n3173","n3174","n3175","n3176","n3177","n3178","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2146","n2156","n2129","n2112","n2109","n2313"],tags:{natural:"wetland"}},w547:{id:"w547",nodes:["n2088","n3013","n3015","n3014","n3017","n3018"],tags:{name:"Conrail Railroad",railway:"rail"}},w548:{id:"w548",nodes:["n3083","n3084","n3085","n3086","n3083"],tags:{building:"yes"}},w549:{id:"w549",nodes:["n3020","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n3020"],tags:{leisure:"park",name:"Conservation Park"}},w55:{id:"w55",nodes:["n277","n278","n279","n280","n281","n282","n283","n284","n277"],tags:{building:"yes"}},w550:{id:"w550",nodes:["n3056","n3042","n3041","n3040","n3039","n3038","n3037","n3036","n3044","n3035","n3034","n3043","n3016","n3056","n3019","n3015","n3012"],tags:{highway:"service"}},w551:{id:"w551",nodes:["n3044","n3045","n3046","n3047","n3048","n3049","n3050","n3051","n3052","n3053","n3054","n3055","n3016"],tags:{highway:"footway"}},w552:{id:"w552",nodes:["n3117","n3118","n3119","n3120","n3121","n3122","n3117"],tags:{building:"yes"}},w553:{id:"w553",nodes:["n3123","n3124","n3129","n3125","n3126","n3123"],tags:{building:"yes"}},w554:{id:"w554",nodes:["n3069","n3070","n3071","n3072","n3073","n3074","n3075","n3076","n3077","n3078","n3079","n3080","n3081","n3082","n3069"],tags:{building:"yes"}},w555:{id:"w555",nodes:["n3087","n3088","n3089","n3090","n3087"],tags:{building:"yes"}},w556:{id:"w556",nodes:["n3113","n3114","n3115","n3116","n3113"],tags:{building:"yes"}},w557:{id:"w557",nodes:["n3103","n3104","n3105","n3106","n3103"],tags:{building:"yes"}},w558:{id:"w558",nodes:["n3127","n3128","n3129","n3124","n3127"],tags:{building:"yes"}},w559:{id:"w559",nodes:["n3137","n3141","n3142","n3138","n3139","n3140","n3137"],tags:{building:"yes"}},w56:{id:"w56",nodes:["n285","n286","n287","n288","n285"],tags:{amenity:"parking"}},w560:{id:"w560",nodes:["n3091","n3092","n3093","n3094","n3091"],tags:{building:"yes"}},w561:{id:"w561",nodes:["n3155","n3157","n3158","n3159","n3156","n3155"],tags:{building:"yes"}},w562:{id:"w562",nodes:["n3057","n3058","n3059","n3060","n3057"],tags:{building:"yes"}},w563:{id:"w563",nodes:["n3107","n3108","n3109","n3110","n3111","n3112","n3107"],tags:{building:"yes"}},w564:{id:"w564",nodes:["n3134","n3135","n3136","n3131","n3134"],tags:{building:"yes"}},w565:{id:"w565",nodes:["n3143","n3144","n3145","n3146","n3143"],tags:{building:"yes"}},w566:{id:"w566",nodes:["n3095","n3096","n3097","n3098","n3095"],tags:{building:"yes"}},w567:{id:"w567",nodes:["n3130","n3131","n3136","n3132","n3133","n3130"],tags:{building:"yes"}},w568:{id:"w568",nodes:["n3025","n3026","n3027","n3028","n3029","n3030","n3031","n3033","n3032","n3025"],tags:{amenity:"parking"}},w569:{id:"w569",nodes:["n3061","n3062","n3063","n3064","n3061"],tags:{building:"yes"}},w57:{id:"w57",nodes:["n289","n290","n291","n292","n289"],tags:{amenity:"parking"}},w570:{id:"w570",nodes:["n3155","n3156","n3152","n3153","n3155"],tags:{building:"yes"}},w571:{id:"w571",nodes:["n3099","n3100","n3101","n3102","n3099"],tags:{building:"yes"}},w572:{id:"w572",nodes:["n3147","n3148","n3149","n3150","n3147"],tags:{building:"yes"}},w573:{id:"w573",nodes:["n3039","n2284"],tags:{highway:"service"}},w574:{id:"w574",nodes:["n3151","n3152","n3153","n3154","n3151"],tags:{building:"yes"}},w575:{id:"w575",nodes:["n3021","n3022","n3023","n3024","n3021"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w576:{id:"w576",nodes:["n3065","n3066","n3067","n3068","n3065"],tags:{building:"yes"}},w577:{id:"w577",nodes:["n2944","n3192","n3757","n3813","n3814","n3815","n3816","n3817","n3818","n3819"],tags:{highway:"service",name:"Willow Drive",service:"driveway",surface:"unpaved"}},w578:{id:"w578",nodes:["n2163","n2165","n2166","n2167","n2168","n2172","n2173","n2174","n2175","n2176","n2178","n2181","n2163"],tags:{building:"yes"}},w579:{id:"w579",nodes:["n2754","n3195","n3204","n3205","n4537","n4540","n3206","n4530","n4536","n3207","n4524","n3199","n4521","n3197","n1032"],tags:{highway:"residential",name:"Elm Street"}},w58:{id:"w58",nodes:["n240","n293","n294"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w580:{id:"w580",nodes:["n2184","n2185","n2187","n2190","n2191","n2192","n2184"],tags:{building:"yes"}},w581:{id:"w581",nodes:["n2765","n3208","n3211","n2755","n3280","n2756","n3346"],tags:{highway:"residential",name:"Kelsey Street"}},w582:{id:"w582",nodes:["n2753","n3194","n3193","n3201","n3196","n4551","n3202","n4550","n3203","n3200","n3198","n1033"],tags:{highway:"residential",name:"Walnut Street"}},w583:{id:"w583",nodes:["n3272","n4469","n4588","n2879","n4564","n2872"],tags:{highway:"residential",name:"10th Avenue"}},w584:{id:"w584",nodes:["n3243","n3242","n3241","n3240","n3243"],tags:{building:"industrial"}},w585:{id:"w585",nodes:["n3273","n3274","n4631","n4593","n3275","n4592","n2846","n4611","n2847"],tags:{highway:"residential",name:"6th Avenue"}},w586:{id:"w586",nodes:["n3276","n4591","n2853","n4605","n2854"],tags:{highway:"residential",name:"8th Avenue"}},w587:{id:"w587",nodes:["n3269","n3268","n3267","n3266","n3265","n3264","n3263","n3262","n3269"],tags:{building:"industrial"}},w588:{id:"w588",nodes:["n3277","n4599","n2857","n4598","n4608","n2858"],tags:{highway:"residential",name:"7th Avenue"}},w589:{id:"w589",nodes:["n3239","n3238","n3271","n3270","n3237","n3236","n3235","n3234","n3239"],tags:{building:"yes"}},w59:{id:"w59",nodes:["n294","n295","n296","n297","n298","n299","n300","n301","n302","n303","n491","n304","n305","n306","n307"],tags:{footway:"sidewalk",highway:"footway"}},w590:{id:"w590",nodes:["n3278","n4458","n4589","n4604","n2861"],tags:{highway:"residential",name:"9th Avenue"}},w591:{id:"w591",nodes:["n3253","n3252","n3251","n3250","n3249","n3248","n3253"],tags:{building:"industrial"}},w592:{id:"w592",nodes:["n3229","n3228","n3227","n3226","n3225","n3224","n3223","n3222","n3221","n3220","n3219","n3218","n3217","n3216","n3215","n3214","n3213","n3212","n3229"],tags:{natural:"water",water:"pond"}},w593:{id:"w593",nodes:["n3261","n3260","n3259","n3258","n3257","n3256","n3255","n3254","n3261"],tags:{building:"industrial"}},w594:{id:"w594",nodes:["n3233","n3232","n3231","n3230","n3233"],tags:{building:"yes"}},w595:{id:"w595",nodes:["n3247","n3246","n3245","n3244","n3247"],tags:{building:"industrial"}},w596:{id:"w596",nodes:["n2769","n3195","n3193","n3209","n2758","n2759","n3279"],tags:{highway:"residential",name:"Armitage Street"}},w597:{id:"w597",nodes:["n2193","n2194","n2195","n2197","n2193"],tags:{building:"yes"}},w598:{id:"w598",nodes:["n3404","n3403","n3402","n3401","n3400","n3399","n3398","n3397","n3373","n3372","n3396","n3395","n3404"],tags:{building:"school"}},w6:{id:"w6",nodes:["n879","n880","n881","n882","n879"],tags:{building:"shed"}},w60:{id:"w60",nodes:["n239","n308","n307"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w600:{id:"w600",nodes:["n3387","n3386","n3316","n3315","n3314","n3313","n3387"],tags:{building:"yes"}},w601:{id:"w601",nodes:["n3304","n3303","n3302","n3301","n3385","n3384","n3300","n3299","n3304"],tags:{building:"yes"}},w602:{id:"w602",nodes:["n3334","n3333","n3332","n3331","n3330","n3329","n3328","n3327","n3326","n3325","n3324","n3323","n3322","n3321","n3320","n3319","n3318","n3317","n3334"],tags:{building:"yes"}},w603:{id:"w603",nodes:["n3353","n3352","n3347","n3280","n2798"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w604:{id:"w604",nodes:["n3753","n3211","n3383"],tags:{highway:"service",service:"alley"}},w605:{id:"w605",nodes:["n3290","n3289","n3288","n3287","n3286","n3285","n3284","n3283","n3282","n3281","n3290"],tags:{building:"yes"}},w606:{id:"w606",nodes:["n2198","n2199","n2201","n2202","n2203","n2206","n2198"],tags:{building:"yes"}},w607:{id:"w607",nodes:["n2198","n2207"],tags:{barrier:"wall"}},w608:{id:"w608",nodes:["n2751","n3208","n3210","n3209","n3415","n3410","n3414","n3413","n3412","n3416"],tags:{highway:"residential",name:"East Street"}},w609:{id:"w609",nodes:["n2772","n3346","n3746","n3748","n3747","n3345","n3378","n3279","n3411"],tags:{highway:"residential",name:"Maple Street"}},w61:{id:"w61",nodes:["n309","n310","n311","n312","n313","n240"],tags:{footway:"sidewalk",highway:"footway"}},w610:{id:"w610",nodes:["n3379","n3380","n3382","n3381","n3379"],tags:{leisure:"park",name:"LaFayette Park"}},w611:{id:"w611",nodes:["n2768","n3194","n3210","n3753","n2760","n3353","n2773","n3378"],tags:{highway:"residential",name:"Bennett Street"}},w612:{id:"w612",nodes:["n2751","n3383","n2749","n2798","n2772"],tags:{highway:"residential",name:"Market Street"}},w613:{id:"w613",nodes:["n3298","n3297","n3296","n3295","n3294","n3293","n3292","n3291","n3298"],tags:{building:"yes"}},w614:{id:"w614",nodes:["n3375","n3406","n3405","n3374","n3375"],tags:{leisure:"playground"}},w615:{id:"w615",nodes:["n3393","n3344","n3343","n3342","n3341","n3340","n3339","n3338","n3337","n3392","n3391","n3390","n3389","n3336","n3335","n3388","n3393"],tags:{building:"yes"}},w616:{id:"w616",nodes:["n3376","n3407","n3408","n3377","n3376"],tags:{amenity:"school",name:"Three Rivers Elementary School"}},w617:{id:"w617",nodes:["n3312","n3311","n3310","n3309","n3308","n3307","n3306","n3305","n3312"],tags:{building:"yes"}},w619:{id:"w619",nodes:["n2863","n3424","n3425","n3426","n3427","n3428","n3429","n3430","n3431","n3432","n3433","n2844"],tags:{highway:"secondary",name:"Michigan Avenue",ref:"M 60"}},w62:{id:"w62",nodes:["n876","n906","n904","n875","n874","n873","n872","n871","n870","n869","n41","n868","n146","n314","n315","n1956"],tags:{footway:"sidewalk",highway:"footway"}},w620:{id:"w620",nodes:["n2844","n3420","n3421","n3422","n3439","n2859","n3437","n3493","n3496","n3500","n3497"],tags:{highway:"residential"}},w621:{id:"w621",nodes:["n3468","n3469","n3470","n3471","n3468"],tags:{building:"yes"}},w622:{id:"w622",nodes:["n3417","n3436","n3438","n3491","n3488","n3492","n3495","n3494","n3498","n3487","n3499","n3490","n3489","n4800","n3417"],tags:{landuse:"cemetery",name:"Riverside Cemetery"}},w623:{id:"w623",nodes:["n3440","n3441","n3442","n3443","n3444","n3445","n3440"],tags:{building:"yes"}},w624:{id:"w624",nodes:["n3446","n3447","n3448","n3449","n3450","n3451","n3452","n3453","n3454","n3455","n3456","n3457","n3458","n3459","n3460","n3461","n3462","n3463","n3464","n3465","n3466","n3467","n3446"],tags:{building:"yes"}},w625:{id:"w625",nodes:["n2844","n3434","n3435","n2878","n3275","n4621","n3276","n3278","n4463","n3272","n3472","n3474","n3475","n3476","n3477","n3478","n1202","n3479","n3480","n3481","n1203","n3482","n3483","n3484","n3485","n4574","n3486","n3473"],tags:{highway:"secondary",name:"Jefferson Street",name_1:"State Highway 60",ref:"M 60"}},w626:{id:"w626",nodes:["n3439","n3423","n2863"],tags:{highway:"unclassified",name:"Michigan Avenue",name_1:"State Highway 60"}},w627:{id:"w627",nodes:["n3500","n3005"],tags:{highway:"service"}},w628:{id:"w628",nodes:["n3491","n3488","n3492","n3010","n3009","n3005","n3008","n3007","n3006","n3502","n3491"],tags:{leisure:"park",name:"Marina Park"}},w629:{id:"w629",nodes:["n2208","n2209","n2212","n2214","n2208"],tags:{building:"yes"}},w63:{id:"w63",nodes:["n1955","n316"],tags:{footway:"sidewalk",highway:"footway"}},w630:{id:"w630",nodes:["n2757","n3414","n3202","n4542","n3206","n4538","n3750","n3503","n1629","n4500","n2763","n4502","n2764","n3508"],tags:{highway:"residential",name:"Hoffman Street"}},w631:{id:"w631",nodes:["n2215","n2750","n2770","n2771","n2215"],tags:{building:"yes"}},w632:{id:"w632",nodes:["n2766","n3504","n3507","n3751","n3205","n3196","n3410","n2746"],tags:{highway:"residential",name:"Cushman Street"}},w633:{id:"w633",nodes:["n2745","n3749","n3507","n4535","n3503"],tags:{highway:"residential",name:"Pine Street"}},w634:{id:"w634",nodes:["n3510","n3511","n3512","n3509","n3510"],tags:{leisure:"park",name:"Bowman Park"}},w636:{id:"w636",nodes:["n2745","n3752","n3204","n3201","n3415","n2761","n2767","n3411"],tags:{highway:"residential",name:"Wheeler Street"}},w637:{id:"w637",nodes:["n3550","n4586","n4476","n3472"],tags:{highway:"residential",name:"11th Avenue"}},w638:{id:"w638",nodes:["n3508","n3518"],tags:{bridge:"yes",highway:"residential",name:"Hoffman Street"}},w639:{id:"w639",nodes:["n3518","n1204","n2862","n3519","n3520","n3521","n3522","n3523","n2161","n3524","n3549","n3552","n4239","n3551","n4577","n4582","n4578","n4583","n4579","n4574"],tags:{highway:"residential",name:"Hoffman Street"}},w64:{id:"w64",nodes:["n316","n317"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w640:{id:"w640",nodes:["n3634","n3640","n3676","n3633","n3678","n3648","n3638","n3683","n3600","n3579","n3679","n3677","n2987","n3592","n3588","n3608","n3559","n3617","n3620","n3660","n3553","n3533","n3530","n3531","n3525","n3527","n3526","n3532","n3529","n3528","n3667","n3627","n3623","n3625","n3601","n3687","n3671","n3644","n3626","n3673","n3582","n3693","n3605","n3619","n3651","n3650","n3615","n3663","n3631","n3596","n3604","n3655","n3586","n3595","n3701","n3603","n3686","n3611","n3568","n3674","n3613","n3580","n3562","n3564","n3689","n3585","n3670","n3659","n3684","n3680","n3646","n3558","n3556","n3692","n3563","n3575","n3571","n3675","n3557","n3700","n3656","n3622","n3657","n3565","n3669","n3658","n3618","n3624","n3688","n3610","n3570","n3645","n3649","n3583","n3694","n3561","n3554","n3614","n3698","n3581","n3635","n3641","n3569","n3647","n3628","n3598","n3696","n3665","n3639","n3607","n3695","n3642","n3672","n3577","n3643","n3691","n3602","n3576","n3591","n3560","n3606","n3685","n3597","n3629","n3661","n3654","n3616","n3697","n3578","n3609","n3653","n3699","n3566","n3637","n3567","n3666","n3555","n3599","n3590","n3572","n3593","n3690","n3681","n3612","n3682","n3668","n3587","n3621","n3636","n3662","n3589","n3573","n3652","n3664","n3632","n3574","n3594","n3584","n3630","n3634"],tags:{landuse:"reservoir",name:"Hoffman Pond",natural:"water"}},w641:{id:"w641",nodes:["n2988","n3534","n3535","n3536","n3537","n3538","n3539","n3540","n3541","n3542","n3543","n3544","n3545","n3546","n3547","n3548","n2970"],tags:{waterway:"river"}},w642:{id:"w642",nodes:["n3702","n3703","n3704","n3705","n3706","n3707","n3708","n3709","n3710","n3711","n3712","n3713","n3714","n3715","n3716","n3717","n3718","n3719","n3720","n3721","n3722","n3723","n3724","n3725","n3726","n3727","n3728","n3729","n3730","n3731","n3732","n3733","n3734","n3735","n3736","n3737","n3738","n3739","n3740","n3741","n3742","n3743","n3702"],tags:{admin_level:"8",boundary:"administrative"}},w643:{id:"w643",nodes:["n2839","n2873"],tags:{highway:"service",service:"driveway"}},w644:{id:"w644",nodes:["n2873","n2840"],tags:{bridge:"yes",highway:"service",layer:"1",service:"driveway"}},w645:{id:"w645",nodes:["n2840","n2841","n2842","n2845","n2866"],tags:{highway:"service",service:"driveway",surface:"unpaved"}},w646:{id:"w646",nodes:["n2752","n3759","n1420","n1421","n1422","n3758","n4507","n4506","n4505","n4520","n3199","n4522","n4504","n4546","n3200","n4547","n3412"],tags:{highway:"residential",name:"Flower Street"}},w647:{id:"w647",nodes:["n2874","n2875","n2876","n2954","n2874"],tags:{building:"industrial"}},w648:{id:"w648",nodes:["n3778","n3779","n3780","n3781","n3782","n3783","n3778"],tags:{building:"yes"}},w649:{id:"w649",nodes:["n3197","n4543","n4544","n3198"],tags:{highway:"residential",name:"Morris Avenue",surface:"unpaved"}},w65:{id:"w65",nodes:["n317","n318","n319","n320","n321"],tags:{footway:"sidewalk",highway:"footway"}},w650:{id:"w650",nodes:["n3207","n4526","n4528","n4548","n3203","n4549","n3413","n2762"],tags:{highway:"residential",name:"Adams Street"}},w651:{id:"w651",nodes:["n3788","n3785","n3786","n3787","n3788"],tags:{power:"station"}},w652:{id:"w652",nodes:["n2957","n3163","n3241"],tags:{barrier:"wall"}},w653:{id:"w653",nodes:["n3549","n3802","n3803","n3800","n3801"],tags:{highway:"service",surface:"unpaved"}},w654:{id:"w654",nodes:["n3164","n3165","n3166","n3167","n3168","n3505","n3164"],tags:{building:"yes"}},w655:{id:"w655",nodes:["n3506","n3517","n3760","n3761","n3762","n3763","n3506"],tags:{building:"yes"}},w656:{id:"w656",nodes:["n3764","n3765","n3766","n3767","n3768","n3769","n3770","n3771","n3764"],tags:{building:"yes"}},w657:{id:"w657",nodes:["n3772","n3773","n3774","n3775","n3772"],tags:{building:"yes"}},w658:{id:"w658",nodes:["n3776","n3777","n3784","n3789","n3776"],tags:{building:"yes"}},w659:{id:"w659",nodes:["n3930","n3931","n3932","n3933","n3934","n3935","n3936","n3937","n3938","n3930"],tags:{leisure:"pitch",sport:"baseball"}},w66:{id:"w66",nodes:["n321","n322"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w660:{id:"w660",nodes:["n3982","n3842","n3864","n3865","n2938","n3866","n2939","n3867","n3868","n3858","n2937","n3869","n2935","n2934","n3870","n3348","n3862"],tags:{highway:"service"}},w661:{id:"w661",nodes:["n3968","n3969"],tags:{highway:"footway"}},w662:{id:"w662",nodes:["n3875","n3876","n3877","n3878","n3879","n3880","n3881","n3882","n3875"],tags:{amenity:"parking"}},w663:{id:"w663",nodes:["n3964","n3965"],tags:{highway:"footway"}},w664:{id:"w664",nodes:["n3966","n3967"],tags:{highway:"footway"}},w665:{id:"w665",nodes:["n3857","n3890","n3884","n3894","n3889","n3899","n3885","n3886","n3896","n3887"],tags:{highway:"service",service:"parking_aisle"}},w666:{id:"w666",nodes:["n3895","n3896"],tags:{highway:"service",service:"parking_aisle"}},w667:{id:"w667",nodes:["n3274","n3977","n3984","n3983","n3981","n3844","n3978","n3982","n3861","n3862","n3873","n3874","n4468","n3863"],tags:{access:"private",highway:"service",name:"Collins Drive"}},w668:{id:"w668",nodes:["n3900","n3901","n3902","n3903","n3904","n3905","n3808","n3809","n3906","n3907","n3908","n3967","n3909","n3910","n3911","n3955","n3964","n3912","n3913","n3914","n3915","n3916","n3917","n3918","n3919","n3920","n3921","n3922","n3923","n3924","n3925","n3926","n3927","n3969","n3970","n3928","n3807","n3929","n3900"],tags:{building:"school"}},w669:{id:"w669",nodes:["n3272","n39","n40","n3974","n3863","n3857","n3892","n3883","n3891","n3889"],tags:{highway:"service"}},w67:{id:"w67",nodes:["n322","n886","n323","n475"],tags:{footway:"crossing",highway:"footway"}},w670:{id:"w670",nodes:["n3473","n3859","n3860","n3980","n4908","n4865"],tags:{highway:"secondary",name:"Hoffman Street",ref:"M 60"}},w671:{id:"w671",nodes:["n3970","n3806","n3971"],tags:{highway:"footway"}},w672:{id:"w672",nodes:["n3892","n3893","n3894"],tags:{highway:"service",service:"parking_aisle"}},w673:{id:"w673",nodes:["n3945","n3946","n3992","n3990","n3945"],tags:{leisure:"pitch",sport:"tennis"}},w674:{id:"w674",nodes:["n3890","n3893","n3891"],tags:{highway:"service",service:"parking_aisle"}},w675:{id:"w675",nodes:["n3947","n3948","n3994","n3993","n3947"],tags:{leisure:"pitch",sport:"tennis"}},w676:{id:"w676",nodes:["n3858","n3954","n3972","n3810","n3811","n3812","n3841","n3973","n3898","n3963","n3897","n3896"],tags:{highway:"service"}},w677:{id:"w677",nodes:["n3977","n3996","n3997","n4004","n3998","n3999","n4005","n4007","n4006","n3995","n4000","n3843","n4001","n4002","n4003","n3949","n3351","n3950","n3354","n3350","n3951","n3349","n3952","n3953","n3954","n3956","n3966","n3955"],tags:{highway:"footway"}},w678:{id:"w678",nodes:["n3887","n3888","n3895","n3899"],tags:{highway:"service",service:"parking_aisle"}},w679:{id:"w679",nodes:["n3946","n3947","n3993","n3992","n3946"],tags:{leisure:"pitch",sport:"tennis"}},w68:{id:"w68",nodes:["n294","n1952","n326"],tags:{footway:"sidewalk",highway:"footway"}},w680:{id:"w680",nodes:["n3939","n3940","n3941","n3985","n3986","n3987","n3988","n3989","n3942","n3943","n3939"],tags:{leisure:"pitch",sport:"baseball"}},w681:{id:"w681",nodes:["n3990","n3991","n3944","n3945","n3990"],tags:{leisure:"pitch",sport:"tennis"}},w682:{id:"w682",nodes:["n3871","n3872","n3873","n3874","n3871"],tags:{amenity:"parking"}},w683:{id:"w683",nodes:["n3956","n3965","n3957","n3958","n3959"],tags:{footway:"sidewalk",highway:"footway"}},w684:{id:"w684",nodes:["n3790","n3791","n3792","n3793","n3790"],tags:{building:"shed"}},w685:{id:"w685",nodes:["n3794","n3795","n3796","n3797","n3794"],tags:{building:"yes"}},w686:{id:"w686",nodes:["n3798","n3799","n3804","n3805","n3798"],tags:{building:"yes"}},w687:{id:"w687",nodes:["n3806","n3807"],tags:{highway:"footway"}},w688:{id:"w688",nodes:["n3845","n3846","n3847","n3848","n3845"],tags:{leisure:"pitch",sport:"american_football"}},w689:{id:"w689",nodes:["n3849","n4021","n3850","n3851","n3852","n3853","n3854","n3855","n3856","n3975","n3976","n3979","n4008","n4009","n4010","n4011","n4012","n4013","n4014","n4015","n4016","n4017","n4018","n4019","n4020","n4021"],tags:{leisure:"track",sport:"running"}},w69:{id:"w69",nodes:["n326","n327"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w690:{id:"w690",nodes:["n4022","n4023","n4024","n4025","n4026","n4027","n4022"],tags:{building:"yes"}},w691:{id:"w691",nodes:["n4028","n4029","n4030","n4031","n4028"],tags:{building:"yes"}},w692:{id:"w692",nodes:["n4032","n4033","n4034","n4035","n4032"],tags:{building:"yes"}},w693:{id:"w693",nodes:["n4036","n4037","n4038","n4039","n4036"],tags:{building:"yes"}},w694:{id:"w694",nodes:["n4040","n4041","n4042","n4043","n4040"],tags:{building:"yes"}},w695:{id:"w695",nodes:["n4044","n4045","n4050","n4053","n4046","n4047","n4048","n4049","n4044"],tags:{building:"yes"}},w696:{id:"w696",nodes:["n4050","n4051","n4052","n4053","n4050"],tags:{building:"roof"}},w697:{id:"w697",nodes:["n4054","n4068","n4055","n4056","n4057","n4054"],tags:{building:"yes"}},w698:{id:"w698",nodes:["n4058","n4059","n4060","n4061","n4062","n4063","n4058"],tags:{building:"yes"}},w699:{id:"w699",nodes:["n4064","n4066","n4065"],tags:{barrier:"fence"}},w7:{id:"w7",nodes:["n43","n44","n45"],tags:{highway:"service"}},w70:{id:"w70",nodes:["n327","n328","n27","n329"],tags:{footway:"sidewalk",highway:"footway"}},w700:{id:"w700",nodes:["n4066","n4067","n4068"],tags:{barrier:"fence"}},w701:{id:"w701",nodes:["n4069","n4070","n4071","n4072","n4069"],tags:{building:"shed"}},w702:{id:"w702",nodes:["n4073","n4074","n4075","n4076","n4077","n4078","n4079","n4080","n4081","n4082","n4083","n4084","n4073"],tags:{building:"yes"}},w703:{id:"w703",nodes:["n4085","n4093","n4086","n4087","n4088","n4089","n4090","n4091","n4092","n4085"],tags:{building:"yes"}},w704:{id:"w704",nodes:["n4093","n4094","n4095","n4096"],tags:{barrier:"fence"}},w705:{id:"w705",nodes:["n4097","n4098","n4099","n4100","n4097"],tags:{building:"yes"}},w706:{id:"w706",nodes:["n4098","n4102","n4087"],tags:{barrier:"fence"}},w707:{id:"w707",nodes:["n4101","n4102","n4096","n4170","n4103"],tags:{barrier:"fence"}},w708:{id:"w708",nodes:["n4104","n4105","n4106","n4107","n4104"],tags:{access:"private",leisure:"swimming_pool"}},w709:{id:"w709",nodes:["n4108","n4109","n4110","n4111","n4108"],tags:{building:"yes"}},w71:{id:"w71",nodes:["n329","n331"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w710:{id:"w710",nodes:["n4112","n4113","n4114","n4115","n4116","n4117","n4118","n4119","n4112"],tags:{building:"yes"}},w711:{id:"w711",nodes:["n4120","n4121","n4122","n4123","n4120"],tags:{building:"yes"}},w712:{id:"w712",nodes:["n4124","n4125","n4126","n4127","n4128","n4129","n4124"],tags:{building:"yes"}},w713:{id:"w713",nodes:["n4130","n4131","n4132","n4133","n4130"],tags:{building:"shed"}},w714:{id:"w714",nodes:["n4134","n4135","n4136","n4137","n4138","n4139","n4140","n4141","n4142","n4143","n4134"],tags:{building:"yes"}},w715:{id:"w715",nodes:["n4144","n4145","n4146","n4147","n4148","n4149","n4144"],tags:{building:"yes"}},w716:{id:"w716",nodes:["n4150","n4151","n4152","n4153","n4150"],tags:{building:"yes"}},w717:{id:"w717",nodes:["n4154","n4155","n4156","n4157","n4154"],tags:{building:"yes"}},w718:{id:"w718",nodes:["n4158","n4159","n4160","n4161","n4162","n4163","n4164","n4165","n4158"],tags:{building:"yes"}},w719:{id:"w719",nodes:["n4166","n4167","n4168","n4169","n4166"],tags:{building:"yes"}},w72:{id:"w72",nodes:["n331","n344","n332","n333","n334"],tags:{footway:"sidewalk",highway:"footway"}},w720:{id:"w720",nodes:["n4170","n4171"],tags:{barrier:"fence"}},w721:{id:"w721",nodes:["n4138","n4103"],tags:{barrier:"fence"}},w722:{id:"w722",nodes:["n4103","n4172"],tags:{barrier:"fence"}},w723:{id:"w723",nodes:["n4173","n4174"],tags:{barrier:"fence"}},w724:{id:"w724",nodes:["n4175","n4176","n4177","n4178","n4175"],tags:{building:"yes"}},w725:{id:"w725",nodes:["n4179","n4180","n4181","n4182","n4183","n4184","n4179"],tags:{building:"yes"}},w726:{id:"w726",nodes:["n4185","n4186","n4187","n4188","n4185"],tags:{building:"yes"}},w727:{id:"w727",nodes:["n4189","n4190","n4191","n4192","n4193","n4194","n4195","n4196","n4197","n4198","n4199","n4200","n4201","n4202","n4189"],tags:{building:"yes"}},w728:{id:"w728",nodes:["n4203","n4204","n4205","n4206","n4207","n4208","n4209","n4210","n4203"],tags:{building:"yes"}},w729:{id:"w729",nodes:["n4211","n4212","n4213","n4214","n4211"],tags:{building:"shed"}},w73:{id:"w73",nodes:["n335","n336","n337","n338","n339","n340","n341","n342","n335"],tags:{building:"yes"}},w730:{id:"w730",nodes:["n4215","n4216","n4217","n4218","n4215"],tags:{building:"yes"}},w731:{id:"w731",nodes:["n4219","n4220","n4221","n4222","n4223","n4224","n4225","n4226","n4227","n4228","n4229","n4230","n4219"],tags:{building:"yes"}},w732:{id:"w732",nodes:["n4231","n4232","n4233","n4234","n4235","n4236","n4237","n4238","n4231"],tags:{building:"yes"}},w733:{id:"w733",nodes:["n4239","n4240","n4241","n4242","n4243","n4244","n4245","n4246","n4247","n4248","n4241"],tags:{highway:"service"}},w734:{id:"w734",nodes:["n4240","n4249","n4248"],tags:{highway:"service",service:"parking_aisle"}},w735:{id:"w735",nodes:["n4250","n4251","n4252","n4253","n4254","n4255","n4256","n4257","n4258","n4250"],tags:{amenity:"parking"}},w736:{id:"w736",nodes:["n4259","n4260","n4261","n4262","n4259"],tags:{building:"yes"}},w737:{id:"w737",nodes:["n4263","n4264","n4265","n4266","n4267","n4268","n4269","n4270","n4271","n4272","n4273","n4274","n4275","n4276","n4263"],tags:{building:"yes"}},w738:{id:"w738",nodes:["n4277","n4278","n4279","n4280","n4281","n4282","n4277"],tags:{building:"yes"}},w739:{id:"w739",nodes:["n4283","n4284","n4285","n4286","n4287","n4288","n4289","n4290","n4291","n4292","n4293","n4294","n4283"],tags:{building:"yes"}},w74:{id:"w74",nodes:["n343","n344","n345"],tags:{highway:"service"}},w740:{id:"w740",nodes:["n4295","n4296","n4297","n4298","n4295"],tags:{building:"yes"}},w741:{id:"w741",nodes:["n4299","n4300","n4301","n4302","n4303","n4304","n4305","n4306","n4307","n4308","n4309","n4310","n4299"],tags:{building:"yes"}},w742:{id:"w742",nodes:["n4311","n4312","n4313","n4314","n4311"],tags:{building:"shed"}},w743:{id:"w743",nodes:["n4315","n4316","n4317","n4318","n4319","n4320","n4315"],tags:{building:"yes"}},w744:{id:"w744",nodes:["n4321","n4322","n4323","n4324","n4325","n4326","n4327","n4328","n4329","n4330","n4331","n4332","n4333","n4334","n4321"],tags:{building:"yes"}},w745:{id:"w745",nodes:["n4335","n4336","n4337","n4338","n4335"],tags:{building:"shed"}},w746:{id:"w746",nodes:["n4339","n4340","n4341","n4342","n4343","n4344","n4339"],tags:{building:"yes"}},w747:{id:"w747",nodes:["n4345","n4346","n4347","n4348","n4345"],tags:{building:"yes"}},w748:{id:"w748",nodes:["n4349","n4350","n4351","n4352","n4349"],tags:{building:"yes"}},w749:{id:"w749",nodes:["n4353","n4354","n4355","n4356","n4357","n4358","n4353"],tags:{building:"yes"}},w75:{id:"w75",nodes:["n346","n347","n348","n349","n350","n351","n346"],tags:{amenity:"parking"}},w750:{id:"w750",nodes:["n4612","n4359","n4360"],tags:{barrier:"fence"}},w751:{id:"w751",nodes:["n4361","n4362","n4363","n4364","n4361"],tags:{building:"yes"}},w752:{id:"w752",nodes:["n4365","n4366","n4367","n4368","n4365"],tags:{building:"yes"}},w753:{id:"w753",nodes:["n4369","n4370","n4371","n4372","n4375","n4369"],tags:{building:"yes"}},w754:{id:"w754",nodes:["n4373","n4374","n4375"],tags:{barrier:"fence"}},w755:{id:"w755",nodes:["n4376","n4377","n4378","n4379","n4376"],tags:{building:"shed"}},w756:{id:"w756",nodes:["n4380","n4381","n4382","n4383","n4384","n4385","n4386","n4387","n4388","n4389","n4390","n4391","n4380"],tags:{building:"yes"}},w757:{id:"w757",nodes:["n4392","n4393","n4394","n4395","n4392"],tags:{building:"yes"}},w758:{id:"w758",nodes:["n4396","n4397","n4398","n4399","n4396"],tags:{building:"shed"}},w759:{id:"w759",nodes:["n4400","n4401","n4402","n4403","n4404","n4405","n4406","n4407","n4408","n4409","n4410","n4411","n4412","n4413","n4414","n4415","n4400"],tags:{building:"yes"}},w76:{id:"w76",nodes:["n2561","n359","n2563","n2793","n357","n356","n2792","n355","n354","n2791","n2562","n353","n352","n358","n2561"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w760:{id:"w760",nodes:["n4416","n4417"],tags:{barrier:"fence"}},w761:{id:"w761",nodes:["n4418","n4416","n4419"],tags:{barrier:"fence"}},w762:{id:"w762",nodes:["n4420","n4421"],tags:{barrier:"fence"}},w763:{id:"w763",nodes:["n4422","n4423","n4424","n4425","n4426","n4427","n4428","n4429","n4430","n4431","n4432","n4433","n4422"],tags:{building:"yes"}},w764:{id:"w764",nodes:["n4434","n4435","n4436","n4437","n4438","n4439","n4440","n4441","n4442","n4445","n4444","n4443","n4434"],tags:{building:"yes"}},w765:{id:"w765",nodes:["n4446","n4447","n4448","n4449","n4446"],tags:{building:"yes"}},w766:{id:"w766",nodes:["n4450","n4451","n4452","n4453","n4450"],tags:{building:"yes"}},w767:{id:"w767",nodes:["n4454","n4455","n4456","n4457","n4454"],tags:{building:"yes"}},w768:{id:"w768",nodes:["n4461","n4458","n4460"],tags:{footway:"crossing",highway:"footway"}},w769:{id:"w769",nodes:["n4460","n4462","n4459"],tags:{footway:"sidewalk",highway:"footway"}},w77:{id:"w77",nodes:["n325","n360","n361"],tags:{footway:"crossing",highway:"footway"}},w770:{id:"w770",nodes:["n4462","n4463","n4464"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w771:{id:"w771",nodes:["n4464","n4465","n4466","n4467"],tags:{footway:"sidewalk",highway:"footway"}},w772:{id:"w772",nodes:["n3959","n3968","n3971","n3960","n3961","n3962","n3963"],tags:{footway:"sidewalk",highway:"footway"}},w773:{id:"w773",nodes:["n4467","n4468","n3959"],tags:{footway:"crossing",highway:"footway"}},w774:{id:"w774",nodes:["n4459","n4469","n4470"],tags:{footway:"crossing",highway:"footway"}},w775:{id:"w775",nodes:["n4470","n4471","n4472","n4473","n4474","n4475"],tags:{footway:"sidewalk",highway:"footway"}},w776:{id:"w776",nodes:["n4475","n4476","n4477"],tags:{footway:"crossing",highway:"footway"}},w777:{id:"w777",nodes:["n4477","n4478","n4479","n4480","n4481","n4482","n4483","n4484","n4485","n4486","n4487"],tags:{footway:"sidewalk",highway:"footway"}},w778:{id:"w778",nodes:["n4488","n4489","n4490","n4491","n4488"],tags:{building:"yes"}},w779:{id:"w779",nodes:["n4492","n4493","n4494","n4495","n4492"],tags:{building:"yes"}},w78:{id:"w78",nodes:["n361","n362","n369"],tags:{footway:"sidewalk",highway:"footway"}},w780:{id:"w780",nodes:["n4496","n4497","n4498","n4499","n4496"],tags:{access:"private",leisure:"swimming_pool"}},w781:{id:"w781",nodes:["n4508","n4509"],tags:{footway:"sidewalk",highway:"footway"}},w782:{id:"w782",nodes:["n4510","n4511"],tags:{footway:"sidewalk",highway:"footway"}},w783:{id:"w783",nodes:["n4512","n4513"],tags:{footway:"sidewalk",highway:"footway"}},w784:{id:"w784",nodes:["n4513","n4514"],tags:{footway:"sidewalk",highway:"footway"}},w785:{id:"w785",nodes:["n4515","n4516"],tags:{footway:"sidewalk",highway:"footway"}},w786:{id:"w786",nodes:["n4517","n4515"],tags:{footway:"sidewalk",highway:"footway"}},w787:{id:"w787",nodes:["n4518","n4519"],tags:{footway:"sidewalk",highway:"footway"}},w788:{id:"w788",nodes:["n4519","n4520","n4513"],tags:{footway:"crossing",highway:"footway"}},w789:{id:"w789",nodes:["n4515","n4521","n4513"],tags:{footway:"crossing",highway:"footway"}},w79:{id:"w79",nodes:["n362","n363","n334"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w790:{id:"w790",nodes:["n4515","n4522","n4523"],tags:{footway:"crossing",highway:"footway"}},w791:{id:"w791",nodes:["n4523","n4524","n4519"],tags:{footway:"crossing",highway:"footway"}},w792:{id:"w792",nodes:["n4523","n4525"],tags:{footway:"sidewalk",highway:"footway"}},w793:{id:"w793",nodes:["n4525","n4526","n4527"],tags:{footway:"crossing",highway:"footway"}},w794:{id:"w794",nodes:["n4527","n4529"],tags:{footway:"sidewalk",highway:"footway"}},w795:{id:"w795",nodes:["n4529","n4530","n4518"],tags:{footway:"crossing",highway:"footway"}},w796:{id:"w796",nodes:["n4518","n4531"],tags:{footway:"sidewalk",highway:"footway"}},w797:{id:"w797",nodes:["n4531","n4532"],tags:{footway:"sidewalk",highway:"footway"}},w798:{id:"w798",nodes:["n4533","n4534"],tags:{footway:"sidewalk",highway:"footway"}},w799:{id:"w799",nodes:["n4518","n4538","n4539"],tags:{footway:"crossing",highway:"footway"}},w8:{id:"w8",nodes:["n46","n47","n145","n48","n49","n46"],tags:{amenity:"parking"}},w80:{id:"w80",nodes:["n334","n364","n365"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w800:{id:"w800",nodes:["n4539","n4540","n4541"],tags:{footway:"crossing",highway:"footway"}},w801:{id:"w801",nodes:["n4541","n4542","n4529"],tags:{footway:"crossing",highway:"footway"}},w802:{id:"w802",nodes:["n4552","n4553"],tags:{footway:"sidewalk",highway:"footway"}},w803:{id:"w803",nodes:["n4554","n4555","n4556","n4557","n4558","n4559","n4554"],tags:{building:"yes"}},w804:{id:"w804",nodes:["n4562","n4563"],tags:{barrier:"retaining_wall"}},w805:{id:"w805",nodes:["n4568","n4569","n4570","n4571","n4568"],tags:{building:"yes"}},w806:{id:"w806",nodes:["n3473","n4575","n4576","n4581","n4580","n3551"],tags:{highway:"residential",oneway:"yes"}},w807:{id:"w807",nodes:["n4613","n4614","n4615","n4616","n4617","n4618","n4619","n4620","n4613"],tags:{leisure:"pitch",sport:"baseball"}},w808:{id:"w808",nodes:["n4621","n4622","n4623","n4624","n4625","n4626","n4627","n4628","n4629","n4630"],tags:{highway:"service"}},w809:{id:"w809",nodes:["n4631","n4632","n4633","n4637","n4634","n4638","n4635","n4636"],tags:{highway:"service"}},w81:{id:"w81",nodes:["n365","n366","n367"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w810:{id:"w810",nodes:["n4639","n4640","n4641"],tags:{barrier:"fence"}},w811:{id:"w811",nodes:["n4649","n4650","n4651","n4652","n4649"],tags:{building:"yes"}},w812:{id:"w812",nodes:["n4654","n4655"],tags:{barrier:"fence"}},w813:{id:"w813",nodes:["n4656","n4657"],tags:{barrier:"fence"}},w814:{id:"w814",nodes:["n4669","n4670","n4671","n4672","n4669"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w815:{id:"w815",nodes:["n4678","n4679","n4680","n1889"],tags:{highway:"service"}},w816:{id:"w816",nodes:["n239","n4686","n4687"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w817:{id:"w817",nodes:["n4687","n4688","n4689"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w818:{id:"w818",nodes:["n4689","n4690","n307"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w819:{id:"w819",nodes:["n2266","n4743"],tags:{highway:"path"}},w82:{id:"w82",nodes:["n724","n368","n369"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w820:{id:"w820",nodes:["n4785","n4786","n4787","n4788","n1684","n4760","n4769","n4761","n4762","n4763","n4764","n4765","n4766","n4767","n4768","n4785"],tags:{natural:"wood"}},w821:{id:"w821",nodes:["n4769","n4770","n4771","n4772","n4773","n4774","n4775","n4776","n4777","n4778","n4779","n4780","n4781","n4782","n4783","n4784","n4785","n4768","n4767","n4766","n4765","n4764","n4763","n4762","n4761","n4769"],tags:{natural:"scrub"}},w822:{id:"w822",nodes:["n4772","n4789","n4790","n4791","n4792","n4793","n4794","n4795","n4796","n4797","n4798","n4799","n4783","n4782","n4781","n4780","n4779","n4778","n4777","n4776","n4775","n4774","n4773","n4772"],tags:{natural:"wood"}},w823:{id:"w823",nodes:["n4800","n4801","n4802","n4803","n4804","n4805","n4806","n4807","n4808","n4809","n4810","n4811","n4812","n4813","n4814","n4815","n4816","n3490","n3489","n4800"],tags:{natural:"wood"}},w824:{id:"w824",nodes:["n4817","n4818","n4819","n4820","n4821","n4822","n4817"],tags:{landuse:"recreation_ground"}},w825:{id:"w825",nodes:["n4563","n4823","n4824","n4829","n4825","n4826","n4827","n4828","n4562","n4563"],tags:{landuse:"recreation_ground"}},w826:{id:"w826",nodes:["n4830","n4831","n4832","n4833","n4834","n4835","n4836","n4830"],tags:{landuse:"industrial"}},w827:{id:"w827",nodes:["n4563","n4837","n4838","n4839","n4840","n4841","n4842","n4827","n4828","n4562","n4563"],tags:{landuse:"industrial"}},w828:{id:"w828",nodes:["n4843","n4844","n4845","n4846","n4843"],tags:{landuse:"farmland"}},w829:{id:"w829",nodes:["n3712","n4847","n4848","n4849","n4850","n4851","n4852","n4858","n4864","n4959","n4960","n4853","n4857","n4854","n4855","n4856","n3712"],tags:{aeroway:"aerodrome",name:"Three Rivers Municipal Airport"}},w83:{id:"w83",nodes:["n371","n372","n373","n374","n371"],tags:{building:"yes"}},w830:{id:"w830",nodes:["n4855","n4854","n4857","n4853","n4960"],tags:{barrier:"fence"}},w831:{id:"w831",nodes:["n4860","n4859","n4858","n4852","n4851"],tags:{barrier:"fence"}},w832:{id:"w832",nodes:["n4866","n4878","n4869","n4867"],tags:{aeroway:"runway",ref:"5/23"}},w833:{id:"w833",nodes:["n4868","n4890","n4894","n4881","n4869","n4905","n4870"],tags:{aeroway:"runway",ref:"9/27"}},w834:{id:"w834",nodes:["n4871","n4875","n4872","n4895","n4873","n4874","n4871"],tags:{aeroway:"apron"}},w835:{id:"w835",nodes:["n4875","n4876","n4877","n4878","n4879","n4880","n4882","n4881"],tags:{aeroway:"taxiway"}},w836:{id:"w836",nodes:["n4882","n4893","n4883","n4891","n4884","n4885","n4886","n4887","n4888","n4892","n4889","n4890"],tags:{aeroway:"taxiway"}},w837:{id:"w837",nodes:["n4893","n4894"],tags:{aeroway:"taxiway"}},w838:{id:"w838",nodes:["n4895","n4896","n4897","n4898","n4899","n4900","n4901","n4902","n4903","n4906","n4904","n4905"],tags:{aeroway:"taxiway"}},w839:{id:"w839",nodes:["n4907","n4908"],tags:{highway:"service"}},w84:{id:"w84",nodes:["n374","n375","n376","n377","n373","n374"],tags:{building:"yes"}},w840:{id:"w840",nodes:["n4909","n4907","n4910"],tags:{highway:"service"}},w841:{id:"w841",nodes:["n4911","n4912","n4913","n4914","n4911"],tags:{building:"yes"}},w842:{id:"w842",nodes:["n4915","n4916","n4917","n4918","n4915"],tags:{aeroway:"hangar",building:"yes"}},w843:{id:"w843",nodes:["n4919","n4920","n4921","n4922","n4919"],tags:{building:"yes"}},w844:{id:"w844",nodes:["n4923","n4924","n4925","n4926","n4923"],tags:{aeroway:"hangar",building:"yes"}},w845:{id:"w845",nodes:["n4927","n4928","n4929","n4930","n4927"],tags:{aeroway:"hangar",building:"yes"}},w846:{id:"w846",nodes:["n4931","n4932","n4933","n4934","n4931"],tags:{aeroway:"hangar",building:"yes"}},w847:{id:"w847",nodes:["n4935","n4936","n4937","n4938","n4935"],tags:{aeroway:"hangar",building:"yes"}},w848:{id:"w848",nodes:["n4939","n4940","n4941","n4942","n4939"],tags:{aeroway:"hangar",building:"yes"}},w849:{id:"w849",nodes:["n4943","n4944","n4945","n4946","n4943"],tags:{aeroway:"hangar",building:"yes"}},w85:{id:"w85",nodes:["n431","n432","n1038","n433","n434","n1040","n431"],tags:{building:"yes"}},w850:{id:"w850",nodes:["n4947","n4948","n4949","n4950","n4947"],tags:{aeroway:"hangar",building:"yes"}},w851:{id:"w851",nodes:["n4951","n4952","n4953","n4954","n4951"],tags:{aeroway:"hangar",building:"yes"}},w852:{id:"w852",nodes:["n4955","n4956","n4957","n4958","n4955"],tags:{aeroway:"hangar",building:"yes"}},w853:{id:"w853",nodes:["n4959","n4864","n4861","n4862","n4863"],tags:{barrier:"fence"}},w854:{id:"w854",nodes:["n4961","n4962","n4963","n4964","n4965","n4966","n4967","n4968","n4969","n4961"],tags:{landuse:"farmland"}},w855:{id:"w855",nodes:["n4970","n4971","n4972","n4973","n4974","n4975","n4976","n4977","n4978","n4980","n4970"],tags:{landuse:"farmland"}},w856:{id:"w856",nodes:["n4979","n4980","n4978","n4981","n4982","n4983","n4984","n4985","n4979"],tags:{natural:"scrub"}},w857:{id:"w857",nodes:["n4986","n4987","n4988","n5032","n4989","n4990","n4991","n4992","n4993","n4994","n4995","n4996","n4997","n4998","n4999","n5000","n5001","n5002","n5022","n5023","n5024","n5025","n5030","n5031","n5029","n5028","n5027","n5026","n4986"],tags:{landuse:"farmland"}},w858:{id:"w858",nodes:["n5001","n5003","n5004","n4999","n5000","n5001"],tags:{natural:"scrub"}},w859:{id:"w859",nodes:["n5005","n5006","n5007","n5008","n5009","n5010","n5021","n5020","n5019","n5011","n5012","n5013","n5018","n5014","n5015","n5017","n5016","n5005"],tags:{landuse:"farmland"}},w86:{id:"w86",nodes:["n384","n385","n386","n387","n384"],tags:{building:"yes"}},w860:{id:"w860",nodes:["n3020","n5033","n5034","n5035","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2153","n2288","n3020"],tags:{landuse:"industrial"}},w87:{id:"w87",nodes:["n387","n388","n389","n386","n387"],tags:{building:"yes"}},w88:{id:"w88",nodes:["n390","n391","n392","n393","n390"],tags:{building:"yes"}},w89:{id:"w89",nodes:["n394","n2895"],tags:{highway:"service"}},w9:{id:"w9",nodes:["n50","n51","n148","n52","n57","n891","n53","n50"],tags:{building:"yes"}},w90:{id:"w90",nodes:["n398","n399","n400","n401","n402","n403","n404","n405","n406","n407","n408","n409","n410","n411","n412","n413","n414","n415","n416","n417","n398"],tags:{building:"yes"}},w91:{id:"w91",nodes:["n418","n423","n419"],tags:{highway:"service"}},w92:{id:"w92",nodes:["n420","n421","n422","n423","n420"],tags:{amenity:"parking"}},w93:{id:"w93",nodes:["n2282","n1876"],tags:{name:"Rocky River",tunnel:"building_passage",waterway:"river"}},w94:{id:"w94",nodes:["n1876","n885","n1875","n2234"],tags:{name:"Rocky River",waterway:"river"}},w95:{id:"w95",nodes:["n425","n426","n427","n914","n428","n913","n425"],tags:{building:"yes"}},w96:{id:"w96",nodes:["n456","n620","n1034","n1035","n456"],tags:{building:"yes"}},w97:{id:"w97",nodes:["n435","n912","n451","n321"],tags:{highway:"footway"}},w98:{id:"w98",nodes:["n436","n319","n437","n438","n439","n440","n441","n476","n442"],tags:{highway:"service"}},w99:{id:"w99",nodes:["n443","n444","n445","n446","n447","n448","n449","n450","n443"],tags:{amenity:"parking"}},n2934:{id:"n2934",loc:[-85.617051,41.952263]},n2935:{id:"n2935",loc:[-85.61699,41.952276]},n2937:{id:"n2937",loc:[-85.616847,41.952262]},n2938:{id:"n2938",loc:[-85.616577,41.951956]},n2939:{id:"n2939",loc:[-85.61656,41.952044]},n3348:{id:"n3348",loc:[-85.61714,41.9522]},n3349:{id:"n3349",loc:[-85.616517,41.95212]},n3350:{id:"n3350",loc:[-85.616489,41.952033]},n3351:{id:"n3351",loc:[-85.616529,41.951907]},n3354:{id:"n3354",loc:[-85.616488,41.951994]}};
59228
59229   // Tooltips and svg mask used to highlight certain features
59230   function uiCurtain() {
59231
59232       var surface = select(null),
59233           tooltip = select(null),
59234           darkness = select(null);
59235
59236       function curtain(selection$$1) {
59237           surface = selection$$1
59238               .append('svg')
59239               .attr('id', 'curtain')
59240               .style('z-index', 1000)
59241               .style('pointer-events', 'none')
59242               .style('position', 'absolute')
59243               .style('top', 0)
59244               .style('left', 0);
59245
59246           darkness = surface.append('path')
59247               .attr('x', 0)
59248               .attr('y', 0)
59249               .attr('class', 'curtain-darkness');
59250
59251           select(window).on('resize.curtain', resize);
59252
59253           tooltip = selection$$1.append('div')
59254               .attr('class', 'tooltip')
59255               .style('z-index', 1002);
59256
59257           tooltip
59258               .append('div')
59259               .attr('class', 'tooltip-arrow');
59260
59261           tooltip
59262               .append('div')
59263               .attr('class', 'tooltip-inner');
59264
59265           resize();
59266
59267
59268           function resize() {
59269               surface
59270                   .attr('width', window.innerWidth)
59271                   .attr('height', window.innerHeight);
59272               curtain.cut(darkness.datum());
59273           }
59274       }
59275
59276
59277       /**
59278        * Reveal cuts the curtain to highlight the given box,
59279        * and shows a tooltip with instructions next to the box.
59280        *
59281        * @param  {String|ClientRect} [box]   box used to cut the curtain
59282        * @param  {String}    [text]          text for a tooltip
59283        * @param  {Object}    [options]
59284        * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
59285        * @param  {integer}   [options.duration]        transition time in milliseconds
59286        * @param  {string}    [options.buttonText]      if set, create a button with this text label
59287        * @param  {function}  [options.buttonCallback]  if set, the callback for the button
59288        * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
59289        */
59290       curtain.reveal = function(box, text, options) {
59291           if (typeof box === 'string') {
59292               box = select(box).node();
59293           }
59294           if (box && box.getBoundingClientRect) {
59295               box = copyBox(box.getBoundingClientRect());
59296           }
59297
59298           options = options || {};
59299
59300           var tooltipBox;
59301           if (options.tooltipBox) {
59302               tooltipBox = options.tooltipBox;
59303               if (typeof tooltipBox === 'string') {
59304                   tooltipBox = select(tooltipBox).node();
59305               }
59306               if (tooltipBox && tooltipBox.getBoundingClientRect) {
59307                   tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
59308               }
59309           } else {
59310               tooltipBox = box;
59311           }
59312
59313           if (tooltipBox && text) {
59314               // pseudo markdown bold text for the instruction section..
59315               var parts = text.split('**');
59316               var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
59317               if (parts[1]) {
59318                   html += '<span class="instruction">' + parts[1] + '</span>';
59319               }
59320
59321               html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
59322               html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
59323
59324               if (options.buttonText && options.buttonCallback) {
59325                   html += '<div class="button-section">' +
59326                       '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
59327               }
59328
59329               var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
59330               tooltip
59331                   .classed(classes, true)
59332                   .selectAll('.tooltip-inner')
59333                   .html(html);
59334
59335               if (options.buttonText && options.buttonCallback) {
59336                   var button = tooltip.selectAll('.button-section .button.action');
59337                   button
59338                       .on('click', function() {
59339                           event.preventDefault();
59340                           options.buttonCallback();
59341                       });
59342               }
59343
59344               var tip = copyBox(tooltip.node().getBoundingClientRect()),
59345                   w = window.innerWidth,
59346                   h = window.innerHeight,
59347                   tooltipWidth = 200,
59348                   tooltipArrow = 5,
59349                   side, pos;
59350
59351
59352               // hack: this will have bottom placement,
59353               // so need to reserve extra space for the tooltip illustration.
59354               if (options.tooltipClass === 'intro-mouse') {
59355                   tip.height += 80;
59356               }
59357
59358               // trim box dimensions to just the portion that fits in the window..
59359               if (tooltipBox.top + tooltipBox.height > h) {
59360                   tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
59361               }
59362               if (tooltipBox.left + tooltipBox.width > w) {
59363                   tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
59364               }
59365
59366               // determine tooltip placement..
59367
59368               if (tooltipBox.top + tooltipBox.height < 100) {
59369                   // tooltip below box..
59370                   side = 'bottom';
59371                   pos = [
59372                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
59373                       tooltipBox.top + tooltipBox.height
59374                   ];
59375
59376               } else if (tooltipBox.top > h - 140) {
59377                   // tooltip above box..
59378                   side = 'top';
59379                   pos = [
59380                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
59381                       tooltipBox.top - tip.height
59382                   ];
59383
59384               } else {
59385                   // tooltip to the side of the tooltipBox..
59386                   var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
59387
59388                   if (textDirection === 'rtl') {
59389                       if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
59390                           side = 'right';
59391                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
59392
59393                       } else {
59394                           side = 'left';
59395                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
59396                       }
59397
59398                   } else {
59399                       if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
59400                           side = 'left';
59401                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
59402                       }
59403                       else {
59404                           side = 'right';
59405                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
59406                       }
59407                   }
59408               }
59409
59410               if (options.duration !== 0 || !tooltip.classed(side)) {
59411                   tooltip.call(uiToggle(true));
59412               }
59413
59414               tooltip
59415                   .style('top', pos[1] + 'px')
59416                   .style('left', pos[0] + 'px')
59417                   .attr('class', classes + ' ' + side);
59418
59419
59420               // shift tooltip-inner if it is very close to the top or bottom edge
59421               // (doesn't affect the placement of the tooltip-arrow)
59422               var shiftY = 0;
59423               if (side === 'left' || side === 'right') {
59424                   if (pos[1] < 60) {
59425                       shiftY = 60 - pos[1];
59426                   }
59427                   else if (pos[1] + tip.height > h - 100) {
59428                       shiftY = h - pos[1] - tip.height - 100;
59429                   }
59430               }
59431               tooltip.selectAll('.tooltip-inner')
59432                   .style('top', shiftY + 'px');
59433
59434           } else {
59435               tooltip
59436                   .classed('in', false)
59437                   .call(uiToggle(false));
59438           }
59439
59440           curtain.cut(box, options.duration);
59441
59442           return tooltip;
59443       };
59444
59445
59446       curtain.cut = function(datum, duration) {
59447           darkness.datum(datum)
59448               .interrupt();
59449
59450           var selection$$1;
59451           if (duration === 0) {
59452               selection$$1 = darkness;
59453           } else {
59454               selection$$1 = darkness
59455                   .transition()
59456                   .duration(duration || 600)
59457                   .ease(linear$1);
59458           }
59459
59460           selection$$1
59461               .attr('d', function(d) {
59462                   var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
59463                       window.innerWidth + ',' + window.innerHeight + 'L' +
59464                       window.innerWidth + ',0 Z';
59465
59466                   if (!d) return string;
59467                   return string + 'M' +
59468                       d.left + ',' + d.top + 'L' +
59469                       d.left + ',' + (d.top + d.height) + 'L' +
59470                       (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
59471                       (d.left + d.width) + ',' + (d.top) + 'Z';
59472
59473               });
59474       };
59475
59476
59477       curtain.remove = function() {
59478           surface.remove();
59479           tooltip.remove();
59480           select(window).on('resize.curtain', null);
59481       };
59482
59483
59484       // ClientRects are immutable, so copy them to an object,
59485       // in case we need to trim the height/width.
59486       function copyBox(src) {
59487           return {
59488               top: src.top,
59489               right: src.right,
59490               bottom: src.bottom,
59491               left: src.left,
59492               width: src.width,
59493               height: src.height
59494           };
59495       }
59496
59497
59498       return curtain;
59499   }
59500
59501   function uiIntroWelcome(context, reveal) {
59502       var dispatch$$1 = dispatch('done'),
59503           listener = clickListener();
59504
59505       var chapter = {
59506           title: 'intro.welcome.title'
59507       };
59508
59509
59510       function welcome() {
59511           context.map().centerZoom([-85.63591, 41.94285], 19);
59512           reveal('.intro-nav-wrap .chapter-welcome',
59513               t('intro.welcome.welcome'),
59514               { buttonText: t('intro.ok'), buttonCallback: practice }
59515           );
59516       }
59517
59518       function practice() {
59519           reveal('.intro-nav-wrap .chapter-welcome',
59520               t('intro.welcome.practice'),
59521               { buttonText: t('intro.ok'), buttonCallback: words }
59522           );
59523       }
59524
59525       function words() {
59526           reveal('.intro-nav-wrap .chapter-welcome',
59527               t('intro.welcome.words'),
59528               { buttonText: t('intro.ok'), buttonCallback: mouse$$1 }
59529           );
59530       }
59531
59532
59533       function mouse$$1() {
59534           reveal('.intro-nav-wrap .chapter-welcome',
59535               t('intro.welcome.mouse'),
59536               { buttonText: t('intro.ok'), buttonCallback: leftClick }
59537           );
59538       }
59539
59540
59541       function leftClick() {
59542           var counter = 0,
59543               times = 5;
59544
59545           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
59546               t('intro.welcome.leftclick', { num: times }),
59547               { tooltipClass: 'intro-mouse' }
59548           );
59549
59550           tooltip.selectAll('.tooltip-inner')
59551               .insert('svg', 'span')
59552               .attr('class', 'tooltip-illustration')
59553               .append('use')
59554               .attr('xlink:href', '#iD-walkthrough-mouse');
59555
59556           tooltip
59557               .append('div')
59558               .attr('class', 'counter');
59559
59560           tooltip.call(listener);
59561
59562           listener.on('click', function(which) {
59563               if (which === 'left') {
59564                   select('.curtain-tooltip.intro-mouse .counter')
59565                       .text(String(++counter));
59566
59567                   if (counter === times) {
59568                       window.setTimeout(function() { continueTo(rightClick); }, 1000);
59569                   }
59570               }
59571           });
59572
59573           function continueTo(nextStep) {
59574               listener.on('click', null);
59575               tooltip.call(listener.off);
59576               tooltip.select('.counter').remove();
59577               nextStep();
59578           }
59579       }
59580
59581
59582       function rightClick() {
59583           var counter = 0,
59584               times = 5;
59585
59586           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
59587               t('intro.welcome.rightclick', { num: times }),
59588               { tooltipClass: 'intro-mouse' }
59589           );
59590
59591           tooltip.selectAll('.tooltip-inner')
59592               .insert('svg', 'span')
59593               .attr('class', 'tooltip-illustration')
59594               .append('use')
59595               .attr('xlink:href', '#iD-walkthrough-mouse');
59596
59597           tooltip
59598               .append('div')
59599               .attr('class', 'counter');
59600
59601           tooltip.call(listener);
59602
59603           listener.on('click', function(which) {
59604               if (which === 'right') {
59605                   select('.curtain-tooltip.intro-mouse .counter')
59606                       .text(String(++counter));
59607
59608                   if (counter === times) {
59609                       window.setTimeout(function() { continueTo(chapters); }, 1000);
59610                   }
59611               }
59612           });
59613
59614           function continueTo(nextStep) {
59615               listener.on('click', null);
59616               tooltip.call(listener.off);
59617               tooltip.select('.counter').remove();
59618               nextStep();
59619           }
59620       }
59621
59622
59623       function chapters() {
59624           dispatch$$1.call('done');
59625           reveal('.intro-nav-wrap .chapter-navigation',
59626               t('intro.welcome.chapters', { next: t('intro.navigation.title') })
59627           );
59628       }
59629
59630
59631       chapter.enter = function() {
59632           welcome();
59633       };
59634
59635
59636       chapter.exit = function() {
59637           listener.off();
59638           select('.curtain-tooltip.intro-mouse')
59639               .selectAll('.counter')
59640               .remove();
59641       };
59642
59643
59644       chapter.restart = function() {
59645           chapter.exit();
59646           chapter.enter();
59647       };
59648
59649
59650       return utilRebind(chapter, dispatch$$1, 'on');
59651   }
59652
59653
59654
59655   function clickListener() {
59656       var dispatch$$1 = dispatch('click'),
59657           minTime = 120,
59658           tooltip = select(null),
59659           down = {};
59660
59661       // `down` keeps track of which buttons/keys are down.
59662       // Setting a property in `down` happens immediately.
59663       // Unsetting a property in `down` is delayed because
59664       //   on Windows a contextmenu event happens after keyup/mouseup
59665
59666       function keydown() {
59667           if (event.keyCode === 93)  {   // context menu
59668               event.preventDefault();
59669               event.stopPropagation();
59670               down.menu = event.timeStamp;
59671               tooltip.classed('rightclick', true);
59672           }
59673       }
59674
59675
59676       function keyup() {
59677           if (event.keyCode === 93)  {   // context menu
59678               event.preventDefault();
59679               event.stopPropagation();
59680               var endTime = event.timeStamp,
59681                   startTime = down.menu || endTime,
59682                   delay = (endTime - startTime < minTime) ? minTime : 0;
59683
59684               window.setTimeout(function() {
59685                   tooltip.classed('rightclick', false);
59686                   down.menu = undefined;  // delayed, for Windows
59687               }, delay);
59688
59689               dispatch$$1.call('click', this, 'right');
59690           }
59691       }
59692
59693
59694       function mousedown() {
59695           var button = event.button;
59696           if (button === 0 && !event.ctrlKey) {
59697               tooltip.classed('leftclick', true);
59698           } else if (button === 2) {
59699               tooltip.classed('rightclick', true);
59700           }
59701           down[button] = event.timeStamp;
59702       }
59703
59704
59705       function mouseup() {
59706           var button = event.button,
59707               endTime = event.timeStamp,
59708               startTime = down[button] || endTime,
59709               delay = (endTime - startTime < minTime) ? minTime : 0;
59710
59711           if (button === 0 && !event.ctrlKey) {
59712               window.setTimeout(function() {
59713                   tooltip.classed('leftclick', false);
59714                   down[button] = undefined;  // delayed, for Windows
59715               }, delay);
59716
59717               dispatch$$1.call('click', this, 'left');
59718
59719           } else if (button === 2) {
59720               window.setTimeout(function() {
59721                   tooltip.classed('rightclick', false);
59722                   down[button] = undefined;  // delayed, for Windows
59723               }, delay);
59724
59725               dispatch$$1.call('click', this, 'right');
59726
59727           } else {
59728               window.setTimeout(function() {
59729                   down[button] = undefined;  // delayed, for Windows
59730               }, delay);
59731           }
59732       }
59733
59734
59735       function contextmenu() {
59736           event.preventDefault();
59737           event.stopPropagation();
59738           if (!down[2] && !down.menu) {
59739               tooltip.classed('rightclick', true);
59740               window.setTimeout(function() {
59741                   tooltip.classed('rightclick', false);
59742               }, minTime);
59743               dispatch$$1.call('click', this, 'right');
59744           }
59745       }
59746
59747
59748       var behavior = function(selection$$1) {
59749           tooltip = selection$$1;
59750           down = {};
59751
59752           select(window)
59753               .on('keydown.intro', keydown)
59754               .on('keyup.intro', keyup)
59755               .on('mousedown.intro', mousedown)
59756               .on('mouseup.intro', mouseup)
59757               .on('contextmenu.intro', contextmenu);
59758       };
59759
59760
59761       behavior.off = function() {
59762           select(window)
59763               .on('keydown.intro', null)
59764               .on('keyup.intro', null)
59765               .on('mousedown.intro', null)
59766               .on('mouseup.intro', null)
59767               .on('contextmenu.intro', null);
59768
59769           tooltip
59770               .classed('leftclick', false)
59771               .classed('rightclick', false);
59772       };
59773
59774       return utilRebind(behavior, dispatch$$1, 'on');
59775   }
59776
59777   function uiIntroNavigation(context, reveal) {
59778       var dispatch$$1 = dispatch('done'),
59779           timeouts = [],
59780           hallId = 'n2061',
59781           townHall = [-85.63591, 41.94285],
59782           springStreetId = 'w397',
59783           springStreetEndId = 'n1834',
59784           springStreet = [-85.63582, 41.94255],
59785           onewayField = context.presets().field('oneway'),
59786           maxspeedField = context.presets().field('maxspeed');
59787
59788
59789       var chapter = {
59790           title: 'intro.navigation.title'
59791       };
59792
59793
59794       function timeout(f, t$$1) {
59795           timeouts.push(window.setTimeout(f, t$$1));
59796       }
59797
59798
59799       function eventCancel() {
59800           event.stopPropagation();
59801           event.preventDefault();
59802       }
59803
59804
59805       function isTownHallSelected() {
59806           var ids = context.selectedIDs();
59807           return ids.length === 1 && ids[0] === hallId;
59808       }
59809
59810
59811       function dragMap() {
59812           context.enter(modeBrowse(context));
59813           context.history().reset('initial');
59814
59815           var msec = transitionTime(townHall, context.map().center());
59816           if (msec) { reveal(null, null, { duration: 0 }); }
59817           context.map().zoom(19).centerEase(townHall, msec);
59818
59819           timeout(function() {
59820               var centerStart = context.map().center();
59821
59822               reveal('#surface', t('intro.navigation.drag'));
59823               context.map().on('drawn.intro', function() {
59824                   reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
59825               });
59826
59827               context.map().on('move.intro', function() {
59828                   var centerNow = context.map().center();
59829                   if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
59830                       context.map().on('move.intro', null);
59831                       timeout(function() { continueTo(zoomMap); }, 3000);
59832                   }
59833               });
59834
59835           }, msec + 100);
59836
59837           function continueTo(nextStep) {
59838               context.map().on('move.intro drawn.intro', null);
59839               nextStep();
59840           }
59841       }
59842
59843
59844       function zoomMap() {
59845           var zoomStart = context.map().zoom();
59846
59847           reveal('#surface',
59848               t('intro.navigation.zoom', {
59849                   plus: icon('#iD-icon-plus', 'pre-text'),
59850                   minus: icon('#iD-icon-minus', 'pre-text')
59851               })
59852           );
59853
59854           context.map().on('drawn.intro', function() {
59855               reveal('#surface',
59856                   t('intro.navigation.zoom', {
59857                       plus: icon('#iD-icon-plus', 'pre-text'),
59858                       minus: icon('#iD-icon-minus', 'pre-text')
59859                   }), { duration: 0 }
59860               );
59861           });
59862
59863           context.map().on('move.intro', function() {
59864               if (context.map().zoom() !== zoomStart) {
59865                   context.map().on('move.intro', null);
59866                   timeout(function() { continueTo(features); }, 3000);
59867               }
59868           });
59869
59870           function continueTo(nextStep) {
59871               context.map().on('move.intro drawn.intro', null);
59872               nextStep();
59873           }
59874       }
59875
59876
59877       function features() {
59878           var onClick = function() { continueTo(pointsLinesAreas); };
59879
59880           reveal('#surface', t('intro.navigation.features'),
59881               { buttonText: t('intro.ok'), buttonCallback: onClick }
59882           );
59883
59884           context.map().on('drawn.intro', function() {
59885               reveal('#surface', t('intro.navigation.features'),
59886                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
59887               );
59888           });
59889
59890           function continueTo(nextStep) {
59891               context.map().on('drawn.intro', null);
59892               nextStep();
59893           }
59894       }
59895
59896       function pointsLinesAreas() {
59897           var onClick = function() { continueTo(nodesWays); };
59898
59899           reveal('#surface', t('intro.navigation.points_lines_areas'),
59900               { buttonText: t('intro.ok'), buttonCallback: onClick }
59901           );
59902
59903           context.map().on('drawn.intro', function() {
59904               reveal('#surface', t('intro.navigation.points_lines_areas'),
59905                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
59906               );
59907           });
59908
59909           function continueTo(nextStep) {
59910               context.map().on('drawn.intro', null);
59911               nextStep();
59912           }
59913       }
59914
59915       function nodesWays() {
59916           var onClick = function() { continueTo(clickTownHall); };
59917
59918           reveal('#surface', t('intro.navigation.nodes_ways'),
59919               { buttonText: t('intro.ok'), buttonCallback: onClick }
59920           );
59921
59922           context.map().on('drawn.intro', function() {
59923               reveal('#surface', t('intro.navigation.nodes_ways'),
59924                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
59925               );
59926           });
59927
59928           function continueTo(nextStep) {
59929               context.map().on('drawn.intro', null);
59930               nextStep();
59931           }
59932       }
59933
59934       function clickTownHall() {
59935           context.enter(modeBrowse(context));
59936           context.history().reset('initial');
59937
59938           reveal(null, null, { duration: 0 });
59939           context.map().zoomEase(19, 500);
59940
59941           timeout(function() {
59942               var entity = context.hasEntity(hallId);
59943               if (!entity) return;
59944               context.map().centerEase(entity.loc, 500);
59945
59946               timeout(function() {
59947                   var entity = context.hasEntity(hallId);
59948                   if (!entity) return;
59949                   var box = pointBox(entity.loc, context);
59950                   reveal(box, t('intro.navigation.click_townhall'));
59951
59952                   context.map().on('move.intro drawn.intro', function() {
59953                       var entity = context.hasEntity(hallId);
59954                       if (!entity) return;
59955                       var box = pointBox(entity.loc, context);
59956                       reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
59957                   });
59958
59959                   context.on('enter.intro', function() {
59960                       if (isTownHallSelected()) continueTo(selectedTownHall);
59961                   });
59962
59963               }, 550);  // after centerEase
59964
59965           }, 550); // after zoomEase
59966
59967           context.history().on('change.intro', function() {
59968               if (!context.hasEntity(hallId)) {
59969                   continueTo(clickTownHall);
59970               }
59971           });
59972
59973           function continueTo(nextStep) {
59974               context.on('enter.intro', null);
59975               context.map().on('move.intro drawn.intro', null);
59976               context.history().on('change.intro', null);
59977               nextStep();
59978           }
59979       }
59980
59981
59982       function selectedTownHall() {
59983           if (!isTownHallSelected()) return clickTownHall();
59984
59985           var entity = context.hasEntity(hallId);
59986           if (!entity) return clickTownHall();
59987
59988           var box = pointBox(entity.loc, context);
59989           var onClick = function() { continueTo(editorTownHall); };
59990
59991           reveal(box, t('intro.navigation.selected_townhall'),
59992               { buttonText: t('intro.ok'), buttonCallback: onClick }
59993           );
59994
59995           context.map().on('move.intro drawn.intro', function() {
59996               var entity = context.hasEntity(hallId);
59997               if (!entity) return;
59998               var box = pointBox(entity.loc, context);
59999               reveal(box, t('intro.navigation.selected_townhall'),
60000                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60001               );
60002           });
60003
60004           context.history().on('change.intro', function() {
60005               if (!context.hasEntity(hallId)) {
60006                   continueTo(clickTownHall);
60007               }
60008           });
60009
60010           function continueTo(nextStep) {
60011               context.map().on('move.intro drawn.intro', null);
60012               context.history().on('change.intro', null);
60013               nextStep();
60014           }
60015       }
60016
60017
60018       function editorTownHall() {
60019           if (!isTownHallSelected()) return clickTownHall();
60020
60021           // disallow scrolling
60022           select('.inspector-wrap').on('wheel.intro', eventCancel);
60023
60024           var onClick = function() { continueTo(presetTownHall); };
60025
60026           reveal('.entity-editor-pane',
60027               t('intro.navigation.editor_townhall'),
60028               { buttonText: t('intro.ok'), buttonCallback: onClick }
60029           );
60030
60031           context.on('exit.intro', function() {
60032               continueTo(clickTownHall);
60033           });
60034
60035           context.history().on('change.intro', function() {
60036               if (!context.hasEntity(hallId)) {
60037                   continueTo(clickTownHall);
60038               }
60039           });
60040
60041           function continueTo(nextStep) {
60042               context.on('exit.intro', null);
60043               context.history().on('change.intro', null);
60044               select('.inspector-wrap').on('wheel.intro', null);
60045               nextStep();
60046           }
60047       }
60048
60049
60050       function presetTownHall() {
60051           if (!isTownHallSelected()) return clickTownHall();
60052
60053           // reset pane, in case user happened to change it..
60054           select('.inspector-wrap .panewrap').style('right', '0%');
60055           // disallow scrolling
60056           select('.inspector-wrap').on('wheel.intro', eventCancel);
60057
60058           // preset match, in case the user happened to change it.
60059           var entity = context.entity(context.selectedIDs()[0]);
60060           var preset = context.presets().match(entity, context.graph());
60061
60062           var onClick = function() { continueTo(fieldsTownHall); };
60063
60064           context.on('exit.intro', function() {
60065               continueTo(clickTownHall);
60066           });
60067
60068           context.history().on('change.intro', function() {
60069               if (!context.hasEntity(hallId)) {
60070                   continueTo(clickTownHall);
60071               }
60072           });
60073
60074           reveal('.inspector-body .preset-list-item.inspector-inner',
60075               t('intro.navigation.preset_townhall', { preset: preset.name() }),
60076               { buttonText: t('intro.ok'), buttonCallback: onClick }
60077           );
60078
60079           function continueTo(nextStep) {
60080               context.on('exit.intro', null);
60081               context.history().on('change.intro', null);
60082               select('.inspector-wrap').on('wheel.intro', null);
60083               nextStep();
60084           }
60085       }
60086
60087
60088       function fieldsTownHall() {
60089           if (!isTownHallSelected()) return clickTownHall();
60090
60091           // reset pane, in case user happened to change it..
60092           select('.inspector-wrap .panewrap').style('right', '0%');
60093           // disallow scrolling
60094           select('.inspector-wrap').on('wheel.intro', eventCancel);
60095
60096           var onClick = function() { continueTo(closeTownHall); };
60097
60098           reveal('.inspector-body .preset-editor',
60099               t('intro.navigation.fields_townhall'),
60100               { buttonText: t('intro.ok'), buttonCallback: onClick }
60101           );
60102
60103           context.on('exit.intro', function() {
60104               continueTo(clickTownHall);
60105           });
60106
60107           context.history().on('change.intro', function() {
60108               if (!context.hasEntity(hallId)) {
60109                   continueTo(clickTownHall);
60110               }
60111           });
60112
60113           function continueTo(nextStep) {
60114               context.on('exit.intro', null);
60115               context.history().on('change.intro', null);
60116               select('.inspector-wrap').on('wheel.intro', null);
60117               nextStep();
60118           }
60119       }
60120
60121
60122       function closeTownHall() {
60123           if (!isTownHallSelected()) return clickTownHall();
60124
60125           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60126           var href = select(selector$$1).attr('href') || '#iD-icon-close';
60127
60128           reveal('.entity-editor-pane',
60129               t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
60130           );
60131
60132           context.on('exit.intro', function() {
60133               continueTo(searchStreet);
60134           });
60135
60136           context.history().on('change.intro', function() {
60137               // update the close icon in the tooltip if the user edits something.
60138               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60139               var href = select(selector$$1).attr('href') || '#iD-icon-close';
60140
60141               reveal('.entity-editor-pane',
60142                   t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
60143                   { duration: 0 }
60144               );
60145           });
60146
60147           function continueTo(nextStep) {
60148               context.on('exit.intro', null);
60149               context.history().on('change.intro', null);
60150               nextStep();
60151           }
60152       }
60153
60154
60155       function searchStreet() {
60156           context.enter(modeBrowse(context));
60157           context.history().reset('initial');  // ensure spring street exists
60158
60159           var msec = transitionTime(springStreet, context.map().center());
60160           if (msec) { reveal(null, null, { duration: 0 }); }
60161           context.map().zoom(19).centerEase(springStreet, msec);  // ..and user can see it
60162
60163           timeout(function() {
60164               reveal('.search-header input',
60165                   t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
60166               );
60167
60168               select('.search-header input')
60169                   .on('keyup.intro', checkSearchResult);
60170           }, msec + 100);
60171       }
60172
60173
60174       function checkSearchResult() {
60175           var first = select('.feature-list-item:nth-child(0n+2)'),  // skip "No Results" item
60176               firstName = first.select('.entity-name'),
60177               name = t('intro.graph.name.spring-street');
60178
60179           if (!firstName.empty() && firstName.text() === name) {
60180               reveal(first.node(),
60181                   t('intro.navigation.choose_street', { name: name }),
60182                   { duration: 300 }
60183               );
60184
60185               context.on('exit.intro', function() {
60186                   continueTo(selectedStreet);
60187               });
60188
60189               select('.search-header input')
60190                   .on('keydown.intro', eventCancel, true)
60191                   .on('keyup.intro', null);
60192           }
60193
60194           function continueTo(nextStep) {
60195               context.on('exit.intro', null);
60196               select('.search-header input')
60197                   .on('keydown.intro', null)
60198                   .on('keyup.intro', null);
60199               nextStep();
60200           }
60201       }
60202
60203
60204       function selectedStreet() {
60205           if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
60206               return searchStreet();
60207           }
60208
60209           var onClick = function() { continueTo(editorStreet); };
60210           var entity = context.entity(springStreetEndId);
60211           var box = pointBox(entity.loc, context);
60212           box.height = 500;
60213
60214           reveal(box,
60215               t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
60216               { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
60217           );
60218
60219           timeout(function() {
60220               context.map().on('move.intro drawn.intro', function() {
60221                   var entity = context.hasEntity(springStreetEndId);
60222                   if (!entity) return;
60223                   var box = pointBox(entity.loc, context);
60224                   box.height = 500;
60225                   reveal(box,
60226                       t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
60227                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60228                   );
60229               });
60230           }, 600);  // after reveal.
60231
60232           context.on('enter.intro', function(mode) {
60233               if (!context.hasEntity(springStreetId)) {
60234                   return continueTo(searchStreet);
60235               }
60236               var ids = context.selectedIDs();
60237               if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
60238                   // keep Spring Street selected..
60239                   context.enter(modeSelect(context, [springStreetId]));
60240               }
60241           });
60242
60243           context.history().on('change.intro', function() {
60244               if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
60245                   timeout(function() {
60246                       continueTo(searchStreet);
60247                   }, 300);  // after any transition (e.g. if user deleted intersection)
60248               }
60249           });
60250
60251           function continueTo(nextStep) {
60252               context.map().on('move.intro drawn.intro', null);
60253               context.on('enter.intro', null);
60254               context.history().on('change.intro', null);
60255               nextStep();
60256           }
60257       }
60258
60259
60260       function editorStreet() {
60261           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60262           var href = select(selector$$1).attr('href') || '#iD-icon-close';
60263
60264           reveal('.entity-editor-pane',
60265               t('intro.navigation.editor_street', {
60266                   button: icon(href, 'pre-text'),
60267                   field1: onewayField.label(),
60268                   field2: maxspeedField.label()
60269               })
60270           );
60271
60272           context.on('exit.intro', function() {
60273               continueTo(play);
60274           });
60275
60276           context.history().on('change.intro', function() {
60277               // update the close icon in the tooltip if the user edits something.
60278               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60279               var href = select(selector$$1).attr('href') || '#iD-icon-close';
60280
60281               reveal('.entity-editor-pane',
60282                   t('intro.navigation.editor_street', {
60283                       button: icon(href, 'pre-text'),
60284                       field1: onewayField.label().toLowerCase(),
60285                       field2: maxspeedField.label().toLowerCase()
60286                   }), { duration: 0 }
60287               );
60288           });
60289
60290           function continueTo(nextStep) {
60291               context.on('exit.intro', null);
60292               context.history().on('change.intro', null);
60293               nextStep();
60294           }
60295       }
60296
60297
60298       function play() {
60299           dispatch$$1.call('done');
60300           reveal('#id-container',
60301               t('intro.navigation.play', { next: t('intro.points.title') }), {
60302                   tooltipBox: '.intro-nav-wrap .chapter-point',
60303                   buttonText: t('intro.ok'),
60304                   buttonCallback: function() { reveal('#id-container'); }
60305               }
60306           );
60307       }
60308
60309
60310       chapter.enter = function() {
60311           dragMap();
60312       };
60313
60314
60315       chapter.exit = function() {
60316           timeouts.forEach(window.clearTimeout);
60317           context.on('enter.intro exit.intro', null);
60318           context.map().on('move.intro drawn.intro', null);
60319           context.history().on('change.intro', null);
60320           select('.inspector-wrap').on('wheel.intro', null);
60321           select('.search-header input').on('keydown.intro keyup.intro', null);
60322       };
60323
60324
60325       chapter.restart = function() {
60326           chapter.exit();
60327           chapter.enter();
60328       };
60329
60330
60331       return utilRebind(chapter, dispatch$$1, 'on');
60332   }
60333
60334   function uiIntroPoint(context, reveal) {
60335       var dispatch$$1 = dispatch('done'),
60336           timeouts = [],
60337           intersection = [-85.63279, 41.94394],
60338           building = [-85.632422, 41.944045],
60339           cafePreset = context.presets().item('amenity/cafe'),
60340           pointId = null;
60341
60342
60343       var chapter = {
60344           title: 'intro.points.title'
60345       };
60346
60347
60348       function timeout(f, t$$1) {
60349           timeouts.push(window.setTimeout(f, t$$1));
60350       }
60351
60352
60353       function revealEditMenu(loc, text, options) {
60354           var rect = context.surfaceRect();
60355           var point$$1 = context.curtainProjection(loc);
60356           var pad = 40;
60357           var width = 250 + (2 * pad);
60358           var height = 250;
60359           var startX = rect.left + point$$1[0];
60360           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
60361           var box = {
60362               left: left,
60363               top: point$$1[1] + rect.top - 60,
60364               width: width,
60365               height: height
60366           };
60367           reveal(box, text, options);
60368       }
60369
60370
60371       function eventCancel() {
60372           event.stopPropagation();
60373           event.preventDefault();
60374       }
60375
60376
60377       function addPoint() {
60378           context.enter(modeBrowse(context));
60379           context.history().reset('initial');
60380
60381           var msec = transitionTime(intersection, context.map().center());
60382           if (msec) { reveal(null, null, { duration: 0 }); }
60383           context.map().zoom(19).centerEase(intersection, msec);
60384
60385           timeout(function() {
60386               var tooltip = reveal('button.add-point',
60387                   t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
60388
60389               pointId = null;
60390
60391               tooltip.selectAll('.tooltip-inner')
60392                   .insert('svg', 'span')
60393                   .attr('class', 'tooltip-illustration')
60394                   .append('use')
60395                   .attr('xlink:href', '#iD-graphic-points');
60396
60397               context.on('enter.intro', function(mode) {
60398                   if (mode.id !== 'add-point') return;
60399                   continueTo(placePoint);
60400               });
60401           }, msec + 100);
60402
60403           function continueTo(nextStep) {
60404               context.on('enter.intro', null);
60405               nextStep();
60406           }
60407       }
60408
60409
60410       function placePoint() {
60411           if (context.mode().id !== 'add-point') {
60412               return chapter.restart();
60413           }
60414
60415           var pointBox$$1 = pad$1(building, 150, context);
60416           reveal(pointBox$$1, t('intro.points.place_point'));
60417
60418           context.map().on('move.intro drawn.intro', function() {
60419               pointBox$$1 = pad$1(building, 150, context);
60420               reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
60421           });
60422
60423           context.on('enter.intro', function(mode) {
60424               if (mode.id !== 'select') return chapter.restart();
60425               pointId = context.mode().selectedIDs()[0];
60426               continueTo(searchPreset);
60427           });
60428
60429           function continueTo(nextStep) {
60430               context.map().on('move.intro drawn.intro', null);
60431               context.on('enter.intro', null);
60432               nextStep();
60433           }
60434       }
60435
60436
60437       function searchPreset() {
60438           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
60439               return addPoint();
60440           }
60441
60442           // disallow scrolling
60443           select('.inspector-wrap').on('wheel.intro', eventCancel);
60444
60445           select('.preset-search-input')
60446               .on('keydown.intro', null)
60447               .on('keyup.intro', checkPresetSearch);
60448
60449           reveal('.preset-search-input',
60450               t('intro.points.search_cafe', { preset: cafePreset.name() })
60451           );
60452
60453           context.on('enter.intro', function(mode) {
60454               if (!pointId || !context.hasEntity(pointId)) {
60455                   return continueTo(addPoint);
60456               }
60457
60458               var ids = context.selectedIDs();
60459               if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
60460                   // keep the user's point selected..
60461                   context.enter(modeSelect(context, [pointId]));
60462
60463                   // disallow scrolling
60464                   select('.inspector-wrap').on('wheel.intro', eventCancel);
60465
60466                   select('.preset-search-input')
60467                       .on('keydown.intro', null)
60468                       .on('keyup.intro', checkPresetSearch);
60469
60470                   reveal('.preset-search-input',
60471                       t('intro.points.search_cafe', { preset: cafePreset.name() })
60472                   );
60473
60474                   context.history().on('change.intro', null);
60475               }
60476           });
60477
60478
60479           function checkPresetSearch() {
60480               var first = select('.preset-list-item:first-child');
60481
60482               if (first.classed('preset-amenity-cafe')) {
60483                   select('.preset-search-input')
60484                       .on('keydown.intro', eventCancel, true)
60485                       .on('keyup.intro', null);
60486
60487                   reveal(first.select('.preset-list-button').node(),
60488                       t('intro.points.choose_cafe', { preset: cafePreset.name() }),
60489                       { duration: 300 }
60490                   );
60491
60492                   context.history().on('change.intro', function() {
60493                       continueTo(aboutFeatureEditor);
60494                   });
60495               }
60496           }
60497
60498           function continueTo(nextStep) {
60499               context.on('enter.intro', null);
60500               context.history().on('change.intro', null);
60501               select('.inspector-wrap').on('wheel.intro', null);
60502               select('.preset-search-input').on('keydown.intro keyup.intro', null);
60503               nextStep();
60504           }
60505       }
60506
60507
60508       function aboutFeatureEditor() {
60509           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
60510               return addPoint();
60511           }
60512
60513           timeout(function() {
60514               reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
60515                   tooltipClass: 'intro-points-describe',
60516                   buttonText: t('intro.ok'),
60517                   buttonCallback: function() { continueTo(addName); }
60518               });
60519           }, 400);
60520
60521           context.on('exit.intro', function() {
60522               // if user leaves select mode here, just continue with the tutorial.
60523               continueTo(reselectPoint);
60524           });
60525
60526           function continueTo(nextStep) {
60527               context.on('exit.intro', null);
60528               nextStep();
60529           }
60530       }
60531
60532
60533       function addName() {
60534           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
60535               return addPoint();
60536           }
60537
60538           // reset pane, in case user happened to change it..
60539           select('.inspector-wrap .panewrap').style('right', '0%');
60540
60541           timeout(function() {
60542               // It's possible for the user to add a name in a previous step..
60543               // If so, don't tell them to add the name in this step.
60544               // Give them an OK button instead.
60545               var entity = context.entity(pointId);
60546               if (entity.tags.name) {
60547                   var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
60548                       tooltipClass: 'intro-points-describe',
60549                       buttonText: t('intro.ok'),
60550                       buttonCallback: function() { continueTo(addCloseEditor); }
60551                   });
60552                   tooltip.select('.instruction').style('display', 'none');
60553
60554               } else {
60555                   reveal('.entity-editor-pane', t('intro.points.add_name'),
60556                       { tooltipClass: 'intro-points-describe' }
60557                   );
60558               }
60559           }, 400);
60560
60561           context.history().on('change.intro', function() {
60562               continueTo(addCloseEditor);
60563           });
60564
60565           context.on('exit.intro', function() {
60566               // if user leaves select mode here, just continue with the tutorial.
60567               continueTo(reselectPoint);
60568           });
60569
60570           function continueTo(nextStep) {
60571               context.on('exit.intro', null);
60572               context.history().on('change.intro', null);
60573               nextStep();
60574           }
60575       }
60576
60577
60578       function addCloseEditor() {
60579           // reset pane, in case user happened to change it..
60580           select('.inspector-wrap .panewrap').style('right', '0%');
60581
60582           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60583           var href = select(selector$$1).attr('href') || '#iD-icon-close';
60584
60585           context.on('exit.intro', function() {
60586               continueTo(reselectPoint);
60587           });
60588
60589           reveal('.entity-editor-pane',
60590               t('intro.points.add_close', { button: icon(href, 'pre-text') })
60591           );
60592
60593           function continueTo(nextStep) {
60594               context.on('exit.intro', null);
60595               nextStep();
60596           }
60597       }
60598
60599
60600       function reselectPoint() {
60601           if (!pointId) return chapter.restart();
60602           var entity = context.hasEntity(pointId);
60603           if (!entity) return chapter.restart();
60604
60605           // make sure it's still a cafe, in case user somehow changed it..
60606           var oldPreset = context.presets().match(entity, context.graph());
60607           context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
60608
60609           context.enter(modeBrowse(context));
60610
60611           var msec = transitionTime(entity.loc, context.map().center());
60612           if (msec) { reveal(null, null, { duration: 0 }); }
60613           context.map().centerEase(entity.loc, msec);
60614
60615           timeout(function() {
60616               var box = pointBox(entity.loc, context);
60617               reveal(box, t('intro.points.reselect'), { duration: 600 });
60618
60619               timeout(function() {
60620                   context.map().on('move.intro drawn.intro', function() {
60621                       var entity = context.hasEntity(pointId);
60622                       if (!entity) return chapter.restart();
60623                       var box = pointBox(entity.loc, context);
60624                       reveal(box, t('intro.points.reselect'), { duration: 0 });
60625                   });
60626               }, 600); // after reveal..
60627
60628               context.on('enter.intro', function(mode) {
60629                   if (mode.id !== 'select') return;
60630                   continueTo(updatePoint);
60631               });
60632
60633           }, msec + 100);
60634
60635           function continueTo(nextStep) {
60636               context.map().on('move.intro drawn.intro', null);
60637               context.on('enter.intro', null);
60638               nextStep();
60639           }
60640       }
60641
60642
60643       function updatePoint() {
60644           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
60645               return continueTo(reselectPoint);
60646           }
60647
60648           // reset pane, in case user happened to untag the point..
60649           select('.inspector-wrap .panewrap').style('right', '0%');
60650
60651           context.on('exit.intro', function() {
60652               continueTo(reselectPoint);
60653           });
60654
60655           context.history().on('change.intro', function() {
60656               continueTo(updateCloseEditor);
60657           });
60658
60659           timeout(function() {
60660               reveal('.entity-editor-pane', t('intro.points.update'),
60661                   { tooltipClass: 'intro-points-describe' }
60662               );
60663           }, 400);
60664
60665           function continueTo(nextStep) {
60666               context.on('exit.intro', null);
60667               context.history().on('change.intro', null);
60668               nextStep();
60669           }
60670       }
60671
60672
60673       function updateCloseEditor() {
60674           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
60675               return continueTo(reselectPoint);
60676           }
60677
60678           // reset pane, in case user happened to change it..
60679           select('.inspector-wrap .panewrap').style('right', '0%');
60680
60681           context.on('exit.intro', function() {
60682               continueTo(rightClickPoint);
60683           });
60684
60685           timeout(function() {
60686               reveal('.entity-editor-pane',
60687                   t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
60688               );
60689           }, 500);
60690
60691           function continueTo(nextStep) {
60692               context.on('exit.intro', null);
60693               nextStep();
60694           }
60695       }
60696
60697
60698       function rightClickPoint() {
60699           if (!pointId) return chapter.restart();
60700           var entity = context.hasEntity(pointId);
60701           if (!entity) return chapter.restart();
60702
60703           context.enter(modeBrowse(context));
60704
60705           var box = pointBox(entity.loc, context);
60706           reveal(box, t('intro.points.rightclick'), { duration: 600 });
60707
60708           timeout(function() {
60709               context.map().on('move.intro drawn.intro', function() {
60710                   var entity = context.hasEntity(pointId);
60711                   if (!entity) return chapter.restart();
60712                   var box = pointBox(entity.loc, context);
60713                   reveal(box, t('intro.points.rightclick'), { duration: 0 });
60714               });
60715           }, 600); // after reveal
60716
60717           context.on('enter.intro', function(mode) {
60718               if (mode.id !== 'select') return;
60719               var ids = context.selectedIDs();
60720               if (ids.length !== 1 || ids[0] !== pointId) return;
60721
60722               timeout(function() {
60723                   var node = selectMenuItem('delete').node();
60724                   if (!node) return;
60725                   continueTo(enterDelete);
60726               }, 300);  // after menu visible
60727           });
60728
60729           function continueTo(nextStep) {
60730               context.on('enter.intro', null);
60731               context.map().on('move.intro drawn.intro', null);
60732               nextStep();
60733           }
60734       }
60735
60736
60737       function enterDelete() {
60738           if (!pointId) return chapter.restart();
60739           var entity = context.hasEntity(pointId);
60740           if (!entity) return chapter.restart();
60741
60742           var node = selectMenuItem('delete').node();
60743           if (!node) { return continueTo(rightClickPoint); }
60744
60745           revealEditMenu(entity.loc,
60746               t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
60747           );
60748
60749           timeout(function() {
60750               context.map().on('move.intro drawn.intro', function() {
60751                   revealEditMenu(entity.loc,
60752                       t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
60753                       { duration: 0}
60754                   );
60755               });
60756           }, 300); // after menu visible
60757
60758           context.on('exit.intro', function() {
60759               if (!pointId) return chapter.restart();
60760               var entity = context.hasEntity(pointId);
60761               if (entity) return continueTo(rightClickPoint);  // point still exists
60762           });
60763
60764           context.history().on('change.intro', function(changed) {
60765               if (changed.deleted().length) {
60766                   continueTo(undo);
60767               }
60768           });
60769
60770           function continueTo(nextStep) {
60771               context.map().on('move.intro drawn.intro', null);
60772               context.history().on('change.intro', null);
60773               context.on('exit.intro', null);
60774               nextStep();
60775           }
60776       }
60777
60778
60779       function undo() {
60780           context.history().on('change.intro', function() {
60781               continueTo(play);
60782           });
60783
60784           var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
60785           reveal('#bar button.undo-button',
60786               t('intro.points.undo', { button: icon(iconName, 'pre-text') })
60787           );
60788
60789           function continueTo(nextStep) {
60790               context.history().on('change.intro', null);
60791               nextStep();
60792           }
60793       }
60794
60795
60796       function play() {
60797           dispatch$$1.call('done');
60798           reveal('#id-container',
60799               t('intro.points.play', { next: t('intro.areas.title') }), {
60800                   tooltipBox: '.intro-nav-wrap .chapter-area',
60801                   buttonText: t('intro.ok'),
60802                   buttonCallback: function() { reveal('#id-container'); }
60803               }
60804           );
60805       }
60806
60807
60808       chapter.enter = function() {
60809           addPoint();
60810       };
60811
60812
60813       chapter.exit = function() {
60814           timeouts.forEach(window.clearTimeout);
60815           context.on('enter.intro exit.intro', null);
60816           context.map().on('move.intro drawn.intro', null);
60817           context.history().on('change.intro', null);
60818           select('.inspector-wrap').on('wheel.intro', eventCancel);
60819           select('.preset-search-input').on('keydown.intro keyup.intro', null);
60820       };
60821
60822
60823       chapter.restart = function() {
60824           chapter.exit();
60825           chapter.enter();
60826       };
60827
60828
60829       return utilRebind(chapter, dispatch$$1, 'on');
60830   }
60831
60832   function uiIntroArea(context, reveal) {
60833       var dispatch$$1 = dispatch('done'),
60834           playground = [-85.63552, 41.94159],
60835           playgroundPreset = context.presets().item('leisure/playground'),
60836           descriptionField = context.presets().field('description'),
60837           timeouts = [],
60838           areaId;
60839
60840
60841       var chapter = {
60842           title: 'intro.areas.title'
60843       };
60844
60845
60846       function timeout(f, t$$1) {
60847           timeouts.push(window.setTimeout(f, t$$1));
60848       }
60849
60850
60851       function eventCancel() {
60852           event.stopPropagation();
60853           event.preventDefault();
60854       }
60855
60856
60857       function revealPlayground(center, text, options) {
60858           var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
60859           var box = pad$1(center, padding, context);
60860           reveal(box, text, options);
60861       }
60862
60863
60864       function addArea() {
60865           context.enter(modeBrowse(context));
60866           context.history().reset('initial');
60867           areaId = null;
60868
60869           var msec = transitionTime(playground, context.map().center());
60870           if (msec) { reveal(null, null, { duration: 0 }); }
60871           context.map().zoom(19).centerEase(playground, msec);
60872
60873           timeout(function() {
60874               var tooltip = reveal('button.add-area',
60875                   t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
60876
60877               tooltip.selectAll('.tooltip-inner')
60878                   .insert('svg', 'span')
60879                   .attr('class', 'tooltip-illustration')
60880                   .append('use')
60881                   .attr('xlink:href', '#iD-graphic-areas');
60882
60883               context.on('enter.intro', function(mode) {
60884                   if (mode.id !== 'add-area') return;
60885                   continueTo(startPlayground);
60886               });
60887           }, msec + 100);
60888
60889           function continueTo(nextStep) {
60890               context.on('enter.intro', null);
60891               nextStep();
60892           }
60893       }
60894
60895
60896       function startPlayground() {
60897           if (context.mode().id !== 'add-area') {
60898               return chapter.restart();
60899           }
60900
60901           areaId = null;
60902           context.map().zoomEase(19.5, 500);
60903
60904           timeout(function() {
60905               revealPlayground(playground,
60906                   t('intro.areas.start_playground'), { duration: 250 }
60907               );
60908
60909               timeout(function() {
60910                   context.map().on('move.intro drawn.intro', function() {
60911                       revealPlayground(playground,
60912                           t('intro.areas.start_playground'), { duration: 0 }
60913                       );
60914                   });
60915                   context.on('enter.intro', function(mode) {
60916                       if (mode.id !== 'draw-area') return chapter.restart();
60917                       continueTo(continuePlayground);
60918                   });
60919               }, 250);  // after reveal
60920
60921           }, 550);  // after easing
60922
60923           function continueTo(nextStep) {
60924               context.map().on('move.intro drawn.intro', null);
60925               context.on('enter.intro', null);
60926               nextStep();
60927           }
60928       }
60929
60930
60931       function continuePlayground() {
60932           if (context.mode().id !== 'draw-area') {
60933               return chapter.restart();
60934           }
60935
60936           areaId = null;
60937           revealPlayground(playground,
60938               t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
60939               { duration: 250 }
60940           );
60941
60942           timeout(function() {
60943               context.map().on('move.intro drawn.intro', function() {
60944                   revealPlayground(playground,
60945                       t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
60946                       { duration: 0 }
60947                   );
60948               });
60949           }, 250);  // after reveal
60950
60951           context.on('enter.intro', function(mode) {
60952               if (mode.id === 'draw-area') {
60953                   var entity = context.hasEntity(context.selectedIDs()[0]);
60954                   if (entity && entity.nodes.length >= 6) {
60955                       return continueTo(finishPlayground);
60956                   } else {
60957                       return;
60958                   }
60959               } else if (mode.id === 'select') {
60960                   areaId = context.selectedIDs()[0];
60961                   return continueTo(searchPresets);
60962               } else {
60963                   return chapter.restart();
60964               }
60965           });
60966
60967           function continueTo(nextStep) {
60968               context.map().on('move.intro drawn.intro', null);
60969               context.on('enter.intro', null);
60970               nextStep();
60971           }
60972       }
60973
60974
60975       function finishPlayground() {
60976           if (context.mode().id !== 'draw-area') {
60977               return chapter.restart();
60978           }
60979
60980           areaId = null;
60981           revealPlayground(playground,
60982               t('intro.areas.finish_playground'), { duration: 250 }
60983           );
60984
60985           timeout(function() {
60986               context.map().on('move.intro drawn.intro', function() {
60987                   revealPlayground(playground,
60988                       t('intro.areas.finish_playground'), { duration: 0 }
60989                   );
60990               });
60991           }, 250);  // after reveal
60992
60993           context.on('enter.intro', function(mode) {
60994               if (mode.id === 'draw-area') {
60995                   return;
60996               } else if (mode.id === 'select') {
60997                   areaId = context.selectedIDs()[0];
60998                   return continueTo(searchPresets);
60999               } else {
61000                   return chapter.restart();
61001               }
61002           });
61003
61004           function continueTo(nextStep) {
61005               context.map().on('move.intro drawn.intro', null);
61006               context.on('enter.intro', null);
61007               nextStep();
61008           }
61009       }
61010
61011
61012       function searchPresets() {
61013           if (!areaId || !context.hasEntity(areaId)) {
61014               return addArea();
61015           }
61016           var ids = context.selectedIDs();
61017           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
61018               context.enter(modeSelect(context, [areaId]));
61019           }
61020
61021           // disallow scrolling
61022           select('.inspector-wrap').on('wheel.intro', eventCancel);
61023
61024           timeout(function() {
61025               // reset pane, in case user somehow happened to change it..
61026               select('.inspector-wrap .panewrap').style('right', '-100%');
61027
61028               select('.preset-search-input')
61029                   .on('keydown.intro', null)
61030                   .on('keyup.intro', checkPresetSearch);
61031
61032               reveal('.preset-search-input',
61033                   t('intro.areas.search_playground', { preset: playgroundPreset.name() })
61034               );
61035           }, 400);  // after preset list pane visible..
61036
61037           context.on('enter.intro', function(mode) {
61038               if (!areaId || !context.hasEntity(areaId)) {
61039                   return continueTo(addArea);
61040               }
61041
61042               var ids = context.selectedIDs();
61043               if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
61044                   // keep the user's area selected..
61045                   context.enter(modeSelect(context, [areaId]));
61046
61047                   // reset pane, in case user somehow happened to change it..
61048                   select('.inspector-wrap .panewrap').style('right', '-100%');
61049                   // disallow scrolling
61050                   select('.inspector-wrap').on('wheel.intro', eventCancel);
61051
61052                   select('.preset-search-input')
61053                       .on('keydown.intro', null)
61054                       .on('keyup.intro', checkPresetSearch);
61055
61056                   reveal('.preset-search-input',
61057                       t('intro.areas.search_playground', { preset: playgroundPreset.name() })
61058                   );
61059
61060                   context.history().on('change.intro', null);
61061               }
61062           });
61063
61064           function checkPresetSearch() {
61065               var first = select('.preset-list-item:first-child');
61066
61067               if (first.classed('preset-leisure-playground')) {
61068                   reveal(first.select('.preset-list-button').node(),
61069                       t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
61070                       { duration: 300 }
61071                   );
61072
61073                   select('.preset-search-input')
61074                       .on('keydown.intro', eventCancel, true)
61075                       .on('keyup.intro', null);
61076
61077                   context.history().on('change.intro', function() {
61078                       continueTo(clickAddField);
61079                   });
61080               }
61081           }
61082
61083           function continueTo(nextStep) {
61084               select('.inspector-wrap').on('wheel.intro', null);
61085               context.on('enter.intro', null);
61086               context.history().on('change.intro', null);
61087               select('.preset-search-input').on('keydown.intro keyup.intro', null);
61088               nextStep();
61089           }
61090       }
61091
61092
61093       function clickAddField() {
61094           if (!areaId || !context.hasEntity(areaId)) {
61095               return addArea();
61096           }
61097           var ids = context.selectedIDs();
61098           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
61099               return searchPresets();
61100           }
61101
61102           if (!select('.form-field-description').empty()) {
61103               return continueTo(describePlayground);
61104           }
61105
61106           // disallow scrolling
61107           select('.inspector-wrap').on('wheel.intro', eventCancel);
61108
61109           timeout(function() {
61110               // reset pane, in case user somehow happened to change it..
61111               select('.inspector-wrap .panewrap').style('right', '0%');
61112
61113               // It's possible for the user to add a description in a previous step..
61114               // If they did this already, just continue to next step.
61115               var entity = context.entity(areaId);
61116               if (entity.tags.description) {
61117                   return continueTo(play);
61118               }
61119
61120               // scroll "Add field" into view
61121               var box = select('.more-fields').node().getBoundingClientRect();
61122               if (box.top > 300) {
61123                   var pane = select('.entity-editor-pane .inspector-body');
61124                   var start = pane.node().scrollTop;
61125                   var end = start + (box.top - 300);
61126
61127                   pane
61128                       .transition()
61129                       .duration(250)
61130                       .tween('scroll.inspector', function() {
61131                           var node = this;
61132                           var i = interpolateNumber(start, end);
61133                           return function(t$$1) {
61134                               node.scrollTop = i(t$$1);
61135                           };
61136                       });
61137               }
61138
61139               timeout(function() {
61140                   reveal('.more-fields .combobox-input',
61141                       t('intro.areas.add_field'),
61142                       { duration: 300 }
61143                   );
61144
61145                   select('.more-fields .combobox-input')
61146                       .on('click.intro', function() {
61147                           continueTo(chooseDescriptionField);
61148                       });
61149               }, 300);  // after "Add Field" visible
61150
61151           }, 400);  // after editor pane visible
61152
61153           context.on('exit.intro', function() {
61154               return continueTo(searchPresets);
61155           });
61156
61157           function continueTo(nextStep) {
61158               select('.inspector-wrap').on('wheel.intro', null);
61159               select('.more-fields .combobox-input').on('click.intro', null);
61160               context.on('exit.intro', null);
61161               nextStep();
61162           }
61163       }
61164
61165
61166       function chooseDescriptionField() {
61167           if (!areaId || !context.hasEntity(areaId)) {
61168               return addArea();
61169           }
61170           var ids = context.selectedIDs();
61171           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
61172               return searchPresets();
61173           }
61174
61175           if (!select('.form-field-description').empty()) {
61176               return continueTo(describePlayground);
61177           }
61178
61179           // Make sure combobox is ready..
61180           if (select('div.combobox').empty()) {
61181               return continueTo(clickAddField);
61182           }
61183           // Watch for the combobox to go away..
61184           var watcher;
61185           watcher = window.setInterval(function() {
61186               if (select('div.combobox').empty()) {
61187                   window.clearInterval(watcher);
61188                   timeout(function() {
61189                       if (select('.form-field-description').empty()) {
61190                           continueTo(retryChooseDescription);
61191                       } else {
61192                           continueTo(describePlayground);
61193                       }
61194                   }, 300);  // after description field added.
61195               }
61196           }, 300);
61197
61198           reveal('div.combobox',
61199               t('intro.areas.choose_field', { field: descriptionField.label() }),
61200               { duration: 300 }
61201           );
61202
61203           context.on('exit.intro', function() {
61204               return continueTo(searchPresets);
61205           });
61206
61207           function continueTo(nextStep) {
61208               if (watcher) window.clearInterval(watcher);
61209               context.on('exit.intro', null);
61210               nextStep();
61211           }
61212       }
61213
61214
61215       function describePlayground() {
61216           if (!areaId || !context.hasEntity(areaId)) {
61217               return addArea();
61218           }
61219           var ids = context.selectedIDs();
61220           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
61221               return searchPresets();
61222           }
61223
61224           // reset pane, in case user happened to change it..
61225           select('.inspector-wrap .panewrap').style('right', '0%');
61226
61227           if (select('.form-field-description').empty()) {
61228               return continueTo(retryChooseDescription);
61229           }
61230
61231           context.on('exit.intro', function() {
61232               continueTo(play);
61233           });
61234
61235           reveal('.entity-editor-pane',
61236               t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
61237               { duration: 300 }
61238           );
61239
61240           function continueTo(nextStep) {
61241               context.on('exit.intro', null);
61242               nextStep();
61243           }
61244       }
61245
61246
61247       function retryChooseDescription() {
61248           if (!areaId || !context.hasEntity(areaId)) {
61249               return addArea();
61250           }
61251           var ids = context.selectedIDs();
61252           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
61253               return searchPresets();
61254           }
61255
61256           // reset pane, in case user happened to change it..
61257           select('.inspector-wrap .panewrap').style('right', '0%');
61258
61259           reveal('.entity-editor-pane',
61260               t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
61261               buttonText: t('intro.ok'),
61262               buttonCallback: function() { continueTo(clickAddField); }
61263           });
61264
61265           context.on('exit.intro', function() {
61266               return continueTo(searchPresets);
61267           });
61268
61269           function continueTo(nextStep) {
61270               context.on('exit.intro', null);
61271               nextStep();
61272           }
61273       }
61274
61275
61276       function play() {
61277           dispatch$$1.call('done');
61278           reveal('#id-container',
61279               t('intro.areas.play', { next: t('intro.lines.title') }), {
61280                   tooltipBox: '.intro-nav-wrap .chapter-line',
61281                   buttonText: t('intro.ok'),
61282                   buttonCallback: function() { reveal('#id-container'); }
61283               }
61284           );
61285       }
61286
61287
61288       chapter.enter = function() {
61289           addArea();
61290       };
61291
61292
61293       chapter.exit = function() {
61294           timeouts.forEach(window.clearTimeout);
61295           context.on('enter.intro exit.intro', null);
61296           context.map().on('move.intro drawn.intro', null);
61297           context.history().on('change.intro', null);
61298           select('.inspector-wrap').on('wheel.intro', null);
61299           select('.preset-search-input').on('keydown.intro keyup.intro', null);
61300           select('.more-fields .combobox-input').on('click.intro', null);
61301       };
61302
61303
61304       chapter.restart = function() {
61305           chapter.exit();
61306           chapter.enter();
61307       };
61308
61309
61310       return utilRebind(chapter, dispatch$$1, 'on');
61311   }
61312
61313   function uiIntroLine(context, reveal) {
61314       var dispatch$$1 = dispatch('done'),
61315           timeouts = [],
61316           tulipRoadId = null,
61317           flowerRoadId = 'w646',
61318           tulipRoadStart = [-85.6297754121684, 41.95805253325314],
61319           tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
61320           tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
61321           roadCategory = context.presets().item('category-road'),
61322           residentialPreset = context.presets().item('highway/residential'),
61323           woodRoadId = 'w525',
61324           woodRoadEndId = 'n2862',
61325           woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
61326           woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
61327           woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
61328           washingtonStreetId = 'w522',
61329           twelfthAvenueId = 'w1',
61330           eleventhAvenueEndId = 'n3550',
61331           twelfthAvenueEndId = 'n5',
61332           washingtonSegmentId = null,
61333           eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
61334           twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
61335           deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
61336           twelfthAvenue = [-85.62219310052491, 41.952505413152956];
61337
61338
61339       var chapter = {
61340           title: 'intro.lines.title'
61341       };
61342
61343
61344       function timeout(f, t$$1) {
61345           timeouts.push(window.setTimeout(f, t$$1));
61346       }
61347
61348
61349       function eventCancel() {
61350           event.stopPropagation();
61351           event.preventDefault();
61352       }
61353
61354
61355       function revealEditMenu(loc, text, options) {
61356           var rect = context.surfaceRect();
61357           var point$$1 = context.curtainProjection(loc);
61358           var pad = 40;
61359           var width = 250 + (2 * pad);
61360           var height = 350;
61361           var startX = rect.left + point$$1[0];
61362           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
61363           var box = {
61364               left: left,
61365               top: point$$1[1] + rect.top - 60,
61366               width: width,
61367               height: height
61368           };
61369           reveal(box, text, options);
61370       }
61371
61372
61373       function addLine() {
61374           context.enter(modeBrowse(context));
61375           context.history().reset('initial');
61376
61377           var msec = transitionTime(tulipRoadStart, context.map().center());
61378           if (msec) { reveal(null, null, { duration: 0 }); }
61379           context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
61380
61381           timeout(function() {
61382               var tooltip = reveal('button.add-line',
61383                   t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
61384
61385               tooltip.selectAll('.tooltip-inner')
61386                   .insert('svg', 'span')
61387                   .attr('class', 'tooltip-illustration')
61388                   .append('use')
61389                   .attr('xlink:href', '#iD-graphic-lines');
61390
61391               context.on('enter.intro', function(mode) {
61392                   if (mode.id !== 'add-line') return;
61393                   continueTo(startLine);
61394               });
61395           }, msec + 100);
61396
61397           function continueTo(nextStep) {
61398               context.on('enter.intro', null);
61399               nextStep();
61400           }
61401       }
61402
61403
61404       function startLine() {
61405           if (context.mode().id !== 'add-line') {
61406               return chapter.restart();
61407           }
61408
61409           tulipRoadId = null;
61410
61411           var padding = 70 * Math.pow(2, context.map().zoom() - 18);
61412           var box = pad$1(tulipRoadStart, padding, context);
61413           box.height = box.height + 100;
61414           reveal(box, t('intro.lines.start_line'));
61415
61416           context.map().on('move.intro drawn.intro', function() {
61417               padding = 70 * Math.pow(2, context.map().zoom() - 18);
61418               box = pad$1(tulipRoadStart, padding, context);
61419               box.height = box.height + 100;
61420               reveal(box, t('intro.lines.start_line'), { duration: 0 });
61421           });
61422
61423           context.on('enter.intro', function(mode) {
61424               if (mode.id !== 'draw-line') return chapter.restart();
61425               continueTo(drawLine);
61426           });
61427
61428           function continueTo(nextStep) {
61429               context.map().on('move.intro drawn.intro', null);
61430               context.on('enter.intro', null);
61431               nextStep();
61432           }
61433       }
61434
61435
61436       function drawLine() {
61437           if (context.mode().id !== 'draw-line') {
61438               return chapter.restart();
61439           }
61440
61441           tulipRoadId = context.mode().selectedIDs()[0];
61442           context.map().centerEase(tulipRoadMidpoint, 500);
61443
61444           timeout(function() {
61445               var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
61446               var box = pad$1(tulipRoadMidpoint, padding, context);
61447               box.height = box.height * 2;
61448               reveal(box,
61449                   t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
61450               );
61451
61452               context.map().on('move.intro drawn.intro', function() {
61453                   padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
61454                   box = pad$1(tulipRoadMidpoint, padding, context);
61455                   box.height = box.height * 2;
61456                   reveal(box,
61457                       t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
61458                       { duration: 0 }
61459                   );
61460               });
61461           }, 550);  // after easing..
61462
61463           context.history().on('change.intro', function() {
61464               var entity = tulipRoadId && context.hasEntity(tulipRoadId);
61465               if (!entity) return chapter.restart();
61466
61467               if (isLineConnected()) {
61468                   continueTo(continueLine);
61469               }
61470           });
61471
61472           context.on('enter.intro', function(mode) {
61473               if (mode.id === 'draw-line')
61474                   return;
61475               else if (mode.id === 'select') {
61476                   continueTo(retryIntersect);
61477                   return;
61478               }
61479               else
61480                   return chapter.restart();
61481           });
61482
61483           function continueTo(nextStep) {
61484               context.map().on('move.intro drawn.intro', null);
61485               context.history().on('change.intro', null);
61486               context.on('enter.intro', null);
61487               nextStep();
61488           }
61489       }
61490
61491
61492       function isLineConnected() {
61493           var entity = tulipRoadId && context.hasEntity(tulipRoadId);
61494           if (!entity) return false;
61495
61496           var drawNodes = context.graph().childNodes(entity);
61497           return some(drawNodes, function(node) {
61498               return some(context.graph().parentWays(node), function(parent) {
61499                   return parent.id === flowerRoadId;
61500               });
61501           });
61502       }
61503
61504
61505       function retryIntersect() {
61506           select(window).on('mousedown.intro', eventCancel, true);
61507
61508           var box = pad$1(tulipRoadIntersection, 80, context);
61509           reveal(box,
61510               t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
61511           );
61512
61513           timeout(chapter.restart, 3000);
61514       }
61515
61516
61517       function continueLine() {
61518           if (context.mode().id !== 'draw-line') return chapter.restart();
61519           var entity = tulipRoadId && context.hasEntity(tulipRoadId);
61520           if (!entity) return chapter.restart();
61521
61522           context.map().centerEase(tulipRoadIntersection, 500);
61523
61524           reveal('#surface', t('intro.lines.continue_line'));
61525
61526           context.on('enter.intro', function(mode) {
61527               if (mode.id === 'draw-line')
61528                   return;
61529               else if (mode.id === 'select')
61530                   return continueTo(chooseCategoryRoad);
61531               else
61532                   return chapter.restart();
61533           });
61534
61535           function continueTo(nextStep) {
61536               context.on('enter.intro', null);
61537               nextStep();
61538           }
61539       }
61540
61541
61542       function chooseCategoryRoad() {
61543           if (context.mode().id !== 'select') {
61544               return chapter.restart();
61545           }
61546
61547           context.on('exit.intro', function() {
61548               return chapter.restart();
61549           });
61550
61551           var button = select('.preset-category-road .preset-list-button');
61552           if (button.empty()) return chapter.restart();
61553
61554           // disallow scrolling
61555           select('.inspector-wrap').on('wheel.intro', eventCancel);
61556
61557           timeout(function() {
61558               // reset pane, in case user somehow happened to change it..
61559               select('.inspector-wrap .panewrap').style('right', '-100%');
61560
61561               reveal(button.node(),
61562                   t('intro.lines.choose_category_road', { category: roadCategory.name() })
61563               );
61564
61565               button.on('click.intro', function() {
61566                   continueTo(choosePresetResidential);
61567               });
61568
61569           }, 400);  // after editor pane visible
61570
61571           function continueTo(nextStep) {
61572               select('.inspector-wrap').on('wheel.intro', null);
61573               select('.preset-list-button').on('click.intro', null);
61574               context.on('exit.intro', null);
61575               nextStep();
61576           }
61577       }
61578
61579
61580       function choosePresetResidential() {
61581           if (context.mode().id !== 'select') {
61582               return chapter.restart();
61583           }
61584
61585           context.on('exit.intro', function() {
61586               return chapter.restart();
61587           });
61588
61589           var subgrid = select('.preset-category-road .subgrid');
61590           if (subgrid.empty()) return chapter.restart();
61591
61592           subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
61593               .on('click.intro', function() {
61594                   continueTo(retryPresetResidential);
61595               });
61596
61597           subgrid.selectAll('.preset-highway-residential .preset-list-button')
61598               .on('click.intro', function() {
61599                   continueTo(nameRoad);
61600               });
61601
61602           timeout(function() {
61603               reveal(subgrid.node(),
61604                   t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
61605                   { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
61606               );
61607           }, 300);
61608
61609           function continueTo(nextStep) {
61610               select('.preset-list-button').on('click.intro', null);
61611               context.on('exit.intro', null);
61612               nextStep();
61613           }
61614       }
61615
61616
61617       // selected wrong road type
61618       function retryPresetResidential() {
61619           if (context.mode().id !== 'select') {
61620               return chapter.restart();
61621           }
61622
61623           context.on('exit.intro', function() {
61624               return chapter.restart();
61625           });
61626
61627           // disallow scrolling
61628           select('.inspector-wrap').on('wheel.intro', eventCancel);
61629
61630           timeout(function() {
61631               var button = select('.entity-editor-pane .preset-list-button');
61632
61633               reveal(button.node(),
61634                   t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
61635               );
61636
61637               button.on('click.intro', function() {
61638                   continueTo(chooseCategoryRoad);
61639               });
61640
61641           }, 500);
61642
61643           function continueTo(nextStep) {
61644               select('.inspector-wrap').on('wheel.intro', null);
61645               select('.preset-list-button').on('click.intro', null);
61646               context.on('exit.intro', null);
61647               nextStep();
61648           }
61649       }
61650
61651
61652       function nameRoad() {
61653           context.on('exit.intro', function() {
61654               continueTo(didNameRoad);
61655           });
61656
61657           timeout(function() {
61658               reveal('.entity-editor-pane',
61659                   t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
61660                   { tooltipClass: 'intro-lines-name_road' }
61661               );
61662           }, 500);
61663
61664           function continueTo(nextStep) {
61665               context.on('exit.intro', null);
61666               nextStep();
61667           }
61668       }
61669
61670
61671       function didNameRoad() {
61672           context.history().checkpoint('doneAddLine');
61673
61674           timeout(function() {
61675               reveal('#surface', t('intro.lines.did_name_road'), {
61676                   buttonText: t('intro.ok'),
61677                   buttonCallback: function() { continueTo(updateLine); }
61678               });
61679           }, 500);
61680
61681           function continueTo(nextStep) {
61682               nextStep();
61683           }
61684       }
61685
61686
61687       function updateLine() {
61688           context.history().reset('doneAddLine');
61689           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61690               return chapter.restart();
61691           }
61692
61693           var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
61694           if (msec) { reveal(null, null, { duration: 0 }); }
61695           context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
61696
61697           timeout(function() {
61698               var padding = 250 * Math.pow(2, context.map().zoom() - 19);
61699               var box = pad$1(woodRoadDragMidpoint, padding, context);
61700               var advance = function() { continueTo(addNode); };
61701
61702               reveal(box, t('intro.lines.update_line'),
61703                   { buttonText: t('intro.ok'), buttonCallback: advance }
61704               );
61705
61706               context.map().on('move.intro drawn.intro', function() {
61707                   var padding = 250 * Math.pow(2, context.map().zoom() - 19);
61708                   var box = pad$1(woodRoadDragMidpoint, padding, context);
61709                   reveal(box, t('intro.lines.update_line'),
61710                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
61711                   );
61712               });
61713           }, msec + 100);
61714
61715           function continueTo(nextStep) {
61716               context.map().on('move.intro drawn.intro', null);
61717               nextStep();
61718           }
61719       }
61720
61721
61722       function addNode() {
61723           context.history().reset('doneAddLine');
61724           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61725               return chapter.restart();
61726           }
61727
61728           var padding = 40 * Math.pow(2, context.map().zoom() - 19);
61729           var box = pad$1(woodRoadAddNode, padding, context);
61730           reveal(box, t('intro.lines.add_node'));
61731
61732           context.map().on('move.intro drawn.intro', function() {
61733               var padding = 40 * Math.pow(2, context.map().zoom() - 19);
61734               var box = pad$1(woodRoadAddNode, padding, context);
61735               reveal(box, t('intro.lines.add_node'), { duration: 0 });
61736           });
61737
61738           context.history().on('change.intro', function(changed) {
61739               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61740                   return continueTo(updateLine);
61741               }
61742               if (changed.created().length === 1) {
61743                   timeout(function() { continueTo(startDragEndpoint); }, 500);
61744               }
61745           });
61746
61747           context.on('enter.intro', function(mode) {
61748               if (mode.id !== 'select') {
61749                   continueTo(updateLine);
61750               }
61751           });
61752
61753           function continueTo(nextStep) {
61754               context.map().on('move.intro drawn.intro', null);
61755               context.history().on('change.intro', null);
61756               context.on('enter.intro', null);
61757               nextStep();
61758           }
61759       }
61760
61761
61762       function startDragEndpoint() {
61763           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61764               return continueTo(updateLine);
61765           }
61766           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61767           var box = pad$1(woodRoadDragEndpoint, padding, context);
61768           reveal(box, t('intro.lines.start_drag_endpoint'));
61769
61770           context.map().on('move.intro drawn.intro', function() {
61771               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61772                   return continueTo(updateLine);
61773               }
61774               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61775               var box = pad$1(woodRoadDragEndpoint, padding, context);
61776               reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
61777
61778               var entity = context.entity(woodRoadEndId);
61779               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
61780                   continueTo(finishDragEndpoint);
61781               }
61782           });
61783
61784           function continueTo(nextStep) {
61785               context.map().on('move.intro drawn.intro', null);
61786               nextStep();
61787           }
61788       }
61789
61790
61791       function finishDragEndpoint() {
61792           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61793               return continueTo(updateLine);
61794           }
61795
61796           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61797           var box = pad$1(woodRoadDragEndpoint, padding, context);
61798           reveal(box, t('intro.lines.finish_drag_endpoint'));
61799
61800           context.map().on('move.intro drawn.intro', function() {
61801               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61802                   return continueTo(updateLine);
61803               }
61804               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61805               var box = pad$1(woodRoadDragEndpoint, padding, context);
61806               reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
61807
61808               var entity = context.entity(woodRoadEndId);
61809               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
61810                   continueTo(startDragEndpoint);
61811               }
61812           });
61813
61814           context.on('enter.intro', function() {
61815               continueTo(startDragMidpoint);
61816           });
61817
61818           function continueTo(nextStep) {
61819               context.map().on('move.intro drawn.intro', null);
61820               context.on('enter.intro', null);
61821               nextStep();
61822           }
61823       }
61824
61825
61826       function startDragMidpoint() {
61827           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61828               return continueTo(updateLine);
61829           }
61830           if (context.selectedIDs().indexOf(woodRoadId) === -1) {
61831               context.enter(modeSelect(context, [woodRoadId]));
61832           }
61833
61834           var padding = 80 * Math.pow(2, context.map().zoom() - 19);
61835           var box = pad$1(woodRoadDragMidpoint, padding, context);
61836           reveal(box, t('intro.lines.start_drag_midpoint'));
61837
61838           context.map().on('move.intro drawn.intro', function() {
61839               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61840                   return continueTo(updateLine);
61841               }
61842               var padding = 80 * Math.pow(2, context.map().zoom() - 19);
61843               var box = pad$1(woodRoadDragMidpoint, padding, context);
61844               reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
61845           });
61846
61847           context.history().on('change.intro', function(changed) {
61848               if (changed.created().length === 1) {
61849                   continueTo(continueDragMidpoint);
61850               }
61851           });
61852
61853           context.on('enter.intro', function(mode) {
61854               if (mode.id !== 'select') {
61855                   // keep Wood Road selected so midpoint triangles are drawn..
61856                   context.enter(modeSelect(context, [woodRoadId]));
61857               }
61858           });
61859
61860           function continueTo(nextStep) {
61861               context.map().on('move.intro drawn.intro', null);
61862               context.history().on('change.intro', null);
61863               context.on('enter.intro', null);
61864               nextStep();
61865           }
61866       }
61867
61868
61869       function continueDragMidpoint() {
61870           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61871               return continueTo(updateLine);
61872           }
61873
61874           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61875           var box = pad$1(woodRoadDragEndpoint, padding, context);
61876           box.height += 400;
61877
61878           var advance = function() {
61879               context.history().checkpoint('doneUpdateLine');
61880               continueTo(deleteLines);
61881           };
61882
61883           reveal(box, t('intro.lines.continue_drag_midpoint'),
61884               { buttonText: t('intro.ok'), buttonCallback: advance }
61885           );
61886
61887           context.map().on('move.intro drawn.intro', function() {
61888               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61889                   return continueTo(updateLine);
61890               }
61891               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61892               var box = pad$1(woodRoadDragEndpoint, padding, context);
61893               box.height += 400;
61894               reveal(box, t('intro.lines.continue_drag_midpoint'),
61895                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
61896               );
61897           });
61898
61899           function continueTo(nextStep) {
61900               context.map().on('move.intro drawn.intro', null);
61901               nextStep();
61902           }
61903       }
61904
61905
61906       function deleteLines() {
61907           context.history().reset('doneUpdateLine');
61908           context.enter(modeBrowse(context));
61909
61910           if (!context.hasEntity(washingtonStreetId) ||
61911               !context.hasEntity(twelfthAvenueId) ||
61912               !context.hasEntity(eleventhAvenueEndId)) {
61913               return chapter.restart();
61914           }
61915
61916           var msec = transitionTime(deleteLinesLoc, context.map().center());
61917           if (msec) { reveal(null, null, { duration: 0 }); }
61918           context.map().zoom(18).centerEase(deleteLinesLoc, msec);
61919
61920           timeout(function() {
61921               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
61922               var box = pad$1(deleteLinesLoc, padding, context);
61923               box.top -= 200;
61924               box.height += 400;
61925               var advance = function() { continueTo(rightClickIntersection); };
61926
61927               reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
61928                   { buttonText: t('intro.ok'), buttonCallback: advance }
61929               );
61930
61931               context.map().on('move.intro drawn.intro', function() {
61932                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
61933                   var box = pad$1(deleteLinesLoc, padding, context);
61934                   box.top -= 200;
61935                   box.height += 400;
61936                   reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
61937                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
61938                   );
61939               });
61940
61941               context.history().on('change.intro', function() {
61942                   timeout(function() {
61943                       continueTo(deleteLines);
61944                   }, 500);  // after any transition (e.g. if user deleted intersection)
61945               });
61946
61947           }, msec + 100);
61948
61949           function continueTo(nextStep) {
61950               context.map().on('move.intro drawn.intro', null);
61951               context.history().on('change.intro', null);
61952               nextStep();
61953           }
61954       }
61955
61956
61957       function rightClickIntersection() {
61958           context.history().reset('doneUpdateLine');
61959           context.enter(modeBrowse(context));
61960
61961           context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
61962
61963           timeout(function() {
61964               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
61965               var box = pad$1(eleventhAvenueEnd, padding, context);
61966               reveal(box, t('intro.lines.rightclick_intersection',
61967                   { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
61968               );
61969
61970               context.map().on('move.intro drawn.intro', function() {
61971                   var padding = 60 * Math.pow(2, context.map().zoom() - 18);
61972                   var box = pad$1(eleventhAvenueEnd, padding, context);
61973                   reveal(box, t('intro.lines.rightclick_intersection',
61974                       { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
61975                       { duration: 0 }
61976                   );
61977               });
61978
61979               context.on('enter.intro', function(mode) {
61980                   if (mode.id !== 'select') return;
61981                   var ids = context.selectedIDs();
61982                   if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
61983
61984                   timeout(function() {
61985                       var node = selectMenuItem('split').node();
61986                       if (!node) return;
61987                       continueTo(splitIntersection);
61988                   }, 300);  // after menu visible
61989               });
61990
61991               context.history().on('change.intro', function() {
61992                   timeout(function() {
61993                       continueTo(deleteLines);
61994                   }, 300);  // after any transition (e.g. if user deleted intersection)
61995               });
61996
61997           }, 600);
61998
61999           function continueTo(nextStep) {
62000               context.map().on('move.intro drawn.intro', null);
62001               context.on('enter.intro', null);
62002               context.history().on('change.intro', null);
62003               nextStep();
62004           }
62005       }
62006
62007
62008       function splitIntersection() {
62009           if (!context.hasEntity(washingtonStreetId) ||
62010               !context.hasEntity(twelfthAvenueId) ||
62011               !context.hasEntity(eleventhAvenueEndId)) {
62012               return continueTo(deleteLines);
62013           }
62014
62015           var node = selectMenuItem('split').node();
62016           if (!node) { return continueTo(rightClickIntersection); }
62017
62018           var wasChanged = false;
62019           var menuCoords = context.map().mouseCoordinates();
62020           washingtonSegmentId = null;
62021
62022           revealEditMenu(menuCoords, t('intro.lines.split_intersection',
62023               { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
62024           );
62025
62026           context.map().on('move.intro drawn.intro', function() {
62027               var node = selectMenuItem('split').node();
62028               if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
62029
62030               revealEditMenu(menuCoords, t('intro.lines.split_intersection',
62031                   { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
62032                   { duration: 0 }
62033               );
62034           });
62035
62036           context.history().on('change.intro', function(changed) {
62037               wasChanged = true;
62038               timeout(function() {
62039                   if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
62040                       washingtonSegmentId = changed.created()[0].id;
62041                       continueTo(didSplit);
62042                   } else {
62043                       washingtonSegmentId = null;
62044                       continueTo(retrySplit);
62045                   }
62046               }, 300);  // after any transition (e.g. if user deleted intersection)
62047           });
62048
62049           function continueTo(nextStep) {
62050               context.map().on('move.intro drawn.intro', null);
62051               context.history().on('change.intro', null);
62052               nextStep();
62053           }
62054       }
62055
62056
62057       function retrySplit() {
62058           context.enter(modeBrowse(context));
62059           context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
62060           var advance = function() { continueTo(rightClickIntersection); };
62061
62062           var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62063           var box = pad$1(eleventhAvenueEnd, padding, context);
62064           reveal(box, t('intro.lines.retry_split'),
62065               { buttonText: t('intro.ok'), buttonCallback: advance }
62066           );
62067
62068           context.map().on('move.intro drawn.intro', function() {
62069               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62070               var box = pad$1(eleventhAvenueEnd, padding, context);
62071               reveal(box, t('intro.lines.retry_split'),
62072                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
62073               );
62074           });
62075
62076           function continueTo(nextStep) {
62077               context.map().on('move.intro drawn.intro', null);
62078               nextStep();
62079           }
62080       }
62081
62082
62083       function didSplit() {
62084           if (!washingtonSegmentId ||
62085               !context.hasEntity(washingtonSegmentId) ||
62086               !context.hasEntity(washingtonStreetId) ||
62087               !context.hasEntity(twelfthAvenueId) ||
62088               !context.hasEntity(eleventhAvenueEndId)) {
62089               return continueTo(rightClickIntersection);
62090           }
62091
62092           var ids = context.selectedIDs();
62093           var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
62094           var street = t('intro.graph.name.washington-street');
62095
62096           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62097           var box = pad$1(twelfthAvenue, padding, context);
62098           box.width = box.width / 2;
62099           reveal(box, t(string, { street1: street, street2: street }),
62100               { duration: 500 }
62101           );
62102
62103           timeout(function() {
62104               context.map().zoom(18).centerEase(twelfthAvenue, 500);
62105
62106               context.map().on('move.intro drawn.intro', function() {
62107                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62108                   var box = pad$1(twelfthAvenue, padding, context);
62109                   box.width = box.width / 2;
62110                   reveal(box, t(string, { street1: street, street2: street }),
62111                       { duration: 0 }
62112                   );
62113               });
62114           }, 600);  // after initial reveal and curtain cut
62115
62116           context.on('enter.intro', function() {
62117               var ids = context.selectedIDs();
62118               if (ids.length === 1 && ids[0] === washingtonSegmentId) {
62119                   continueTo(multiSelect);
62120               }
62121           });
62122
62123           context.history().on('change.intro', function() {
62124               if (!washingtonSegmentId ||
62125                   !context.hasEntity(washingtonSegmentId) ||
62126                   !context.hasEntity(washingtonStreetId) ||
62127                   !context.hasEntity(twelfthAvenueId) ||
62128                   !context.hasEntity(eleventhAvenueEndId)) {
62129                   return continueTo(rightClickIntersection);
62130               }
62131           });
62132
62133           function continueTo(nextStep) {
62134               context.map().on('move.intro drawn.intro', null);
62135               context.on('enter.intro', null);
62136               context.history().on('change.intro', null);
62137               nextStep();
62138           }
62139       }
62140
62141
62142       function multiSelect() {
62143           if (!washingtonSegmentId ||
62144               !context.hasEntity(washingtonSegmentId) ||
62145               !context.hasEntity(washingtonStreetId) ||
62146               !context.hasEntity(twelfthAvenueId) ||
62147               !context.hasEntity(eleventhAvenueEndId)) {
62148               return continueTo(rightClickIntersection);
62149           }
62150
62151           var ids = context.selectedIDs();
62152           var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
62153           var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
62154
62155           if (hasWashington && hasTwelfth) {
62156               return continueTo(multiRightClick);
62157           } else if (!hasWashington && !hasTwelfth) {
62158               return continueTo(didSplit);
62159           }
62160
62161           context.map().zoom(18).centerEase(twelfthAvenue, 500);
62162
62163           timeout(function() {
62164               var selected, other, padding, box;
62165               if (hasWashington) {
62166                   selected = t('intro.graph.name.washington-street');
62167                   other = t('intro.graph.name.12th-avenue');
62168                   padding = 60 * Math.pow(2, context.map().zoom() - 18);
62169                   box = pad$1(twelfthAvenueEnd, padding, context);
62170                   box.width *= 3;
62171               } else {
62172                   selected = t('intro.graph.name.12th-avenue');
62173                   other = t('intro.graph.name.washington-street');
62174                   padding = 200 * Math.pow(2, context.map().zoom() - 18);
62175                   box = pad$1(twelfthAvenue, padding, context);
62176                   box.width /= 2;
62177               }
62178
62179               reveal(box,
62180                   t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
62181               );
62182
62183               context.map().on('move.intro drawn.intro', function() {
62184                   if (hasWashington) {
62185                       selected = t('intro.graph.name.washington-street');
62186                       other = t('intro.graph.name.12th-avenue');
62187                       padding = 60 * Math.pow(2, context.map().zoom() - 18);
62188                       box = pad$1(twelfthAvenueEnd, padding, context);
62189                       box.width *= 3;
62190                   } else {
62191                       selected = t('intro.graph.name.12th-avenue');
62192                       other = t('intro.graph.name.washington-street');
62193                       padding = 200 * Math.pow(2, context.map().zoom() - 18);
62194                       box = pad$1(twelfthAvenue, padding, context);
62195                       box.width /= 2;
62196                   }
62197
62198                   reveal(box,
62199                       t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
62200                       { duration: 0 }
62201                   );
62202               });
62203
62204               context.on('enter.intro', function() {
62205                   continueTo(multiSelect);
62206               });
62207
62208               context.history().on('change.intro', function() {
62209                   if (!washingtonSegmentId ||
62210                       !context.hasEntity(washingtonSegmentId) ||
62211                       !context.hasEntity(washingtonStreetId) ||
62212                       !context.hasEntity(twelfthAvenueId) ||
62213                       !context.hasEntity(eleventhAvenueEndId)) {
62214                       return continueTo(rightClickIntersection);
62215                   }
62216               });
62217           }, 600);
62218
62219           function continueTo(nextStep) {
62220               context.map().on('move.intro drawn.intro', null);
62221               context.on('enter.intro', null);
62222               context.history().on('change.intro', null);
62223               nextStep();
62224           }
62225       }
62226
62227
62228       function multiRightClick() {
62229           if (!washingtonSegmentId ||
62230               !context.hasEntity(washingtonSegmentId) ||
62231               !context.hasEntity(washingtonStreetId) ||
62232               !context.hasEntity(twelfthAvenueId) ||
62233               !context.hasEntity(eleventhAvenueEndId)) {
62234               return continueTo(rightClickIntersection);
62235           }
62236
62237           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62238           var box = pad$1(twelfthAvenue, padding, context);
62239           reveal(box, t('intro.lines.multi_rightclick'));
62240
62241           context.map().on('move.intro drawn.intro', function() {
62242               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62243               var box = pad$1(twelfthAvenue, padding, context);
62244               reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
62245           });
62246
62247           select(window).on('click.intro contextmenu.intro', function() {
62248               timeout(function() {
62249                   var ids = context.selectedIDs();
62250                   if (ids.length === 2 &&
62251                       ids.indexOf(twelfthAvenueId) !== -1 &&
62252                       ids.indexOf(washingtonSegmentId) !== -1) {
62253                           var node = selectMenuItem('delete').node();
62254                           if (!node) return;
62255                           continueTo(multiDelete);
62256                   } else if (ids.length === 1 &&
62257                       ids.indexOf(washingtonSegmentId) !== -1) {
62258                       return continueTo(multiSelect);
62259                   } else {
62260                       return continueTo(didSplit);
62261                   }
62262               }, 300);  // after edit menu visible
62263           }, true);
62264
62265           context.history().on('change.intro', function() {
62266               if (!washingtonSegmentId ||
62267                   !context.hasEntity(washingtonSegmentId) ||
62268                   !context.hasEntity(washingtonStreetId) ||
62269                   !context.hasEntity(twelfthAvenueId) ||
62270                   !context.hasEntity(eleventhAvenueEndId)) {
62271                   return continueTo(rightClickIntersection);
62272               }
62273           });
62274
62275           function continueTo(nextStep) {
62276               context.map().on('move.intro drawn.intro', null);
62277               select(window).on('click.intro contextmenu.intro', null, true);
62278               context.history().on('change.intro', null);
62279               nextStep();
62280           }
62281       }
62282
62283
62284       function multiDelete() {
62285           if (!washingtonSegmentId ||
62286               !context.hasEntity(washingtonSegmentId) ||
62287               !context.hasEntity(washingtonStreetId) ||
62288               !context.hasEntity(twelfthAvenueId) ||
62289               !context.hasEntity(eleventhAvenueEndId)) {
62290               return continueTo(rightClickIntersection);
62291           }
62292
62293           var node = selectMenuItem('delete').node();
62294           if (!node) return continueTo(multiRightClick);
62295
62296           var menuCoords = context.map().mouseCoordinates();
62297           revealEditMenu(menuCoords,
62298               t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
62299           );
62300
62301           context.map().on('move.intro drawn.intro', function() {
62302               revealEditMenu(menuCoords,
62303                   t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
62304                   { duration: 0 }
62305               );
62306           });
62307
62308           context.on('exit.intro', function() {
62309               if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
62310                   return continueTo(multiSelect);  // left select mode but roads still exist
62311               }
62312           });
62313
62314           context.history().on('change.intro', function() {
62315               if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
62316                   continueTo(retryDelete);         // changed something but roads still exist
62317               } else {
62318                   continueTo(play);
62319               }
62320           });
62321
62322           function continueTo(nextStep) {
62323               context.map().on('move.intro drawn.intro', null);
62324               context.on('exit.intro', null);
62325               context.history().on('change.intro', null);
62326               nextStep();
62327           }
62328       }
62329
62330
62331       function retryDelete() {
62332           context.enter(modeBrowse(context));
62333
62334           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62335           var box = pad$1(twelfthAvenue, padding, context);
62336           reveal(box, t('intro.lines.retry_delete'), {
62337               buttonText: t('intro.ok'),
62338               buttonCallback: function() { continueTo(multiSelect); }
62339           });
62340
62341           function continueTo(nextStep) {
62342               nextStep();
62343           }
62344       }
62345
62346
62347       function play() {
62348           dispatch$$1.call('done');
62349           reveal('#id-container',
62350               t('intro.lines.play', { next: t('intro.buildings.title') }), {
62351                   tooltipBox: '.intro-nav-wrap .chapter-building',
62352                   buttonText: t('intro.ok'),
62353                   buttonCallback: function() { reveal('#id-container'); }
62354               }
62355           );
62356      }
62357
62358
62359       chapter.enter = function() {
62360           addLine();
62361       };
62362
62363
62364       chapter.exit = function() {
62365           timeouts.forEach(window.clearTimeout);
62366           select(window).on('mousedown.intro', null, true);
62367           context.on('enter.intro exit.intro', null);
62368           context.map().on('move.intro drawn.intro', null);
62369           context.history().on('change.intro', null);
62370           select('.inspector-wrap').on('wheel.intro', null);
62371           select('.preset-list-button').on('click.intro', null);
62372       };
62373
62374
62375       chapter.restart = function() {
62376           chapter.exit();
62377           chapter.enter();
62378       };
62379
62380
62381       return utilRebind(chapter, dispatch$$1, 'on');
62382   }
62383
62384   function uiIntroBuilding(context, reveal) {
62385       var dispatch$$1 = dispatch('done'),
62386           house = [-85.62815, 41.95638],
62387           tank = [-85.62732, 41.95347],
62388           buildingCatetory = context.presets().item('category-building'),
62389           housePreset = context.presets().item('building/house'),
62390           tankPreset = context.presets().item('man_made/storage_tank'),
62391           timeouts = [],
62392           houseId = null,
62393           tankId = null;
62394
62395
62396       var chapter = {
62397           title: 'intro.buildings.title'
62398       };
62399
62400
62401       function timeout(f, t$$1) {
62402           timeouts.push(window.setTimeout(f, t$$1));
62403       }
62404
62405
62406       function eventCancel() {
62407           event.stopPropagation();
62408           event.preventDefault();
62409       }
62410
62411
62412       function revealHouse(center, text, options) {
62413           var padding = 160 * Math.pow(2, context.map().zoom() - 20);
62414           var box = pad$1(center, padding, context);
62415           reveal(box, text, options);
62416       }
62417
62418
62419       function revealTank(center, text, options) {
62420           var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
62421           var box = pad$1(center, padding, context);
62422           reveal(box, text, options);
62423       }
62424
62425
62426       function revealEditMenu(loc, text, options) {
62427           var rect = context.surfaceRect();
62428           var point$$1 = context.curtainProjection(loc);
62429           var pad = 40;
62430           var width = 250 + (2 * pad);
62431           var height = 350;
62432           var startX = rect.left + point$$1[0];
62433           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
62434           var box = {
62435               left: left,
62436               top: point$$1[1] + rect.top - 60,
62437               width: width,
62438               height: height
62439           };
62440           reveal(box, text, options);
62441       }
62442
62443
62444       function addHouse() {
62445           context.enter(modeBrowse(context));
62446           context.history().reset('initial');
62447           houseId = null;
62448
62449           var msec = transitionTime(house, context.map().center());
62450           if (msec) { reveal(null, null, { duration: 0 }); }
62451           context.map().zoom(19).centerEase(house, msec);
62452
62453           timeout(function() {
62454               var tooltip = reveal('button.add-area',
62455                   t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
62456
62457               tooltip.selectAll('.tooltip-inner')
62458                   .insert('svg', 'span')
62459                   .attr('class', 'tooltip-illustration')
62460                   .append('use')
62461                   .attr('xlink:href', '#iD-graphic-buildings');
62462
62463               context.on('enter.intro', function(mode) {
62464                   if (mode.id !== 'add-area') return;
62465                   continueTo(startHouse);
62466               });
62467           }, msec + 100);
62468
62469           function continueTo(nextStep) {
62470               context.on('enter.intro', null);
62471               nextStep();
62472           }
62473       }
62474
62475
62476       function startHouse() {
62477           if (context.mode().id !== 'add-area') {
62478               return continueTo(addHouse);
62479           }
62480
62481           houseId = null;
62482           context.map().zoomEase(20, 500);
62483
62484           timeout(function() {
62485               revealHouse(house, t('intro.buildings.start_building'));
62486
62487               context.map().on('move.intro drawn.intro', function() {
62488                   revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
62489               });
62490
62491               context.on('enter.intro', function(mode) {
62492                   if (mode.id !== 'draw-area') return chapter.restart();
62493                   continueTo(continueHouse);
62494               });
62495
62496           }, 550);  // after easing
62497
62498           function continueTo(nextStep) {
62499               context.map().on('move.intro drawn.intro', null);
62500               context.on('enter.intro', null);
62501               nextStep();
62502           }
62503       }
62504
62505
62506       function continueHouse() {
62507           if (context.mode().id !== 'draw-area') {
62508               return continueTo(addHouse);
62509           }
62510
62511           houseId = null;
62512
62513           revealHouse(house, t('intro.buildings.continue_building'));
62514
62515           context.map().on('move.intro drawn.intro', function() {
62516               revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
62517           });
62518
62519           context.on('enter.intro', function(mode) {
62520               if (mode.id === 'draw-area') {
62521                   return;
62522               } else if (mode.id === 'select') {
62523                   var graph = context.graph(),
62524                       way = context.entity(context.selectedIDs()[0]),
62525                       nodes = graph.childNodes(way),
62526                       points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
62527
62528                   if (isMostlySquare(points)) {
62529                       houseId = way.id;
62530                       return continueTo(chooseCategoryBuilding);
62531                   } else {
62532                       return continueTo(retryHouse);
62533                   }
62534
62535               } else {
62536                   return chapter.restart();
62537               }
62538           });
62539
62540           function continueTo(nextStep) {
62541               context.map().on('move.intro drawn.intro', null);
62542               context.on('enter.intro', null);
62543               nextStep();
62544           }
62545       }
62546
62547
62548       function retryHouse() {
62549           var onClick = function() { continueTo(addHouse); };
62550
62551           revealHouse(house, t('intro.buildings.retry_building'),
62552               { buttonText: t('intro.ok'), buttonCallback: onClick }
62553           );
62554
62555           context.map().on('move.intro drawn.intro', function() {
62556               revealHouse(house, t('intro.buildings.retry_building'),
62557                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
62558               );
62559           });
62560
62561           function continueTo(nextStep) {
62562               context.map().on('move.intro drawn.intro', null);
62563               nextStep();
62564           }
62565       }
62566
62567
62568       function chooseCategoryBuilding() {
62569           if (!houseId || !context.hasEntity(houseId)) {
62570               return addHouse();
62571           }
62572           var ids = context.selectedIDs();
62573           if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
62574               context.enter(modeSelect(context, [houseId]));
62575           }
62576
62577           // disallow scrolling
62578           select('.inspector-wrap').on('wheel.intro', eventCancel);
62579
62580           timeout(function() {
62581               // reset pane, in case user somehow happened to change it..
62582               select('.inspector-wrap .panewrap').style('right', '-100%');
62583
62584               var button = select('.preset-category-building .preset-list-button');
62585
62586               reveal(button.node(),
62587                   t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
62588               );
62589
62590               button.on('click.intro', function() {
62591                   button.on('click.intro', null);
62592                   continueTo(choosePresetHouse);
62593               });
62594
62595           }, 400);  // after preset list pane visible..
62596
62597
62598           context.on('enter.intro', function(mode) {
62599               if (!houseId || !context.hasEntity(houseId)) {
62600                   return continueTo(addHouse);
62601               }
62602               var ids = context.selectedIDs();
62603               if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
62604                   return continueTo(chooseCategoryBuilding);
62605               }
62606           });
62607
62608           function continueTo(nextStep) {
62609               select('.inspector-wrap').on('wheel.intro', null);
62610               select('.preset-list-button').on('click.intro', null);
62611               context.on('enter.intro', null);
62612               nextStep();
62613           }
62614       }
62615
62616
62617       function choosePresetHouse() {
62618           if (!houseId || !context.hasEntity(houseId)) {
62619               return addHouse();
62620           }
62621           var ids = context.selectedIDs();
62622           if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
62623               context.enter(modeSelect(context, [houseId]));
62624           }
62625
62626           // disallow scrolling
62627           select('.inspector-wrap').on('wheel.intro', eventCancel);
62628
62629           timeout(function() {
62630               // reset pane, in case user somehow happened to change it..
62631               select('.inspector-wrap .panewrap').style('right', '-100%');
62632
62633               var button = select('.preset-building-house .preset-list-button');
62634
62635               reveal(button.node(),
62636                   t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
62637                   { duration: 300 }
62638               );
62639
62640               button.on('click.intro', function() {
62641                   button.on('click.intro', null);
62642                   continueTo(closeEditorHouse);
62643               });
62644
62645
62646           }, 400);  // after preset list pane visible..
62647
62648           context.on('enter.intro', function(mode) {
62649               if (!houseId || !context.hasEntity(houseId)) {
62650                   return continueTo(addHouse);
62651               }
62652               var ids = context.selectedIDs();
62653               if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
62654                   return continueTo(chooseCategoryBuilding);
62655               }
62656           });
62657
62658           function continueTo(nextStep) {
62659               select('.inspector-wrap').on('wheel.intro', null);
62660               select('.preset-list-button').on('click.intro', null);
62661               context.on('enter.intro', null);
62662               nextStep();
62663           }
62664       }
62665
62666
62667       function closeEditorHouse() {
62668           if (!houseId || !context.hasEntity(houseId)) {
62669               return addHouse();
62670           }
62671           var ids = context.selectedIDs();
62672           if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
62673               context.enter(modeSelect(context, [houseId]));
62674           }
62675
62676           context.history().checkpoint('hasHouse');
62677
62678           context.on('exit.intro', function() {
62679               continueTo(rightClickHouse);
62680           });
62681
62682           timeout(function() {
62683               reveal('.entity-editor-pane',
62684                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
62685               );
62686           }, 500);
62687
62688           function continueTo(nextStep) {
62689               context.on('exit.intro', null);
62690               nextStep();
62691           }
62692       }
62693
62694
62695       function rightClickHouse() {
62696           if (!houseId) return chapter.restart();
62697
62698           context.enter(modeBrowse(context));
62699           context.history().reset('hasHouse');
62700           context.map().centerEase(house, 500);
62701
62702           timeout(function() {
62703               if (context.map().zoom() < 20) {
62704                   context.map().zoomEase(20, 500);
62705               }
62706           }, 520);
62707
62708           context.on('enter.intro', function(mode) {
62709               if (mode.id !== 'select') return;
62710               var ids = context.selectedIDs();
62711               if (ids.length !== 1 || ids[0] !== houseId) return;
62712
62713               timeout(function() {
62714                   var node = selectMenuItem('orthogonalize').node();
62715                   if (!node) return;
62716                   continueTo(clickSquare);
62717               }, 300);  // after menu visible
62718           });
62719
62720           context.map().on('move.intro drawn.intro', function() {
62721               revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
62722           });
62723
62724           context.history().on('change.intro', function() {
62725               continueTo(rightClickHouse);
62726           });
62727
62728           function continueTo(nextStep) {
62729               context.on('enter.intro', null);
62730               context.map().on('move.intro drawn.intro', null);
62731               context.history().on('change.intro', null);
62732               nextStep();
62733           }
62734       }
62735
62736
62737       function clickSquare() {
62738           if (!houseId) return chapter.restart();
62739           var entity = context.hasEntity(houseId);
62740           if (!entity) return continueTo(rightClickHouse);
62741
62742           var node = selectMenuItem('orthogonalize').node();
62743           if (!node) { return continueTo(rightClickHouse); }
62744
62745           var wasChanged = false;
62746           var menuCoords = context.map().mouseCoordinates();
62747
62748           revealEditMenu(menuCoords,
62749               t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
62750           );
62751
62752           context.on('enter.intro', function(mode) {
62753               if (mode.id === 'browse') {
62754                   continueTo(rightClickHouse);
62755               } else if (mode.id === 'move' || mode.id === 'rotate') {
62756                   continueTo(retryClickSquare);
62757               }
62758           });
62759
62760           context.map().on('move.intro drawn.intro', function() {
62761               var node = selectMenuItem('orthogonalize').node();
62762               if (!wasChanged && !node) { return continueTo(rightClickHouse); }
62763
62764               revealEditMenu(menuCoords,
62765                   t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
62766                   { duration: 0 }
62767               );
62768           });
62769
62770           context.history().on('change.intro', function() {
62771               wasChanged = true;
62772               context.history().on('change.intro', null);
62773
62774               // Something changed.  Wait for transition to complete and check undo annotation.
62775               timeout(function() {
62776                   if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
62777                       continueTo(doneSquare);
62778                   } else {
62779                       continueTo(retryClickSquare);
62780                   }
62781               }, 500);  // after transitioned actions
62782           });
62783
62784           function continueTo(nextStep) {
62785               context.on('enter.intro', null);
62786               context.map().on('move.intro drawn.intro', null);
62787               context.history().on('change.intro', null);
62788               nextStep();
62789           }
62790       }
62791
62792
62793       function retryClickSquare() {
62794           context.enter(modeBrowse(context));
62795
62796           revealHouse(house, t('intro.buildings.retry_square'), {
62797               buttonText: t('intro.ok'),
62798               buttonCallback: function() { continueTo(rightClickHouse); }
62799           });
62800
62801           function continueTo(nextStep) {
62802               nextStep();
62803           }
62804       }
62805
62806
62807       function doneSquare() {
62808           context.history().checkpoint('doneSquare');
62809
62810           revealHouse(house, t('intro.buildings.done_square'), {
62811               buttonText: t('intro.ok'),
62812               buttonCallback: function() { continueTo(addTank); }
62813           });
62814
62815           function continueTo(nextStep) {
62816               nextStep();
62817           }
62818       }
62819
62820
62821       function addTank() {
62822           context.enter(modeBrowse(context));
62823           context.history().reset('doneSquare');
62824           tankId = null;
62825
62826           var msec = transitionTime(tank, context.map().center());
62827           if (msec) { reveal(null, null, { duration: 0 }); }
62828           context.map().zoom(19.5).centerEase(tank, msec);
62829
62830           timeout(function() {
62831               reveal('button.add-area',
62832                   t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
62833               );
62834
62835               context.on('enter.intro', function(mode) {
62836                   if (mode.id !== 'add-area') return;
62837                   continueTo(startTank);
62838               });
62839           }, msec + 100);
62840
62841           function continueTo(nextStep) {
62842               context.on('enter.intro', null);
62843               nextStep();
62844           }
62845       }
62846
62847
62848       function startTank() {
62849           if (context.mode().id !== 'add-area') {
62850               return continueTo(addTank);
62851           }
62852
62853           tankId = null;
62854
62855           timeout(function() {
62856               revealTank(tank, t('intro.buildings.start_tank'));
62857
62858               context.map().on('move.intro drawn.intro', function() {
62859                   revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
62860               });
62861
62862               context.on('enter.intro', function(mode) {
62863                   if (mode.id !== 'draw-area') return chapter.restart();
62864                   continueTo(continueTank);
62865               });
62866
62867           }, 550);  // after easing
62868
62869           function continueTo(nextStep) {
62870               context.map().on('move.intro drawn.intro', null);
62871               context.on('enter.intro', null);
62872               nextStep();
62873           }
62874       }
62875
62876
62877       function continueTank() {
62878           if (context.mode().id !== 'draw-area') {
62879               return continueTo(addTank);
62880           }
62881
62882           tankId = null;
62883
62884           revealTank(tank, t('intro.buildings.continue_tank'));
62885
62886           context.map().on('move.intro drawn.intro', function() {
62887               revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
62888           });
62889
62890           context.on('enter.intro', function(mode) {
62891               if (mode.id === 'draw-area') {
62892                   return;
62893               } else if (mode.id === 'select') {
62894                   tankId = context.selectedIDs()[0];
62895                   return continueTo(searchPresetTank);
62896               } else {
62897                   return continueTo(addTank);
62898               }
62899           });
62900
62901           function continueTo(nextStep) {
62902               context.map().on('move.intro drawn.intro', null);
62903               context.on('enter.intro', null);
62904               nextStep();
62905           }
62906       }
62907
62908
62909       function searchPresetTank() {
62910           if (!tankId || !context.hasEntity(tankId)) {
62911               return addTank();
62912           }
62913           var ids = context.selectedIDs();
62914           if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
62915               context.enter(modeSelect(context, [tankId]));
62916           }
62917
62918           // disallow scrolling
62919           select('.inspector-wrap').on('wheel.intro', eventCancel);
62920
62921           timeout(function() {
62922               // reset pane, in case user somehow happened to change it..
62923               select('.inspector-wrap .panewrap').style('right', '-100%');
62924
62925               select('.preset-search-input')
62926                   .on('keydown.intro', null)
62927                   .on('keyup.intro', checkPresetSearch);
62928
62929               reveal('.preset-search-input',
62930                   t('intro.buildings.search_tank', { preset: tankPreset.name() })
62931               );
62932           }, 400);  // after preset list pane visible..
62933
62934           context.on('enter.intro', function(mode) {
62935               if (!tankId || !context.hasEntity(tankId)) {
62936                   return continueTo(addTank);
62937               }
62938
62939               var ids = context.selectedIDs();
62940               if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
62941                   // keep the user's area selected..
62942                   context.enter(modeSelect(context, [tankId]));
62943
62944                   // reset pane, in case user somehow happened to change it..
62945                   select('.inspector-wrap .panewrap').style('right', '-100%');
62946                   // disallow scrolling
62947                   select('.inspector-wrap').on('wheel.intro', eventCancel);
62948
62949                   select('.preset-search-input')
62950                       .on('keydown.intro', null)
62951                       .on('keyup.intro', checkPresetSearch);
62952
62953                   reveal('.preset-search-input',
62954                       t('intro.buildings.search_tank', { preset: tankPreset.name() })
62955                   );
62956
62957                   context.history().on('change.intro', null);
62958               }
62959           });
62960
62961           function checkPresetSearch() {
62962               var first = select('.preset-list-item:first-child');
62963
62964               if (first.classed('preset-man_made-storage_tank')) {
62965                   reveal(first.select('.preset-list-button').node(),
62966                       t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
62967                       { duration: 300 }
62968                   );
62969
62970                   select('.preset-search-input')
62971                       .on('keydown.intro', eventCancel, true)
62972                       .on('keyup.intro', null);
62973
62974                   context.history().on('change.intro', function() {
62975                       continueTo(closeEditorTank);
62976                   });
62977               }
62978           }
62979
62980           function continueTo(nextStep) {
62981               select('.inspector-wrap').on('wheel.intro', null);
62982               context.on('enter.intro', null);
62983               context.history().on('change.intro', null);
62984               select('.preset-search-input').on('keydown.intro keyup.intro', null);
62985               nextStep();
62986           }
62987       }
62988
62989
62990       function closeEditorTank() {
62991           if (!tankId || !context.hasEntity(tankId)) {
62992               return addTank();
62993           }
62994           var ids = context.selectedIDs();
62995           if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
62996               context.enter(modeSelect(context, [tankId]));
62997           }
62998
62999           context.history().checkpoint('hasTank');
63000
63001           context.on('exit.intro', function() {
63002               continueTo(rightClickTank);
63003           });
63004
63005           timeout(function() {
63006               reveal('.entity-editor-pane',
63007                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
63008               );
63009           }, 500);
63010
63011           function continueTo(nextStep) {
63012               context.on('exit.intro', null);
63013               nextStep();
63014           }
63015       }
63016
63017
63018       function rightClickTank() {
63019           if (!tankId) return continueTo(addTank);
63020
63021           context.enter(modeBrowse(context));
63022           context.history().reset('hasTank');
63023           context.map().centerEase(tank, 500);
63024
63025           timeout(function() {
63026               context.on('enter.intro', function(mode) {
63027                   if (mode.id !== 'select') return;
63028                   var ids = context.selectedIDs();
63029                   if (ids.length !== 1 || ids[0] !== tankId) return;
63030
63031                   timeout(function() {
63032                       var node = selectMenuItem('circularize').node();
63033                       if (!node) return;
63034                       continueTo(clickCircle);
63035                   }, 300);  // after menu visible
63036               });
63037
63038               revealTank(tank, t('intro.buildings.rightclick_tank'));
63039
63040               context.map().on('move.intro drawn.intro', function() {
63041                   revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
63042               });
63043
63044               context.history().on('change.intro', function() {
63045                   continueTo(rightClickTank);
63046               });
63047
63048           }, 600);
63049
63050           function continueTo(nextStep) {
63051               context.on('enter.intro', null);
63052               context.map().on('move.intro drawn.intro', null);
63053               context.history().on('change.intro', null);
63054               nextStep();
63055           }
63056       }
63057
63058
63059       function clickCircle() {
63060           if (!tankId) return chapter.restart();
63061           var entity = context.hasEntity(tankId);
63062           if (!entity) return continueTo(rightClickTank);
63063
63064           var node = selectMenuItem('circularize').node();
63065           if (!node) { return continueTo(rightClickTank); }
63066
63067           var wasChanged = false;
63068           var menuCoords = context.map().mouseCoordinates();
63069
63070           revealEditMenu(menuCoords,
63071               t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
63072           );
63073
63074           context.on('enter.intro', function(mode) {
63075               if (mode.id === 'browse') {
63076                   continueTo(rightClickTank);
63077               } else if (mode.id === 'move' || mode.id === 'rotate') {
63078                   continueTo(retryClickCircle);
63079               }
63080           });
63081
63082           context.map().on('move.intro drawn.intro', function() {
63083               var node = selectMenuItem('circularize').node();
63084               if (!wasChanged && !node) { return continueTo(rightClickTank); }
63085
63086               revealEditMenu(menuCoords,
63087                   t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
63088                   { duration: 0 }
63089               );
63090           });
63091
63092           context.history().on('change.intro', function() {
63093               wasChanged = true;
63094               context.history().on('change.intro', null);
63095
63096               // Something changed.  Wait for transition to complete and check undo annotation.
63097               timeout(function() {
63098                   if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
63099                       continueTo(play);
63100                   } else {
63101                       continueTo(retryClickCircle);
63102                   }
63103               }, 500);  // after transitioned actions
63104           });
63105
63106           function continueTo(nextStep) {
63107               context.on('enter.intro', null);
63108               context.map().on('move.intro drawn.intro', null);
63109               context.history().on('change.intro', null);
63110               nextStep();
63111           }
63112       }
63113
63114
63115       function retryClickCircle() {
63116           context.enter(modeBrowse(context));
63117
63118           revealTank(tank, t('intro.buildings.retry_circle'), {
63119               buttonText: t('intro.ok'),
63120               buttonCallback: function() { continueTo(rightClickTank); }
63121           });
63122
63123           function continueTo(nextStep) {
63124               nextStep();
63125           }
63126       }
63127
63128
63129       function play() {
63130           dispatch$$1.call('done');
63131           reveal('#id-container',
63132               t('intro.buildings.play', { next: t('intro.startediting.title') }), {
63133                   tooltipBox: '.intro-nav-wrap .chapter-startEditing',
63134                   buttonText: t('intro.ok'),
63135                   buttonCallback: function() { reveal('#id-container'); }
63136               }
63137           );
63138       }
63139
63140
63141       chapter.enter = function() {
63142           addHouse();
63143       };
63144
63145
63146       chapter.exit = function() {
63147           timeouts.forEach(window.clearTimeout);
63148           context.on('enter.intro exit.intro', null);
63149           context.map().on('move.intro drawn.intro', null);
63150           context.history().on('change.intro', null);
63151           select('.inspector-wrap').on('wheel.intro', null);
63152           select('.preset-search-input').on('keydown.intro keyup.intro', null);
63153           select('.more-fields .combobox-input').on('click.intro', null);
63154       };
63155
63156
63157       chapter.restart = function() {
63158           chapter.exit();
63159           chapter.enter();
63160       };
63161
63162
63163       return utilRebind(chapter, dispatch$$1, 'on');
63164   }
63165
63166   function uiModal(selection$$1, blocking) {
63167       var keybinding = d3keybinding('modal');
63168       var previous = selection$$1.select('div.modal');
63169       var animate = previous.empty();
63170
63171       previous.transition()
63172           .duration(200)
63173           .style('opacity', 0)
63174           .remove();
63175
63176       var shaded = selection$$1
63177           .append('div')
63178           .attr('class', 'shaded')
63179           .style('opacity', 0);
63180
63181       shaded.close = function() {
63182           shaded
63183               .transition()
63184               .duration(200)
63185               .style('opacity',0)
63186               .remove();
63187
63188           modal
63189               .transition()
63190               .duration(200)
63191               .style('top','0px');
63192
63193           keybinding.off();
63194       };
63195
63196
63197       var modal = shaded
63198           .append('div')
63199           .attr('class', 'modal fillL col6');
63200
63201       if (!blocking) {
63202           shaded.on('click.remove-modal', function() {
63203               if (event.target === this) {
63204                   shaded.close();
63205               }
63206           });
63207
63208           modal.append('button')
63209               .attr('class', 'close')
63210               .on('click', shaded.close)
63211               .call(svgIcon('#iD-icon-close'));
63212
63213           keybinding
63214               .on('⌫', shaded.close)
63215               .on('⎋', shaded.close);
63216
63217           select(document)
63218               .call(keybinding);
63219       }
63220
63221       modal
63222           .append('div')
63223           .attr('class', 'content');
63224
63225       if (animate) {
63226           shaded.transition().style('opacity', 1);
63227       } else {
63228           shaded.style('opacity', 1);
63229       }
63230
63231
63232       return shaded;
63233   }
63234
63235   function uiIntroStartEditing(context, reveal) {
63236       var dispatch$$1 = dispatch('done', 'startEditing');
63237       var modalSelection = select(null);
63238
63239
63240       var chapter = {
63241           title: 'intro.startediting.title'
63242       };
63243
63244       function showHelp() {
63245           reveal('.map-control.help-control',
63246               t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
63247                   buttonText: t('intro.ok'),
63248                   buttonCallback: function() { shortcuts(); }
63249               }
63250           );
63251       }
63252
63253       function shortcuts() {
63254           reveal('.map-control.help-control',
63255               t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
63256                   buttonText: t('intro.ok'),
63257                   buttonCallback: function() { showSave(); }
63258               }
63259           );
63260       }
63261
63262       function showSave() {
63263           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
63264           reveal('#bar button.save',
63265               t('intro.startediting.save'), {
63266                   buttonText: t('intro.ok'),
63267                   buttonCallback: function() { showStart(); }
63268               }
63269           );
63270       }
63271
63272       function showStart() {
63273           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
63274
63275           modalSelection = uiModal(context.container());
63276
63277           modalSelection.select('.modal')
63278               .attr('class', 'modal-splash modal col6');
63279
63280           modalSelection.selectAll('.close').remove();
63281
63282           var startbutton = modalSelection.select('.content')
63283               .attr('class', 'fillL')
63284               .append('button')
63285                   .attr('class', 'modal-section huge-modal-button')
63286                   .on('click', function() {
63287                       modalSelection.remove();
63288                   });
63289
63290               startbutton
63291                   .append('svg')
63292                   .attr('class', 'illustration')
63293                   .append('use')
63294                   .attr('xlink:href', '#iD-logo-walkthrough');
63295
63296               startbutton
63297                   .append('h2')
63298                   .text(t('intro.startediting.start'));
63299
63300           dispatch$$1.call('startEditing');
63301       }
63302
63303
63304       chapter.enter = function() {
63305           showHelp();
63306       };
63307
63308
63309       chapter.exit = function() {
63310           modalSelection.remove();
63311           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
63312       };
63313
63314
63315       return utilRebind(chapter, dispatch$$1, 'on');
63316   }
63317
63318   var chapterUi = {
63319       welcome: uiIntroWelcome,
63320       navigation: uiIntroNavigation,
63321       point: uiIntroPoint,
63322       area: uiIntroArea,
63323       line: uiIntroLine,
63324       building: uiIntroBuilding,
63325       startEditing: uiIntroStartEditing
63326   };
63327
63328   var chapterFlow = [
63329       'welcome',
63330       'navigation',
63331       'point',
63332       'area',
63333       'line',
63334       'building',
63335       'startEditing'
63336   ];
63337
63338
63339   function uiIntro(context) {
63340       var INTRO_IMAGERY = 'EsriWorldImageryClarity';
63341       var introGraph = {};
63342       var _currChapter;
63343
63344       // create entities for intro graph and localize names
63345       for (var id in dataIntroGraph) {
63346           introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
63347       }
63348
63349
63350       function intro(selection$$1) {
63351           context.enter(modeBrowse(context));
63352
63353           // Save current map state
63354           var osm = context.connection();
63355           var history = context.history().toJSON();
63356           var hash = window.location.hash;
63357           var center = context.map().center();
63358           var zoom = context.map().zoom();
63359           var background = context.background().baseLayerSource();
63360           var overlays = context.background().overlayLayerSources();
63361           var opacity = d3_selectAll('#map .layer-background').style('opacity');
63362           var caches = osm && osm.caches();
63363           var baseEntities = context.history().graph().base().entities;
63364           var countryCode = services.geocoder.countryCode;
63365
63366           // Block saving
63367           context.inIntro(true);
63368
63369           // Load semi-real data used in intro
63370           if (osm) { osm.toggle(false).reset(); }
63371           context.history().reset();
63372           context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
63373           context.history().checkpoint('initial');
63374
63375           var imagery = context.background().findSource(INTRO_IMAGERY);
63376           if (imagery) {
63377               context.background().baseLayerSource(imagery);
63378           } else {
63379               context.background().bing();
63380           }
63381           overlays.forEach(function (d) {
63382               context.background().toggleOverlayLayer(d);
63383           });
63384
63385           // Mock geocoder
63386           services.geocoder.countryCode = function(location, callback) {
63387               callback(null, t('intro.graph.countrycode'));
63388           };
63389
63390           d3_selectAll('#map .layer-background').style('opacity', 1);
63391
63392           var curtain = uiCurtain();
63393           selection$$1.call(curtain);
63394
63395           // store that the user started the walkthrough..
63396           context.storage('walkthrough_started', 'yes');
63397
63398           // restore previous walkthrough progress..
63399           var storedProgress = context.storage('walkthrough_progress') || '';
63400           var progress = storedProgress.split(';').filter(Boolean);
63401
63402           var chapters = chapterFlow.map(function(chapter, i) {
63403               var s = chapterUi[chapter](context, curtain.reveal)
63404                   .on('done', function() {
63405                       context.presets().init();  // clear away "recent" presets
63406
63407                       buttons.filter(function(d) {
63408                           return d.title === s.title;
63409                       }).classed('finished', true);
63410
63411                       if (i < chapterFlow.length - 1) {
63412                           var next = chapterFlow[i + 1];
63413                           select('button.chapter-' + next)
63414                               .classed('next', true);
63415                       }
63416
63417                       // store walkthrough progress..
63418                       progress.push(chapter);
63419                       context.storage('walkthrough_progress', uniq(progress).join(';'));
63420                   });
63421               return s;
63422           });
63423
63424           chapters[chapters.length - 1].on('startEditing', function() {
63425               // store walkthrough progress..
63426               progress.push('startEditing');
63427               context.storage('walkthrough_progress', uniq(progress).join(';'));
63428
63429               // store if walkthrough is completed..
63430               var incomplete = difference(chapterFlow, progress);
63431               if (!incomplete.length) {
63432                   context.storage('walkthrough_completed', 'yes');
63433               }
63434
63435               curtain.remove();
63436               navwrap.remove();
63437               d3_selectAll('#map .layer-background').style('opacity', opacity);
63438               if (osm) { osm.toggle(true).reset().caches(caches); }
63439               context.history().reset().merge(values$1(baseEntities));
63440               context.background().baseLayerSource(background);
63441               overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
63442               if (history) { context.history().fromJSON(history, false); }
63443               context.map().centerZoom(center, zoom);
63444               window.location.replace(hash);
63445               services.geocoder.countryCode = countryCode;
63446               context.inIntro(false);
63447           });
63448
63449           var navwrap = selection$$1
63450               .append('div')
63451               .attr('class', 'intro-nav-wrap fillD');
63452
63453           navwrap
63454               .append('svg')
63455               .attr('class', 'intro-nav-wrap-logo')
63456               .append('use')
63457               .attr('xlink:href', '#iD-logo-walkthrough');
63458
63459           var buttonwrap = navwrap
63460               .append('div')
63461               .attr('class', 'joined')
63462               .selectAll('button.chapter');
63463
63464           var buttons = buttonwrap
63465               .data(chapters)
63466               .enter()
63467               .append('button')
63468               .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
63469               .on('click', enterChapter);
63470
63471           buttons
63472               .append('span')
63473               .text(function(d) { return t(d.title); });
63474
63475           buttons
63476               .append('span')
63477               .attr('class', 'status')
63478               .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
63479
63480           enterChapter(chapters[0]);
63481
63482
63483           function enterChapter(newChapter) {
63484               if (_currChapter) { _currChapter.exit(); }
63485               context.enter(modeBrowse(context));
63486
63487               _currChapter = newChapter;
63488               _currChapter.enter();
63489
63490               buttons
63491                   .classed('next', false)
63492                   .classed('active', function(d) {
63493                       return d.title === _currChapter.title;
63494                   });
63495           }
63496       }
63497
63498
63499       return intro;
63500   }
63501
63502   function uiConfirm(selection) {
63503       var modalSelection = uiModal(selection);
63504
63505       modalSelection.select('.modal')
63506           .classed('modal-alert', true);
63507
63508       var section = modalSelection.select('.content');
63509
63510       section.append('div')
63511           .attr('class', 'modal-section header');
63512
63513       section.append('div')
63514           .attr('class', 'modal-section message-text');
63515
63516       var buttons = section.append('div')
63517           .attr('class', 'modal-section buttons cf');
63518
63519
63520       modalSelection.okButton = function() {
63521           buttons
63522               .append('button')
63523               .attr('class', 'button ok-button action col4')
63524               .on('click.confirm', function() {
63525                   modalSelection.remove();
63526               })
63527               .text(t('confirm.okay'))
63528               .node()
63529               .focus();
63530
63531           return modalSelection;
63532       };
63533
63534
63535       return modalSelection;
63536   }
63537
63538   function uiSettingsCustomData(context) {
63539       var dispatch$$1 = dispatch('change');
63540
63541       function render(selection$$1) {
63542           var dataLayer = context.layers().layer('data');
63543           var _origSettings = {
63544               fileList: (dataLayer && dataLayer.fileList()) || null,
63545               url: context.storage('settings-custom-data-url')
63546           };
63547           var _currSettings = cloneDeep(_origSettings);
63548
63549           // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
63550           var modal = uiConfirm(selection$$1).okButton();
63551
63552           modal
63553               .classed('settings-modal settings-custom-data', true);
63554
63555           modal.select('.modal-section.header')
63556               .append('h3')
63557               .text(t('settings.custom_data.header'));
63558
63559
63560           var textSection = modal.select('.modal-section.message-text');
63561
63562           textSection
63563               .append('pre')
63564               .attr('class', 'instructions-file')
63565               .text(t('settings.custom_data.file.instructions'));
63566
63567           textSection
63568               .append('input')
63569               .attr('class', 'field-file')
63570               .attr('type', 'file')
63571               .property('files', _currSettings.fileList)  // works for all except IE11
63572               .on('change', function() {
63573                   var files = event.target.files;
63574                   if (files && files.length) {
63575                       _currSettings.url = '';
63576                       textSection.select('.field-url').property('value', '');
63577                       _currSettings.fileList = files;
63578                   } else {
63579                       _currSettings.fileList = null;
63580                   }
63581               });
63582
63583           textSection
63584               .append('h4')
63585               .text(t('settings.custom_data.or'));
63586
63587           textSection
63588               .append('pre')
63589               .attr('class', 'instructions-url')
63590               .text(t('settings.custom_data.url.instructions'));
63591
63592           textSection
63593               .append('textarea')
63594               .attr('class', 'field-url')
63595               .attr('placeholder', t('settings.custom_data.url.placeholder'))
63596               .call(utilNoAuto)
63597               .property('value', _currSettings.url);
63598
63599
63600           // insert a cancel button, and adjust the button widths
63601           var buttonSection = modal.select('.modal-section.buttons');
63602
63603           buttonSection
63604               .insert('button', '.ok-button')
63605               .attr('class', 'button col3 cancel-button secondary-action')
63606               .text(t('confirm.cancel'));
63607
63608
63609           buttonSection.select('.cancel-button')
63610               .on('click.cancel', clickCancel);
63611
63612           buttonSection.select('.ok-button')
63613               .classed('col3', true)
63614               .classed('col4', false)
63615               .attr('disabled', isSaveDisabled)
63616               .on('click.save', clickSave);
63617
63618
63619           function isSaveDisabled() {
63620               return null;
63621           }
63622
63623
63624           // restore the original url
63625           function clickCancel() {
63626               textSection.select('.field-url').property('value', _origSettings.url);
63627               context.storage('settings-custom-data-url', _origSettings.url);
63628               this.blur();
63629               modal.close();
63630           }
63631
63632           // accept the current url
63633           function clickSave() {
63634               _currSettings.url = textSection.select('.field-url').property('value').trim();
63635
63636               // one or the other but not both
63637               if (_currSettings.url) { _currSettings.fileList = null; }
63638               if (_currSettings.fileList) { _currSettings.url = ''; }
63639
63640               context.storage('settings-custom-data-url', _currSettings.url);
63641               this.blur();
63642               modal.close();
63643               dispatch$$1.call('change', this, _currSettings);
63644           }
63645       }
63646
63647       return utilRebind(render, dispatch$$1, 'on');
63648   }
63649
63650   function uiTooltipHtml(text, key, heading) {
63651       var s = '';
63652
63653       if (heading) {
63654           s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
63655       }
63656       if (text) {
63657           s += '<div class="tooltip-text"><span>' + text + '</span></div>';
63658       }
63659       if (key) {
63660           s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
63661               '<span class="keyhint">' + key + '</span></div>';
63662       }
63663
63664       return s;
63665   }
63666
63667   function uiMapData(context) {
63668       var key = t('map_data.key');
63669       var features = context.features().keys();
63670       var layers = context.layers();
63671       var fills = ['wireframe', 'partial', 'full'];
63672
63673       var settingsCustomData = uiSettingsCustomData(context)
63674           .on('change', customChanged);
63675
63676       var _fillSelected = context.storage('area-fill') || 'partial';
63677       var _shown = false;
63678       var _dataLayerContainer = select(null);
63679       var _fillList = select(null);
63680       var _featureList = select(null);
63681
63682
63683       function showsFeature(d) {
63684           return context.features().enabled(d);
63685       }
63686
63687
63688       function autoHiddenFeature(d) {
63689           return context.features().autoHidden(d);
63690       }
63691
63692
63693       function clickFeature(d) {
63694           context.features().toggle(d);
63695           update();
63696       }
63697
63698
63699       function showsFill(d) {
63700           return _fillSelected === d;
63701       }
63702
63703
63704       function setFill(d) {
63705           fills.forEach(function(opt) {
63706               context.surface().classed('fill-' + opt, Boolean(opt === d));
63707           });
63708
63709           _fillSelected = d;
63710           context.storage('area-fill', d);
63711           if (d !== 'wireframe') {
63712               context.storage('area-fill-toggle', d);
63713           }
63714           update();
63715       }
63716
63717
63718       function showsLayer(which) {
63719           var layer = layers.layer(which);
63720           if (layer) {
63721               return layer.enabled();
63722           }
63723           return false;
63724       }
63725
63726
63727       function setLayer(which, enabled) {
63728           var layer = layers.layer(which);
63729           if (layer) {
63730               layer.enabled(enabled);
63731
63732               if (!enabled && (which === 'osm' || which === 'notes')) {
63733                   context.enter(modeBrowse(context));
63734               }
63735
63736               update();
63737           }
63738       }
63739
63740
63741       function toggleLayer(which) {
63742           setLayer(which, !showsLayer(which));
63743       }
63744
63745
63746       function drawPhotoItems(selection$$1) {
63747           var photoKeys = ['streetside', 'mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
63748           var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
63749           var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
63750
63751           function layerSupported(d) {
63752               return d.layer && d.layer.supported();
63753           }
63754           function layerEnabled(d) {
63755               return layerSupported(d) && d.layer.enabled();
63756           }
63757
63758           var ul = selection$$1
63759               .selectAll('.layer-list-photos')
63760               .data([0]);
63761
63762           ul = ul.enter()
63763               .append('ul')
63764               .attr('class', 'layer-list layer-list-photos')
63765               .merge(ul);
63766
63767           var li = ul.selectAll('.list-item-photos')
63768               .data(data);
63769
63770           li.exit()
63771               .remove();
63772
63773           var liEnter = li.enter()
63774               .append('li')
63775               .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
63776
63777           var labelEnter = liEnter
63778               .append('label')
63779               .each(function(d) {
63780                   select(this)
63781                       .call(tooltip()
63782                           .title(t(d.id.replace('-', '_') + '.tooltip'))
63783                           .placement('top')
63784                       );
63785               });
63786
63787           labelEnter
63788               .append('input')
63789               .attr('type', 'checkbox')
63790               .on('change', function(d) { toggleLayer(d.id); });
63791
63792           labelEnter
63793               .append('span')
63794               .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
63795
63796
63797           // Update
63798           li
63799               .merge(liEnter)
63800               .classed('active', layerEnabled)
63801               .selectAll('input')
63802               .property('checked', layerEnabled);
63803       }
63804
63805
63806       function drawOsmItems(selection$$1) {
63807           var osmKeys = ['osm', 'notes'];
63808           var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
63809
63810           var ul = selection$$1
63811               .selectAll('.layer-list-osm')
63812               .data([0]);
63813
63814           ul = ul.enter()
63815               .append('ul')
63816               .attr('class', 'layer-list layer-list-osm')
63817               .merge(ul);
63818
63819           var li = ul.selectAll('.list-item')
63820               .data(osmLayers);
63821
63822           li.exit()
63823               .remove();
63824
63825           var liEnter = li.enter()
63826               .append('li')
63827               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
63828
63829           var labelEnter = liEnter
63830               .append('label')
63831               .each(function(d) {
63832                   select(this)
63833                       .call(tooltip()
63834                           .title(t('map_data.layers.' + d.id + '.tooltip'))
63835                           .placement('bottom')
63836                       );
63837               });
63838
63839           labelEnter
63840               .append('input')
63841               .attr('type', 'checkbox')
63842               .on('change', function(d) { toggleLayer(d.id); });
63843
63844           labelEnter
63845               .append('span')
63846               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
63847
63848
63849           // Update
63850           li
63851               .merge(liEnter)
63852               .classed('active', function (d) { return d.layer.enabled(); })
63853               .selectAll('input')
63854               .property('checked', function (d) { return d.layer.enabled(); });
63855       }
63856
63857
63858       // Beta feature - sample vector layers to support Detroit Mapping Challenge
63859       // https://github.com/osmus/detroit-mapping-challenge
63860       function drawVectorItems(selection$$1) {
63861           var dataLayer = layers.layer('data');
63862           var vtData = [
63863               {
63864                   name: 'Detroit Neighborhoods/Parks',
63865                   src: 'neighborhoods-parks',
63866                   tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
63867                   template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmur6x34562qp9iv1u3ksf-54hev,jonahadkins.cjksmqxdx33jj2wp90xd9x2md-4e5y2/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
63868               }, {
63869                   name: 'Detroit Composite POIs',
63870                   src: 'composite-poi',
63871                   tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
63872                   template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmm6a02sli31myxhsr7zf3-2sw8h/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
63873               }, {
63874                   name: 'Detroit All-The-Places POIs',
63875                   src: 'alltheplaces-poi',
63876                   tooltip: 'Public domain business location data created by web scrapers.',
63877                   template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmswgk340g2vo06p1w9w0j-8fjjc/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
63878               }
63879           ];
63880
63881           // Only show this if the map is around Detroit..
63882           var detroit = geoExtent$$1([-83.5, 42.1], [-82.8, 42.5]);
63883           var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
63884
63885           var container = selection$$1.selectAll('.vectortile-container')
63886               .data(showVectorItems ? [0] : []);
63887
63888           container.exit()
63889               .remove();
63890
63891           var containerEnter = container.enter()
63892               .append('div')
63893               .attr('class', 'vectortile-container');
63894
63895           containerEnter
63896               .append('h4')
63897               .attr('class', 'vectortile-header')
63898               .text('Detroit Vector Tiles (Beta)');
63899
63900           containerEnter
63901               .append('ul')
63902               .attr('class', 'layer-list layer-list-vectortile');
63903
63904           containerEnter
63905               .append('div')
63906               .attr('class', 'vectortile-footer')
63907               .append('a')
63908               .attr('target', '_blank')
63909               .attr('tabindex', -1)
63910               .call(svgIcon('#iD-icon-out-link', 'inline'))
63911               .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
63912               .append('span')
63913               .text('About these layers');
63914
63915           container = container
63916               .merge(containerEnter);
63917
63918
63919           var ul = container.selectAll('.layer-list-vectortile');
63920
63921           var li = ul.selectAll('.list-item')
63922               .data(vtData);
63923
63924           li.exit()
63925               .remove();
63926
63927           var liEnter = li.enter()
63928               .append('li')
63929               .attr('class', function(d) { return 'list-item list-item-' + d.src; });
63930
63931           var labelEnter = liEnter
63932               .append('label')
63933               .each(function(d) {
63934                   select(this).call(
63935                       tooltip().title(d.tooltip).placement('top')
63936                   );
63937               });
63938
63939           labelEnter
63940               .append('input')
63941               .attr('type', 'radio')
63942               .attr('name', 'vectortile')
63943               .on('change', selectVTLayer);
63944
63945           labelEnter
63946               .append('span')
63947               .text(function(d) { return d.name; });
63948
63949           // Update
63950           li
63951               .merge(liEnter)
63952               .classed('active', isVTLayerSelected)
63953               .selectAll('input')
63954               .property('checked', isVTLayerSelected);
63955
63956
63957           function isVTLayerSelected(d) {
63958               return dataLayer && dataLayer.template() === d.template;
63959           }
63960
63961           function selectVTLayer(d) {
63962               context.storage('settings-custom-data-url', d.template);
63963               if (dataLayer) {
63964                   dataLayer.template(d.template, d.src);
63965                   dataLayer.enabled(true);
63966               }
63967           }
63968       }
63969
63970
63971       function drawCustomDataItems(selection$$1) {
63972           var dataLayer = layers.layer('data');
63973           var hasData = dataLayer && dataLayer.hasData();
63974           var showsData = hasData && dataLayer.enabled();
63975
63976           var ul = selection$$1
63977               .selectAll('.layer-list-data')
63978               .data(dataLayer ? [0] : []);
63979
63980           // Exit
63981           ul.exit()
63982               .remove();
63983
63984           // Enter
63985           var ulEnter = ul.enter()
63986               .append('ul')
63987               .attr('class', 'layer-list layer-list-data');
63988
63989           var liEnter = ulEnter
63990               .append('li')
63991               .attr('class', 'list-item-data');
63992
63993           liEnter
63994               .append('button')
63995               .call(tooltip()
63996                   .title(t('settings.custom_data.tooltip'))
63997                   .placement((textDirection === 'rtl') ? 'right' : 'left')
63998               )
63999               .on('click', editCustom)
64000               .call(svgIcon('#iD-icon-more'));
64001
64002           liEnter
64003               .append('button')
64004               .call(tooltip()
64005                   .title(t('map_data.layers.custom.zoom'))
64006                   .placement((textDirection === 'rtl') ? 'right' : 'left')
64007               )
64008               .on('click', function() {
64009                   event.preventDefault();
64010                   event.stopPropagation();
64011                   dataLayer.fitZoom();
64012               })
64013               .call(svgIcon('#iD-icon-search'));
64014
64015           var labelEnter = liEnter
64016               .append('label')
64017               .call(tooltip()
64018                   .title(t('map_data.layers.custom.tooltip'))
64019                   .placement('top')
64020               );
64021
64022           labelEnter
64023               .append('input')
64024               .attr('type', 'checkbox')
64025               .on('change', function() { toggleLayer('data'); });
64026
64027           labelEnter
64028               .append('span')
64029               .text(t('map_data.layers.custom.title'));
64030
64031           // Update
64032           ul = ul
64033               .merge(ulEnter);
64034
64035           ul.selectAll('.list-item-data')
64036               .classed('active', showsData)
64037               .selectAll('label')
64038               .classed('deemphasize', !hasData)
64039               .selectAll('input')
64040               .property('disabled', !hasData)
64041               .property('checked', showsData);
64042       }
64043
64044
64045       function editCustom() {
64046           event.preventDefault();
64047           context.container()
64048               .call(settingsCustomData);
64049       }
64050
64051
64052       function customChanged(d) {
64053           var dataLayer = layers.layer('data');
64054
64055           if (d && d.url) {
64056               dataLayer.url(d.url);
64057           } else if (d && d.fileList) {
64058               dataLayer.fileList(d.fileList);
64059           }
64060       }
64061
64062
64063       function drawListItems(selection$$1, data, type, name, change, active) {
64064           var items = selection$$1.selectAll('li')
64065               .data(data);
64066
64067           // Exit
64068           items.exit()
64069               .remove();
64070
64071           // Enter
64072           var enter = items.enter()
64073               .append('li')
64074               .attr('class', 'layer')
64075               .call(tooltip()
64076                   .html(true)
64077                   .title(function(d) {
64078                       var tip = t(name + '.' + d + '.tooltip'),
64079                           key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
64080
64081                       if (name === 'feature' && autoHiddenFeature(d)) {
64082                           var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
64083                           tip += '<div>' + msg + '</div>';
64084                       }
64085                       return uiTooltipHtml(tip, key);
64086                   })
64087                   .placement('top')
64088               );
64089
64090           var label = enter
64091               .append('label');
64092
64093           label
64094               .append('input')
64095               .attr('type', type)
64096               .attr('name', name)
64097               .on('change', change);
64098
64099           label
64100               .append('span')
64101               .text(function(d) { return t(name + '.' + d + '.description'); });
64102
64103           // Update
64104           items = items
64105               .merge(enter);
64106
64107           items
64108               .classed('active', active)
64109               .selectAll('input')
64110               .property('checked', active)
64111               .property('indeterminate', function(d) {
64112                   return (name === 'feature' && autoHiddenFeature(d));
64113               });
64114       }
64115
64116
64117       function renderDataLayers(selection$$1) {
64118           var container = selection$$1.selectAll('data-layer-container')
64119               .data([0]);
64120
64121           _dataLayerContainer = container.enter()
64122               .append('div')
64123               .attr('class', 'data-layer-container')
64124               .merge(container);
64125       }
64126
64127
64128       function renderFillList(selection$$1) {
64129           var container = selection$$1.selectAll('layer-fill-list')
64130               .data([0]);
64131
64132           _fillList = container.enter()
64133               .append('ul')
64134               .attr('class', 'layer-list layer-fill-list')
64135               .merge(container);
64136       }
64137
64138
64139       function renderFeatureList(selection$$1) {
64140           var container = selection$$1.selectAll('layer-feature-list')
64141               .data([0]);
64142
64143           _featureList = container.enter()
64144               .append('ul')
64145               .attr('class', 'layer-list layer-feature-list')
64146               .merge(container);
64147       }
64148
64149
64150       function update() {
64151           _dataLayerContainer
64152               .call(drawOsmItems)
64153               .call(drawPhotoItems)
64154               .call(drawCustomDataItems)
64155               .call(drawVectorItems);      // Beta - Detroit mapping challenge
64156
64157           _fillList
64158               .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
64159
64160           _featureList
64161               .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
64162       }
64163
64164
64165       function toggleWireframe() {
64166           if (event) {
64167               event.preventDefault();
64168               event.stopPropagation();
64169           }
64170
64171           if (_fillSelected === 'wireframe') {
64172               _fillSelected = context.storage('area-fill-toggle') || 'partial';
64173           } else {
64174               _fillSelected = 'wireframe';
64175           }
64176
64177           setFill(_fillSelected);
64178           context.map().pan([0,0]);  // trigger a redraw
64179       }
64180
64181
64182       function mapData(selection$$1) {
64183
64184           function hidePane() {
64185               setVisible(false);
64186           }
64187
64188           function togglePane() {
64189               if (event) event.preventDefault();
64190               paneTooltip.hide(button);
64191               setVisible(!button.classed('active'));
64192           }
64193
64194           function setVisible(show) {
64195               if (show !== _shown) {
64196                   button.classed('active', show);
64197                   _shown = show;
64198
64199                   if (show) {
64200                       uiBackground.hidePane();
64201                       uiHelp.hidePane();
64202                       update();
64203
64204                       pane
64205                           .style('display', 'block')
64206                           .style('right', '-300px')
64207                           .transition()
64208                           .duration(200)
64209                           .style('right', '0px');
64210
64211                   } else {
64212                       pane
64213                           .style('display', 'block')
64214                           .style('right', '0px')
64215                           .transition()
64216                           .duration(200)
64217                           .style('right', '-300px')
64218                           .on('end', function() {
64219                               select(this).style('display', 'none');
64220                           });
64221                   }
64222               }
64223           }
64224
64225
64226           var pane = selection$$1
64227               .append('div')
64228               .attr('class', 'fillL map-pane col4 hide');
64229
64230           var paneTooltip = tooltip()
64231               .placement((textDirection === 'rtl') ? 'right' : 'left')
64232               .html(true)
64233               .title(uiTooltipHtml(t('map_data.description'), key));
64234
64235           var button = selection$$1
64236               .append('button')
64237               .attr('tabindex', -1)
64238               .on('click', togglePane)
64239               .call(svgIcon('#iD-icon-data', 'light'))
64240               .call(paneTooltip);
64241
64242
64243           var heading = pane
64244               .append('div')
64245               .attr('class', 'pane-heading');
64246
64247           heading
64248               .append('h2')
64249               .text(t('map_data.title'));
64250
64251           heading
64252               .append('button')
64253               .on('click', function() { uiMapData.hidePane(); })
64254               .call(svgIcon('#iD-icon-close'));
64255
64256
64257           var content = pane
64258               .append('div')
64259               .attr('class', 'pane-content');
64260
64261           // data layers
64262           content
64263               .append('div')
64264               .attr('class', 'map-data-data-layers')
64265               .call(uiDisclosure(context, 'data_layers', true)
64266                   .title(t('map_data.data_layers'))
64267                   .content(renderDataLayers)
64268               );
64269
64270           // area fills
64271           content
64272               .append('div')
64273               .attr('class', 'map-data-area-fills')
64274               .call(uiDisclosure(context, 'fill_area', false)
64275                   .title(t('map_data.fill_area'))
64276                   .content(renderFillList)
64277               );
64278
64279           // feature filters
64280           content
64281               .append('div')
64282               .attr('class', 'map-data-feature-filters')
64283               .call(uiDisclosure(context, 'map_features', false)
64284                   .title(t('map_data.map_features'))
64285                   .content(renderFeatureList)
64286               );
64287
64288
64289           // add listeners
64290           context.features()
64291               .on('change.map_data-update', update);
64292
64293           update();
64294           setFill(_fillSelected);
64295
64296           var keybinding = d3keybinding('features')
64297               .on(key, togglePane)
64298               .on(t('area_fill.wireframe.key'), toggleWireframe)
64299               .on([t('background.key'), t('help.key')], hidePane);
64300
64301           select(document)
64302               .call(keybinding);
64303
64304           uiMapData.hidePane = hidePane;
64305           uiMapData.togglePane = togglePane;
64306           uiMapData.setVisible = setVisible;
64307       }
64308
64309       return mapData;
64310   }
64311
64312   function uiShortcuts() {
64313       var detected = utilDetect();
64314       var activeTab = 0;
64315       var modalSelection;
64316       var savedSelection;
64317
64318
64319       var keybinding = d3keybinding('shortcuts')
64320           .on(t('shortcuts.toggle.key'), function () {
64321               if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
64322                   if (modalSelection) {
64323                       modalSelection.close();
64324                       modalSelection = null;
64325                   }
64326               } else {
64327                   modalSelection = uiModal(savedSelection);
64328                   shortcutsModal(modalSelection);
64329               }
64330           });
64331
64332       select(document)
64333           .call(keybinding);
64334
64335
64336
64337       function shortcutsModal(modalSelection) {
64338           modalSelection.select('.modal')
64339               .classed('modal-shortcuts', true);
64340
64341           var shortcutsModal = modalSelection.select('.content');
64342
64343           shortcutsModal
64344               .append('div')
64345               .attr('class', 'modal-section')
64346               .append('h3')
64347               .text(t('shortcuts.title'));
64348
64349           shortcutsModal
64350               .call(render);
64351       }
64352
64353
64354       function render(selection$$1) {
64355           var wrapper = selection$$1
64356               .selectAll('.wrapper')
64357               .data([0]);
64358
64359           var wrapperEnter = wrapper
64360               .enter()
64361               .append('div')
64362               .attr('class', 'wrapper modal-section');
64363
64364           var tabsBar = wrapperEnter
64365               .append('div')
64366               .attr('class', 'tabs-bar');
64367
64368           var shortcutsList = wrapperEnter
64369               .append('div')
64370               .attr('class', 'shortcuts-list');
64371
64372           wrapper = wrapper.merge(wrapperEnter);
64373
64374           var tabs = tabsBar
64375               .selectAll('.tab')
64376               .data(dataShortcuts);
64377
64378           var tabsEnter = tabs
64379               .enter()
64380               .append('div')
64381               .attr('class', 'tab')
64382               .on('click', function (d, i) {
64383                   activeTab = i;
64384                   render(selection$$1);
64385               });
64386
64387           tabsEnter
64388               .append('span')
64389               .text(function (d) { return t(d.text); });
64390
64391           tabs = tabs
64392               .merge(tabsEnter);
64393
64394           // Update
64395           wrapper.selectAll('.tab')
64396               .classed('active', function (d, i) {
64397                   return i === activeTab;
64398               });
64399
64400
64401           var shortcuts = shortcutsList
64402               .selectAll('.shortcut-tab')
64403               .data(dataShortcuts);
64404
64405           var shortcutsEnter = shortcuts
64406               .enter()
64407               .append('div')
64408               .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
64409
64410           var columnsEnter = shortcutsEnter
64411               .selectAll('.shortcut-column')
64412               .data(function (d) { return d.columns; })
64413               .enter()
64414               .append('table')
64415               .attr('class', 'shortcut-column');
64416
64417           var rowsEnter = columnsEnter
64418               .selectAll('.shortcut-row')
64419               .data(function (d) { return d.rows; })
64420               .enter()
64421               .append('tr')
64422               .attr('class', 'shortcut-row');
64423
64424
64425           var sectionRows = rowsEnter
64426               .filter(function (d) { return !d.shortcuts; });
64427
64428           sectionRows
64429               .append('td');
64430
64431           sectionRows
64432               .append('td')
64433               .attr('class', 'shortcut-section')
64434               .append('h3')
64435               .text(function (d) { return t(d.text); });
64436
64437
64438           var shortcutRows = rowsEnter
64439               .filter(function (d) { return d.shortcuts; });
64440
64441           var shortcutKeys = shortcutRows
64442               .append('td')
64443               .attr('class', 'shortcut-keys');
64444
64445           var modifierKeys = shortcutKeys
64446               .filter(function (d) { return d.modifiers; });
64447
64448           modifierKeys
64449               .selectAll('kbd.modifier')
64450               .data(function (d) {
64451                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
64452                       return ['⌘'];
64453                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
64454                       return [];
64455                   } else {
64456                       return d.modifiers;
64457                   }
64458               })
64459               .enter()
64460               .each(function () {
64461                   var selection$$1 = select(this);
64462
64463                   selection$$1
64464                       .append('kbd')
64465                       .attr('class', 'modifier')
64466                       .text(function (d) { return uiCmd.display(d); });
64467
64468                   selection$$1
64469                       .append('span')
64470                       .text('+');
64471               });
64472
64473
64474           shortcutKeys
64475               .selectAll('kbd.shortcut')
64476               .data(function (d) {
64477                   var arr = d.shortcuts;
64478                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
64479                       arr = ['Y'];
64480                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
64481                       arr = ['F11'];
64482                   }
64483
64484                   return arr.map(function(s) {
64485                       return {
64486                           shortcut: s,
64487                           separator: d.separator
64488                       };
64489                   });
64490               })
64491               .enter()
64492               .each(function (d, i, nodes) {
64493                   var selection$$1 = select(this);
64494                   var click = d.shortcut.toLowerCase().match(/(.*).click/);
64495
64496                   if (click && click[1]) {
64497                       selection$$1
64498                           .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
64499                   } else {
64500                       selection$$1
64501                           .append('kbd')
64502                           .attr('class', 'shortcut')
64503                           .text(function (d) {
64504                               var key = d.shortcut;
64505                               return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
64506                           });
64507                   }
64508
64509                   if (i < nodes.length - 1) {
64510                       selection$$1
64511                           .append('span')
64512                           .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
64513                   }
64514               });
64515
64516
64517           shortcutKeys
64518               .filter(function(d) { return d.gesture; })
64519               .each(function () {
64520                   var selection$$1 = select(this);
64521
64522                   selection$$1
64523                       .append('span')
64524                       .text('+');
64525
64526                   selection$$1
64527                       .append('span')
64528                       .attr('class', 'gesture')
64529                       .text(function (d) { return t(d.gesture); });
64530               });
64531
64532
64533           shortcutRows
64534               .append('td')
64535               .attr('class', 'shortcut-desc')
64536               .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
64537
64538
64539           shortcuts = shortcuts
64540               .merge(shortcutsEnter);
64541
64542           // Update
64543           wrapper.selectAll('.shortcut-tab')
64544               .style('display', function (d, i) {
64545                   return i === activeTab ? 'flex' : 'none';
64546               });
64547       }
64548
64549
64550       return function(selection$$1, show) {
64551           savedSelection = selection$$1;
64552           if (show) {
64553               modalSelection = uiModal(selection$$1);
64554               shortcutsModal(modalSelection);
64555           }
64556       };
64557   }
64558
64559   function uiHelp(context) {
64560       var key = t('help.key');
64561
64562       var docKeys = [
64563           ['help', [
64564               'welcome',
64565               'open_data_h',
64566               'open_data',
64567               'before_start_h',
64568               'before_start',
64569               'open_source_h',
64570               'open_source',
64571               'open_source_help'
64572           ]],
64573           ['overview', [
64574               'navigation_h',
64575               'navigation_drag',
64576               'navigation_zoom',
64577               'features_h',
64578               'features',
64579               'nodes_ways'
64580           ]],
64581           ['editing', [
64582               'select_h',
64583               'select_left_click',
64584               'select_right_click',
64585               'multiselect_h',
64586               'multiselect_shift_click',
64587               'multiselect_lasso',
64588               'undo_redo_h',
64589               'undo_redo',
64590               'save_h',
64591               'save',
64592               'save_validation',
64593               'upload_h',
64594               'upload',
64595               'backups_h',
64596               'backups',
64597               'keyboard_h',
64598               'keyboard'
64599           ]],
64600           ['feature_editor', [
64601               'intro',
64602               'definitions',
64603               'type_h',
64604               'type',
64605               'type_picker',
64606               'fields_h',
64607               'fields_all_fields',
64608               'fields_example',
64609               'fields_add_field',
64610               'tags_h',
64611               'tags_all_tags',
64612               'tags_resources'
64613           ]],
64614           ['points', [
64615               'intro',
64616               'add_point_h',
64617               'add_point',
64618               'add_point_finish',
64619               'move_point_h',
64620               'move_point',
64621               'delete_point_h',
64622               'delete_point',
64623               'delete_point_command'
64624           ]],
64625           ['lines', [
64626               'intro',
64627               'add_line_h',
64628               'add_line',
64629               'add_line_draw',
64630               'add_line_finish',
64631               'modify_line_h',
64632               'modify_line_dragnode',
64633               'modify_line_addnode',
64634               'connect_line_h',
64635               'connect_line',
64636               'connect_line_display',
64637               'connect_line_drag',
64638               'connect_line_tag',
64639               'disconnect_line_h',
64640               'disconnect_line_command',
64641               'move_line_h',
64642               'move_line_command',
64643               'move_line_connected',
64644               'delete_line_h',
64645               'delete_line',
64646               'delete_line_command'
64647           ]],
64648           ['areas', [
64649               'intro',
64650               'point_or_area_h',
64651               'point_or_area',
64652               'add_area_h',
64653               'add_area_command',
64654               'add_area_draw',
64655               'add_area_finish',
64656               'square_area_h',
64657               'square_area_command',
64658               'modify_area_h',
64659               'modify_area_dragnode',
64660               'modify_area_addnode',
64661               'delete_area_h',
64662               'delete_area',
64663               'delete_area_command'
64664           ]],
64665           ['relations', [
64666               'intro',
64667               'edit_relation_h',
64668               'edit_relation',
64669               'edit_relation_add',
64670               'edit_relation_delete',
64671               'maintain_relation_h',
64672               'maintain_relation',
64673               'relation_types_h',
64674               'multipolygon_h',
64675               'multipolygon',
64676               'multipolygon_create',
64677               'multipolygon_merge',
64678               'turn_restriction_h',
64679               'turn_restriction',
64680               'turn_restriction_field',
64681               'turn_restriction_editing',
64682               'route_h',
64683               'route',
64684               'route_add',
64685               'boundary_h',
64686               'boundary',
64687               'boundary_add'
64688           ]],
64689           ['notes', [
64690               'intro',
64691               'add_note_h',
64692               'add_note',
64693               'move_note',
64694               'update_note_h',
64695               'update_note',
64696               'save_note_h',
64697               'save_note'
64698           ]],
64699
64700           ['imagery', [
64701               'intro',
64702               'sources_h',
64703               'choosing',
64704               'sources',
64705               'offsets_h',
64706               'offset',
64707               'offset_change'
64708           ]],
64709           ['streetlevel', [
64710               'intro',
64711               'using_h',
64712               'using',
64713               'photos',
64714               'viewer'
64715           ]],
64716           ['gps', [
64717               'intro',
64718               'survey',
64719               'using_h',
64720               'using',
64721               'tracing',
64722               'upload'
64723           ]]
64724       ];
64725
64726       var headings = {
64727           'help.help.open_data_h': 3,
64728           'help.help.before_start_h': 3,
64729           'help.help.open_source_h': 3,
64730           'help.overview.navigation_h': 3,
64731           'help.overview.features_h': 3,
64732           'help.editing.select_h': 3,
64733           'help.editing.multiselect_h': 3,
64734           'help.editing.undo_redo_h': 3,
64735           'help.editing.save_h': 3,
64736           'help.editing.upload_h': 3,
64737           'help.editing.backups_h': 3,
64738           'help.editing.keyboard_h': 3,
64739           'help.feature_editor.type_h': 3,
64740           'help.feature_editor.fields_h': 3,
64741           'help.feature_editor.tags_h': 3,
64742           'help.points.add_point_h': 3,
64743           'help.points.move_point_h': 3,
64744           'help.points.delete_point_h': 3,
64745           'help.lines.add_line_h': 3,
64746           'help.lines.modify_line_h': 3,
64747           'help.lines.connect_line_h': 3,
64748           'help.lines.disconnect_line_h': 3,
64749           'help.lines.move_line_h': 3,
64750           'help.lines.delete_line_h': 3,
64751           'help.areas.point_or_area_h': 3,
64752           'help.areas.add_area_h': 3,
64753           'help.areas.square_area_h': 3,
64754           'help.areas.modify_area_h': 3,
64755           'help.areas.delete_area_h': 3,
64756           'help.relations.edit_relation_h': 3,
64757           'help.relations.maintain_relation_h': 3,
64758           'help.relations.relation_types_h': 2,
64759           'help.relations.multipolygon_h': 3,
64760           'help.relations.turn_restriction_h': 3,
64761           'help.relations.route_h': 3,
64762           'help.relations.boundary_h': 3,
64763           'help.notes.add_note_h': 3,
64764           'help.notes.update_note_h': 3,
64765           'help.notes.save_note_h': 3,
64766           'help.imagery.sources_h': 3,
64767           'help.imagery.offsets_h': 3,
64768           'help.streetlevel.using_h': 3,
64769           'help.gps.using_h': 3,
64770       };
64771
64772       var replacements = {
64773           point: icon('#iD-icon-point', 'pre-text'),
64774           line: icon('#iD-icon-line', 'pre-text'),
64775           area: icon('#iD-icon-area', 'pre-text'),
64776           note: icon('#iD-icon-note', 'pre-text add-note'),
64777           plus: icon('#iD-icon-plus', 'pre-text'),
64778           minus: icon('#iD-icon-minus', 'pre-text'),
64779           orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
64780           disconnect: icon('#iD-operation-disconnect', 'pre-text'),
64781           layers: icon('#iD-icon-layers', 'pre-text'),
64782           data: icon('#iD-icon-data', 'pre-text'),
64783           inspect: icon('#iD-icon-inspect', 'pre-text'),
64784           move: icon('#iD-operation-move', 'pre-text'),
64785           merge: icon('#iD-operation-merge', 'pre-text'),
64786           delete: icon('#iD-operation-delete', 'pre-text'),
64787           close: icon('#iD-icon-close', 'pre-text'),
64788           undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
64789           redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
64790           save: icon('#iD-icon-save', 'pre-text'),
64791           leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
64792           rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
64793           shift: uiCmd.display('⇧'),
64794           alt: uiCmd.display('⌥'),
64795           return: uiCmd.display('↵'),
64796           version: context.version
64797       };
64798
64799       // For each section, squash all the texts into a single markdown document
64800       var docs = docKeys.map(function(key) {
64801           var helpkey = 'help.' + key[0];
64802           var text = key[1].reduce(function(all, part) {
64803               var subkey = helpkey + '.' + part;
64804               var depth = headings[subkey];                              // is this subkey a heading?
64805               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
64806               return all + hhh + t(subkey, replacements) + '\n\n';
64807           }, '');
64808
64809           return {
64810               title: t(helpkey + '.title'),
64811               html: marked(text.trim())
64812           };
64813       });
64814
64815
64816       function help(selection$$1) {
64817
64818           function hidePane() {
64819               setVisible(false);
64820           }
64821
64822
64823           function togglePane() {
64824               if (event) event.preventDefault();
64825               tooltipBehavior.hide(button);
64826               setVisible(!button.classed('active'));
64827           }
64828
64829
64830           function setVisible(show) {
64831               if (show !== shown) {
64832                   button.classed('active', show);
64833                   shown = show;
64834
64835                   if (show) {
64836                       uiBackground.hidePane();
64837                       uiMapData.hidePane();
64838
64839                       pane.style('display', 'block')
64840                           .style('right', '-500px')
64841                           .transition()
64842                           .duration(200)
64843                           .style('right', '0px');
64844
64845                   } else {
64846                       pane.style('right', '0px')
64847                           .transition()
64848                           .duration(200)
64849                           .style('right', '-500px')
64850                           .on('end', function() {
64851                               select(this).style('display', 'none');
64852                           });
64853                   }
64854               }
64855           }
64856
64857
64858           function clickHelp(d, i) {
64859               var rtl = (textDirection === 'rtl');
64860               pane.property('scrollTop', 0);
64861               doctitle.html(d.title);
64862
64863               body.html(d.html);
64864               body.selectAll('a')
64865                   .attr('target', '_blank');
64866               menuItems.classed('selected', function(m) {
64867                   return m.title === d.title;
64868               });
64869
64870               nav.html('');
64871               if (rtl) {
64872                   nav.call(drawNext).call(drawPrevious);
64873               } else {
64874                   nav.call(drawPrevious).call(drawNext);
64875               }
64876
64877
64878               function drawNext(selection$$1) {
64879                   if (i < docs.length - 1) {
64880                       var nextLink = selection$$1
64881                           .append('a')
64882                           .attr('class', 'next')
64883                           .on('click', function() {
64884                               clickHelp(docs[i + 1], i + 1);
64885                           });
64886
64887                       nextLink
64888                           .append('span')
64889                           .text(docs[i + 1].title)
64890                           .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
64891                   }
64892               }
64893
64894
64895               function drawPrevious(selection$$1) {
64896                   if (i > 0) {
64897                       var prevLink = selection$$1
64898                           .append('a')
64899                           .attr('class', 'previous')
64900                           .on('click', function() {
64901                               clickHelp(docs[i - 1], i - 1);
64902                           });
64903
64904                       prevLink
64905                           .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
64906                           .append('span')
64907                           .text(docs[i - 1].title);
64908                   }
64909               }
64910           }
64911
64912
64913           function clickWalkthrough() {
64914               if (context.inIntro()) return;
64915               context.container().call(uiIntro(context));
64916               setVisible(false);
64917           }
64918
64919
64920           function clickShortcuts() {
64921               context.container().call(uiShortcuts(context), true);
64922           }
64923
64924
64925           var pane = selection$$1.append('div')
64926               .attr('class', 'help-wrap map-pane fillL col6 hide');
64927
64928           var tooltipBehavior = tooltip()
64929               .placement((textDirection === 'rtl') ? 'right' : 'left')
64930               .html(true)
64931               .title(uiTooltipHtml(t('help.title'), key));
64932
64933           var button = selection$$1.append('button')
64934               .attr('tabindex', -1)
64935               .on('click', togglePane)
64936               .call(svgIcon('#iD-icon-help', 'light'))
64937               .call(tooltipBehavior);
64938
64939           var shown = false;
64940
64941
64942           var heading = pane
64943               .append('div')
64944               .attr('class', 'pane-heading');
64945
64946           var doctitle = heading
64947               .append('h2')
64948               .text(t('help.title'));
64949
64950           heading
64951               .append('button')
64952               .on('click', function() { uiHelp.hidePane(); })
64953               .call(svgIcon('#iD-icon-close'));
64954
64955
64956           var content = pane
64957               .append('div')
64958               .attr('class', 'pane-content');
64959
64960           var toc = content
64961               .append('ul')
64962               .attr('class', 'toc');
64963
64964           var menuItems = toc.selectAll('li')
64965               .data(docs)
64966               .enter()
64967               .append('li')
64968               .append('a')
64969               .html(function(d) { return d.title; })
64970               .on('click', clickHelp);
64971
64972           var shortcuts = toc
64973               .append('li')
64974               .attr('class', 'shortcuts')
64975               .call(tooltip()
64976                   .html(true)
64977                   .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
64978                   .placement('top')
64979               )
64980               .append('a')
64981               .on('click', clickShortcuts);
64982
64983           shortcuts
64984               .append('div')
64985               .text(t('shortcuts.title'));
64986
64987           var walkthrough = toc
64988               .append('li')
64989               .attr('class', 'walkthrough')
64990               .append('a')
64991               .on('click', clickWalkthrough);
64992
64993           walkthrough
64994               .append('svg')
64995               .attr('class', 'logo logo-walkthrough')
64996               .append('use')
64997               .attr('xlink:href', '#iD-logo-walkthrough');
64998
64999           walkthrough
65000               .append('div')
65001               .text(t('splash.walkthrough'));
65002
65003
65004           var helpContent = content
65005               .append('div')
65006               .attr('class', 'left-content');
65007
65008           var body = helpContent
65009               .append('div')
65010               .attr('class', 'body');
65011
65012           var nav = helpContent
65013               .append('div')
65014               .attr('class', 'nav');
65015
65016           clickHelp(docs[0], 0);
65017
65018           var keybinding = d3keybinding('help')
65019               .on(key, togglePane)
65020               .on([t('background.key'), t('map_data.key')], hidePane);
65021
65022           select(document)
65023               .call(keybinding);
65024
65025           uiHelp.hidePane = hidePane;
65026           uiHelp.togglePane = togglePane;
65027           uiHelp.setVisible = setVisible;
65028       }
65029
65030       return help;
65031   }
65032
65033   function localeDateString(s) {
65034       if (!s) return null;
65035       var detected = utilDetect();
65036       var options = { day: 'numeric', month: 'short', year: 'numeric' };
65037       var d = new Date(s);
65038       if (isNaN(d.getTime())) return null;
65039       return d.toLocaleDateString(detected.locale, options);
65040   }
65041
65042   function vintageRange(vintage) {
65043       var s;
65044       if (vintage.start || vintage.end) {
65045           s = (vintage.start || '?');
65046           if (vintage.start !== vintage.end) {
65047               s += ' - ' + (vintage.end || '?');
65048           }
65049       }
65050       return s;
65051   }
65052
65053
65054   function rendererBackgroundSource(data) {
65055       var source = clone(data);
65056       var offset = [0, 0];
65057       var name = source.name;
65058       var description = source.description;
65059       var best = !!source.best;
65060       var template = source.template;
65061
65062       source.tileSize = data.tileSize || 256;
65063       source.zoomExtent = data.zoomExtent || [0, 22];
65064       source.overzoom = data.overzoom !== false;
65065
65066       source.offset = function(_) {
65067           if (!arguments.length) return offset;
65068           offset = _;
65069           return source;
65070       };
65071
65072
65073       source.nudge = function(_, zoomlevel) {
65074           offset[0] += _[0] / Math.pow(2, zoomlevel);
65075           offset[1] += _[1] / Math.pow(2, zoomlevel);
65076           return source;
65077       };
65078
65079
65080       source.name = function() {
65081           var id_safe = source.id.replace('.', '<TX_DOT>');
65082           return t('imagery.' + id_safe + '.name', { default: name });
65083       };
65084
65085
65086       source.description = function() {
65087           var id_safe = source.id.replace('.', '<TX_DOT>');
65088           return t('imagery.' + id_safe + '.description', { default: description });
65089       };
65090
65091
65092       source.best = function() {
65093           return best;
65094       };
65095
65096
65097       source.area = function() {
65098           if (!data.polygon) return Number.MAX_VALUE;  // worldwide
65099           var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
65100           return isNaN(area) ? 0 : area;
65101       };
65102
65103
65104       source.imageryUsed = function() {
65105           return name || source.id;
65106       };
65107
65108
65109       source.template = function(_) {
65110           if (!arguments.length) return template;
65111           if (source.id === 'custom') template = _;
65112           return source;
65113       };
65114
65115
65116       source.url = function(coord) {
65117           if (this.type === 'wms') {
65118               var tileToProjectedCoords = (function(x, y, z) {
65119                   //polyfill for IE11, PhantomJS
65120                   var sinh = Math.sinh || function(x) {
65121                       var y = Math.exp(x);
65122                       return (y - 1 / y) / 2;
65123                   };
65124
65125                   var zoomSize = Math.pow(2, z);
65126                   var lon = x / zoomSize * Math.PI * 2 - Math.PI;
65127                   var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
65128
65129                   switch (this.projection) {
65130                       case 'EPSG:4326':
65131                           return {
65132                               x: lon * 180 / Math.PI,
65133                               y: lat * 180 / Math.PI
65134                           };
65135                       default: // EPSG:3857 and synonyms
65136                           var mercCoords = mercatorRaw(lon, lat);
65137                           return {
65138                               x: 20037508.34 / Math.PI * mercCoords[0],
65139                               y: 20037508.34 / Math.PI * mercCoords[1]
65140                           };
65141                   }
65142               }).bind(this);
65143
65144               var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
65145               var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
65146               return template
65147                   .replace('{width}', this.tileSize)
65148                   .replace('{height}', this.tileSize)
65149                   .replace('{proj}', this.projection)
65150                   .replace('{bbox}', minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y);
65151           }
65152           return template
65153               .replace('{x}', coord[0])
65154               .replace('{y}', coord[1])
65155               // TMS-flipped y coordinate
65156               .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
65157               .replace(/\{z(oom)?\}/, coord[2])
65158               .replace(/\{switch:([^}]+)\}/, function(s, r) {
65159                   var subdomains = r.split(',');
65160                   return subdomains[(coord[0] + coord[1]) % subdomains.length];
65161               })
65162               .replace('{u}', function() {
65163                   var u = '';
65164                   for (var zoom = coord[2]; zoom > 0; zoom--) {
65165                       var b = 0;
65166                       var mask = 1 << (zoom - 1);
65167                       if ((coord[0] & mask) !== 0) b++;
65168                       if ((coord[1] & mask) !== 0) b += 2;
65169                       u += b.toString();
65170                   }
65171                   return u;
65172               });
65173       };
65174
65175
65176       source.validZoom = function(z) {
65177           return source.zoomExtent[0] <= z &&
65178               (source.overzoom || source.zoomExtent[1] > z);
65179       };
65180
65181
65182       source.isLocatorOverlay = function() {
65183           return source.id === 'mapbox_locator_overlay';
65184       };
65185
65186
65187       /* hides a source from the list, but leaves it available for use */
65188       source.isHidden = function() {
65189           return source.id === 'DigitalGlobe-Premium-vintage' ||
65190               source.id === 'DigitalGlobe-Standard-vintage';
65191       };
65192
65193
65194       source.copyrightNotices = function() {};
65195
65196
65197       source.getMetadata = function(center, tileCoord, callback) {
65198           var vintage = {
65199               start: localeDateString(source.startDate),
65200               end: localeDateString(source.endDate)
65201           };
65202           vintage.range = vintageRange(vintage);
65203
65204           var metadata = { vintage: vintage };
65205           callback(null, metadata);
65206       };
65207
65208
65209       return source;
65210   }
65211
65212
65213   rendererBackgroundSource.Bing = function(data, dispatch) {
65214       // http://msdn.microsoft.com/en-us/library/ff701716.aspx
65215       // http://msdn.microsoft.com/en-us/library/ff701701.aspx
65216
65217       data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
65218
65219       var bing = rendererBackgroundSource(data);
65220       var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // Same as P2 and JOSM
65221       var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
65222               key;
65223       var cache = {};
65224       var inflight = {};
65225       var providers = [];
65226
65227       d3_json(url, function(err, json$$1) {
65228           providers = json$$1.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
65229               return {
65230                   attribution: provider.attribution,
65231                   areas: provider.coverageAreas.map(function(area) {
65232                       return {
65233                           zoom: [area.zoomMin, area.zoomMax],
65234                           extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
65235                       };
65236                   })
65237               };
65238           });
65239           dispatch.call('change');
65240       });
65241
65242
65243       bing.copyrightNotices = function(zoom, extent) {
65244           zoom = Math.min(zoom, 21);
65245           return providers.filter(function(provider) {
65246               return some(provider.areas, function(area) {
65247                   return extent.intersects(area.extent) &&
65248                       area.zoom[0] <= zoom &&
65249                       area.zoom[1] >= zoom;
65250               });
65251           }).map(function(provider) {
65252               return provider.attribution;
65253           }).join(', ');
65254       };
65255
65256
65257       bing.getMetadata = function(center, tileCoord, callback) {
65258           var tileId = tileCoord.slice(0, 3).join('/');
65259           var zoom = Math.min(tileCoord[2], 21);
65260           var centerPoint = center[1] + ',' + center[0];  // lat,lng
65261           var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
65262                   '?zl=' + zoom + '&key=' + key;
65263
65264           if (inflight[tileId]) return;
65265
65266           if (!cache[tileId]) {
65267               cache[tileId] = {};
65268           }
65269           if (cache[tileId] && cache[tileId].metadata) {
65270               return callback(null, cache[tileId].metadata);
65271           }
65272
65273           inflight[tileId] = true;
65274           d3_json(url, function(error, result) {
65275               delete inflight[tileId];
65276
65277               var err;
65278               if (error) {
65279                   err = error;
65280               } else if (!result && 'Unknown Error') {
65281                   err = result.errorDetails;
65282               }
65283               if (err) {
65284                   return callback(err);
65285               } else {
65286                   var vintage = {
65287                       start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
65288                       end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
65289                   };
65290                   vintage.range = vintageRange(vintage);
65291
65292                   var metadata = { vintage: vintage };
65293                   cache[tileId].metadata = metadata;
65294                   return callback(null, metadata);
65295               }
65296           });
65297       };
65298
65299
65300       bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
65301
65302
65303       return bing;
65304   };
65305
65306
65307
65308   rendererBackgroundSource.Esri = function(data) {
65309       // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
65310       if (data.template.match(/blankTile/) === null) {
65311           data.template = data.template + '?blankTile=false';
65312       }
65313
65314       var esri = rendererBackgroundSource(data);
65315       var cache = {};
65316       var inflight = {};
65317       var _prevCenter;
65318
65319       // use a tilemap service to set maximum zoom for esri tiles dynamically
65320       // https://developers.arcgis.com/documentation/tiled-elevation-service/
65321       esri.fetchTilemap = function(center) {
65322           // skip if we have already fetched a tilemap within 5km
65323           if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
65324           _prevCenter = center;
65325
65326           // tiles are available globally to zoom level 19, afterward they may or may not be present
65327           var z = 20;
65328
65329           // first generate a random url using the template
65330           var dummyUrl = esri.url([1,2,3]);
65331
65332           // calculate url z/y/x from the lat/long of the center of the map
65333           var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
65334           var y = (Math.floor((1 - Math.log(Math.tan(center[1] * Math.PI / 180) + 1 / Math.cos(center[1] * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, z)));
65335
65336           // fetch an 8x8 grid to leverage cache
65337           var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
65338
65339           // make the request and introspect the response from the tilemap server
65340           d3_json(tilemapUrl, function (err, tilemap) {
65341               if (err || !tilemap) return;
65342
65343               var hasTiles = true;
65344               for (var i = 0; i < tilemap.data.length; i++) {
65345                   // 0 means an individual tile in the grid doesn't exist
65346                   if (!tilemap.data[i]) {
65347                       hasTiles = false;
65348                       break;
65349                   }
65350               }
65351
65352               // if any tiles are missing at level 20 we restrict maxZoom to 19
65353               esri.zoomExtent[1] = (hasTiles ? 22 : 19);
65354           });
65355       };
65356
65357       esri.getMetadata = function(center, tileCoord, callback) {
65358           var tileId = tileCoord.slice(0, 3).join('/');
65359           var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
65360           var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
65361           var unknown = t('info_panels.background.unknown');
65362           var metadataLayer;
65363           var vintage = {};
65364           var metadata = {};
65365
65366           if (inflight[tileId]) return;
65367
65368           switch (true) {
65369               case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
65370                   metadataLayer = 4;
65371                   break;
65372               case zoom >= 19:
65373                   metadataLayer = 3;
65374                   break;
65375               case zoom >= 17:
65376                   metadataLayer = 2;
65377                   break;
65378               case zoom >= 13:
65379                   metadataLayer = 0;
65380                   break;
65381               default:
65382                   metadataLayer = 99;
65383           }
65384
65385           var url;
65386           // build up query using the layer appropriate to the current zoom
65387           if (esri.id === 'EsriWorldImagery') {
65388               url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
65389           } else if (esri.id === 'EsriWorldImageryClarity') {
65390               url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
65391           }
65392
65393           url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
65394
65395           if (!cache[tileId]) {
65396               cache[tileId] = {};
65397           }
65398           if (cache[tileId] && cache[tileId].metadata) {
65399               return callback(null, cache[tileId].metadata);
65400           }
65401
65402           // accurate metadata is only available >= 13
65403           if (metadataLayer === 99) {
65404               vintage = {
65405                   start: null,
65406                   end: null,
65407                   range: null
65408               };
65409               metadata = {
65410                   vintage: null,
65411                   source: unknown,
65412                   description: unknown,
65413                   resolution: unknown,
65414                   accuracy: unknown
65415               };
65416
65417               callback(null, metadata);
65418
65419           } else {
65420               inflight[tileId] = true;
65421               d3_json(url, function(error, result) {
65422                   delete inflight[tileId];
65423
65424                   var err;
65425                   if (error) {
65426                       err = error;
65427                   } else if (!result) {
65428                       err = 'Unknown Error';
65429                   } else if (result.features && result.features.length < 1) {
65430                       err = 'No Results';
65431                   } else if (result.error && result.error.message) {
65432                       err = result.error.message;
65433                   }
65434
65435                   if (err) {
65436                       return callback(err);
65437                   } else {
65438                       // pass through the discrete capture date from metadata
65439                       var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
65440                       vintage = {
65441                           start: captureDate,
65442                           end: captureDate,
65443                           range: captureDate
65444                       };
65445                       metadata = {
65446                           vintage: vintage,
65447                           source: clean(result.features[0].attributes.NICE_NAME),
65448                           description: clean(result.features[0].attributes.NICE_DESC),
65449                           resolution: clean(result.features[0].attributes.SRC_RES),
65450                           accuracy: clean(result.features[0].attributes.SRC_ACC)
65451                       };
65452
65453                       // append units - meters
65454                       if (isFinite(metadata.resolution)) {
65455                           metadata.resolution += ' m';
65456                       }
65457                       if (isFinite(metadata.accuracy)) {
65458                           metadata.accuracy += ' m';
65459                       }
65460
65461                       cache[tileId].metadata = metadata;
65462                       return callback(null, metadata);
65463                   }
65464               });
65465           }
65466
65467
65468           function clean(val) {
65469               return String(val).trim() || unknown;
65470           }
65471       };
65472
65473       return esri;
65474   };
65475
65476
65477   rendererBackgroundSource.None = function() {
65478       var source = rendererBackgroundSource({ id: 'none', template: '' });
65479
65480
65481       source.name = function() {
65482           return t('background.none');
65483       };
65484
65485
65486       source.imageryUsed = function() {
65487           return 'None';
65488       };
65489
65490
65491       source.area = function() {
65492           return -1;  // sources in background pane are sorted by area
65493       };
65494
65495
65496       return source;
65497   };
65498
65499
65500   rendererBackgroundSource.Custom = function(template) {
65501       var source = rendererBackgroundSource({ id: 'custom', template: template });
65502
65503
65504       source.name = function() {
65505           return t('background.custom');
65506       };
65507
65508
65509       source.imageryUsed = function() {
65510           return 'Custom (' + source.template() + ')';
65511       };
65512
65513
65514       source.area = function() {
65515           return -2;  // sources in background pane are sorted by area
65516       };
65517
65518
65519       return source;
65520   };
65521
65522   function rendererTileLayer(context) {
65523       var transformProp = utilPrefixCSSProperty('Transform');
65524       var tiler = utilTiler();
65525
65526       var _tileSize = 256;
65527       var _projection;
65528       var _cache = {};
65529       var _tileOrigin;
65530       var _zoom;
65531       var _source;
65532
65533
65534       function tileSizeAtZoom(d, z) {
65535           var EPSILON = 0.002;    // close seams
65536           return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
65537       }
65538
65539
65540       function atZoom(t$$1, distance) {
65541           var power = Math.pow(2, distance);
65542           return [
65543               Math.floor(t$$1[0] * power),
65544               Math.floor(t$$1[1] * power),
65545               t$$1[2] + distance
65546           ];
65547       }
65548
65549
65550       function lookUp(d) {
65551           for (var up = -1; up > -d[2]; up--) {
65552               var tile = atZoom(d, up);
65553               if (_cache[_source.url(tile)] !== false) {
65554                   return tile;
65555               }
65556           }
65557       }
65558
65559
65560       function uniqueBy(a, n) {
65561           var o = [];
65562           var seen = {};
65563           for (var i = 0; i < a.length; i++) {
65564               if (seen[a[i][n]] === undefined) {
65565                   o.push(a[i]);
65566                   seen[a[i][n]] = true;
65567               }
65568           }
65569           return o;
65570       }
65571
65572
65573       function addSource(d) {
65574           d.push(_source.url(d));
65575           return d;
65576       }
65577
65578
65579       // Update tiles based on current state of `projection`.
65580       function background(selection$$1) {
65581           _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
65582
65583           var pixelOffset;
65584           if (_source) {
65585               pixelOffset = [
65586                   _source.offset()[0] * Math.pow(2, _zoom),
65587                   _source.offset()[1] * Math.pow(2, _zoom)
65588               ];
65589           } else {
65590               pixelOffset = [0, 0];
65591           }
65592
65593           var translate = [
65594               _projection.translate()[0] + pixelOffset[0],
65595               _projection.translate()[1] + pixelOffset[1]
65596           ];
65597
65598           tiler
65599               .scale(_projection.scale() * 2 * Math.PI)
65600               .translate(translate);
65601
65602           _tileOrigin = [
65603               _projection.scale() * Math.PI - translate[0],
65604               _projection.scale() * Math.PI - translate[1]
65605           ];
65606
65607           render(selection$$1);
65608       }
65609
65610
65611       // Derive the tiles onscreen, remove those offscreen and position them.
65612       // Important that this part not depend on `_projection` because it's
65613       // rentered when tiles load/error (see #644).
65614       function render(selection$$1) {
65615           if (!_source) return;
65616           var requests = [];
65617           var showDebug = context.getDebug('tile') && !_source.overlay;
65618
65619           if (_source.validZoom(_zoom)) {
65620               tiler.skipNullIsland(!!_source.overlay);
65621
65622               tiler().forEach(function(d) {
65623                   addSource(d);
65624                   if (d[3] === '') return;
65625                   if (typeof d[3] !== 'string') return; // Workaround for #2295
65626                   requests.push(d);
65627                   if (_cache[d[3]] === false && lookUp(d)) {
65628                       requests.push(addSource(lookUp(d)));
65629                   }
65630               });
65631
65632               requests = uniqueBy(requests, 3).filter(function(r) {
65633                   // don't re-request tiles which have failed in the past
65634                   return _cache[r[3]] !== false;
65635               });
65636           }
65637
65638           function load(d) {
65639               _cache[d[3]] = true;
65640               select(this)
65641                   .on('error', null)
65642                   .on('load', null)
65643                   .classed('tile-loaded', true);
65644               render(selection$$1);
65645           }
65646
65647           function error(d) {
65648               _cache[d[3]] = false;
65649               select(this)
65650                   .on('error', null)
65651                   .on('load', null)
65652                   .remove();
65653               render(selection$$1);
65654           }
65655
65656           function imageTransform(d) {
65657               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
65658               var scale = tileSizeAtZoom(d, _zoom);
65659               return 'translate(' +
65660                   ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
65661                   ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
65662                   'scale(' + scale + ',' + scale + ')';
65663           }
65664
65665           function tileCenter(d) {
65666               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
65667               return [
65668                   ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
65669                   ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
65670               ];
65671           }
65672
65673           function debugTransform(d) {
65674               var coord = tileCenter(d);
65675               return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
65676           }
65677
65678
65679           // Pick a representative tile near the center of the viewport
65680           // (This is useful for sampling the imagery vintage)
65681           var dims = tiler.size();
65682           var mapCenter = [dims[0] / 2, dims[1] / 2];
65683           var minDist = Math.max(dims[0], dims[1]);
65684           var nearCenter;
65685
65686           requests.forEach(function(d) {
65687               var c = tileCenter(d);
65688               var dist = geoVecLength(c, mapCenter);
65689               if (dist < minDist) {
65690                   minDist = dist;
65691                   nearCenter = d;
65692               }
65693           });
65694
65695
65696           var image = selection$$1.selectAll('img')
65697               .data(requests, function(d) { return d[3]; });
65698
65699           image.exit()
65700               .style(transformProp, imageTransform)
65701               .classed('tile-removing', true)
65702               .classed('tile-center', false)
65703               .each(function() {
65704                   var tile = select(this);
65705                   window.setTimeout(function() {
65706                       if (tile.classed('tile-removing')) {
65707                           tile.remove();
65708                       }
65709                   }, 300);
65710               });
65711
65712           image.enter()
65713             .append('img')
65714               .attr('class', 'tile')
65715               .attr('src', function(d) { return d[3]; })
65716               .on('error', error)
65717               .on('load', load)
65718             .merge(image)
65719               .style(transformProp, imageTransform)
65720               .classed('tile-debug', showDebug)
65721               .classed('tile-removing', false)
65722               .classed('tile-center', function(d) { return d === nearCenter; });
65723
65724
65725
65726           var debug = selection$$1.selectAll('.tile-label-debug')
65727               .data(showDebug ? requests : [], function(d) { return d[3]; });
65728
65729           debug.exit()
65730               .remove();
65731
65732           if (showDebug) {
65733               var debugEnter = debug.enter()
65734                   .append('div')
65735                   .attr('class', 'tile-label-debug');
65736
65737               debugEnter
65738                   .append('div')
65739                   .attr('class', 'tile-label-debug-coord');
65740
65741               debugEnter
65742                   .append('div')
65743                   .attr('class', 'tile-label-debug-vintage');
65744
65745               debug = debug.merge(debugEnter);
65746
65747               debug
65748                   .style(transformProp, debugTransform);
65749
65750               debug
65751                   .selectAll('.tile-label-debug-coord')
65752                   .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
65753
65754               debug
65755                   .selectAll('.tile-label-debug-vintage')
65756                   .each(function(d) {
65757                       var span = select(this);
65758                       var center = context.projection.invert(tileCenter(d));
65759                       _source.getMetadata(center, d, function(err, result) {
65760                           span.text((result && result.vintage && result.vintage.range) ||
65761                               t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
65762                           );
65763                       });
65764                   });
65765           }
65766
65767       }
65768
65769
65770       background.projection = function(_) {
65771           if (!arguments.length) return _projection;
65772           _projection = _;
65773           return background;
65774       };
65775
65776
65777       background.dimensions = function(_) {
65778           if (!arguments.length) return tiler.size();
65779           tiler.size(_);
65780           return background;
65781       };
65782
65783
65784       background.source = function(_) {
65785           if (!arguments.length) return _source;
65786           _source = _;
65787           _tileSize = _source.tileSize;
65788           _cache = {};
65789           tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
65790           return background;
65791       };
65792
65793
65794       return background;
65795   }
65796
65797   function rendererBackground(context) {
65798       var dispatch$$1 = dispatch('change');
65799       var detected = utilDetect();
65800       var baseLayer = rendererTileLayer(context).projection(context.projection);
65801       var _overlayLayers = [];
65802       var _backgroundSources = [];
65803       var _brightness = 1;
65804       var _contrast = 1;
65805       var _saturation = 1;
65806       var _sharpness = 1;
65807
65808
65809       function background(selection$$1) {
65810           // If we are displaying an Esri basemap at high zoom,
65811           // check its tilemap to see how high the zoom can go
65812           if (context.map().zoom() > 18) {
65813               var basemap = baseLayer.source();
65814               if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
65815                   var center = context.map().center();
65816                   basemap.fetchTilemap(center);
65817               }
65818           }
65819
65820           var baseFilter = '';
65821           if (detected.cssfilters) {
65822               if (_brightness !== 1) {
65823                   baseFilter += 'brightness(' + _brightness + ')';
65824               }
65825               if (_contrast !== 1) {
65826                   baseFilter += 'contrast(' + _contrast + ')';
65827               }
65828               if (_saturation !== 1) {
65829                   baseFilter += 'saturate(' + _saturation + ')';
65830               }
65831               if (_sharpness < 1) {  // gaussian blur
65832                   var blur = interpolateNumber(0.5, 5)(1 - _sharpness);
65833                   baseFilter += 'blur(' + blur + 'px)';
65834               }
65835           }
65836
65837           var base = selection$$1.selectAll('.layer-background')
65838               .data([0]);
65839
65840           base = base.enter()
65841               .insert('div', '.layer-data')
65842               .attr('class', 'layer layer-background')
65843               .merge(base);
65844
65845           if (detected.cssfilters) {
65846               base.style('filter', baseFilter || null);
65847           } else {
65848               base.style('opacity', _brightness);
65849           }
65850
65851
65852           var imagery = base.selectAll('.layer-imagery')
65853               .data([0]);
65854
65855           imagery.enter()
65856               .append('div')
65857               .attr('class', 'layer layer-imagery')
65858               .merge(imagery)
65859               .call(baseLayer);
65860
65861
65862           var maskFilter = '';
65863           var mixBlendMode = '';
65864           if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
65865               mixBlendMode = 'overlay';
65866               maskFilter = 'saturate(0) blur(3px) invert(1)';
65867
65868               var contrast = _sharpness - 1;
65869               maskFilter += ' contrast(' + contrast + ')';
65870
65871               var brightness = interpolateNumber(1, 0.85)(_sharpness - 1);
65872               maskFilter += ' brightness(' + brightness + ')';
65873           }
65874
65875           var mask = base.selectAll('.layer-unsharp-mask')
65876               .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
65877
65878           mask.exit()
65879               .remove();
65880
65881           mask.enter()
65882               .append('div')
65883               .attr('class', 'layer layer-mask layer-unsharp-mask')
65884               .merge(mask)
65885               .call(baseLayer)
65886               .style('filter', maskFilter || null)
65887               .style('mix-blend-mode', mixBlendMode || null);
65888
65889
65890           var overlays = selection$$1.selectAll('.layer-overlay')
65891               .data(_overlayLayers, function(d) { return d.source().name(); });
65892
65893           overlays.exit()
65894               .remove();
65895
65896           overlays.enter()
65897               .insert('div', '.layer-data')
65898               .attr('class', 'layer layer-overlay')
65899               .merge(overlays)
65900               .each(function(layer) { select(this).call(layer); });
65901       }
65902
65903
65904       background.updateImagery = function() {
65905           if (context.inIntro()) return;
65906
65907           var b = background.baseLayerSource();
65908           var o = _overlayLayers
65909               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
65910               .map(function (d) { return d.source().id; })
65911               .join(',');
65912
65913           var meters = geoOffsetToMeters(b.offset());
65914           var epsilon = 0.01;
65915           var x = +meters[0].toFixed(2);
65916           var y = +meters[1].toFixed(2);
65917           var q = utilStringQs(window.location.hash.substring(1));
65918
65919           var id = b.id;
65920           if (id === 'custom') {
65921               id = 'custom:' + b.template();
65922           }
65923
65924           if (id) {
65925               q.background = id;
65926           } else {
65927               delete q.background;
65928           }
65929
65930           if (o) {
65931               q.overlays = o;
65932           } else {
65933               delete q.overlays;
65934           }
65935
65936           if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
65937               q.offset = x + ',' + y;
65938           } else {
65939               delete q.offset;
65940           }
65941
65942           if (!window.mocha) {
65943               window.location.replace('#' + utilQsString(q, true));
65944           }
65945
65946           var imageryUsed = [b.imageryUsed()];
65947
65948           _overlayLayers
65949               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
65950               .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
65951
65952           var data$$1 = context.layers().layer('data');
65953           if (data$$1 && data$$1.enabled() && data$$1.hasData()) {
65954               imageryUsed.push(data$$1.getSrc());
65955           }
65956
65957           var streetside = context.layers().layer('streetside');
65958           if (streetside && streetside.enabled()) {
65959               imageryUsed.push('Bing Streetside');
65960           }
65961
65962           var mapillary_images = context.layers().layer('mapillary-images');
65963           if (mapillary_images && mapillary_images.enabled()) {
65964               imageryUsed.push('Mapillary Images');
65965           }
65966
65967           var mapillary_signs = context.layers().layer('mapillary-signs');
65968           if (mapillary_signs && mapillary_signs.enabled()) {
65969               imageryUsed.push('Mapillary Signs');
65970           }
65971
65972           var openstreetcam_images = context.layers().layer('openstreetcam-images');
65973           if (openstreetcam_images && openstreetcam_images.enabled()) {
65974               imageryUsed.push('OpenStreetCam Images');
65975           }
65976
65977           context.history().imageryUsed(imageryUsed);
65978       };
65979
65980
65981       background.sources = function(extent) {
65982           if (!data.imagery || !data.imagery.query) return [];   // called before init()?
65983
65984           var matchIDs = {};
65985           var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
65986           matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
65987
65988           return _backgroundSources.filter(function(source) {
65989               return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
65990           });
65991       };
65992
65993
65994       background.dimensions = function(d) {
65995           if (!d) return;
65996           baseLayer.dimensions(d);
65997
65998           _overlayLayers.forEach(function(layer) {
65999               layer.dimensions(d);
66000           });
66001       };
66002
66003
66004       background.baseLayerSource = function(d) {
66005           if (!arguments.length) return baseLayer.source();
66006
66007           // test source against OSM imagery blacklists..
66008           var osm = context.connection();
66009           if (!osm) return background;
66010
66011           var blacklists = context.connection().imageryBlacklists();
66012           var template = d.template();
66013           var fail = false;
66014           var tested = 0;
66015           var regex;
66016
66017           for (var i = 0; i < blacklists.length; i++) {
66018               try {
66019                   regex = new RegExp(blacklists[i]);
66020                   fail = regex.test(template);
66021                   tested++;
66022                   if (fail) break;
66023               } catch (e) {
66024                   /* noop */
66025               }
66026           }
66027
66028           // ensure at least one test was run.
66029           if (!tested) {
66030               regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
66031               fail = regex.test(template);
66032           }
66033
66034           baseLayer.source(!fail ? d : background.findSource('none'));
66035           dispatch$$1.call('change');
66036           background.updateImagery();
66037           return background;
66038       };
66039
66040
66041       background.findSource = function(id) {
66042           return find$1(_backgroundSources, function(d) {
66043               return d.id && d.id === id;
66044           });
66045       };
66046
66047
66048       background.bing = function() {
66049           background.baseLayerSource(background.findSource('Bing'));
66050       };
66051
66052
66053       background.showsLayer = function(d) {
66054           return d.id === baseLayer.source().id ||
66055               _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
66056       };
66057
66058
66059       background.overlayLayerSources = function() {
66060           return _overlayLayers.map(function (l) { return l.source(); });
66061       };
66062
66063
66064       background.toggleOverlayLayer = function(d) {
66065           var layer;
66066           for (var i = 0; i < _overlayLayers.length; i++) {
66067               layer = _overlayLayers[i];
66068               if (layer.source() === d) {
66069                   _overlayLayers.splice(i, 1);
66070                   dispatch$$1.call('change');
66071                   background.updateImagery();
66072                   return;
66073               }
66074           }
66075
66076           layer = rendererTileLayer(context)
66077               .source(d)
66078               .projection(context.projection)
66079               .dimensions(baseLayer.dimensions()
66080           );
66081
66082           _overlayLayers.push(layer);
66083           dispatch$$1.call('change');
66084           background.updateImagery();
66085       };
66086
66087
66088       background.nudge = function(d, zoom) {
66089           baseLayer.source().nudge(d, zoom);
66090           dispatch$$1.call('change');
66091           background.updateImagery();
66092           return background;
66093       };
66094
66095
66096       background.offset = function(d) {
66097           if (!arguments.length) return baseLayer.source().offset();
66098           baseLayer.source().offset(d);
66099           dispatch$$1.call('change');
66100           background.updateImagery();
66101           return background;
66102       };
66103
66104
66105       background.brightness = function(d) {
66106           if (!arguments.length) return _brightness;
66107           _brightness = d;
66108           if (context.mode()) dispatch$$1.call('change');
66109           return background;
66110       };
66111
66112
66113       background.contrast = function(d) {
66114           if (!arguments.length) return _contrast;
66115           _contrast = d;
66116           if (context.mode()) dispatch$$1.call('change');
66117           return background;
66118       };
66119
66120
66121       background.saturation = function(d) {
66122           if (!arguments.length) return _saturation;
66123           _saturation = d;
66124           if (context.mode()) dispatch$$1.call('change');
66125           return background;
66126       };
66127
66128
66129       background.sharpness = function(d) {
66130           if (!arguments.length) return _sharpness;
66131           _sharpness = d;
66132           if (context.mode()) dispatch$$1.call('change');
66133           return background;
66134       };
66135
66136
66137       background.init = function() {
66138           function parseMap(qmap) {
66139               if (!qmap) return false;
66140               var args = qmap.split('/').map(Number);
66141               if (args.length < 3 || args.some(isNaN)) return false;
66142               return geoExtent$$1([args[2], args[1]]);
66143           }
66144
66145           var q = utilStringQs(window.location.hash.substring(1));
66146           var requested = q.background || q.layer;
66147           var extent = parseMap(q.map);
66148           var first;
66149           var best;
66150
66151
66152           data.imagery = data.imagery || [];
66153           data.imagery.features = {};
66154
66155           // build efficient index and querying for data.imagery
66156           var features = data.imagery.map(function(source) {
66157               if (!source.polygon) return null;
66158               var feature = {
66159                   type: 'Feature',
66160                   properties: { id: source.id },
66161                   geometry: { type: 'MultiPolygon', coordinates: [ source.polygon ] }
66162               };
66163
66164               data.imagery.features[source.id] = feature;
66165               return feature;
66166           }).filter(Boolean);
66167
66168           data.imagery.query = whichPolygon_1({
66169               type: 'FeatureCollection',
66170               features: features
66171           });
66172
66173
66174           // Add all the available imagery sources
66175           _backgroundSources = data.imagery.map(function(source) {
66176               if (source.type === 'bing') {
66177                   return rendererBackgroundSource.Bing(source, dispatch$$1);
66178               } else if (/^EsriWorldImagery/.test(source.id)) {
66179                   return rendererBackgroundSource.Esri(source);
66180               } else {
66181                   return rendererBackgroundSource(source);
66182               }
66183           });
66184
66185           first = _backgroundSources.length && _backgroundSources[0];
66186
66187           // Add 'None'
66188           _backgroundSources.unshift(rendererBackgroundSource.None());
66189
66190           // Add 'Custom'
66191           var template = context.storage('background-custom-template') || '';
66192           var custom = rendererBackgroundSource.Custom(template);
66193           _backgroundSources.unshift(custom);
66194
66195
66196           // Decide which background layer to display
66197           if (!requested && extent) {
66198               best = find$1(this.sources(extent), function(s) { return s.best(); });
66199           }
66200           if (requested && requested.indexOf('custom:') === 0) {
66201               template = requested.replace(/^custom:/, '');
66202               background.baseLayerSource(custom.template(template));
66203               context.storage('background-custom-template', template);
66204           } else {
66205               background.baseLayerSource(
66206                   background.findSource(requested) ||
66207                   best ||
66208                   background.findSource(context.storage('background-last-used')) ||
66209                   background.findSource('Bing') ||
66210                   first ||
66211                   background.findSource('none')
66212               );
66213           }
66214
66215           var locator = find$1(_backgroundSources, function(d) {
66216               return d.overlay && d.default;
66217           });
66218
66219           if (locator) {
66220               background.toggleOverlayLayer(locator);
66221           }
66222
66223           var overlays = (q.overlays || '').split(',');
66224           overlays.forEach(function(overlay) {
66225               overlay = background.findSource(overlay);
66226               if (overlay) {
66227                   background.toggleOverlayLayer(overlay);
66228               }
66229           });
66230
66231           if (q.gpx) {
66232               var gpx = context.layers().layer('data');
66233               if (gpx) {
66234                   gpx.url(q.gpx, '.gpx');
66235               }
66236           }
66237
66238           if (q.offset) {
66239               var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
66240                   return !isNaN(n) && n;
66241               });
66242
66243               if (offset.length === 2) {
66244                   background.offset(geoMetersToOffset(offset));
66245               }
66246           }
66247       };
66248
66249
66250       return utilRebind(background, dispatch$$1, 'on');
66251   }
66252
66253   function rendererFeatures(context) {
66254       var traffic_roads = {
66255           'motorway': true,
66256           'motorway_link': true,
66257           'trunk': true,
66258           'trunk_link': true,
66259           'primary': true,
66260           'primary_link': true,
66261           'secondary': true,
66262           'secondary_link': true,
66263           'tertiary': true,
66264           'tertiary_link': true,
66265           'residential': true,
66266           'unclassified': true,
66267           'living_street': true
66268       };
66269
66270       var service_roads = {
66271           'service': true,
66272           'road': true,
66273           'track': true
66274       };
66275
66276       var paths = {
66277           'path': true,
66278           'footway': true,
66279           'cycleway': true,
66280           'bridleway': true,
66281           'steps': true,
66282           'pedestrian': true,
66283           'corridor': true
66284       };
66285
66286       var past_futures = {
66287           'proposed': true,
66288           'construction': true,
66289           'abandoned': true,
66290           'dismantled': true,
66291           'disused': true,
66292           'razed': true,
66293           'demolished': true,
66294           'obliterated': true
66295       };
66296
66297       var dispatch$$1 = dispatch('change', 'redraw'),
66298           _cullFactor = 1,
66299           _cache = {},
66300           _features = {},
66301           _stats = {},
66302           _keys = [],
66303           _hidden = [];
66304
66305
66306       function update() {
66307           if (!window.mocha) {
66308               var q = utilStringQs(window.location.hash.substring(1));
66309               var disabled = features.disabled();
66310               if (disabled.length) {
66311                   q.disable_features = disabled.join(',');
66312               } else {
66313                   delete q.disable_features;
66314               }
66315               window.location.replace('#' + utilQsString(q, true));
66316               context.storage('disabled-features', disabled.join(','));
66317           }
66318           _hidden = features.hidden();
66319           dispatch$$1.call('change');
66320           dispatch$$1.call('redraw');
66321       }
66322
66323
66324       function defineFeature(k, filter, max) {
66325           var isEnabled = true;
66326
66327           _keys.push(k);
66328           _features[k] = {
66329               filter: filter,
66330               enabled: isEnabled,   // whether the user wants it enabled..
66331               count: 0,
66332               currentMax: (max || Infinity),
66333               defaultMax: (max || Infinity),
66334               enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
66335               disable: function() { this.enabled = false; this.currentMax = 0; },
66336               hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
66337               autoHidden: function() { return this.hidden() && this.currentMax > 0; }
66338           };
66339       }
66340
66341
66342       defineFeature('points', function isPoint(entity, resolver, geometry) {
66343           return geometry === 'point';
66344       }, 200);
66345
66346       defineFeature('traffic_roads', function isTrafficRoad(entity) {
66347           return traffic_roads[entity.tags.highway];
66348       });
66349
66350       defineFeature('service_roads', function isServiceRoad(entity) {
66351           return service_roads[entity.tags.highway];
66352       });
66353
66354       defineFeature('paths', function isPath(entity) {
66355           return paths[entity.tags.highway];
66356       });
66357
66358       defineFeature('buildings', function isBuilding(entity) {
66359           return (
66360               !!entity.tags['building:part'] ||
66361               (!!entity.tags.building && entity.tags.building !== 'no') ||
66362               entity.tags.parking === 'multi-storey' ||
66363               entity.tags.parking === 'sheds' ||
66364               entity.tags.parking === 'carports' ||
66365               entity.tags.parking === 'garage_boxes'
66366           );
66367       }, 250);
66368
66369       defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
66370           return geometry === 'area' &&
66371               !_features.buildings.filter(entity) &&
66372               !_features.water.filter(entity);
66373       });
66374
66375       defineFeature('boundaries', function isBoundary(entity) {
66376           return (
66377               !!entity.tags.boundary
66378           ) && !(
66379               traffic_roads[entity.tags.highway] ||
66380               service_roads[entity.tags.highway] ||
66381               paths[entity.tags.highway]
66382           );
66383       });
66384
66385       defineFeature('water', function isWater(entity) {
66386           return (
66387               !!entity.tags.waterway ||
66388               entity.tags.natural === 'water' ||
66389               entity.tags.natural === 'coastline' ||
66390               entity.tags.natural === 'bay' ||
66391               entity.tags.landuse === 'pond' ||
66392               entity.tags.landuse === 'basin' ||
66393               entity.tags.landuse === 'reservoir' ||
66394               entity.tags.landuse === 'salt_pond'
66395           );
66396       });
66397
66398       defineFeature('rail', function isRail(entity) {
66399           return (
66400               !!entity.tags.railway ||
66401               entity.tags.landuse === 'railway'
66402           ) && !(
66403               traffic_roads[entity.tags.highway] ||
66404               service_roads[entity.tags.highway] ||
66405               paths[entity.tags.highway]
66406           );
66407       });
66408
66409       defineFeature('power', function isPower(entity) {
66410           return !!entity.tags.power;
66411       });
66412
66413       // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
66414       defineFeature('past_future', function isPastFuture(entity) {
66415           if (
66416               traffic_roads[entity.tags.highway] ||
66417               service_roads[entity.tags.highway] ||
66418               paths[entity.tags.highway]
66419           ) { return false; }
66420
66421           var strings = Object.keys(entity.tags);
66422
66423           for (var i = 0; i < strings.length; i++) {
66424               var s = strings[i];
66425               if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
66426           }
66427           return false;
66428       });
66429
66430       // Lines or areas that don't match another feature filter.
66431       // IMPORTANT: The 'others' feature must be the last one defined,
66432       //   so that code in getMatches can skip this test if `hasMatch = true`
66433       defineFeature('others', function isOther(entity, resolver, geometry) {
66434           return (geometry === 'line' || geometry === 'area');
66435       });
66436
66437
66438       function features() {}
66439
66440
66441       features.features = function() {
66442           return _features;
66443       };
66444
66445
66446       features.keys = function() {
66447           return _keys;
66448       };
66449
66450
66451       features.enabled = function(k) {
66452           if (!arguments.length) {
66453               return _keys.filter(function(k) { return _features[k].enabled; });
66454           }
66455           return _features[k] && _features[k].enabled;
66456       };
66457
66458
66459       features.disabled = function(k) {
66460           if (!arguments.length) {
66461               return _keys.filter(function(k) { return !_features[k].enabled; });
66462           }
66463           return _features[k] && !_features[k].enabled;
66464       };
66465
66466
66467       features.hidden = function(k) {
66468           if (!arguments.length) {
66469               return _keys.filter(function(k) { return _features[k].hidden(); });
66470           }
66471           return _features[k] && _features[k].hidden();
66472       };
66473
66474
66475       features.autoHidden = function(k) {
66476           if (!arguments.length) {
66477               return _keys.filter(function(k) { return _features[k].autoHidden(); });
66478           }
66479           return _features[k] && _features[k].autoHidden();
66480       };
66481
66482
66483       features.enable = function(k) {
66484           if (_features[k] && !_features[k].enabled) {
66485               _features[k].enable();
66486               update();
66487           }
66488       };
66489
66490
66491       features.disable = function(k) {
66492           if (_features[k] && _features[k].enabled) {
66493               _features[k].disable();
66494               update();
66495           }
66496       };
66497
66498
66499       features.toggle = function(k) {
66500           if (_features[k]) {
66501               (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
66502               update();
66503           }
66504       };
66505
66506
66507       features.resetStats = function() {
66508           for (var i = 0; i < _keys.length; i++) {
66509               _features[_keys[i]].count = 0;
66510           }
66511           dispatch$$1.call('change');
66512       };
66513
66514
66515       features.gatherStats = function(d, resolver, dimensions) {
66516           var needsRedraw = false,
66517               type = groupBy(d, function(ent) { return ent.type; }),
66518               entities = [].concat(type.relation || [], type.way || [], type.node || []),
66519               currHidden, geometry, matches, i, j;
66520
66521           for (i = 0; i < _keys.length; i++) {
66522               _features[_keys[i]].count = 0;
66523           }
66524
66525           // adjust the threshold for point/building culling based on viewport size..
66526           // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
66527           _cullFactor = dimensions[0] * dimensions[1] / 1000000;
66528
66529           for (i = 0; i < entities.length; i++) {
66530               geometry = entities[i].geometry(resolver);
66531               if (!(geometry === 'vertex' || geometry === 'relation')) {
66532                   matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
66533                   for (j = 0; j < matches.length; j++) {
66534                       _features[matches[j]].count++;
66535                   }
66536               }
66537           }
66538
66539           currHidden = features.hidden();
66540           if (currHidden !== _hidden) {
66541               _hidden = currHidden;
66542               needsRedraw = true;
66543               dispatch$$1.call('change');
66544           }
66545
66546           return needsRedraw;
66547       };
66548
66549
66550       features.stats = function() {
66551           for (var i = 0; i < _keys.length; i++) {
66552               _stats[_keys[i]] = _features[_keys[i]].count;
66553           }
66554
66555           return _stats;
66556       };
66557
66558
66559       features.clear = function(d) {
66560           for (var i = 0; i < d.length; i++) {
66561               features.clearEntity(d[i]);
66562           }
66563       };
66564
66565
66566       features.clearEntity = function(entity) {
66567           delete _cache[osmEntity$$1.key(entity)];
66568       };
66569
66570
66571       features.reset = function() {
66572           _cache = {};
66573       };
66574
66575
66576       features.getMatches = function(entity, resolver, geometry) {
66577           if (geometry === 'vertex' || geometry === 'relation') return {};
66578
66579           var ent = osmEntity$$1.key(entity);
66580           if (!_cache[ent]) {
66581               _cache[ent] = {};
66582           }
66583
66584           if (!_cache[ent].matches) {
66585               var matches = {},
66586                   hasMatch = false;
66587
66588               for (var i = 0; i < _keys.length; i++) {
66589                   if (_keys[i] === 'others') {
66590                       if (hasMatch) continue;
66591
66592                       // Multipolygon members:
66593                       // If an entity...
66594                       //   1. is a way that hasn't matched other 'interesting' feature rules,
66595                       //   2. and it belongs to a single parent multipolygon relation
66596                       // ...then match whatever feature rules the parent multipolygon has matched.
66597                       // see #2548, #2887
66598                       //
66599                       // IMPORTANT:
66600                       // For this to work, getMatches must be called on relations before ways.
66601                       //
66602                       if (entity.type === 'way') {
66603                           var parents = features.getParents(entity, resolver, geometry);
66604                           if (parents.length === 1 && parents[0].isMultipolygon()) {
66605                               var pkey = osmEntity$$1.key(parents[0]);
66606                               if (_cache[pkey] && _cache[pkey].matches) {
66607                                   matches = clone(_cache[pkey].matches);
66608                                   continue;
66609                               }
66610                           }
66611                       }
66612                   }
66613
66614                   if (_features[_keys[i]].filter(entity, resolver, geometry)) {
66615                       matches[_keys[i]] = hasMatch = true;
66616                   }
66617               }
66618               _cache[ent].matches = matches;
66619           }
66620
66621           return _cache[ent].matches;
66622       };
66623
66624
66625       features.getParents = function(entity, resolver, geometry) {
66626           if (geometry === 'point') return [];
66627
66628           var ent = osmEntity$$1.key(entity);
66629           if (!_cache[ent]) {
66630               _cache[ent] = {};
66631           }
66632
66633           if (!_cache[ent].parents) {
66634               var parents = [];
66635               if (geometry === 'vertex') {
66636                   parents = resolver.parentWays(entity);
66637               } else {   // 'line', 'area', 'relation'
66638                   parents = resolver.parentRelations(entity);
66639               }
66640               _cache[ent].parents = parents;
66641           }
66642           return _cache[ent].parents;
66643       };
66644
66645
66646       features.isHiddenFeature = function(entity, resolver, geometry) {
66647           if (!_hidden.length) return false;
66648           if (!entity.version) return false;
66649
66650           var matches = features.getMatches(entity, resolver, geometry);
66651
66652           for (var i = 0; i < _hidden.length; i++) {
66653               if (matches[_hidden[i]]) return true;
66654           }
66655           return false;
66656       };
66657
66658
66659       features.isHiddenChild = function(entity, resolver, geometry) {
66660           if (!_hidden.length) return false;
66661           if (!entity.version || geometry === 'point') return false;
66662
66663           var parents = features.getParents(entity, resolver, geometry);
66664           if (!parents.length) return false;
66665
66666           for (var i = 0; i < parents.length; i++) {
66667               if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
66668                   return false;
66669               }
66670           }
66671           return true;
66672       };
66673
66674
66675       features.hasHiddenConnections = function(entity, resolver) {
66676           if (!_hidden.length) return false;
66677           var childNodes, connections;
66678
66679           if (entity.type === 'midpoint') {
66680               childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
66681               connections = [];
66682           } else {
66683               childNodes = entity.nodes ? resolver.childNodes(entity) : [];
66684               connections = features.getParents(entity, resolver, entity.geometry(resolver));
66685           }
66686
66687           // gather ways connected to child nodes..
66688           connections = reduce(childNodes, function(result, e) {
66689               return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
66690           }, connections);
66691
66692           return connections.length ? some(connections, function(e) {
66693               return features.isHidden(e, resolver, e.geometry(resolver));
66694           }) : false;
66695       };
66696
66697
66698       features.isHidden = function(entity, resolver, geometry) {
66699           if (!_hidden.length) return false;
66700           if (!entity.version) return false;
66701
66702           var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
66703           return fn(entity, resolver, geometry);
66704       };
66705
66706
66707       features.filter = function(d, resolver) {
66708           if (!_hidden.length) return d;
66709
66710           var result = [];
66711           for (var i = 0; i < d.length; i++) {
66712               var entity = d[i];
66713               if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
66714                   result.push(entity);
66715               }
66716           }
66717           return result;
66718       };
66719
66720
66721       features.init = function() {
66722           var storage = context.storage('disabled-features');
66723           if (storage) {
66724               var storageDisabled = storage.replace(/;/g, ',').split(',');
66725               storageDisabled.forEach(features.disable);
66726           }
66727
66728           var q = utilStringQs(window.location.hash.substring(1));
66729           if (q.disable_features) {
66730               var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
66731               hashDisabled.forEach(features.disable);
66732           }
66733       };
66734
66735       return utilRebind(features, dispatch$$1, 'on');
66736   }
66737
66738   function utilBindOnce(target, type, listener, capture) {
66739       var typeOnce = type + '.once';
66740       function one() {
66741           target.on(typeOnce, null);
66742           listener.apply(this, arguments);
66743       }
66744       target.on(typeOnce, one, capture);
66745       return this;
66746   }
66747
66748   // constants
66749   var TAU$1 = 2 * Math.PI;
66750   var TILESIZE = 256;
66751   var kMin = geoZoomToScale(2, TILESIZE);
66752   var kMax = geoZoomToScale(24, TILESIZE);
66753
66754
66755   function rendererMap(context) {
66756       var dispatch$$1 = dispatch('move', 'drawn');
66757       var projection = context.projection;
66758       var curtainProjection = context.curtainProjection;
66759       var drawLayers = svgLayers(projection, context);
66760       var drawPoints = svgPoints$$1(projection, context);
66761       var drawVertices = svgVertices$$1(projection, context);
66762       var drawLines = svgLines$$1(projection, context);
66763       var drawAreas = svgAreas$$1(projection, context);
66764       var drawMidpoints = svgMidpoints$$1(projection, context);
66765       var drawLabels = svgLabels(projection, context);
66766
66767       var _selection = select(null);
66768       var supersurface = select(null);
66769       var wrapper = select(null);
66770       var surface = select(null);
66771
66772       var dimensions = [1, 1];
66773       var _dblClickEnabled = true;
66774       var _redrawEnabled = true;
66775       var _transformStart = projection.transform();
66776       var _transformLast;
66777       var _transformed = false;
66778       var minzoom = 0;
66779       var mouse$$1;
66780       var mousemove;
66781
66782       var zoom$$1 = d3_zoom()
66783           .scaleExtent([kMin, kMax])
66784           .interpolate(interpolate)
66785           .filter(zoomEventFilter)
66786           .on('zoom', zoomPan);
66787
66788       var scheduleRedraw = throttle(redraw, 750);
66789       // var isRedrawScheduled = false;
66790       // var pendingRedrawCall;
66791       // function scheduleRedraw() {
66792       //     // Only schedule the redraw if one has not already been set.
66793       //     if (isRedrawScheduled) return;
66794       //     isRedrawScheduled = true;
66795       //     var that = this;
66796       //     var args = arguments;
66797       //     pendingRedrawCall = window.requestIdleCallback(function () {
66798       //         // Reset the boolean so future redraws can be set.
66799       //         isRedrawScheduled = false;
66800       //         redraw.apply(that, args);
66801       //     }, { timeout: 1400 });
66802       // }
66803
66804       function cancelPendingRedraw() {
66805           scheduleRedraw.cancel();
66806           // isRedrawScheduled = false;
66807           // window.cancelIdleCallback(pendingRedrawCall);
66808       }
66809
66810
66811       function map(selection$$1) {
66812           _selection = selection$$1;
66813
66814           context
66815               .on('change.map', immediateRedraw);
66816
66817           var osm = context.connection();
66818           if (osm) {
66819               osm.on('change.map', immediateRedraw);
66820           }
66821
66822           context.history()
66823               .on('change.map', immediateRedraw)
66824               .on('undone.map redone.map', function(stack) {
66825                   var mode = context.mode().id;
66826                   if (mode !== 'browse' && mode !== 'select') return;
66827
66828                   var followSelected = false;
66829                   if (Array.isArray(stack.selectedIDs)) {
66830                       followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
66831                       context.enter(
66832                           modeSelect(context, stack.selectedIDs).follow(followSelected)
66833                       );
66834                   }
66835                   if (!followSelected && stack.transform) {
66836                       map.transformEase(stack.transform);
66837                   }
66838               });
66839
66840           context.background()
66841               .on('change.map', immediateRedraw);
66842
66843           context.features()
66844               .on('redraw.map', immediateRedraw);
66845
66846           drawLayers
66847               .on('change.map', function() {
66848                   context.background().updateImagery();
66849                   immediateRedraw();
66850               });
66851
66852           selection$$1
66853               .on('dblclick.map', dblClick)
66854               .call(zoom$$1)
66855               .call(zoom$$1.transform, projection.transform());
66856
66857           supersurface = selection$$1.append('div')
66858               .attr('id', 'supersurface')
66859               .call(utilSetTransform, 0, 0);
66860
66861           // Need a wrapper div because Opera can't cope with an absolutely positioned
66862           // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
66863           wrapper = supersurface
66864               .append('div')
66865               .attr('class', 'layer layer-data');
66866
66867           map.surface = surface = wrapper
66868               .call(drawLayers)
66869               .selectAll('.surface')
66870               .attr('id', 'surface');
66871
66872           surface
66873               .call(drawLabels.observe)
66874               .on('mousedown.zoom', function() {
66875                   if (event.button === 2) {
66876                       event.stopPropagation();
66877                   }
66878               }, true)
66879               .on('mouseup.zoom', function() {
66880                   if (resetTransform()) immediateRedraw();
66881               })
66882               .on('mousemove.map', function() {
66883                   mousemove = event;
66884               })
66885               .on('mouseover.vertices', function() {
66886                   if (map.editable() && !_transformed) {
66887                       var hover = event.target.__data__;
66888                       surface.selectAll('.data-layer-osm')
66889                           .call(drawVertices.drawHover, context.graph(), hover, map.extent());
66890                       dispatch$$1.call('drawn', this, { full: false });
66891                   }
66892               })
66893               .on('mouseout.vertices', function() {
66894                   if (map.editable() && !_transformed) {
66895                       var hover = event.relatedTarget && event.relatedTarget.__data__;
66896                       surface.selectAll('.data-layer-osm')
66897                           .call(drawVertices.drawHover, context.graph(), hover, map.extent());
66898                       dispatch$$1.call('drawn', this, { full: false });
66899                   }
66900               });
66901
66902           supersurface
66903               .call(context.background());
66904
66905           context.on('enter.map',  function() {
66906               if (map.editable() && !_transformed) {
66907                   // redraw immediately any objects affected by a change in selectedIDs.
66908                   var graph = context.graph();
66909                   var selectedAndParents = {};
66910                   context.selectedIDs().forEach(function(id) {
66911                       var entity = graph.hasEntity(id);
66912                       if (entity) {
66913                           selectedAndParents[entity.id] = entity;
66914                           if (entity.type === 'node') {
66915                               graph.parentWays(entity).forEach(function(parent) {
66916                                   selectedAndParents[parent.id] = parent;
66917                               });
66918                           }
66919                       }
66920                   });
66921                   var data = values$1(selectedAndParents);
66922                   var filter = function(d) { return d.id in selectedAndParents; };
66923
66924                   data = context.features().filter(data, graph);
66925
66926                   surface.selectAll('.data-layer-osm')
66927                       .call(drawVertices.drawSelected, graph, map.extent())
66928                       .call(drawLines, graph, data, filter)
66929                       .call(drawAreas, graph, data, filter)
66930                       .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
66931
66932                   dispatch$$1.call('drawn', this, { full: false });
66933
66934                   // redraw everything else later
66935                   scheduleRedraw();
66936               }
66937           });
66938
66939           map.dimensions(utilGetDimensions(selection$$1));
66940       }
66941
66942
66943       function zoomEventFilter() {
66944           // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
66945           // Intercept `mousedown` and check if there is an orphaned zoom gesture.
66946           // This can happen if a previous `mousedown` occurred without a `mouseup`.
66947           // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
66948           // so that d3-zoom won't stop propagation of new `mousedown` events.
66949           if (event.type === 'mousedown') {
66950               var hasOrphan = false;
66951               var listeners = window.__on;
66952               for (var i = 0; i < listeners.length; i++) {
66953                   var listener = listeners[i];
66954                   if (listener.name === 'zoom' && listener.type === 'mouseup') {
66955                       hasOrphan = true;
66956                       break;
66957                   }
66958               }
66959               if (hasOrphan) {
66960                   var event$$1 = window.CustomEvent;
66961                   if (event$$1) {
66962                       event$$1 = new event$$1('mouseup');
66963                   } else {
66964                       event$$1 = window.document.createEvent('Event');
66965                       event$$1.initEvent('mouseup', false, false);
66966                   }
66967                   // Event needs to be dispatched with an event.view property.
66968                   event$$1.view = window;
66969                   window.dispatchEvent(event$$1);
66970               }
66971           }
66972
66973           return event.button !== 2;   // ignore right clicks
66974       }
66975
66976
66977       function pxCenter() {
66978           return [dimensions[0] / 2, dimensions[1] / 2];
66979       }
66980
66981
66982       function drawVector(difference, extent) {
66983           var mode = context.mode();
66984           var graph = context.graph();
66985           var features = context.features();
66986           var all = context.intersects(map.extent());
66987           var fullRedraw = false;
66988           var data;
66989           var filter;
66990
66991           if (difference) {
66992               var complete = difference.complete(map.extent());
66993               data = compact(values$1(complete));
66994               filter = function(d) { return d.id in complete; };
66995               features.clear(data);
66996
66997           } else {
66998               // force a full redraw if gatherStats detects that a feature
66999               // should be auto-hidden (e.g. points or buildings)..
67000               if (features.gatherStats(all, graph, dimensions)) {
67001                   extent = undefined;
67002               }
67003
67004               if (extent) {
67005                   data = context.intersects(map.extent().intersection(extent));
67006                   var set$$1 = set$2(map$3(data, 'id'));
67007                   filter = function(d) { return set$$1.has(d.id); };
67008
67009               } else {
67010                   data = all;
67011                   fullRedraw = true;
67012                   filter = utilFunctor(true);
67013               }
67014           }
67015
67016           data = features.filter(data, graph);
67017
67018           if (mode && mode.id === 'select') {
67019               // update selected vertices - the user might have just double-clicked a way,
67020               // creating a new vertex, triggering a partial redraw without a mode change
67021               surface.selectAll('.data-layer-osm')
67022                   .call(drawVertices.drawSelected, graph, map.extent());
67023           }
67024
67025           surface.selectAll('.data-layer-osm')
67026               .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
67027               .call(drawLines, graph, data, filter)
67028               .call(drawAreas, graph, data, filter)
67029               .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
67030               .call(drawLabels, graph, data, filter, dimensions, fullRedraw)
67031               .call(drawPoints, graph, data, filter);
67032
67033           dispatch$$1.call('drawn', this, {full: true});
67034       }
67035
67036
67037       function editOff() {
67038           context.features().resetStats();
67039           surface.selectAll('.layer-osm *').remove();
67040
67041           var mode = context.mode();
67042           if (mode && mode.id !== 'save' && mode.id !== 'select-note' && mode.id !== 'select-data') {
67043               context.enter(modeBrowse(context));
67044           }
67045
67046           dispatch$$1.call('drawn', this, {full: true});
67047       }
67048
67049
67050       function dblClick() {
67051           if (!_dblClickEnabled) {
67052               event.preventDefault();
67053               event.stopImmediatePropagation();
67054           }
67055       }
67056
67057
67058       function zoomPan(manualEvent) {
67059           var event$$1 = (manualEvent || event);
67060           var source = event$$1.sourceEvent;
67061           var eventTransform = event$$1.transform;
67062
67063           if (_transformStart.x === eventTransform.x &&
67064               _transformStart.y === eventTransform.y &&
67065               _transformStart.k === eventTransform.k) {
67066               return;  // no change
67067           }
67068
67069           // Normalize mousewheel - #3029
67070           // If wheel delta is provided in LINE units, recalculate it in PIXEL units
67071           // We are essentially redoing the calculations that occur here:
67072           //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
67073           // See this for more info:
67074           //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
67075           if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
67076               // pick sensible scroll amount if user scrolling fast or slow..
67077               var lines = Math.abs(source.deltaY);
67078               var scroll = lines > 2 ? 40 : lines * 10;
67079
67080               var t0 = _transformed ? _transformLast : _transformStart;
67081               var p0 = mouse$$1(source);
67082               var p1 = t0.invert(p0);
67083               var k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500);
67084               var x2 = p0[0] - p1[0] * k2;
67085               var y2 = p0[1] - p1[1] * k2;
67086
67087               eventTransform = identity$7.translate(x2,y2).scale(k2);
67088               _selection.node().__zoom = eventTransform;
67089           }
67090
67091           if (geoScaleToZoom(eventTransform.k, TILESIZE) < minzoom) {
67092               surface.interrupt();
67093               uiFlash().text(t('cannot_zoom'))();
67094               setZoom(context.minEditableZoom(), true);
67095               scheduleRedraw();
67096               dispatch$$1.call('move', this, map);
67097               return;
67098           }
67099
67100           projection.transform(eventTransform);
67101
67102           var scale = eventTransform.k / _transformStart.k;
67103           var tX = (eventTransform.x / scale - _transformStart.x) * scale;
67104           var tY = (eventTransform.y / scale - _transformStart.y) * scale;
67105
67106           if (context.inIntro()) {
67107               curtainProjection.transform({
67108                   x: eventTransform.x - tX,
67109                   y: eventTransform.y - tY,
67110                   k: eventTransform.k
67111               });
67112           }
67113
67114           if (source) mousemove = event$$1;
67115           _transformed = true;
67116           _transformLast = eventTransform;
67117           utilSetTransform(supersurface, tX, tY, scale);
67118           scheduleRedraw();
67119
67120           dispatch$$1.call('move', this, map);
67121       }
67122
67123
67124       function resetTransform() {
67125           if (!_transformed) return false;
67126
67127           // deprecation warning - Radial Menu to be removed in iD v3
67128           surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
67129           utilSetTransform(supersurface, 0, 0);
67130           _transformed = false;
67131           if (context.inIntro()) {
67132               curtainProjection.transform(projection.transform());
67133           }
67134           return true;
67135       }
67136
67137
67138       function redraw(difference, extent) {
67139           if (surface.empty() || !_redrawEnabled) return;
67140
67141           // If we are in the middle of a zoom/pan, we can't do differenced redraws.
67142           // It would result in artifacts where differenced entities are redrawn with
67143           // one transform and unchanged entities with another.
67144           if (resetTransform()) {
67145               difference = extent = undefined;
67146           }
67147
67148           var zoom$$1 = map.zoom();
67149           var z = String(~~zoom$$1);
67150
67151           if (surface.attr('data-zoom') !== z) {
67152               surface.attr('data-zoom', z);
67153           }
67154
67155           // class surface as `lowzoom` around z17-z18.5 (based on latitude)
67156           var lat = map.center()[1];
67157           var lowzoom = linear$2()
67158               .domain([-60, 0, 60])
67159               .range([17, 18.5, 17])
67160               .clamp(true);
67161
67162           surface
67163               .classed('low-zoom', zoom$$1 <= lowzoom(lat));
67164
67165
67166           if (!difference) {
67167               supersurface.call(context.background());
67168           }
67169
67170           wrapper
67171               .call(drawLayers);
67172
67173           // OSM
67174           if (map.editable()) {
67175               context.loadTiles(projection);
67176               drawVector(difference, extent);
67177           } else {
67178               editOff();
67179           }
67180
67181           _transformStart = projection.transform();
67182
67183           return map;
67184       }
67185
67186
67187
67188       var immediateRedraw = function(difference, extent) {
67189           if (!difference && !extent) cancelPendingRedraw();
67190           redraw(difference, extent);
67191       };
67192
67193
67194       map.mouse = function() {
67195           var event$$1 = mousemove || event;
67196           if (event$$1) {
67197               var s;
67198               while ((s = event$$1.sourceEvent)) { event$$1 = s; }
67199               return mouse$$1(event$$1);
67200           }
67201           return null;
67202       };
67203
67204
67205       // returns Lng/Lat
67206       map.mouseCoordinates = function() {
67207           var coord = map.mouse() || pxCenter();
67208           return projection.invert(coord);
67209       };
67210
67211
67212       map.dblclickEnable = function(_) {
67213           if (!arguments.length) return _dblClickEnabled;
67214           _dblClickEnabled = _;
67215           return map;
67216       };
67217
67218
67219       map.redrawEnable = function(_) {
67220           if (!arguments.length) return _redrawEnabled;
67221           _redrawEnabled = _;
67222           return map;
67223       };
67224
67225
67226       map.isTransformed = function() {
67227           return _transformed;
67228       };
67229
67230
67231       function setTransform(t2, duration, force) {
67232           var t$$1 = projection.transform();
67233           if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
67234               return false;
67235           }
67236
67237           if (duration) {
67238               _selection
67239                   .transition()
67240                   .duration(duration)
67241                   .on('start', function() { map.startEase(); })
67242                   .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
67243           } else {
67244               projection.transform(t2);
67245               _transformStart = t2;
67246               _selection.call(zoom$$1.transform, _transformStart);
67247           }
67248       }
67249
67250
67251       function setZoom(z2, force, duration) {
67252           if (z2 === map.zoom() && !force) {
67253               return false;
67254           }
67255
67256           var k = projection.scale();
67257           var k2 = Math.max(kMin, Math.min(kMax, geoZoomToScale(z2, TILESIZE)));
67258           var center = pxCenter();
67259           var l = pointLocation(center);
67260
67261           projection.scale(k2);
67262
67263           var t$$1 = projection.translate();
67264           l = locationPoint(l);
67265
67266           t$$1[0] += center[0] - l[0];
67267           t$$1[1] += center[1] - l[1];
67268
67269           if (duration) {
67270               projection.scale(k);  // reset scale
67271               _selection
67272                   .transition()
67273                   .duration(duration)
67274                   .on('start', function() { map.startEase(); })
67275                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
67276           } else {
67277               projection.translate(t$$1);
67278               _transformStart = projection.transform();
67279               _selection.call(zoom$$1.transform, _transformStart);
67280           }
67281
67282           return true;
67283
67284
67285           function locationPoint(l) {
67286               var translate = projection.translate();
67287               var scale = projection.scale() * TAU$1;
67288               return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
67289           }
67290
67291           function pointLocation(p) {
67292               var translate = projection.translate();
67293               var scale = projection.scale() * TAU$1;
67294               return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
67295           }
67296       }
67297
67298
67299       function setCenter(loc2, duration) {
67300           var c = map.center();
67301           if (loc2[0] === c[0] && loc2[1] === c[1]) {
67302               return false;
67303           }
67304
67305           var t$$1 = projection.translate();
67306           var k = projection.scale();
67307           var pxC = pxCenter();
67308           var ll = projection(loc2);
67309
67310           t$$1[0] = t$$1[0] - ll[0] + pxC[0];
67311           t$$1[1] = t$$1[1] - ll[1] + pxC[1];
67312
67313           if (duration) {
67314               _selection
67315                   .transition()
67316                   .duration(duration)
67317                   .on('start', function() { map.startEase(); })
67318                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
67319           } else {
67320               projection.translate(t$$1);
67321               _transformStart = projection.transform();
67322               _selection.call(zoom$$1.transform, _transformStart);
67323           }
67324
67325           return true;
67326       }
67327
67328
67329       map.pan = function(delta, duration) {
67330           var t$$1 = projection.translate();
67331           var k = projection.scale();
67332
67333           t$$1[0] += delta[0];
67334           t$$1[1] += delta[1];
67335
67336           if (duration) {
67337               _selection
67338                   .transition()
67339                   .duration(duration)
67340                   .on('start', function() { map.startEase(); })
67341                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
67342           } else {
67343               projection.translate(t$$1);
67344               _transformStart = projection.transform();
67345               _selection.call(zoom$$1.transform, _transformStart);
67346               dispatch$$1.call('move', this, map);
67347               immediateRedraw();
67348           }
67349
67350           return map;
67351       };
67352
67353
67354       map.dimensions = function(_) {
67355           if (!arguments.length) return dimensions;
67356           var center = map.center();
67357           dimensions = _;
67358           drawLayers.dimensions(dimensions);
67359           context.background().dimensions(dimensions);
67360           projection.clipExtent([[0, 0], dimensions]);
67361           mouse$$1 = utilFastMouse(supersurface.node());
67362           setCenter(center);
67363
67364           scheduleRedraw();
67365           return map;
67366       };
67367
67368
67369       function zoomIn(delta) {
67370           setZoom(~~map.zoom() + delta, true, 250);
67371       }
67372
67373       function zoomOut(delta) {
67374           setZoom(~~map.zoom() - delta, true, 250);
67375       }
67376
67377       map.zoomIn = function() { zoomIn(1); };
67378       map.zoomInFurther = function() { zoomIn(4); };
67379
67380       map.zoomOut = function() { zoomOut(1); };
67381       map.zoomOutFurther = function() { zoomOut(4); };
67382
67383
67384       map.center = function(loc2) {
67385           if (!arguments.length) {
67386               return projection.invert(pxCenter());
67387           }
67388
67389           if (setCenter(loc2)) {
67390               dispatch$$1.call('move', this, map);
67391           }
67392
67393           scheduleRedraw();
67394           return map;
67395       };
67396
67397
67398       map.zoom = function(z2) {
67399           if (!arguments.length) {
67400               return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
67401           }
67402
67403           if (z2 < minzoom) {
67404               surface.interrupt();
67405               uiFlash().text(t('cannot_zoom'))();
67406               z2 = context.minEditableZoom();
67407           }
67408
67409           if (setZoom(z2)) {
67410               dispatch$$1.call('move', this, map);
67411           }
67412
67413           scheduleRedraw();
67414           return map;
67415       };
67416
67417
67418       map.zoomTo = function(entity, zoomLimits) {
67419           var extent = entity.extent(context.graph());
67420           if (!isFinite(extent.area())) return;
67421
67422           var z2 = map.trimmedExtentZoom(extent);
67423           zoomLimits = zoomLimits || [context.minEditableZoom(), 19];
67424           map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
67425       };
67426
67427
67428       map.centerZoom = function(loc2, z2) {
67429           var centered = setCenter(loc2);
67430           var zoomed   = setZoom(z2);
67431
67432           if (centered || zoomed) {
67433               dispatch$$1.call('move', this, map);
67434           }
67435
67436           scheduleRedraw();
67437           return map;
67438       };
67439
67440
67441       map.centerEase = function(loc2, duration) {
67442           duration = duration || 250;
67443           setCenter(loc2, duration);
67444           return map;
67445       };
67446
67447
67448       map.zoomEase = function(z2, duration) {
67449           duration = duration || 250;
67450           setZoom(z2, false, duration);
67451           return map;
67452       };
67453
67454
67455       map.transformEase = function(t2, duration) {
67456           duration = duration || 250;
67457           setTransform(t2, duration, false);
67458           return map;
67459       };
67460
67461
67462       map.startEase = function() {
67463           utilBindOnce(surface, 'mousedown.ease', function() {
67464               map.cancelEase();
67465           });
67466           return map;
67467       };
67468
67469
67470       map.cancelEase = function() {
67471           _selection.interrupt();
67472           return map;
67473       };
67474
67475
67476       map.extent = function(_) {
67477           if (!arguments.length) {
67478               return new geoExtent$$1(
67479                   projection.invert([0, dimensions[1]]),
67480                   projection.invert([dimensions[0], 0])
67481               );
67482           } else {
67483               var extent = geoExtent$$1(_);
67484               map.centerZoom(extent.center(), map.extentZoom(extent));
67485           }
67486       };
67487
67488
67489       map.trimmedExtent = function(_) {
67490           if (!arguments.length) {
67491               var headerY = 60;
67492               var footerY = 30;
67493               var pad = 10;
67494               return new geoExtent$$1(
67495                   projection.invert([pad, dimensions[1] - footerY - pad]),
67496                   projection.invert([dimensions[0] - pad, headerY + pad])
67497               );
67498           } else {
67499               var extent = geoExtent$$1(_);
67500               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
67501           }
67502       };
67503
67504
67505       function calcZoom(extent, dim) {
67506           var tl = projection([extent[0][0], extent[1][1]]);
67507           var br = projection([extent[1][0], extent[0][1]]);
67508
67509           // Calculate maximum zoom that fits extent
67510           var hFactor = (br[0] - tl[0]) / dim[0];
67511           var vFactor = (br[1] - tl[1]) / dim[1];
67512           var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
67513           var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
67514           var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
67515
67516           return newZoom;
67517       }
67518
67519
67520       map.extentZoom = function(_) {
67521           return calcZoom(geoExtent$$1(_), dimensions);
67522       };
67523
67524
67525       map.trimmedExtentZoom = function(_) {
67526           var trimY = 120;
67527           var trimX = 40;
67528           var trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
67529           return calcZoom(geoExtent$$1(_), trimmed);
67530       };
67531
67532
67533       map.editable = function() {
67534           var osmLayer = surface.selectAll('.data-layer-osm');
67535           if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
67536
67537           return map.zoom() >= context.minEditableZoom();
67538       };
67539
67540
67541       map.notesEditable = function() {
67542           var noteLayer = surface.selectAll('.data-layer-notes');
67543           if (!noteLayer.empty() && noteLayer.classed('disabled')) return false;
67544
67545           return map.zoom() >= context.minEditableZoom();
67546       };
67547
67548
67549       map.minzoom = function(_) {
67550           if (!arguments.length) return minzoom;
67551           minzoom = _;
67552           return map;
67553       };
67554
67555
67556       map.layers = drawLayers;
67557
67558
67559       return utilRebind(map, dispatch$$1, 'on');
67560   }
67561
67562   function uiMapInMap(context) {
67563
67564       function map_in_map(selection$$1) {
67565           var backgroundLayer = rendererTileLayer(context);
67566           var overlayLayers = {};
67567           var projection$$1 = geoRawMercator();
67568           var dataLayer = svgData$$1(projection$$1, context).showLabels(false);
67569           var debugLayer = svgDebug$$1(projection$$1, context);
67570           var zoom$$1 = d3_zoom()
67571               .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
67572               .on('start', zoomStarted)
67573               .on('zoom', zoomed)
67574               .on('end', zoomEnded);
67575           var isTransformed = false;
67576           var isHidden = true;
67577           var skipEvents = false;
67578           var gesture = null;
67579           var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
67580           var wrap = select(null);
67581           var tiles = select(null);
67582           var viewport = select(null);
67583           var tStart;    // transform at start of gesture
67584           var tCurr;     // transform at most recent event
67585           var timeoutId;
67586
67587
67588           function zoomStarted() {
67589               if (skipEvents) return;
67590               tStart = tCurr = projection$$1.transform();
67591               gesture = null;
67592           }
67593
67594
67595           function zoomed() {
67596               if (skipEvents) return;
67597
67598               var x = event.transform.x;
67599               var y = event.transform.y;
67600               var k = event.transform.k;
67601               var isZooming = (k !== tStart.k);
67602               var isPanning = (x !== tStart.x || y !== tStart.y);
67603
67604               if (!isZooming && !isPanning) {
67605                   return;  // no change
67606               }
67607
67608               // lock in either zooming or panning, don't allow both in minimap.
67609               if (!gesture) {
67610                   gesture = isZooming ? 'zoom' : 'pan';
67611               }
67612
67613               var tMini = projection$$1.transform();
67614               var tX, tY, scale;
67615
67616               if (gesture === 'zoom') {
67617                   var dMini = utilGetDimensions(wrap);
67618                   var cMini = geoVecScale(dMini, 0.5);
67619                   scale = k / tMini.k;
67620                   tX = (cMini[0] / scale - cMini[0]) * scale;
67621                   tY = (cMini[1] / scale - cMini[1]) * scale;
67622               } else {
67623                   k = tMini.k;
67624                   scale = 1;
67625                   tX = x - tMini.x;
67626                   tY = y - tMini.y;
67627               }
67628
67629               utilSetTransform(tiles, tX, tY, scale);
67630               utilSetTransform(viewport, 0, 0, scale);
67631               isTransformed = true;
67632               tCurr = identity$7.translate(x, y).scale(k);
67633
67634               var zMain = geoScaleToZoom(context.projection.scale());
67635               var zMini = geoScaleToZoom(k);
67636
67637               zDiff = zMain - zMini;
67638
67639               queueRedraw();
67640           }
67641
67642
67643           function zoomEnded() {
67644               if (skipEvents) return;
67645               if (gesture !== 'pan') return;
67646
67647               updateProjection();
67648               gesture = null;
67649               var dMini = utilGetDimensions(wrap);
67650               var cMini = geoVecScale(dMini, 0.5);
67651               context.map().center(projection$$1.invert(cMini));   // recenter main map..
67652           }
67653
67654
67655           function updateProjection() {
67656               var loc = context.map().center();
67657               var dMini = utilGetDimensions(wrap);
67658               var cMini = geoVecScale(dMini, 0.5);
67659               var tMain = context.projection.transform();
67660               var zMain = geoScaleToZoom(tMain.k);
67661               var zMini = Math.max(zMain - zDiff, 0.5);
67662               var kMini = geoZoomToScale(zMini);
67663
67664               projection$$1
67665                   .translate([tMain.x, tMain.y])
67666                   .scale(kMini);
67667
67668               var point$$1 = projection$$1(loc);
67669               var mouse$$1 = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
67670               var xMini = cMini[0] - point$$1[0] + tMain.x + mouse$$1[0];
67671               var yMini = cMini[1] - point$$1[1] + tMain.y + mouse$$1[1];
67672
67673               projection$$1
67674                   .translate([xMini, yMini])
67675                   .clipExtent([[0, 0], dMini]);
67676
67677               tCurr = projection$$1.transform();
67678
67679               if (isTransformed) {
67680                   utilSetTransform(tiles, 0, 0);
67681                   utilSetTransform(viewport, 0, 0);
67682                   isTransformed = false;
67683               }
67684
67685               zoom$$1
67686                   .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
67687
67688               skipEvents = true;
67689               wrap.call(zoom$$1.transform, tCurr);
67690               skipEvents = false;
67691           }
67692
67693
67694           function redraw() {
67695               clearTimeout(timeoutId);
67696               if (isHidden) return;
67697
67698               updateProjection();
67699
67700               var dMini = utilGetDimensions(wrap);
67701               var zMini = geoScaleToZoom(projection$$1.scale());
67702
67703               // setup tile container
67704               tiles = wrap
67705                   .selectAll('.map-in-map-tiles')
67706                   .data([0]);
67707
67708               tiles = tiles.enter()
67709                   .append('div')
67710                   .attr('class', 'map-in-map-tiles')
67711                   .merge(tiles);
67712
67713               // redraw background
67714               backgroundLayer
67715                   .source(context.background().baseLayerSource())
67716                   .projection(projection$$1)
67717                   .dimensions(dMini);
67718
67719               var background = tiles
67720                   .selectAll('.map-in-map-background')
67721                   .data([0]);
67722
67723               background.enter()
67724                   .append('div')
67725                   .attr('class', 'map-in-map-background')
67726                   .merge(background)
67727                   .call(backgroundLayer);
67728
67729
67730               // redraw overlay
67731               var overlaySources = context.background().overlayLayerSources();
67732               var activeOverlayLayers = [];
67733               for (var i = 0; i < overlaySources.length; i++) {
67734                   if (overlaySources[i].validZoom(zMini)) {
67735                       if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
67736                       activeOverlayLayers.push(overlayLayers[i]
67737                           .source(overlaySources[i])
67738                           .projection(projection$$1)
67739                           .dimensions(dMini));
67740                   }
67741               }
67742
67743               var overlay = tiles
67744                   .selectAll('.map-in-map-overlay')
67745                   .data([0]);
67746
67747               overlay = overlay.enter()
67748                   .append('div')
67749                   .attr('class', 'map-in-map-overlay')
67750                   .merge(overlay);
67751
67752
67753               var overlays = overlay
67754                   .selectAll('div')
67755                   .data(activeOverlayLayers, function(d) { return d.source().name(); });
67756
67757               overlays.exit()
67758                   .remove();
67759
67760               overlays = overlays.enter()
67761                   .append('div')
67762                   .merge(overlays)
67763                   .each(function(layer) { select(this).call(layer); });
67764
67765
67766               var dataLayers = tiles
67767                   .selectAll('.map-in-map-data')
67768                   .data([0]);
67769
67770               dataLayers.exit()
67771                   .remove();
67772
67773               dataLayers = dataLayers.enter()
67774                   .append('svg')
67775                   .attr('class', 'map-in-map-data')
67776                   .merge(dataLayers)
67777                   .call(dataLayer)
67778                   .call(debugLayer);
67779
67780
67781               // redraw viewport bounding box
67782               if (gesture !== 'pan') {
67783                   var getPath = d3_geoPath(projection$$1);
67784                   var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
67785
67786                   viewport = wrap.selectAll('.map-in-map-viewport')
67787                       .data([0]);
67788
67789                   viewport = viewport.enter()
67790                       .append('svg')
67791                       .attr('class', 'map-in-map-viewport')
67792                       .merge(viewport);
67793
67794
67795                   var path = viewport.selectAll('.map-in-map-bbox')
67796                       .data([bbox]);
67797
67798                   path.enter()
67799                       .append('path')
67800                       .attr('class', 'map-in-map-bbox')
67801                       .merge(path)
67802                       .attr('d', getPath)
67803                       .classed('thick', function(d) { return getPath.area(d) < 30; });
67804               }
67805           }
67806
67807
67808           function queueRedraw() {
67809               clearTimeout(timeoutId);
67810               timeoutId = setTimeout(function() { redraw(); }, 750);
67811           }
67812
67813
67814           function toggle() {
67815               if (event) event.preventDefault();
67816
67817               isHidden = !isHidden;
67818
67819               select('.minimap-toggle-item')
67820                   .classed('active', !isHidden)
67821                   .select('input')
67822                   .property('checked', !isHidden);
67823
67824               if (isHidden) {
67825                   wrap
67826                       .style('display', 'block')
67827                       .style('opacity', '1')
67828                       .transition()
67829                       .duration(200)
67830                       .style('opacity', '0')
67831                       .on('end', function() {
67832                           selection$$1.selectAll('.map-in-map')
67833                               .style('display', 'none');
67834                       });
67835               } else {
67836                   wrap
67837                       .style('display', 'block')
67838                       .style('opacity', '0')
67839                       .transition()
67840                       .duration(200)
67841                       .style('opacity', '1')
67842                       .on('end', function() {
67843                           redraw();
67844                       });
67845               }
67846           }
67847
67848
67849           uiMapInMap.toggle = toggle;
67850
67851           wrap = selection$$1.selectAll('.map-in-map')
67852               .data([0]);
67853
67854           wrap = wrap.enter()
67855               .append('div')
67856               .attr('class', 'map-in-map')
67857               .style('display', (isHidden ? 'none' : 'block'))
67858               .call(zoom$$1)
67859               .on('dblclick.zoom', null)
67860               .merge(wrap);
67861
67862           context.map()
67863               .on('drawn.map-in-map', function(drawn) {
67864                   if (drawn.full === true) {
67865                       redraw();
67866                   }
67867               });
67868
67869           redraw();
67870
67871           var keybinding = d3keybinding('map-in-map')
67872               .on(t('background.minimap.key'), toggle);
67873
67874           select(document)
67875               .call(keybinding);
67876       }
67877
67878       return map_in_map;
67879   }
67880
67881   function uiSettingsCustomBackground(context) {
67882       var dispatch$$1 = dispatch('change');
67883
67884       function render(selection) {
67885           var _origSettings = {
67886               template: context.storage('background-custom-template')
67887           };
67888           var _currSettings = cloneDeep(_origSettings);
67889           var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
67890           var modal = uiConfirm(selection).okButton();
67891
67892           modal
67893               .classed('settings-modal settings-custom-background', true);
67894
67895           modal.select('.modal-section.header')
67896               .append('h3')
67897               .text(t('settings.custom_background.header'));
67898
67899
67900           var textSection = modal.select('.modal-section.message-text');
67901
67902           textSection
67903               .append('pre')
67904               .attr('class', 'instructions-template')
67905               .text(t('settings.custom_background.instructions', { example: example }));
67906
67907           textSection
67908               .append('textarea')
67909               .attr('class', 'field-template')
67910               .attr('placeholder', t('settings.custom_background.template.placeholder'))
67911               .call(utilNoAuto)
67912               .property('value', _currSettings.template);
67913
67914
67915           // insert a cancel button, and adjust the button widths
67916           var buttonSection = modal.select('.modal-section.buttons');
67917
67918           buttonSection
67919               .insert('button', '.ok-button')
67920               .attr('class', 'button col3 cancel-button secondary-action')
67921               .text(t('confirm.cancel'));
67922
67923
67924           buttonSection.select('.cancel-button')
67925               .on('click.cancel', clickCancel);
67926
67927           buttonSection.select('.ok-button')
67928               .classed('col3', true)
67929               .classed('col4', false)
67930               .attr('disabled', isSaveDisabled)
67931               .on('click.save', clickSave);
67932
67933
67934           function isSaveDisabled() {
67935               return null;
67936           }
67937
67938
67939           // restore the original template
67940           function clickCancel() {
67941               textSection.select('.field-template').property('value', _origSettings.template);
67942               context.storage('background-custom-template', _origSettings.template);
67943               this.blur();
67944               modal.close();
67945           }
67946
67947           // accept the current template
67948           function clickSave() {
67949               _currSettings.template = textSection.select('.field-template').property('value');
67950               context.storage('background-custom-template', _currSettings.template);
67951               this.blur();
67952               modal.close();
67953               dispatch$$1.call('change', this, _currSettings);
67954           }
67955       }
67956
67957       return utilRebind(render, dispatch$$1, 'on');
67958   }
67959
67960   function uiBackground(context) {
67961       var key = t('background.key');
67962
67963       var _customSource = context.background().findSource('custom');
67964       var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
67965       var _shown = false;
67966
67967       var _backgroundList = select(null);
67968       var _overlayList = select(null);
67969       var _displayOptionsContainer = select(null);
67970       var _offsetContainer = select(null);
67971
67972       var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
67973       var backgroundOffset = uiBackgroundOffset(context);
67974
67975       var settingsCustomBackground = uiSettingsCustomBackground(context)
67976           .on('change', customChanged);
67977
67978
67979       function setTooltips(selection$$1) {
67980           selection$$1.each(function(d, i, nodes) {
67981               var item = select(this).select('label');
67982               var span = item.select('span');
67983               var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
67984               var description = d.description();
67985               var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
67986
67987               if (d === _previousBackground) {
67988                   item.call(tooltip()
67989                       .placement(placement)
67990                       .html(true)
67991                       .title(function() {
67992                           var tip = '<div>' + t('background.switch') + '</div>';
67993                           return uiTooltipHtml(tip, uiCmd('⌘' + key));
67994                       })
67995                   );
67996               } else if (description || isOverflowing) {
67997                   item.call(tooltip()
67998                       .placement(placement)
67999                       .title(description || d.name())
68000                   );
68001               } else {
68002                   item.call(tooltip().destroy);
68003               }
68004           });
68005       }
68006
68007
68008       function updateLayerSelections(selection$$1) {
68009           function active(d) {
68010               return context.background().showsLayer(d);
68011           }
68012
68013           selection$$1.selectAll('.layer')
68014               .classed('active', active)
68015               .classed('switch', function(d) { return d === _previousBackground; })
68016               .call(setTooltips)
68017               .selectAll('input')
68018               .property('checked', active);
68019       }
68020
68021
68022       function chooseBackground(d) {
68023           if (d.id === 'custom' && !d.template()) {
68024               return editCustom();
68025           }
68026
68027           event.preventDefault();
68028           _previousBackground = context.background().baseLayerSource();
68029           context.storage('background-last-used-toggle', _previousBackground.id);
68030           context.storage('background-last-used', d.id);
68031           context.background().baseLayerSource(d);
68032           _backgroundList.call(updateLayerSelections);
68033           document.activeElement.blur();
68034       }
68035
68036
68037       function customChanged(d) {
68038           if (d && d.template) {
68039               _customSource.template(d.template);
68040               chooseBackground(_customSource);
68041           } else {
68042               _customSource.template('');
68043               chooseBackground(context.background().findSource('none'));
68044           }
68045       }
68046
68047
68048       function editCustom() {
68049           event.preventDefault();
68050           context.container()
68051               .call(settingsCustomBackground);
68052       }
68053
68054
68055       function chooseOverlay(d) {
68056           event.preventDefault();
68057           context.background().toggleOverlayLayer(d);
68058           _overlayList.call(updateLayerSelections);
68059           document.activeElement.blur();
68060       }
68061
68062
68063       function drawListItems(layerList, type, change, filter) {
68064           var sources = context.background()
68065               .sources(context.map().extent())
68066               .filter(filter);
68067
68068           var layerLinks = layerList.selectAll('li.layer')
68069               .data(sources, function(d) { return d.name(); });
68070
68071           layerLinks.exit()
68072               .remove();
68073
68074           var enter = layerLinks.enter()
68075               .append('li')
68076               .attr('class', 'layer')
68077               .classed('layer-custom', function(d) { return d.id === 'custom'; })
68078               .classed('best', function(d) { return d.best(); });
68079
68080           enter.filter(function(d) { return d.id === 'custom'; })
68081               .append('button')
68082               .attr('class', 'layer-browse')
68083               .call(tooltip()
68084                   .title(t('settings.custom_background.tooltip'))
68085                   .placement((textDirection === 'rtl') ? 'right' : 'left')
68086               )
68087               .on('click', editCustom)
68088               .call(svgIcon('#iD-icon-more'));
68089
68090           enter.filter(function(d) { return d.best(); })
68091               .append('div')
68092               .attr('class', 'best')
68093               .call(tooltip()
68094                   .title(t('background.best_imagery'))
68095                   .placement((textDirection === 'rtl') ? 'right' : 'left')
68096               )
68097               .append('span')
68098               .html('&#9733;');
68099
68100           var label = enter
68101               .append('label');
68102
68103           label
68104               .append('input')
68105               .attr('type', type)
68106               .attr('name', 'layers')
68107               .on('change', change);
68108
68109           label
68110               .append('span')
68111               .text(function(d) { return d.name(); });
68112
68113
68114           layerList.selectAll('li.layer')
68115               .sort(sortSources)
68116               .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
68117
68118           layerList
68119               .call(updateLayerSelections);
68120
68121
68122           function sortSources(a, b) {
68123               return a.best() && !b.best() ? -1
68124                   : b.best() && !a.best() ? 1
68125                   : d3_descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
68126           }
68127       }
68128
68129
68130       function renderBackgroundList(selection$$1) {
68131
68132           // the background list
68133           var container = selection$$1.selectAll('.layer-background-list')
68134               .data([0]);
68135
68136           _backgroundList = container.enter()
68137               .append('ul')
68138               .attr('class', 'layer-list layer-background-list')
68139               .attr('dir', 'auto')
68140               .merge(container);
68141
68142
68143           // add minimap toggle below list
68144           var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
68145               .data([0])
68146               .enter()
68147               .append('ul')
68148               .attr('class', 'layer-list minimap-toggle-list')
68149               .append('li')
68150               .attr('class', 'layer minimap-toggle-item');
68151
68152           var minimapLabelEnter = minimapEnter
68153               .append('label')
68154               .call(tooltip()
68155                   .html(true)
68156                   .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
68157                   .placement('top')
68158               );
68159
68160           minimapLabelEnter
68161               .append('input')
68162               .attr('type', 'checkbox')
68163               .on('change', function() {
68164                   event.preventDefault();
68165                   uiMapInMap.toggle();
68166               });
68167
68168           minimapLabelEnter
68169               .append('span')
68170               .text(t('background.minimap.description'));
68171
68172
68173           // "Info / Report a Problem" link
68174           selection$$1.selectAll('.imagery-faq')
68175               .data([0])
68176               .enter()
68177               .append('div')
68178               .attr('class', 'imagery-faq')
68179               .append('a')
68180               .attr('target', '_blank')
68181               .attr('tabindex', -1)
68182               .call(svgIcon('#iD-icon-out-link', 'inline'))
68183               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
68184               .append('span')
68185               .text(t('background.imagery_source_faq'));
68186       }
68187
68188
68189       function renderOverlayList(selection$$1) {
68190           var container = selection$$1.selectAll('.layer-overlay-list')
68191               .data([0]);
68192
68193           _overlayList = container.enter()
68194               .append('ul')
68195               .attr('class', 'layer-list layer-overlay-list')
68196               .attr('dir', 'auto')
68197               .merge(container);
68198       }
68199
68200
68201       function update() {
68202           _backgroundList
68203               .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
68204
68205           _overlayList
68206               .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
68207
68208           _displayOptionsContainer
68209               .call(backgroundDisplayOptions);
68210
68211           _offsetContainer
68212               .call(backgroundOffset);
68213       }
68214
68215
68216       function quickSwitch() {
68217           if (event) {
68218               event.stopImmediatePropagation();
68219               event.preventDefault();
68220           }
68221           if (_previousBackground) {
68222               chooseBackground(_previousBackground);
68223           }
68224       }
68225
68226
68227       function background(selection$$1) {
68228
68229           function hidePane() {
68230               setVisible(false);
68231           }
68232
68233           function togglePane() {
68234               if (event) event.preventDefault();
68235               paneTooltip.hide(button);
68236               setVisible(!button.classed('active'));
68237           }
68238
68239           function setVisible(show) {
68240               if (show !== _shown) {
68241                   button.classed('active', show);
68242                   _shown = show;
68243
68244                   if (show) {
68245                       uiMapData.hidePane();
68246                       uiHelp.hidePane();
68247                       update();
68248
68249                       pane
68250                           .style('display', 'block')
68251                           .style('right', '-300px')
68252                           .transition()
68253                           .duration(200)
68254                           .style('right', '0px');
68255
68256                   } else {
68257                       pane
68258                           .style('display', 'block')
68259                           .style('right', '0px')
68260                           .transition()
68261                           .duration(200)
68262                           .style('right', '-300px')
68263                           .on('end', function() {
68264                               select(this).style('display', 'none');
68265                           });
68266                   }
68267               }
68268           }
68269
68270
68271           var pane = selection$$1
68272               .append('div')
68273               .attr('class', 'fillL map-pane col4 hide');
68274
68275           var paneTooltip = tooltip()
68276               .placement((textDirection === 'rtl') ? 'right' : 'left')
68277               .html(true)
68278               .title(uiTooltipHtml(t('background.description'), key));
68279
68280           var button = selection$$1
68281               .append('button')
68282               .attr('tabindex', -1)
68283               .on('click', togglePane)
68284               .call(svgIcon('#iD-icon-layers', 'light'))
68285               .call(paneTooltip);
68286
68287
68288           var heading = pane
68289               .append('div')
68290               .attr('class', 'pane-heading');
68291
68292           heading
68293               .append('h2')
68294               .text(t('background.title'));
68295
68296           heading
68297               .append('button')
68298               .on('click', function() { uiBackground.hidePane(); })
68299               .call(svgIcon('#iD-icon-close'));
68300
68301
68302           var content = pane
68303               .append('div')
68304               .attr('class', 'pane-content');
68305
68306           // background list
68307           content
68308               .append('div')
68309               .attr('class', 'background-background-list-container')
68310               .call(uiDisclosure(context, 'background_list', true)
68311                   .title(t('background.backgrounds'))
68312                   .content(renderBackgroundList)
68313               );
68314
68315           // overlay list
68316           content
68317               .append('div')
68318               .attr('class', 'background-overlay-list-container')
68319               .call(uiDisclosure(context, 'overlay_list', true)
68320                   .title(t('background.overlays'))
68321                   .content(renderOverlayList)
68322               );
68323
68324           // display options
68325           _displayOptionsContainer = content
68326               .append('div')
68327               .attr('class', 'background-display-options');
68328
68329           // offset controls
68330           _offsetContainer = content
68331               .append('div')
68332               .attr('class', 'background-offset');
68333
68334
68335           // add listeners
68336           context.map()
68337               .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
68338
68339           context.background()
68340               .on('change.background-update', update);
68341
68342
68343           update();
68344
68345           var keybinding = d3keybinding('background')
68346               .on(key, togglePane)
68347               .on(uiCmd('⌘' + key), quickSwitch)
68348               .on([t('map_data.key'), t('help.key')], hidePane);
68349
68350           select(document)
68351               .call(keybinding);
68352
68353           uiBackground.hidePane = hidePane;
68354           uiBackground.togglePane = togglePane;
68355           uiBackground.setVisible = setVisible;
68356       }
68357
68358       return background;
68359   }
68360
68361   function uiContributors(context) {
68362       var osm = context.connection(),
68363           debouncedUpdate = debounce(function() { update(); }, 1000),
68364           limit = 4,
68365           hidden = false,
68366           wrap = select(null);
68367
68368
68369       function update() {
68370           if (!osm) return;
68371
68372           var users = {},
68373               entities = context.intersects(context.map().extent());
68374
68375           entities.forEach(function(entity) {
68376               if (entity && entity.user) users[entity.user] = true;
68377           });
68378
68379           var u = Object.keys(users),
68380               subset = u.slice(0, u.length > limit ? limit - 1 : limit);
68381
68382           wrap.html('')
68383               .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
68384
68385           var userList = select(document.createElement('span'));
68386
68387           userList.selectAll()
68388               .data(subset)
68389               .enter()
68390               .append('a')
68391               .attr('class', 'user-link')
68392               .attr('href', function(d) { return osm.userURL(d); })
68393               .attr('target', '_blank')
68394               .attr('tabindex', -1)
68395               .text(String);
68396
68397           if (u.length > limit) {
68398               var count = select(document.createElement('span'));
68399
68400               count.append('a')
68401                   .attr('target', '_blank')
68402                   .attr('tabindex', -1)
68403                   .attr('href', function() {
68404                       return osm.changesetsURL(context.map().center(), context.map().zoom());
68405                   })
68406                   .text(u.length - limit + 1);
68407
68408               wrap.append('span')
68409                   .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
68410
68411           } else {
68412               wrap.append('span')
68413                   .html(t('contributors.list', { users: userList.html() }));
68414           }
68415
68416           if (!u.length) {
68417               hidden = true;
68418               wrap
68419                   .transition()
68420                   .style('opacity', 0);
68421
68422           } else if (hidden) {
68423               wrap
68424                   .transition()
68425                   .style('opacity', 1);
68426           }
68427       }
68428
68429
68430       return function(selection$$1) {
68431           if (!osm) return;
68432           wrap = selection$$1;
68433           update();
68434
68435           osm.on('loaded.contributors', debouncedUpdate);
68436           context.map().on('move.contributors', debouncedUpdate);
68437       };
68438   }
68439
68440   function uiFeatureInfo(context) {
68441       function update(selection$$1) {
68442           var features = context.features(),
68443               stats = features.stats(),
68444               count = 0,
68445               hiddenList = compact(map$3(features.hidden(), function(k) {
68446                   if (stats[k]) {
68447                       count += stats[k];
68448                       return String(stats[k]) + ' ' + t('feature.' + k + '.description');
68449                   }
68450               }));
68451
68452           selection$$1.html('');
68453
68454           if (hiddenList.length) {
68455               var tooltipBehavior = tooltip()
68456                   .placement('top')
68457                   .html(true)
68458                   .title(function() {
68459                       return uiTooltipHtml(hiddenList.join('<br/>'));
68460                   });
68461
68462               var warning = selection$$1.append('a')
68463                   .attr('href', '#')
68464                   .attr('tabindex', -1)
68465                   .html(t('feature_info.hidden_warning', { count: count }))
68466                   .call(tooltipBehavior)
68467                   .on('click', function() {
68468                       tooltipBehavior.hide(warning);
68469                       // open map data panel?
68470                       event.preventDefault();
68471                   });
68472           }
68473
68474           selection$$1
68475               .classed('hide', !hiddenList.length);
68476       }
68477
68478
68479       return function(selection$$1) {
68480           update(selection$$1);
68481
68482           context.features().on('change.feature_info', function() {
68483               update(selection$$1);
68484           });
68485       };
68486   }
68487
68488   function uiFullScreen(context) {
68489       var element = context.container().node(),
68490           keybinding = d3keybinding('full-screen');
68491           // button;
68492
68493
68494       function getFullScreenFn() {
68495           if (element.requestFullscreen) {
68496               return element.requestFullscreen;
68497           } else if (element.msRequestFullscreen) {
68498               return element.msRequestFullscreen;
68499           } else if (element.mozRequestFullScreen) {
68500               return element.mozRequestFullScreen;
68501           } else if (element.webkitRequestFullscreen) {
68502               return element.webkitRequestFullscreen;
68503           }
68504       }
68505
68506
68507       function getExitFullScreenFn() {
68508           if (document.exitFullscreen) {
68509               return document.exitFullscreen;
68510           } else if (document.msExitFullscreen) {
68511               return document.msExitFullscreen;
68512           } else if (document.mozCancelFullScreen) {
68513               return document.mozCancelFullScreen;
68514           } else if (document.webkitExitFullscreen) {
68515               return document.webkitExitFullscreen;
68516           }
68517       }
68518
68519
68520       function isFullScreen() {
68521           return document.fullscreenElement ||
68522               document.mozFullScreenElement ||
68523               document.webkitFullscreenElement ||
68524               document.msFullscreenElement;
68525       }
68526
68527
68528       function isSupported() {
68529           return !!getFullScreenFn();
68530       }
68531
68532
68533       function fullScreen() {
68534           event.preventDefault();
68535           if (!isFullScreen()) {
68536               // button.classed('active', true);
68537               getFullScreenFn().apply(element);
68538           } else {
68539               // button.classed('active', false);
68540               getExitFullScreenFn().apply(document);
68541           }
68542       }
68543
68544
68545       return function() { // selection) {
68546           if (!isSupported())
68547               return;
68548
68549           // button = selection.append('button')
68550           //     .attr('title', t('full_screen'))
68551           //     .attr('tabindex', -1)
68552           //     .on('click', fullScreen)
68553           //     .call(tooltip);
68554
68555           // button.append('span')
68556           //     .attr('class', 'icon full-screen');
68557
68558           var detected = utilDetect();
68559           var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
68560           keybinding.on(keys, fullScreen);
68561
68562           select(document)
68563               .call(keybinding);
68564       };
68565   }
68566
68567   function uiLoading(context) {
68568       var _modalSelection = select(null);
68569       var _message = '';
68570       var _blocking = false;
68571
68572
68573       var loading = function(selection$$1) {
68574           _modalSelection = uiModal(selection$$1, _blocking);
68575
68576           var loadertext = _modalSelection.select('.content')
68577               .classed('loading-modal', true)
68578               .append('div')
68579               .attr('class', 'modal-section fillL');
68580
68581           loadertext
68582               .append('img')
68583               .attr('class', 'loader')
68584               .attr('src', context.imagePath('loader-white.gif'));
68585
68586           loadertext
68587               .append('h3')
68588               .text(_message);
68589
68590           _modalSelection.select('button.close')
68591               .attr('class', 'hide');
68592
68593           return loading;
68594       };
68595
68596
68597       loading.message = function(_) {
68598           if (!arguments.length) return _message;
68599           _message = _;
68600           return loading;
68601       };
68602
68603
68604       loading.blocking = function(_) {
68605           if (!arguments.length) return _blocking;
68606           _blocking = _;
68607           return loading;
68608       };
68609
68610
68611       loading.close = function() {
68612           _modalSelection.remove();
68613       };
68614
68615
68616       return loading;
68617   }
68618
68619   function uiGeolocate(context) {
68620       var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
68621           locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
68622           timeoutId;
68623
68624
68625       function click() {
68626           if (context.inIntro()) return;
68627           context.enter(modeBrowse(context));
68628           context.container().call(locating);
68629           navigator.geolocation.getCurrentPosition(success, error, geoOptions);
68630
68631           // This timeout ensures that we still call finish() even if
68632           // the user declines to share their location in Firefox
68633           timeoutId = setTimeout(finish, 10000 /* 10sec */ );
68634       }
68635
68636
68637       function success(position) {
68638           var map = context.map(),
68639               extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
68640                   .padByMeters(position.coords.accuracy);
68641
68642           map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
68643           finish();
68644       }
68645
68646
68647       function error() {
68648           finish();
68649       }
68650
68651
68652       function finish() {
68653           locating.close();  // unblock ui
68654           if (timeoutId) { clearTimeout(timeoutId); }
68655           timeoutId = undefined;
68656       }
68657
68658
68659       return function(selection) {
68660           if (!navigator.geolocation) return;
68661
68662           selection
68663               .append('button')
68664               .attr('tabindex', -1)
68665               .attr('title', t('geolocate.title'))
68666               .on('click', click)
68667               .call(svgIcon('#iD-icon-geolocate', 'light'))
68668               .call(tooltip()
68669                   .placement((textDirection === 'rtl') ? 'right' : 'left'));
68670       };
68671   }
68672
68673   function uiPanelBackground(context) {
68674       var background = context.background();
68675       var currSourceName = null;
68676       var metadata = {};
68677       var metadataKeys = [
68678           'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
68679       ];
68680
68681       var debouncedRedraw = debounce(redraw, 250);
68682
68683       function redraw(selection$$1) {
68684           var source = background.baseLayerSource(),
68685               isDG = (source.id.match(/^DigitalGlobe/i) !== null);
68686
68687           if (currSourceName !== source.name()) {
68688               currSourceName = source.name();
68689               metadata = {};
68690           }
68691
68692           selection$$1.html('');
68693
68694           var list = selection$$1
68695               .append('ul')
68696               .attr('class', 'background-info');
68697
68698           list
68699               .append('li')
68700               .text(currSourceName);
68701
68702           metadataKeys.forEach(function(k) {
68703               // DigitalGlobe vintage is available in raster layers for now.
68704               if (isDG && k === 'vintage') return;
68705
68706               list
68707                   .append('li')
68708                   .attr('class', 'background-info-list-' + k)
68709                   .classed('hide', !metadata[k])
68710                   .text(t('info_panels.background.' + k) + ':')
68711                   .append('span')
68712                   .attr('class', 'background-info-span-' + k)
68713                   .text(metadata[k]);
68714           });
68715
68716           debouncedGetMetadata(selection$$1);
68717
68718           var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
68719
68720           selection$$1
68721               .append('a')
68722               .text(t('info_panels.background.' + toggleTiles))
68723               .attr('href', '#')
68724               .attr('class', 'button button-toggle-tiles')
68725               .on('click', function() {
68726                   event.preventDefault();
68727                   context.setDebug('tile', !context.getDebug('tile'));
68728                   selection$$1.call(redraw);
68729               });
68730
68731           if (isDG) {
68732               var key = source.id + '-vintage';
68733               var sourceVintage = context.background().findSource(key);
68734               var showsVintage = context.background().showsLayer(sourceVintage);
68735               var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
68736               selection$$1
68737                   .append('a')
68738                   .text(t('info_panels.background.' + toggleVintage))
68739                   .attr('href', '#')
68740                   .attr('class', 'button button-toggle-vintage')
68741                   .on('click', function() {
68742                       event.preventDefault();
68743                       context.background().toggleOverlayLayer(sourceVintage);
68744                       selection$$1.call(redraw);
68745                   });
68746           }
68747
68748           // disable if necessary
68749           ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
68750               if (source.id !== layerId) {
68751                   var key = layerId + '-vintage';
68752                   var sourceVintage = context.background().findSource(key);
68753                   if (context.background().showsLayer(sourceVintage)) {
68754                       context.background().toggleOverlayLayer(sourceVintage);
68755                   }
68756               }
68757           });
68758       }
68759
68760
68761       var debouncedGetMetadata = debounce(getMetadata, 250);
68762
68763       function getMetadata(selection$$1) {
68764           var tile = select('.layer-background img.tile-center');   // tile near viewport center
68765           if (tile.empty()) return;
68766
68767           var sourceName = currSourceName,
68768               d = tile.datum(),
68769               zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
68770               center = context.map().center();
68771
68772           // update zoom
68773           metadata.zoom = String(zoom);
68774           selection$$1.selectAll('.background-info-list-zoom')
68775               .classed('hide', false)
68776               .selectAll('.background-info-span-zoom')
68777               .text(metadata.zoom);
68778
68779           if (!d || !d.length >= 3) return;
68780
68781           background.baseLayerSource().getMetadata(center, d, function(err, result) {
68782               if (err || currSourceName !== sourceName) return;
68783
68784               // update vintage
68785               var vintage = result.vintage;
68786               metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
68787               selection$$1.selectAll('.background-info-list-vintage')
68788                   .classed('hide', false)
68789                   .selectAll('.background-info-span-vintage')
68790                   .text(metadata.vintage);
68791
68792               // update other metdata
68793               without(metadataKeys, 'zoom', 'vintage')
68794                   .forEach(function(k) {
68795                       var val = result[k];
68796                       metadata[k] = val;
68797                       selection$$1.selectAll('.background-info-list-' + k)
68798                           .classed('hide', !val)
68799                           .selectAll('.background-info-span-' + k)
68800                           .text(val);
68801                   });
68802           });
68803       }
68804
68805
68806       var panel = function(selection$$1) {
68807           selection$$1.call(redraw);
68808
68809           context.map()
68810               .on('drawn.info-background', function() {
68811                   selection$$1.call(debouncedRedraw);
68812               })
68813               .on('move.info-background', function() {
68814                   selection$$1.call(debouncedGetMetadata);
68815               });
68816
68817       };
68818
68819       panel.off = function() {
68820           context.map()
68821               .on('drawn.info-background', null)
68822               .on('move.info-background', null);
68823       };
68824
68825       panel.id = 'background';
68826       panel.title = t('info_panels.background.title');
68827       panel.key = t('info_panels.background.key');
68828
68829
68830       return panel;
68831   }
68832
68833   function uiPanelHistory(context) {
68834       var osm;
68835
68836       function displayTimestamp(timestamp) {
68837           if (!timestamp) return t('info_panels.history.unknown');
68838           var detected = utilDetect();
68839           var options = {
68840               day: 'numeric', month: 'short', year: 'numeric',
68841               hour: 'numeric', minute: 'numeric', second: 'numeric'
68842           };
68843           var d = new Date(timestamp);
68844           if (isNaN(d.getTime())) return t('info_panels.history.unknown');
68845           return d.toLocaleString(detected.locale, options);
68846       }
68847
68848
68849       function displayUser(selection, userName) {
68850           if (!userName) {
68851               selection
68852                   .append('span')
68853                   .text(t('info_panels.history.unknown'));
68854               return;
68855           }
68856
68857           selection
68858               .append('span')
68859               .attr('class', 'user-name')
68860               .text(userName);
68861
68862           var links = selection
68863               .append('div')
68864               .attr('class', 'links');
68865
68866           if (osm) {
68867               links
68868                   .append('a')
68869                   .attr('class', 'user-osm-link')
68870                   .attr('href', osm.userURL(userName))
68871                   .attr('target', '_blank')
68872                   .attr('tabindex', -1)
68873                   .text('OSM');
68874           }
68875
68876           links
68877               .append('a')
68878               .attr('class', 'user-hdyc-link')
68879               .attr('href', 'https://hdyc.neis-one.org/?' + userName)
68880               .attr('target', '_blank')
68881               .attr('tabindex', -1)
68882               .text('HDYC');
68883       }
68884
68885
68886       function displayChangeset(selection, changeset) {
68887           if (!changeset) {
68888               selection
68889                   .append('span')
68890                   .text(t('info_panels.history.unknown'));
68891               return;
68892           }
68893
68894           selection
68895               .append('span')
68896               .attr('class', 'changeset-id')
68897               .text(changeset);
68898
68899           var links = selection
68900               .append('div')
68901               .attr('class', 'links');
68902
68903           if (osm) {
68904               links
68905                   .append('a')
68906                   .attr('class', 'changeset-osm-link')
68907                   .attr('href', osm.changesetURL(changeset))
68908                   .attr('target', '_blank')
68909                   .attr('tabindex', -1)
68910                   .text('OSM');
68911           }
68912
68913           links
68914               .append('a')
68915               .attr('class', 'changeset-osmcha-link')
68916               .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
68917               .attr('target', '_blank')
68918               .attr('tabindex', -1)
68919               .text('OSMCha');
68920       }
68921
68922
68923       function redraw(selection) {
68924           var selectedNoteID = context.selectedNoteID();
68925           osm = context.connection();
68926
68927           var selected, note, entity;
68928           if (selectedNoteID && osm) {       // selected 1 note
68929               selected = [ t('note.note') + ' ' + selectedNoteID ];
68930               note = osm.getNote(selectedNoteID);
68931           } else {                           // selected 1..n entities
68932               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
68933               if (selected.length) {
68934                   entity = context.entity(selected[0]);
68935               }
68936           }
68937
68938           var singular = selected.length === 1 ? selected[0] : null;
68939
68940           selection.html('');
68941
68942           selection
68943               .append('h4')
68944               .attr('class', 'history-heading')
68945               .text(singular || t('info_panels.history.selected', { n: selected.length }));
68946
68947           if (!singular) return;
68948
68949           if (entity) {
68950               selection.call(redrawEntity, entity);
68951           } else if (note) {
68952               selection.call(redrawNote, note);
68953           }
68954       }
68955
68956
68957       function redrawNote(selection, note) {
68958           if (!note || note.isNew()) {
68959               selection
68960                   .append('div')
68961                   .text(t('info_panels.history.note_no_history'));
68962               return;
68963           }
68964
68965           var list = selection
68966               .append('ul');
68967
68968           list
68969               .append('li')
68970               .text(t('info_panels.history.note_comments') + ':')
68971               .append('span')
68972               .text(note.comments.length);
68973
68974           if (note.comments.length) {
68975               list
68976                   .append('li')
68977                   .text(t('info_panels.history.note_created_date') + ':')
68978                   .append('span')
68979                   .text(displayTimestamp(note.comments[0].date));
68980
68981               list
68982                   .append('li')
68983                   .text(t('info_panels.history.note_created_user') + ':')
68984                   .call(displayUser, note.comments[0].user);
68985           }
68986
68987           if (osm) {
68988               selection
68989                   .append('a')
68990                   .attr('class', 'view-history-on-osm')
68991                   .attr('target', '_blank')
68992                   .attr('tabindex', -1)
68993                   .attr('href', osm.noteURL(note))
68994                   .call(svgIcon('#iD-icon-out-link', 'inline'))
68995                   .append('span')
68996                   .text(t('info_panels.history.note_link_text'));
68997           }
68998       }
68999
69000
69001       function redrawEntity(selection, entity) {
69002           if (!entity || entity.isNew()) {
69003               selection
69004                   .append('div')
69005                   .text(t('info_panels.history.no_history'));
69006               return;
69007           }
69008
69009           var list = selection
69010               .append('ul');
69011
69012           list
69013               .append('li')
69014               .text(t('info_panels.history.version') + ':')
69015               .append('span')
69016               .text(entity.version);
69017
69018           list
69019               .append('li')
69020               .text(t('info_panels.history.last_edit') + ':')
69021               .append('span')
69022               .text(displayTimestamp(entity.timestamp));
69023
69024           list
69025               .append('li')
69026               .text(t('info_panels.history.edited_by') + ':')
69027               .call(displayUser, entity.user);
69028
69029           list
69030               .append('li')
69031               .text(t('info_panels.history.changeset') + ':')
69032               .call(displayChangeset, entity.changeset);
69033
69034           if (osm) {
69035               selection
69036                   .append('a')
69037                   .attr('class', 'view-history-on-osm')
69038                   .attr('target', '_blank')
69039                   .attr('tabindex', -1)
69040                   .attr('href', osm.historyURL(entity))
69041                   .call(svgIcon('#iD-icon-out-link', 'inline'))
69042                   .append('span')
69043                   .text(t('info_panels.history.link_text'));
69044           }
69045       }
69046
69047
69048       var panel = function(selection) {
69049           selection.call(redraw);
69050
69051           context.map()
69052               .on('drawn.info-history', function() {
69053                   selection.call(redraw);
69054               });
69055
69056           context
69057               .on('enter.info-history', function() {
69058                   selection.call(redraw);
69059               });
69060       };
69061
69062       panel.off = function() {
69063           context.map().on('drawn.info-history', null);
69064           context.on('enter.info-history', null);
69065       };
69066
69067       panel.id = 'history';
69068       panel.title = t('info_panels.history.title');
69069       panel.key = t('info_panels.history.key');
69070
69071
69072       return panel;
69073   }
69074
69075   var OSM_PRECISION = 7;
69076   var locale$2 = utilDetect().locale;
69077
69078   /**
69079    * Returns a localized representation of the given length measurement.
69080    *
69081    * @param {Number} m area in meters
69082    * @param {Boolean} isImperial true for U.S. customary units; false for metric
69083    */
69084   function displayLength(m, isImperial) {
69085       var d = m * (isImperial ? 3.28084 : 1);
69086       var unit;
69087
69088       if (isImperial) {
69089           if (d >= 5280) {
69090               d /= 5280;
69091               unit = 'miles';
69092           } else {
69093               unit = 'feet';
69094           }
69095       } else {
69096           if (d >= 1000) {
69097               d /= 1000;
69098               unit = 'kilometers';
69099           } else {
69100               unit = 'meters';
69101           }
69102       }
69103
69104       return t('units.' + unit, {
69105           quantity: d.toLocaleString(locale$2, {
69106               maximumSignificantDigits: 4
69107           })
69108       });
69109   }
69110
69111   /**
69112    * Returns a localized representation of the given area measurement.
69113    *
69114    * @param {Number} m2 area in square meters
69115    * @param {Boolean} isImperial true for U.S. customary units; false for metric
69116    */
69117   function displayArea(m2, isImperial) {
69118       var d = m2 * (isImperial ? 10.7639111056 : 1);
69119       var d1, d2, area;
69120       var unit1 = '';
69121       var unit2 = '';
69122
69123       if (isImperial) {
69124           if (d >= 6969600) { // > 0.25mi² show mi²
69125               d1 = d / 27878400;
69126               unit1 = 'square_miles';
69127           } else {
69128               d1 = d;
69129               unit1 = 'square_feet';
69130           }
69131
69132           if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
69133               d2 = d / 43560;
69134               unit2 = 'acres';
69135           }
69136
69137       } else {
69138           if (d >= 250000) { // > 0.25km² show km²
69139               d1 = d / 1000000;
69140               unit1 = 'square_kilometers';
69141           } else {
69142               d1 = d;
69143               unit1 = 'square_meters';
69144           }
69145
69146           if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
69147               d2 = d / 10000;
69148               unit2 = 'hectares';
69149           }
69150       }
69151
69152       area = t('units.' + unit1, {
69153           quantity: d1.toLocaleString(locale$2, {
69154               maximumSignificantDigits: 4
69155           })
69156       });
69157
69158       if (d2) {
69159           return t('units.area_pair', {
69160               area1: area,
69161               area2: t('units.' + unit2, {
69162                   quantity: d2.toLocaleString(locale$2, {
69163                       maximumSignificantDigits: 2
69164                   })
69165               })
69166           });
69167       } else {
69168           return area;
69169       }
69170   }
69171
69172   function wrap(x, min, max) {
69173       var d = max - min;
69174       return ((x - min) % d + d) % d + min;
69175   }
69176
69177   function clamp(x, min, max) {
69178       return Math.max(min, Math.min(x, max));
69179   }
69180
69181   function displayCoordinate(deg, pos, neg) {
69182       var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
69183       var sec = (min - Math.floor(min)) * 60;
69184       var displayDegrees = t('units.arcdegrees', {
69185           quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
69186       });
69187       var displayCoordinate;
69188
69189       if (Math.floor(sec) > 0) {
69190           displayCoordinate = displayDegrees +
69191               t('units.arcminutes', {
69192                   quantity: Math.floor(min).toLocaleString(locale$2)
69193               }) +
69194               t('units.arcseconds', {
69195                   quantity: Math.round(sec).toLocaleString(locale$2)
69196               });
69197       } else if (Math.floor(min) > 0) {
69198           displayCoordinate = displayDegrees +
69199               t('units.arcminutes', {
69200                   quantity: Math.round(min).toLocaleString(locale$2)
69201               });
69202       } else {
69203           displayCoordinate = t('units.arcdegrees', {
69204               quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
69205           });
69206       }
69207
69208       if (deg === 0) {
69209           return displayCoordinate;
69210       } else {
69211           return t('units.coordinate', {
69212               coordinate: displayCoordinate,
69213               direction: t('units.' + (deg > 0 ? pos : neg))
69214           });
69215       }
69216   }
69217
69218   /**
69219    * Returns given coordinate pair in degree-minute-second format.
69220    *
69221    * @param {Array<Number>} coord longitude and latitude
69222    */
69223   function dmsCoordinatePair(coord) {
69224       return t('units.coordinate_pair', {
69225           latitude: displayCoordinate(clamp(coord[1], -90, 90), 'north', 'south'),
69226           longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
69227       });
69228   }
69229
69230   /**
69231    * Returns the given coordinate pair in decimal format.
69232    * note: unlocalized to avoid comma ambiguity - see #4765
69233    *
69234    * @param {Array<Number>} coord longitude and latitude
69235    */
69236   function decimalCoordinatePair(coord) {
69237       return t('units.coordinate_pair', {
69238           latitude: clamp(coord[1], -90, 90).toFixed(OSM_PRECISION),
69239           longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
69240       });
69241   }
69242
69243   function uiPanelLocation(context) {
69244       var currLocation = '';
69245
69246
69247       function redraw(selection) {
69248           selection.html('');
69249
69250           var list = selection
69251               .append('ul');
69252
69253           // Mouse coordinates
69254           var coord = context.map().mouseCoordinates();
69255           if (coord.some(isNaN)) {
69256               coord = context.map().center();
69257           }
69258
69259           list
69260               .append('li')
69261               .text(dmsCoordinatePair(coord))
69262               .append('li')
69263               .text(decimalCoordinatePair(coord));
69264
69265           // Location Info
69266           selection
69267               .append('div')
69268               .attr('class', 'location-info')
69269               .text(currLocation || ' ');
69270
69271           debouncedGetLocation(selection, coord);
69272       }
69273
69274
69275       var debouncedGetLocation = debounce(getLocation, 250);
69276       function getLocation(selection, coord) {
69277           if (!services.geocoder) {
69278               currLocation = t('info_panels.location.unknown_location');
69279               selection.selectAll('.location-info')
69280                   .text(currLocation);
69281           } else {
69282               services.geocoder.reverse(coord, function(err, result) {
69283                   currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
69284                   selection.selectAll('.location-info')
69285                       .text(currLocation);
69286               });
69287           }
69288       }
69289
69290
69291       var panel = function(selection) {
69292           selection.call(redraw);
69293
69294           context.surface()
69295               .on('mousemove.info-location', function() {
69296                   selection.call(redraw);
69297               });
69298       };
69299
69300       panel.off = function() {
69301           context.surface()
69302               .on('mousemove.info-location', null);
69303       };
69304
69305       panel.id = 'location';
69306       panel.title = t('info_panels.location.title');
69307       panel.key = t('info_panels.location.key');
69308
69309
69310       return panel;
69311   }
69312
69313   function uiPanelMeasurement(context) {
69314       var locale = utilDetect().locale,
69315           isImperial = (locale.toLowerCase() === 'en-us');
69316
69317
69318       function radiansToMeters(r) {
69319           // using WGS84 authalic radius (6371007.1809 m)
69320           return r * 6371007.1809;
69321       }
69322
69323       function steradiansToSqmeters(r) {
69324           // http://gis.stackexchange.com/a/124857/40446
69325           return r / (4 * Math.PI) * 510065621724000;
69326       }
69327
69328
69329       function toLineString(feature) {
69330           if (feature.type === 'LineString') return feature;
69331
69332           var result = { type: 'LineString', coordinates: [] };
69333           if (feature.type === 'Polygon') {
69334               result.coordinates = feature.coordinates[0];
69335           } else if (feature.type === 'MultiPolygon') {
69336               result.coordinates = feature.coordinates[0][0];
69337           }
69338
69339           return result;
69340       }
69341
69342
69343       function nodeCount(feature) {
69344         if (feature.type === 'LineString') return feature.coordinates.length;
69345         if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
69346       }
69347
69348
69349       function redraw(selection$$1) {
69350           var resolver = context.graph();
69351           var selectedNoteID = context.selectedNoteID();
69352           var osm = services.osm;
69353
69354           var selected, center, entity, note, geometry;
69355
69356           if (selectedNoteID && osm) {       // selected 1 note
69357               selected = [ t('note.note') + ' ' + selectedNoteID ];
69358               note = osm.getNote(selectedNoteID);
69359               center = note.loc;
69360               geometry = 'note';
69361
69362           } else {                           // selected 1..n entities
69363               var extent = geoExtent$$1();
69364               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
69365               if (selected.length) {
69366                   for (var i = 0; i < selected.length; i++) {
69367                       entity = context.entity(selected[i]);
69368                       extent._extend(entity.extent(resolver));
69369                   }
69370                   center = extent.center();
69371                   geometry = entity.geometry(resolver);
69372               }
69373           }
69374
69375           var singular = selected.length === 1 ? selected[0] : null;
69376
69377           selection$$1.html('');
69378
69379           selection$$1
69380               .append('h4')
69381               .attr('class', 'measurement-heading')
69382               .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
69383
69384           if (!selected.length) return;
69385
69386
69387           var list = selection$$1
69388               .append('ul');
69389           var coordItem;
69390
69391           // multiple selected features, just display extent center..
69392           if (!singular) {
69393               coordItem = list
69394                   .append('li')
69395                   .text(t('info_panels.measurement.center') + ':');
69396               coordItem.append('span')
69397                   .text(dmsCoordinatePair(center));
69398               coordItem.append('span')
69399                   .text(decimalCoordinatePair(center));
69400               return;
69401           }
69402
69403           // single selected feature, display details..
69404           if (geometry === 'line' || geometry === 'area') {
69405               var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
69406               var feature = entity.asGeoJSON(resolver);
69407               var length = radiansToMeters(length$1(toLineString(feature)));
69408               var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
69409               var centroid = d3_geoCentroid(feature);
69410
69411               list
69412                   .append('li')
69413                   .text(t('info_panels.measurement.geometry') + ':')
69414                   .append('span')
69415                   .text(
69416                       closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
69417                   );
69418
69419               if (entity.type !== 'relation') {
69420                   list
69421                       .append('li')
69422                       .text(t('info_panels.measurement.node_count') + ':')
69423                       .append('span')
69424                       .text(nodeCount(feature).toLocaleString(locale));
69425               }
69426
69427               if (closed) {
69428                   var area = steradiansToSqmeters(entity.area(resolver));
69429                   list
69430                       .append('li')
69431                       .text(t('info_panels.measurement.area') + ':')
69432                       .append('span')
69433                       .text(displayArea(area, isImperial));
69434               }
69435
69436
69437               list
69438                   .append('li')
69439                   .text(lengthLabel + ':')
69440                   .append('span')
69441                   .text(displayLength(length, isImperial));
69442
69443               coordItem = list
69444                   .append('li')
69445                   .text(t('info_panels.measurement.centroid') + ':');
69446               coordItem.append('span')
69447                   .text(dmsCoordinatePair(centroid));
69448               coordItem.append('span')
69449                   .text(decimalCoordinatePair(centroid));
69450
69451               var toggle  = isImperial ? 'imperial' : 'metric';
69452
69453               selection$$1
69454                   .append('a')
69455                   .text(t('info_panels.measurement.' + toggle))
69456                   .attr('href', '#')
69457                   .attr('class', 'button button-toggle-units')
69458                   .on('click', function() {
69459                       event.preventDefault();
69460                       isImperial = !isImperial;
69461                       selection$$1.call(redraw);
69462                   });
69463
69464           } else {
69465               var centerLabel = t('info_panels.measurement.' +
69466                   (note || entity.type === 'node' ? 'location' : 'center'));
69467
69468               list
69469                   .append('li')
69470                   .text(t('info_panels.measurement.geometry') + ':')
69471                   .append('span')
69472                   .text(t('geometry.' + geometry));
69473
69474               coordItem = list
69475                   .append('li')
69476                   .text(centerLabel + ':');
69477               coordItem.append('span')
69478                   .text(dmsCoordinatePair(center));
69479               coordItem.append('span')
69480                   .text(decimalCoordinatePair(center));
69481           }
69482       }
69483
69484
69485       var panel = function(selection$$1) {
69486           selection$$1.call(redraw);
69487
69488           context.map()
69489               .on('drawn.info-measurement', function() {
69490                   selection$$1.call(redraw);
69491               });
69492
69493           context
69494               .on('enter.info-measurement', function() {
69495                   selection$$1.call(redraw);
69496               });
69497       };
69498
69499       panel.off = function() {
69500           context.map().on('drawn.info-measurement', null);
69501           context.on('enter.info-measurement', null);
69502       };
69503
69504       panel.id = 'measurement';
69505       panel.title = t('info_panels.measurement.title');
69506       panel.key = t('info_panels.measurement.key');
69507
69508
69509       return panel;
69510   }
69511
69512   var uiInfoPanels = {
69513       background: uiPanelBackground,
69514       history: uiPanelHistory,
69515       location: uiPanelLocation,
69516       measurement: uiPanelMeasurement,
69517   };
69518
69519   function uiInfo(context) {
69520       var ids = Object.keys(uiInfoPanels),
69521           wasActive = ['measurement'],
69522           panels = {},
69523           active = {};
69524
69525       // create panels
69526       ids.forEach(function(k) {
69527           if (!panels[k]) {
69528               panels[k] = uiInfoPanels[k](context);
69529               active[k] = false;
69530           }
69531       });
69532
69533
69534       function info(selection$$1) {
69535
69536           function redraw() {
69537               var activeids = ids.filter(function(k) { return active[k]; }).sort();
69538
69539               var containers = infoPanels.selectAll('.panel-container')
69540                   .data(activeids, function(k) { return k; });
69541
69542               containers.exit()
69543                   .style('opacity', 1)
69544                   .transition()
69545                   .duration(200)
69546                   .style('opacity', 0)
69547                   .on('end', function(d) {
69548                       select(this)
69549                           .call(panels[d].off)
69550                           .remove();
69551                   });
69552
69553               var enter = containers.enter()
69554                   .append('div')
69555                   .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
69556
69557               enter
69558                   .style('opacity', 0)
69559                   .transition()
69560                   .duration(200)
69561                   .style('opacity', 1);
69562
69563               var title = enter
69564                   .append('div')
69565                   .attr('class', 'panel-title fillD2');
69566
69567               title
69568                   .append('h3')
69569                   .text(function(d) { return panels[d].title; });
69570
69571               title
69572                   .append('button')
69573                   .attr('class', 'close')
69574                   .on('click', function (d) { toggle(d); })
69575                   .call(svgIcon('#iD-icon-close'));
69576
69577               enter
69578                   .append('div')
69579                   .attr('class', function(d) { return 'panel-content panel-content-' + d; });
69580
69581
69582               // redraw the panels
69583               infoPanels.selectAll('.panel-content')
69584                   .each(function(d) {
69585                       select(this).call(panels[d]);
69586                   });
69587           }
69588
69589
69590           function toggle(which) {
69591               if (event) {
69592                   event.stopImmediatePropagation();
69593                   event.preventDefault();
69594               }
69595
69596               var activeids = ids.filter(function(k) { return active[k]; });
69597
69598               if (which) {  // toggle one
69599                   active[which] = !active[which];
69600                   if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
69601                       wasActive = [which];
69602                   }
69603               } else {      // toggle all
69604                   if (activeids.length) {
69605                       wasActive = activeids;
69606                       activeids.forEach(function(k) { active[k] = false; });
69607                   } else {
69608                       wasActive.forEach(function(k) { active[k] = true; });
69609                   }
69610               }
69611
69612               redraw();
69613           }
69614
69615
69616           var infoPanels = selection$$1.selectAll('.info-panels')
69617               .data([0]);
69618
69619           infoPanels = infoPanels.enter()
69620               .append('div')
69621               .attr('class', 'info-panels')
69622               .merge(infoPanels);
69623
69624           redraw();
69625
69626           var keybinding = d3keybinding('info')
69627               .on(uiCmd('⌘' + t('info_panels.key')), toggle);
69628
69629           ids.forEach(function(k) {
69630               var key = t('info_panels.' + k + '.key', { default: null });
69631               if (!key) return;
69632               keybinding
69633                   .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
69634           });
69635
69636           select(document)
69637               .call(keybinding);
69638       }
69639
69640       return info;
69641   }
69642
69643   function uiModes(context) {
69644       var modes = [
69645           modeAddPoint$$1(context),
69646           modeAddLine$$1(context),
69647           modeAddArea$$1(context),
69648           modeAddNote$$1(context)
69649       ];
69650
69651
69652       function editable() {
69653           var mode = context.mode();
69654           return context.editable() && mode && mode.id !== 'save';
69655       }
69656
69657       function notesEnabled() {
69658           var noteLayer = context.layers().layer('notes');
69659           return noteLayer && noteLayer.enabled();
69660       }
69661
69662       function notesEditable() {
69663           var mode = context.mode();
69664           return context.map().notesEditable() && mode && mode.id !== 'save';
69665       }
69666
69667
69668       return function(selection$$1) {
69669           context
69670               .on('enter.editor', function(entered) {
69671                   selection$$1.selectAll('button.add-button')
69672                       .classed('active', function(mode) { return entered.button === mode.button; });
69673                   context.container()
69674                       .classed('mode-' + entered.id, true);
69675               });
69676
69677           context
69678               .on('exit.editor', function(exited) {
69679                   context.container()
69680                       .classed('mode-' + exited.id, false);
69681               });
69682
69683           var keybinding = d3keybinding('mode-buttons');
69684
69685           modes.forEach(function(mode) {
69686               keybinding.on(mode.key, function() {
69687                   if (mode.id === 'add-note' && !(notesEnabled() && notesEditable())) return;
69688                   if (mode.id !== 'add-note' && !editable()) return;
69689
69690                   if (mode.id === context.mode().id) {
69691                       context.enter(modeBrowse(context));
69692                   } else {
69693                       context.enter(mode);
69694                   }
69695               });
69696           });
69697
69698           select(document)
69699               .call(keybinding);
69700
69701
69702           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
69703
69704           context.map()
69705               .on('move.modes', debouncedUpdate)
69706               .on('drawn.modes', debouncedUpdate);
69707
69708           context
69709               .on('enter.modes', update);
69710
69711           update();
69712
69713
69714           function update() {
69715               var showNotes = notesEnabled();
69716               var data = showNotes ? modes : modes.slice(0, 3);
69717
69718               selection$$1
69719                   .classed('col3', !showNotes)  // 25%
69720                   .classed('col4', showNotes);  // 33%
69721
69722               var buttons = selection$$1.selectAll('button.add-button')
69723                   .data(data, function(d) { return d.id; });
69724
69725               // exit
69726               buttons.exit()
69727                   .remove();
69728
69729               // enter
69730               var buttonsEnter = buttons.enter()
69731                   .append('button')
69732                   .attr('tabindex', -1)
69733                   .attr('class', function(d) { return d.id + ' add-button'; })
69734                   .on('click.mode-buttons', function(mode) {
69735                       // When drawing, ignore accidental clicks on mode buttons - #4042
69736                       var currMode = context.mode().id;
69737                       if (currMode.match(/^draw/) !== null) return;
69738
69739                       if (mode.id === currMode) {
69740                           context.enter(modeBrowse(context));
69741                       } else {
69742                           context.enter(mode);
69743                       }
69744                   })
69745                   .call(tooltip()
69746                       .placement('bottom')
69747                       .html(true)
69748                       .title(function(mode) {
69749                           return uiTooltipHtml(mode.description, mode.key);
69750                       })
69751                   );
69752
69753               buttonsEnter
69754                   .each(function(d) {
69755                       select(this)
69756                           .call(svgIcon('#iD-icon-' + d.button, 'pre-text'));
69757                   });
69758
69759               buttonsEnter
69760                   .append('span')
69761                   .attr('class', 'label')
69762                   .text(function(mode) { return mode.title; });
69763
69764               // update
69765               buttons = buttons
69766                   .merge(buttonsEnter)
69767                   .classed('col3', showNotes)    // 25%
69768                   .classed('col4', !showNotes)   // 33%
69769                   .property('disabled', function(d) {
69770                       return d.id === 'add-note' ? !notesEditable() : !editable();
69771                   });
69772           }
69773       };
69774   }
69775
69776   function uiNotice(context) {
69777
69778       return function(selection$$1) {
69779           var div = selection$$1
69780               .append('div')
69781               .attr('class', 'notice');
69782
69783           var button = div
69784               .append('button')
69785               .attr('class', 'zoom-to notice fillD')
69786               .on('click', function() {
69787                   context.map().zoomEase(context.minEditableZoom());
69788               })
69789               .on('wheel', function() {   // let wheel events pass through #4482
69790                   var e2 = new WheelEvent(event.type, event);
69791                   context.surface().node().dispatchEvent(e2);
69792               });
69793
69794           button
69795               .call(svgIcon('#iD-icon-plus', 'pre-text'))
69796               .append('span')
69797               .attr('class', 'label')
69798               .text(t('zoom_in_edit'));
69799
69800
69801           function disableTooHigh() {
69802               var canEdit = context.map().zoom() >= context.minEditableZoom();
69803               div.style('display', canEdit ? 'none' : 'block');
69804           }
69805
69806           context.map()
69807               .on('move.notice', debounce(disableTooHigh, 500));
69808
69809           disableTooHigh();
69810       };
69811   }
69812
69813   function uiRestore(context) {
69814
69815       return function(selection) {
69816           if (!context.history().lock() || !context.history().restorableChanges())
69817               return;
69818
69819           var modalSelection = uiModal(selection, true);
69820
69821           modalSelection.select('.modal')
69822               .attr('class', 'modal fillL col6');
69823
69824           var introModal = modalSelection.select('.content');
69825
69826           introModal
69827               .attr('class','cf');
69828
69829           introModal
69830               .append('div')
69831               .attr('class', 'modal-section')
69832               .append('h3')
69833               .text(t('restore.heading'));
69834
69835           introModal
69836               .append('div')
69837               .attr('class','modal-section')
69838               .append('p')
69839               .text(t('restore.description'));
69840
69841           var buttonWrap = introModal
69842               .append('div')
69843               .attr('class', 'modal-actions cf');
69844
69845           var restore = buttonWrap
69846               .append('button')
69847               .attr('class', 'restore col6')
69848               .on('click', function() {
69849                   context.history().restore();
69850                   modalSelection.remove();
69851               });
69852
69853           restore
69854               .append('svg')
69855               .attr('class', 'logo logo-restore')
69856               .append('use')
69857               .attr('xlink:href', '#iD-logo-restore');
69858
69859           restore
69860               .append('div')
69861               .text(t('restore.restore'));
69862
69863           var reset = buttonWrap
69864               .append('button')
69865               .attr('class', 'reset col6')
69866               .on('click', function() {
69867                   context.history().clearSaved();
69868                   modalSelection.remove();
69869               });
69870
69871           reset
69872               .append('svg')
69873               .attr('class', 'logo logo-reset')
69874               .append('use')
69875               .attr('xlink:href', '#iD-logo-reset');
69876
69877           reset
69878               .append('div')
69879               .text(t('restore.reset'));
69880
69881           restore.node().focus();
69882       };
69883   }
69884
69885   function uiSave(context) {
69886       var history = context.history();
69887       var key = uiCmd('⌘S');
69888
69889
69890       function saving() {
69891           var mode = context.mode();
69892           return mode && mode.id === 'save';
69893       }
69894
69895
69896       function save() {
69897           event.preventDefault();
69898           if (!context.inIntro() && !saving() && history.hasChanges()) {
69899               context.enter(modeSave$$1(context));
69900           }
69901       }
69902
69903
69904       function getBackground(numChanges) {
69905           var step;
69906           if (numChanges === 0) {
69907               return null;
69908           } else if (numChanges <= 50) {
69909               step = numChanges / 50;
69910               return interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
69911           } else {
69912               step = Math.min((numChanges - 50) / 50, 1.0);
69913               return interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
69914           }
69915       }
69916
69917
69918       return function(selection$$1) {
69919           var numChanges = 0;
69920
69921           function updateCount() {
69922               var _ = history.difference().summary().length;
69923               if (_ === numChanges) return;
69924               numChanges = _;
69925
69926               tooltipBehavior
69927                   .title(uiTooltipHtml(
69928                       t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
69929                   );
69930
69931               var background = getBackground(numChanges);
69932
69933               button
69934                   .classed('disabled', numChanges === 0)
69935                   .classed('has-count', numChanges > 0)
69936                   .style('background', background);
69937
69938               button.select('span.count')
69939                   .text(numChanges)
69940                   .style('background', background)
69941                   .style('border-color', background);
69942           }
69943
69944
69945           var tooltipBehavior = tooltip()
69946               .placement('bottom')
69947               .html(true)
69948               .title(uiTooltipHtml(t('save.no_changes'), key));
69949
69950           var button = selection$$1
69951               .append('button')
69952               .attr('class', 'save col12 disabled')
69953               .attr('tabindex', -1)
69954               .on('click', save)
69955               .call(tooltipBehavior);
69956
69957           button
69958               .call(svgIcon('#iD-icon-save', 'pre-text'))
69959               .append('span')
69960               .attr('class', 'label')
69961               .text(t('save.title'));
69962
69963           button
69964               .append('span')
69965               .attr('class', 'count')
69966               .text('0');
69967
69968           updateCount();
69969
69970
69971           var keybinding = d3keybinding('uiSave')
69972               .on(key, save, true);
69973
69974           select(document)
69975               .call(keybinding);
69976
69977           context.history()
69978               .on('change.save', updateCount);
69979
69980           context
69981               .on('enter.save', function() {
69982                   button.property('disabled', saving());
69983                   if (saving()) button.call(tooltipBehavior.hide);
69984               });
69985       };
69986   }
69987
69988   function uiScale(context) {
69989       var projection = context.projection,
69990           isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
69991           maxLength = 180,
69992           tickHeight = 8;
69993
69994
69995       function scaleDefs(loc1, loc2) {
69996           var lat = (loc2[1] + loc1[1]) / 2,
69997               conversion = (isImperial ? 3.28084 : 1),
69998               dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
69999               scale = { dist: 0, px: 0, text: '' },
70000               buckets, i, val, dLon;
70001
70002           if (isImperial) {
70003               buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
70004           } else {
70005               buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
70006           }
70007
70008           // determine a user-friendly endpoint for the scale
70009           for (i = 0; i < buckets.length; i++) {
70010               val = buckets[i];
70011               if (dist >= val) {
70012                   scale.dist = Math.floor(dist / val) * val;
70013                   break;
70014               } else {
70015                   scale.dist = +dist.toFixed(2);
70016               }
70017           }
70018
70019           dLon = geoMetersToLon(scale.dist / conversion, lat);
70020           scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
70021
70022           scale.text = displayLength(scale.dist / conversion, isImperial);
70023
70024           return scale;
70025       }
70026
70027
70028       function update(selection) {
70029           // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
70030           var dims = context.map().dimensions(),
70031               loc1 = projection.invert([0, dims[1]]),
70032               loc2 = projection.invert([maxLength, dims[1]]),
70033               scale = scaleDefs(loc1, loc2);
70034
70035           selection.select('#scale-path')
70036               .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
70037
70038           selection.select('#scale-textgroup')
70039               .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
70040
70041           selection.select('#scale-text')
70042               .text(scale.text);
70043       }
70044
70045
70046       return function(selection) {
70047           function switchUnits() {
70048               isImperial = !isImperial;
70049               selection.call(update);
70050           }
70051
70052           var scalegroup = selection.append('svg')
70053               .attr('id', 'scale')
70054               .on('click', switchUnits)
70055               .append('g')
70056               .attr('transform', 'translate(10,11)');
70057
70058           scalegroup
70059               .append('path')
70060               .attr('id', 'scale-path');
70061
70062           scalegroup
70063               .append('g')
70064               .attr('id', 'scale-textgroup')
70065               .append('text')
70066               .attr('id', 'scale-text');
70067
70068           selection.call(update);
70069
70070           context.map().on('move.scale', function() {
70071               update(selection);
70072           });
70073       };
70074   }
70075
70076   function uiSidebar$$1(context) {
70077       var inspector = uiInspector(context);
70078       var dataEditor = uiDataEditor$$1(context);
70079       var noteEditor = uiNoteEditor$$1(context);
70080       var _current;
70081       var _wasData = false;
70082       var _wasNote = false;
70083
70084
70085       function sidebar(selection$$1) {
70086           var featureListWrap = selection$$1
70087               .append('div')
70088               .attr('class', 'feature-list-pane')
70089               .call(uiFeatureList(context));
70090
70091           var inspectorWrap = selection$$1
70092               .append('div')
70093               .attr('class', 'inspector-hidden inspector-wrap fr');
70094
70095
70096           function hover(datum) {
70097               if (datum && datum.__featurehash__) {   // hovering on data
70098                   _wasData = true;
70099                   sidebar
70100                       .show(dataEditor.datum(datum));
70101
70102                   selection$$1.selectAll('.sidebar-component')
70103                       .classed('inspector-hover', true);
70104
70105               } else if (datum instanceof osmNote) {
70106                   if (context.mode().id === 'drag-note') return;
70107                   _wasNote = true;
70108
70109                   sidebar
70110                       .show(noteEditor.note(datum));
70111
70112                   selection$$1.selectAll('.sidebar-component')
70113                       .classed('inspector-hover', true);
70114
70115               } else if (!_current && (datum instanceof osmEntity$$1)) {
70116                   featureListWrap
70117                       .classed('inspector-hidden', true);
70118
70119                   inspectorWrap
70120                       .classed('inspector-hidden', false)
70121                       .classed('inspector-hover', true);
70122
70123                   if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
70124                       inspector
70125                           .state('hover')
70126                           .entityID(datum.id);
70127
70128                       inspectorWrap
70129                           .call(inspector);
70130                   }
70131
70132               } else if (!_current) {
70133                   featureListWrap
70134                       .classed('inspector-hidden', false);
70135                   inspectorWrap
70136                       .classed('inspector-hidden', true);
70137                   inspector
70138                       .state('hide');
70139
70140               } else if (_wasData || _wasNote) {
70141                   _wasNote = false;
70142                   _wasData = false;
70143                   d3_selectAll('.note').classed('hover', false);
70144                   sidebar.hide();
70145               }
70146           }
70147
70148
70149           sidebar.hover = throttle(hover, 200);
70150
70151
70152           sidebar.select = function(id, newFeature) {
70153               if (!_current && id) {
70154                   featureListWrap
70155                       .classed('inspector-hidden', true);
70156
70157                   inspectorWrap
70158                       .classed('inspector-hidden', false)
70159                       .classed('inspector-hover', false);
70160
70161                   if (inspector.entityID() !== id || inspector.state() !== 'select') {
70162                       inspector
70163                           .state('select')
70164                           .entityID(id)
70165                           .newFeature(newFeature);
70166
70167                       inspectorWrap
70168                           .call(inspector);
70169                   }
70170
70171               } else if (!_current) {
70172                   featureListWrap
70173                       .classed('inspector-hidden', false);
70174                   inspectorWrap
70175                       .classed('inspector-hidden', true);
70176                   inspector
70177                       .state('hide');
70178               }
70179           };
70180
70181
70182           sidebar.show = function(component, element) {
70183               featureListWrap
70184                   .classed('inspector-hidden', true);
70185               inspectorWrap
70186                   .classed('inspector-hidden', true);
70187
70188               if (_current) _current.remove();
70189               _current = selection$$1
70190                   .append('div')
70191                   .attr('class', 'sidebar-component')
70192                   .call(component, element);
70193           };
70194
70195
70196           sidebar.hide = function() {
70197               featureListWrap
70198                   .classed('inspector-hidden', false);
70199               inspectorWrap
70200                   .classed('inspector-hidden', true);
70201
70202               if (_current) _current.remove();
70203               _current = null;
70204           };
70205       }
70206
70207
70208       sidebar.hover = function() {};
70209       sidebar.hover.cancel = function() {};
70210       sidebar.select = function() {};
70211       sidebar.show = function() {};
70212       sidebar.hide = function() {};
70213
70214       return sidebar;
70215   }
70216
70217   function uiSpinner(context) {
70218       var osm = context.connection();
70219
70220
70221       return function(selection) {
70222           var img = selection
70223               .append('img')
70224               .attr('src', context.imagePath('loader-black.gif'))
70225               .style('opacity', 0);
70226
70227           if (osm) {
70228               osm
70229                   .on('loading.spinner', function() {
70230                       img.transition()
70231                           .style('opacity', 1);
70232                   })
70233                   .on('loaded.spinner', function() {
70234                       img.transition()
70235                           .style('opacity', 0);
70236                   });
70237           }
70238       };
70239   }
70240
70241   function uiSplash(context) {
70242
70243       return function(selection) {
70244           if (context.storage('sawSplash'))
70245                return;
70246
70247           context.storage('sawSplash', true);
70248
70249           var modalSelection = uiModal(selection);
70250
70251           modalSelection.select('.modal')
70252               .attr('class', 'modal-splash modal col6');
70253
70254           var introModal = modalSelection.select('.content')
70255               .append('div')
70256               .attr('class', 'fillL');
70257
70258           introModal
70259               .append('div')
70260               .attr('class','modal-section cf')
70261               .append('h3').text(t('splash.welcome'));
70262
70263           introModal
70264               .append('div')
70265               .attr('class','modal-section')
70266               .append('p')
70267               .html(t('splash.text', {
70268                   version: context.version,
70269                   website: '<a href="http://ideditor.com/">ideditor.com</a>',
70270                   github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
70271               }));
70272
70273           var buttonWrap = introModal
70274               .append('div')
70275               .attr('class', 'modal-actions cf');
70276
70277           var walkthrough = buttonWrap
70278               .append('button')
70279               .attr('class', 'walkthrough col6')
70280               .on('click', function() {
70281                   context.container().call(uiIntro(context));
70282                   modalSelection.close();
70283               });
70284
70285           walkthrough
70286               .append('svg')
70287               .attr('class', 'logo logo-walkthrough')
70288               .append('use')
70289               .attr('xlink:href', '#iD-logo-walkthrough');
70290
70291           walkthrough
70292               .append('div')
70293               .text(t('splash.walkthrough'));
70294
70295           var startEditing = buttonWrap
70296               .append('button')
70297               .attr('class', 'start-editing col6')
70298               .on('click', modalSelection.close);
70299
70300           startEditing
70301               .append('svg')
70302               .attr('class', 'logo logo-features')
70303               .append('use')
70304               .attr('xlink:href', '#iD-logo-features');
70305
70306           startEditing
70307               .append('div')
70308               .text(t('splash.start'));
70309
70310
70311           modalSelection.select('button.close')
70312               .attr('class','hide');
70313
70314       };
70315   }
70316
70317   function uiStatus(context) {
70318       var osm = context.connection();
70319
70320
70321       return function(selection$$1) {
70322           if (!osm) return;
70323
70324           function update() {
70325               osm.status(function(err, apiStatus) {
70326                   selection$$1.html('');
70327
70328                   if (err) {
70329                       if (apiStatus === 'connectionSwitched') {
70330                           // if the connection was just switched, we can't rely on
70331                           // the status (we're getting the status of the previous api)
70332                           return;
70333
70334                       } else if (apiStatus === 'rateLimited') {
70335                           selection$$1
70336                               .text(t('status.rateLimit'))
70337                               .append('a')
70338                               .attr('class', 'api-status-login')
70339                               .attr('target', '_blank')
70340                               .call(svgIcon('#iD-icon-out-link', 'inline'))
70341                               .append('span')
70342                               .text(t('login'))
70343                               .on('click.login', function() {
70344                                   event.preventDefault();
70345                                   osm.authenticate();
70346                               });
70347                       } else {
70348                           // eslint-disable-next-line no-warning-comments
70349                           // TODO: nice messages for different error types
70350                           selection$$1.text(t('status.error'));
70351                       }
70352
70353                   } else if (apiStatus === 'readonly') {
70354                       selection$$1.text(t('status.readonly'));
70355                   } else if (apiStatus === 'offline') {
70356                       selection$$1.text(t('status.offline'));
70357                   }
70358
70359                   selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
70360               });
70361           }
70362
70363           osm.on('change', function() { update(selection$$1); });
70364
70365           window.setInterval(update, 90000);
70366           update(selection$$1);
70367       };
70368   }
70369
70370   function uiUndoRedo(context) {
70371       var commands = [{
70372           id: 'undo',
70373           cmd: uiCmd('⌘Z'),
70374           action: function() { if (editable()) context.undo(); },
70375           annotation: function() { return context.history().undoAnnotation(); }
70376       }, {
70377           id: 'redo',
70378           cmd: uiCmd('⌘⇧Z'),
70379           action: function() { if (editable()) context.redo(); },
70380           annotation: function() { return context.history().redoAnnotation(); }
70381       }];
70382
70383
70384       function editable() {
70385           var mode = context.mode();
70386           return context.editable() && mode && mode.id !== 'save';
70387       }
70388
70389
70390       return function(selection$$1) {
70391           var tooltipBehavior = tooltip()
70392               .placement('bottom')
70393               .html(true)
70394               .title(function (d) {
70395                   return uiTooltipHtml(d.annotation() ?
70396                       t(d.id + '.tooltip', {action: d.annotation()}) :
70397                       t(d.id + '.nothing'), d.cmd);
70398               });
70399
70400           var buttons = selection$$1.selectAll('button')
70401               .data(commands)
70402               .enter()
70403               .append('button')
70404               .attr('class', function(d) { return 'col6 disabled ' + d.id + '-button'; })
70405               .on('click', function(d) { return d.action(); })
70406               .call(tooltipBehavior);
70407
70408           buttons.each(function(d) {
70409               var iconName = d.id;
70410               if (textDirection === 'rtl') {
70411                   if (iconName === 'undo') {
70412                       iconName = 'redo';
70413                   } else if (iconName === 'redo') {
70414                       iconName = 'undo';
70415                   }
70416               }
70417               select(this)
70418                   .call(svgIcon('#iD-icon-' + iconName));
70419           });
70420
70421           var keybinding = d3keybinding('undo')
70422               .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
70423               .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
70424
70425           select(document)
70426               .call(keybinding);
70427
70428
70429           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
70430
70431           context.map()
70432               .on('move.undo_redo', debouncedUpdate)
70433               .on('drawn.undo_redo', debouncedUpdate);
70434
70435           context.history()
70436               .on('change.undo_redo', update);
70437
70438           context
70439               .on('enter.undo_redo', update);
70440
70441
70442           function update() {
70443               buttons
70444                   .property('disabled', !editable())
70445                   .classed('disabled', function(d) { return !d.annotation(); })
70446                   .each(function() {
70447                       var selection$$1 = select(this);
70448                       if (selection$$1.property('tooltipVisible')) {
70449                           selection$$1.call(tooltipBehavior.show);
70450                       }
70451                   });
70452           }
70453       };
70454   }
70455
70456   // these are module variables so they are preserved through a ui.restart()
70457   var sawVersion = null;
70458   var isNewVersion = false;
70459   var isNewUser = false;
70460
70461
70462   function uiVersion(context) {
70463
70464       var currVersion = context.version;
70465       var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
70466
70467       if (sawVersion === null && matchedVersion !== null) {
70468           isNewVersion = (context.storage('sawVersion') !== currVersion);
70469           isNewUser = !context.storage('sawSplash');
70470           context.storage('sawVersion', currVersion);
70471           sawVersion = currVersion;
70472       }
70473
70474       return function(selection) {
70475           selection
70476               .append('a')
70477               .attr('target', '_blank')
70478               .attr('tabindex', -1)
70479               .attr('href', 'https://github.com/openstreetmap/iD')
70480               .text(currVersion);
70481
70482           // only show new version indicator to users that have used iD before
70483           if (isNewVersion && !isNewUser) {
70484               selection
70485                   .append('div')
70486                   .attr('class', 'badge')
70487                   .append('a')
70488                   .attr('target', '_blank')
70489                   .attr('tabindex', -1)
70490                   .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
70491                   .call(svgIcon('#maki-gift-11'))
70492                   .call(tooltip()
70493                       .title(t('version.whats_new', { version: currVersion }))
70494                       .placement('top')
70495                   );
70496           }
70497       };
70498   }
70499
70500   function uiZoom(context) {
70501       var zooms = [{
70502           id: 'zoom-in',
70503           icon: 'plus',
70504           title: t('zoom.in'),
70505           action: context.zoomIn,
70506           key: '+'
70507       }, {
70508           id: 'zoom-out',
70509           icon: 'minus',
70510           title: t('zoom.out'),
70511           action: context.zoomOut,
70512           key: '-'
70513       }];
70514
70515
70516       function zoomIn() {
70517           event.preventDefault();
70518           context.zoomIn();
70519       }
70520
70521
70522       function zoomOut() {
70523           event.preventDefault();
70524           context.zoomOut();
70525       }
70526
70527
70528       function zoomInFurther() {
70529           event.preventDefault();
70530           context.zoomInFurther();
70531       }
70532
70533
70534       function zoomOutFurther() {
70535           event.preventDefault();
70536           context.zoomOutFurther();
70537       }
70538
70539
70540       return function(selection$$1) {
70541           var button = selection$$1.selectAll('button')
70542               .data(zooms)
70543               .enter()
70544               .append('button')
70545               .attr('tabindex', -1)
70546               .attr('class', function(d) { return d.id; })
70547               .on('click.editor', function(d) { d.action(); })
70548               .call(tooltip()
70549                   .placement((textDirection === 'rtl') ? 'right' : 'left')
70550                   .html(true)
70551                   .title(function(d) {
70552                       return uiTooltipHtml(d.title, d.key);
70553                   })
70554               );
70555
70556           button.each(function(d) {
70557               select(this)
70558                   .call(svgIcon('#iD-icon-' + d.icon, 'light'));
70559           });
70560
70561           var keybinding = d3keybinding('zoom');
70562
70563           ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
70564               keybinding.on([key], zoomIn);
70565               keybinding.on([uiCmd('⌘' + key)], zoomInFurther);
70566           });
70567
70568           ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
70569               keybinding.on([key], zoomOut);
70570               keybinding.on([uiCmd('⌘' + key)], zoomOutFurther);
70571           });
70572
70573           select(document)
70574               .call(keybinding);
70575       };
70576   }
70577
70578   function uiInit(context) {
70579       var uiInitCounter = 0;
70580       var dispatch$$1 = dispatch('photoviewerResize');
70581
70582
70583       function render(container) {
70584           container
70585               .attr('dir', textDirection);
70586
70587           var map = context.map();
70588
70589           var hash = behaviorHash(context);
70590           hash();
70591
70592           if (!hash.hadHash) {
70593               map.centerZoom([0, 0], 2);
70594           }
70595
70596           container
70597               .append('svg')
70598               .attr('id', 'defs')
70599               .call(svgDefs(context));
70600
70601           container
70602               .append('div')
70603               .attr('id', 'sidebar')
70604               .attr('class', 'col4')
70605               .call(ui.sidebar);
70606
70607           var content = container
70608               .append('div')
70609               .attr('id', 'content')
70610               .attr('class', 'active');
70611
70612           var bar = content
70613               .append('div')
70614               .attr('id', 'bar')
70615               .attr('class', 'fillD');
70616
70617           content
70618               .append('div')
70619               .attr('id', 'map')
70620               .attr('dir', 'ltr')
70621               .call(map);
70622
70623           content
70624               .call(uiMapInMap(context))
70625               .call(uiInfo(context))
70626               .call(uiNotice(context));
70627
70628           bar
70629               .append('div')
70630               .attr('class', 'spacer col4');
70631
70632           var limiter = bar.append('div')
70633               .attr('class', 'limiter');
70634
70635           limiter
70636               .append('div')
70637               .attr('class', 'button-wrap joined col3')
70638               .call(uiModes(context), limiter);
70639
70640           limiter
70641               .append('div')
70642               .attr('class', 'button-wrap joined col1')
70643               .call(uiUndoRedo(context));
70644
70645           limiter
70646               .append('div')
70647               .attr('class', 'button-wrap col1')
70648               .call(uiSave(context));
70649
70650           bar
70651               .append('div')
70652               .attr('class', 'full-screen')
70653               .call(uiFullScreen(context));
70654
70655           bar
70656               .append('div')
70657               .attr('class', 'spinner')
70658               .call(uiSpinner(context));
70659
70660
70661           var controls = bar
70662               .append('div')
70663               .attr('class', 'map-controls');
70664
70665           controls
70666               .append('div')
70667               .attr('class', 'map-control zoombuttons')
70668               .call(uiZoom(context));
70669
70670           controls
70671               .append('div')
70672               .attr('class', 'map-control geolocate-control')
70673               .call(uiGeolocate(context));
70674
70675           controls
70676               .append('div')
70677               .attr('class', 'map-control background-control')
70678               .call(uiBackground(context));
70679
70680           controls
70681               .append('div')
70682               .attr('class', 'map-control map-data-control')
70683               .call(uiMapData(context));
70684
70685           controls
70686               .append('div')
70687               .attr('class', 'map-control help-control')
70688               .call(uiHelp(context));
70689
70690
70691           var about = content
70692               .append('div')
70693               .attr('id', 'about');
70694
70695           about
70696               .append('div')
70697               .attr('id', 'attrib')
70698               .attr('dir', 'ltr')
70699               .call(uiAttribution(context));
70700
70701           about
70702               .append('div')
70703               .attr('class', 'api-status')
70704               .call(uiStatus(context));
70705
70706
70707           var footer = about
70708               .append('div')
70709               .attr('id', 'footer')
70710               .attr('class', 'fillD');
70711
70712           footer
70713               .append('div')
70714               .attr('id', 'flash-wrap')
70715               .attr('class', 'footer-hide');
70716
70717           var footerWrap = footer
70718               .append('div')
70719               .attr('id', 'footer-wrap')
70720               .attr('class', 'footer-show');
70721
70722           footerWrap
70723               .append('div')
70724               .attr('id', 'scale-block')
70725               .call(uiScale(context));
70726
70727           var aboutList = footerWrap
70728               .append('div')
70729               .attr('id', 'info-block')
70730               .append('ul')
70731               .attr('id', 'about-list');
70732
70733           if (!context.embed()) {
70734               aboutList
70735                   .call(uiAccount(context));
70736           }
70737
70738           aboutList
70739               .append('li')
70740               .attr('class', 'version')
70741               .call(uiVersion(context));
70742
70743           var issueLinks = aboutList
70744               .append('li');
70745
70746           issueLinks
70747               .append('a')
70748               .attr('target', '_blank')
70749               .attr('tabindex', -1)
70750               .attr('href', 'https://github.com/openstreetmap/iD/issues')
70751               .call(svgIcon('#iD-icon-bug', 'light'))
70752               .call(tooltip().title(t('report_a_bug')).placement('top'));
70753
70754           issueLinks
70755               .append('a')
70756               .attr('target', '_blank')
70757               .attr('tabindex', -1)
70758               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
70759               .call(svgIcon('#iD-icon-translate', 'light'))
70760               .call(tooltip().title(t('help_translate')).placement('top'));
70761
70762           aboutList
70763               .append('li')
70764               .attr('class', 'feature-warning')
70765               .attr('tabindex', -1)
70766               .call(uiFeatureInfo(context));
70767
70768           aboutList
70769               .append('li')
70770               .attr('class', 'user-list')
70771               .attr('tabindex', -1)
70772               .call(uiContributors(context));
70773
70774
70775           var photoviewer = content
70776               .append('div')
70777               .attr('id', 'photoviewer')
70778               .classed('al', true)       // 'al'=left,  'ar'=right
70779               .classed('hide', true);
70780
70781           photoviewer
70782               .append('button')
70783               .attr('class', 'thumb-hide')
70784               .on('click', function () {
70785                   if (services.streetside) { services.streetside.hideViewer(); }
70786                   if (services.mapillary) { services.mapillary.hideViewer(); }
70787                   if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
70788               })
70789               .append('div')
70790               .call(svgIcon('#iD-icon-close'));
70791
70792           photoviewer
70793               .append('button')
70794               .attr('class', 'resize-handle-xy')
70795               .on(
70796                   'mousedown',
70797                   buildResizeListener(photoviewer, 'photoviewerResize', dispatch$$1, { resizeOnX: true, resizeOnY: true })
70798               );
70799
70800           photoviewer
70801               .append('button')
70802               .attr('class', 'resize-handle-x')
70803               .on(
70804                   'mousedown',
70805                   buildResizeListener(photoviewer, 'photoviewerResize', dispatch$$1, { resizeOnX: true })
70806               );
70807
70808           photoviewer
70809               .append('button')
70810               .attr('class', 'resize-handle-y')
70811               .on(
70812                   'mousedown',
70813                   buildResizeListener(photoviewer, 'photoviewerResize', dispatch$$1, { resizeOnY: true })
70814               );
70815
70816           var mapDimensions = map.dimensions();
70817
70818           // bind events
70819           window.onbeforeunload = function() {
70820               return context.save();
70821           };
70822
70823           window.onunload = function() {
70824               context.history().unlock();
70825           };
70826
70827           select(window)
70828               .on('resize.editor', onResize);
70829
70830           onResize();
70831
70832
70833           var pa = 80;  // pan amount
70834           var keybinding = d3keybinding('main')
70835               .on('⌫', function() { event.preventDefault(); })
70836               .on('←', pan([pa, 0]))
70837               .on('↑', pan([0, pa]))
70838               .on('→', pan([-pa, 0]))
70839               .on('↓', pan([0, -pa]))
70840               .on(['⇧←', uiCmd('⌘←')], pan([mapDimensions[0], 0]))
70841               .on(['⇧↑', uiCmd('⌘↑')], pan([0, mapDimensions[1]]))
70842               .on(['⇧→', uiCmd('⌘→')], pan([-mapDimensions[0], 0]))
70843               .on(['⇧↓', uiCmd('⌘↓')], pan([0, -mapDimensions[1]]));
70844
70845           select(document)
70846               .call(keybinding);
70847
70848           context.enter(modeBrowse(context));
70849
70850           if (!uiInitCounter++) {
70851               if (!hash.startWalkthrough) {
70852                   context.container()
70853                       .call(uiSplash(context))
70854                       .call(uiRestore(context));
70855               }
70856
70857               context.container()
70858                   .call(uiShortcuts(context));
70859           }
70860
70861           var osm = context.connection();
70862           var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
70863
70864           if (osm && auth) {
70865               osm
70866                   .on('authLoading.ui', function() {
70867                       context.container()
70868                           .call(auth);
70869                   })
70870                   .on('authDone.ui', function() {
70871                       auth.close();
70872                   });
70873           }
70874
70875           uiInitCounter++;
70876
70877           if (hash.startWalkthrough) {
70878               hash.startWalkthrough = false;
70879               context.container().call(uiIntro(context));
70880           }
70881
70882
70883           function onResize() {
70884               mapDimensions = utilGetDimensions(content, true);
70885               map.dimensions(mapDimensions);
70886
70887               // shrink photo viewer if it is too big
70888               // (-90 preserves space at top and bottom of map used by menus)
70889               var photoDimensions = utilGetDimensions(photoviewer, true);
70890               if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
70891                   var setPhotoDimensions = [
70892                       Math.min(photoDimensions[0], mapDimensions[0]),
70893                       Math.min(photoDimensions[1], mapDimensions[1] - 90),
70894                   ];
70895
70896                   photoviewer
70897                       .style('width', setPhotoDimensions[0] + 'px')
70898                       .style('height', setPhotoDimensions[1] + 'px');
70899
70900                   dispatch$$1.call('photoviewerResize', photoviewer, setPhotoDimensions);
70901               }
70902           }
70903
70904
70905           function pan(d) {
70906               return function() {
70907                   event.preventDefault();
70908                   context.pan(d, 100);
70909               };
70910           }
70911
70912           function buildResizeListener(target, eventName, dispatch$$1, options) {
70913               var resizeOnX = !!options.resizeOnX;
70914               var resizeOnY = !!options.resizeOnY;
70915               var minHeight = options.minHeight || 240;
70916               var minWidth = options.minWidth || 320;
70917               var startX;
70918               var startY;
70919               var startWidth;
70920               var startHeight;
70921
70922               function startResize() {
70923                   var mapSize = context.map().dimensions();
70924
70925                   if (resizeOnX) {
70926                       var maxWidth = mapSize[0];
70927                       var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
70928                       target.style('width', newWidth + 'px');
70929                   }
70930
70931                   if (resizeOnY) {
70932                       var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
70933                       var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
70934                       target.style('height', newHeight + 'px');
70935                   }
70936
70937                   dispatch$$1.call(eventName, target, utilGetDimensions(target, true));
70938               }
70939
70940               function clamp(num, min, max) {
70941                   return Math.max(min, Math.min(num, max));
70942               }
70943
70944               function stopResize() {
70945                   select(window)
70946                       .on('.' + eventName, null);
70947               }
70948
70949               return function initResize() {
70950                   startX = event.clientX;
70951                   startY = event.clientY;
70952                   startWidth = target.node().getBoundingClientRect().width;
70953                   startHeight = target.node().getBoundingClientRect().height;
70954
70955                   select(window)
70956                       .on('mousemove.' + eventName, startResize, false)
70957                       .on('mouseup.' + eventName, stopResize, false);
70958               };
70959           }
70960       }
70961
70962
70963       var renderCallback;
70964
70965       function ui(node, callback) {
70966           renderCallback = callback;
70967           var container = select(node);
70968           context.container(container);
70969           context.loadLocale(function(err) {
70970               if (!err) {
70971                   render(container);
70972               }
70973               if (callback) {
70974                   callback(err);
70975               }
70976           });
70977       }
70978
70979
70980       ui.restart = function(arg) {
70981           context.locale(arg);
70982           context.loadLocale(function(err) {
70983               if (!err) {
70984                   context.container().selectAll('*').remove();
70985                   render(context.container());
70986                   if (renderCallback) renderCallback();
70987               }
70988           });
70989       };
70990
70991
70992       ui.sidebar = uiSidebar$$1(context);
70993
70994       return utilRebind(ui, dispatch$$1, 'on');
70995   }
70996
70997   function d3combobox() {
70998       var dispatch$$1 = dispatch('accept');
70999       var _container = select(document.body);
71000       var _data = [];
71001       var _suggestions = [];
71002       var _minItems = 2;
71003       var _caseSensitive = false;
71004
71005       var _fetcher = function(val, cb) {
71006           cb(_data.filter(function(d) {
71007               return d.value
71008                   .toString()
71009                   .toLowerCase()
71010                   .indexOf(val.toLowerCase()) !== -1;
71011           }));
71012       };
71013
71014       var combobox = function(input, attachTo) {
71015           var idx = -1;
71016           var wrapper = _container
71017               .selectAll('div.combobox')
71018               .filter(function(d) { return d === input.node(); });
71019           var shown = !wrapper.empty();
71020           var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
71021
71022           input
71023               .classed('combobox-input', true)
71024               .on('focus.typeahead', focus)
71025               .on('blur.typeahead', blur)
71026               .on('keydown.typeahead', keydown)
71027               .on('keyup.typeahead', keyup)
71028               .on('input.typeahead', change)
71029               .each(function() {
71030                   var parent = this.parentNode;
71031                   var sibling = this.nextSibling;
71032
71033                   var caret = select(parent).selectAll('.combobox-caret')
71034                       .filter(function(d) { return d === input.node(); })
71035                       .data([input.node()]);
71036
71037                   caret = caret.enter()
71038                       .insert('div', function() { return sibling; })
71039                       .attr('class', 'combobox-caret')
71040                       .merge(caret);
71041
71042                   caret
71043                       .on('mousedown', function () {
71044                           // prevent the form element from blurring. it blurs
71045                           // on mousedown
71046                           event.stopPropagation();
71047                           event.preventDefault();
71048                           if (!shown) {
71049                               input.node().focus();
71050                               fetch('', render);
71051                           } else {
71052                               hide();
71053                           }
71054                       });
71055               });
71056
71057           function focus() {
71058               fetch(value(), render);
71059           }
71060
71061           function blur() {
71062               window.setTimeout(hide, 150);
71063           }
71064
71065           function show() {
71066               if (!shown) {
71067                   wrapper = _container
71068                       .insert('div', ':first-child')
71069                       .datum(input.node())
71070                       .attr('class', 'combobox')
71071                       .style('position', 'absolute')
71072                       .style('display', 'block')
71073                       .style('left', '0px')
71074                       .on('mousedown', function () {
71075                           // prevent moving focus out of the text field
71076                           event.preventDefault();
71077                       });
71078
71079                   select('body')
71080                       .on('scroll.combobox', render, true);
71081
71082                   shown = true;
71083               }
71084           }
71085
71086           function hide() {
71087               if (shown) {
71088                   idx = -1;
71089                   wrapper.remove();
71090
71091                   select('body')
71092                       .on('scroll.combobox', null);
71093
71094                   shown = false;
71095               }
71096           }
71097
71098           function keydown() {
71099              switch (event.keyCode) {
71100                  // backspace, delete
71101                  case 8:
71102                  case 46:
71103                      input.on('input.typeahead', function() {
71104                          idx = -1;
71105                          render();
71106                          var start = input.property('selectionStart');
71107                          input.node().setSelectionRange(start, start);
71108                          input.on('input.typeahead', change);
71109                      });
71110                      break;
71111                  // tab
71112                  case 9:
71113                      wrapper.selectAll('a.selected').each(function (d) {
71114                          dispatch$$1.call('accept', this, d);
71115                      });
71116                      hide();
71117                      break;
71118                  // return
71119                  case 13:
71120                      event.preventDefault();
71121                      break;
71122                  // up arrow
71123                  case 38:
71124                      if (tagName === 'textarea' && !shown) return;
71125                      nav(-1);
71126                      event.preventDefault();
71127                      break;
71128                  // down arrow
71129                  case 40:
71130                      if (tagName === 'textarea' && !shown) return;
71131                      nav(+1);
71132                      event.preventDefault();
71133                      break;
71134              }
71135              event.stopPropagation();
71136           }
71137
71138           function keyup() {
71139               switch (event.keyCode) {
71140                   // escape
71141                   case 27:
71142                       hide();
71143                       break;
71144                   // return
71145                   case 13:
71146                       wrapper.selectAll('a.selected').each(function (d) {
71147                          dispatch$$1.call('accept', this, d);
71148                       });
71149                       hide();
71150                       break;
71151               }
71152           }
71153
71154           function change() {
71155               fetch(value(), function() {
71156                   if (input.property('selectionEnd') === input.property('value').length) {
71157                       autocomplete();
71158                   }
71159                   render();
71160               });
71161           }
71162
71163           function nav(dir) {
71164               if (!_suggestions.length) return;
71165               idx = Math.max(Math.min(idx + dir, _suggestions.length - 1), 0);
71166               input.property('value', _suggestions[idx].value);
71167               render();
71168               ensureVisible();
71169           }
71170
71171           function value() {
71172               var value = input.property('value');
71173               var start = input.property('selectionStart');
71174               var end = input.property('selectionEnd');
71175
71176               if (start && end) {
71177                   value = value.substring(0, start);
71178               }
71179
71180               return value;
71181           }
71182
71183           function fetch(v, cb) {
71184               _fetcher.call(input, v, function(_) {
71185                   _suggestions = _;
71186                   cb();
71187               });
71188           }
71189
71190           function autocomplete() {
71191               var v = _caseSensitive ? value() : value().toLowerCase();
71192               idx = -1;
71193               if (!v) return;
71194
71195               // Don't autocomplete if user is typing a number - #4935
71196               if (!isNaN(parseFloat(v)) && isFinite(v)) return;
71197
71198               var best = -1;
71199               var suggestion, compare;
71200
71201               for (var i = 0; i < _suggestions.length; i++) {
71202                   suggestion = _suggestions[i].value;
71203                   compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
71204
71205                   // if search string matches suggestion exactly, pick it..
71206                   if (compare === v) {
71207                       best = i;
71208                       break;
71209
71210                   // otherwise lock in the first result that starts with the search string..
71211                   } else if (best === -1 && compare.indexOf(v) === 0) {
71212                       best = i;
71213                   }
71214               }
71215
71216               if (best !== -1) {
71217                   idx = best;
71218                   suggestion = _suggestions[best].value;
71219                   input.property('value', suggestion);
71220                   input.node().setSelectionRange(v.length, suggestion.length);
71221               }
71222           }
71223
71224           function render() {
71225               if (_suggestions.length >= _minItems && document.activeElement === input.node()) {
71226                   show();
71227               } else {
71228                   hide();
71229                   return;
71230               }
71231
71232               var options = wrapper
71233                   .selectAll('a.combobox-option')
71234                   .data(_suggestions, function(d) { return d.value; });
71235
71236               options.exit()
71237                   .remove();
71238
71239               options.enter()
71240                   .append('a')
71241                   .attr('class', 'combobox-option')
71242                   .text(function(d) { return d.value; })
71243                   .merge(options)
71244                   .attr('title', function(d) { return d.title; })
71245                   .classed('selected', function(d, i) { return i === idx; })
71246                   .on('mouseover', select$$1)
71247                   .on('click', accept)
71248                   .order();
71249
71250
71251               var node = attachTo ? attachTo.node() : input.node();
71252               var rect = node.getBoundingClientRect();
71253
71254               wrapper
71255                   .style('left', (rect.left + 5) + 'px')
71256                   .style('width', (rect.width - 10) + 'px')
71257                   .style('top', rect.height + rect.top + 'px');
71258           }
71259
71260           function select$$1(d, i) {
71261               idx = i;
71262               render();
71263           }
71264
71265           function ensureVisible() {
71266               var node = wrapper.selectAll('a.selected').node();
71267               if (node) node.scrollIntoView();
71268           }
71269
71270           function accept(d) {
71271               if (!shown) return;
71272               input.property('value', d.value);
71273               utilTriggerEvent(input, 'change');
71274               dispatch$$1.call('accept', this, d);
71275               hide();
71276           }
71277       };
71278
71279       combobox.fetcher = function(_) {
71280           if (!arguments.length) return _fetcher;
71281           _fetcher = _;
71282           return combobox;
71283       };
71284
71285       combobox.data = function(_) {
71286           if (!arguments.length) return _data;
71287           _data = _;
71288           return combobox;
71289       };
71290
71291       combobox.minItems = function(_) {
71292           if (!arguments.length) return _minItems;
71293           _minItems = _;
71294           return combobox;
71295       };
71296
71297       combobox.caseSensitive = function(_) {
71298           if (!arguments.length) return _caseSensitive;
71299           _caseSensitive = _;
71300           return combobox;
71301       };
71302
71303       combobox.container = function(_) {
71304           if (!arguments.length) return _container;
71305           _container = _;
71306           return combobox;
71307       };
71308
71309       return utilRebind(combobox, dispatch$$1, 'on');
71310   }
71311
71312
71313   d3combobox.off = function(input) {
71314       input
71315           .on('focus.typeahead', null)
71316           .on('blur.typeahead', null)
71317           .on('keydown.typeahead', null)
71318           .on('keyup.typeahead', null)
71319           .on('input.typeahead', null)
71320           .each(function() {
71321               select(this.parentNode).selectAll('.combobox-caret')
71322                   .filter(function(d) { return d === input.node(); })
71323                   .on('mousedown', null);
71324           });
71325
71326       select('body')
71327           .on('scroll.combobox', null);
71328   };
71329
71330   // This currently only works with the 'restrictions' field
71331   // It borrows some code from uiHelp
71332
71333   function uiFieldHelp(context, fieldName) {
71334       var fieldHelp = {};
71335       var _inspector = select(null);
71336       var _wrap = select(null);
71337       var _body = select(null);
71338
71339       var fieldHelpKeys = {
71340           restrictions: [
71341               ['about',[
71342                   'about',
71343                   'from_via_to',
71344                   'maxdist',
71345                   'maxvia'
71346               ]],
71347               ['inspecting',[
71348                   'about',
71349                   'from_shadow',
71350                   'allow_shadow',
71351                   'restrict_shadow',
71352                   'only_shadow',
71353                   'restricted',
71354                   'only'
71355               ]],
71356               ['modifying',[
71357                   'about',
71358                   'indicators',
71359                   'allow_turn',
71360                   'restrict_turn',
71361                   'only_turn'
71362               ]],
71363               ['tips',[
71364                   'simple',
71365                   'simple_example',
71366                   'indirect',
71367                   'indirect_example',
71368                   'indirect_noedit'
71369               ]]
71370           ]
71371       };
71372
71373       var fieldHelpHeadings = {};
71374
71375       var replacements = {
71376           distField: t('restriction.controls.distance'),
71377           viaField: t('restriction.controls.via'),
71378           fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
71379           allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
71380           restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
71381           onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
71382           allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
71383           restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
71384           onlyTurn: icon('#iD-turn-only', 'pre-text turn')
71385       };
71386
71387
71388       // For each section, squash all the texts into a single markdown document
71389       var docs = fieldHelpKeys[fieldName].map(function(key) {
71390           var helpkey = 'help.field.' + fieldName + '.' + key[0];
71391           var text = key[1].reduce(function(all, part) {
71392               var subkey = helpkey + '.' + part;
71393               var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
71394               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
71395               return all + hhh + t(subkey, replacements) + '\n\n';
71396           }, '');
71397
71398           return {
71399               key: helpkey,
71400               title: t(helpkey + '.title'),
71401               html: marked(text.trim())
71402           };
71403       });
71404
71405
71406       function show() {
71407           updatePosition();
71408
71409           _body
71410               .classed('hide', false)
71411               .style('opacity', '0')
71412               .transition()
71413               .duration(200)
71414               .style('opacity', '1');
71415       }
71416
71417
71418       function hide() {
71419           _body
71420               .classed('hide', true)
71421               .transition()
71422               .duration(200)
71423               .style('opacity', '0')
71424               .on('end', function () {
71425                   _body.classed('hide', true);
71426               });
71427       }
71428
71429
71430       function clickHelp(index) {
71431           var d = docs[index];
71432           var tkeys = fieldHelpKeys[fieldName][index][1];
71433
71434           _body.selectAll('.field-help-nav-item')
71435               .classed('active', function(d, i) { return i === index; });
71436
71437           var content = _body.selectAll('.field-help-content')
71438               .html(d.html);
71439
71440           // class the paragraphs so we can find and style them
71441           content.selectAll('p')
71442               .attr('class', function(d, i) { return tkeys[i]; });
71443
71444           // insert special content for certain help sections
71445           if (d.key === 'help.field.restrictions.inspecting') {
71446               content
71447                   .insert('img', 'p.from_shadow')
71448                   .attr('class', 'field-help-image cf')
71449                   .attr('src', context.imagePath('tr_inspect.gif'));
71450
71451           } else if (d.key === 'help.field.restrictions.modifying') {
71452               content
71453                   .insert('img', 'p.allow_turn')
71454                   .attr('class', 'field-help-image cf')
71455                   .attr('src', context.imagePath('tr_modify.gif'));
71456           }
71457       }
71458
71459
71460       fieldHelp.button = function(selection$$1) {
71461           if (_body.empty()) return;
71462
71463           var button = selection$$1.selectAll('.field-help-button')
71464               .data([0]);
71465
71466           // enter/update
71467           button.enter()
71468               .append('button')
71469               .attr('class', 'field-help-button')
71470               .attr('tabindex', -1)
71471               .call(svgIcon('#iD-icon-help'))
71472               .merge(button)
71473               .on('click', function () {
71474                   event.stopPropagation();
71475                   event.preventDefault();
71476                   if (_body.classed('hide')) {
71477                       show();
71478                   } else {
71479                       hide();
71480                   }
71481               });
71482       };
71483
71484
71485       function updatePosition() {
71486           var wrap = _wrap.node();
71487           var inspector = _inspector.node();
71488           var wRect = wrap.getBoundingClientRect();
71489           var iRect = inspector.getBoundingClientRect();
71490
71491           _body
71492               .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
71493       }
71494
71495
71496       fieldHelp.body = function(selection$$1) {
71497           // This control expects the field to have a preset-input-wrap div
71498           _wrap = selection$$1.selectAll('.preset-input-wrap');
71499           if (_wrap.empty()) return;
71500
71501           // absolute position relative to the inspector, so it "floats" above the fields
71502           _inspector = select('#sidebar .entity-editor-pane .inspector-body');
71503           if (_inspector.empty()) return;
71504
71505           _body = _inspector.selectAll('.field-help-body')
71506               .data([0]);
71507
71508           var enter = _body.enter()
71509               .append('div')
71510               .attr('class', 'field-help-body hide');   // initially hidden
71511
71512           var titleEnter = enter
71513               .append('div')
71514               .attr('class', 'field-help-title cf');
71515
71516           titleEnter
71517               .append('h2')
71518               .attr('class', 'fl')
71519               .text(t('help.field.' + fieldName + '.title'));
71520
71521           titleEnter
71522               .append('button')
71523               .attr('class', 'fr close')
71524               .on('click', function() {
71525                   event.stopPropagation();
71526                   event.preventDefault();
71527                   hide();
71528               })
71529               .call(svgIcon('#iD-icon-close'));
71530
71531           var navEnter = enter
71532               .append('div')
71533               .attr('class', 'field-help-nav cf');
71534
71535           var titles = docs.map(function(d) { return d.title; });
71536           navEnter.selectAll('.field-help-nav-item')
71537               .data(titles)
71538               .enter()
71539               .append('div')
71540               .attr('class', 'field-help-nav-item')
71541               .text(function(d) { return d; })
71542               .on('click', function(d, i) {
71543                   event.stopPropagation();
71544                   event.preventDefault();
71545                   clickHelp(i);
71546               });
71547
71548           enter
71549               .append('div')
71550               .attr('class', 'field-help-content');
71551
71552           _body = _body
71553               .merge(enter);
71554
71555           clickHelp(0);
71556       };
71557
71558
71559       return fieldHelp;
71560   }
71561
71562   function uiFieldCheck(field, context) {
71563       var dispatch$$1 = dispatch('change');
71564       var options = field.strings && field.strings.options;
71565       var values = [];
71566       var texts = [];
71567
71568       var input = select(null);
71569       var text = select(null);
71570       var label = select(null);
71571       var reverser = select(null);
71572
71573       var _impliedYes;
71574       var _entityID;
71575       var _value;
71576
71577
71578       if (options) {
71579           for (var k in options) {
71580               values.push(k === 'undefined' ? undefined : k);
71581               texts.push(field.t('options.' + k, { 'default': options[k] }));
71582           }
71583       } else {
71584           values = [undefined, 'yes'];
71585           texts = [t('inspector.unknown'), t('inspector.check.yes')];
71586           if (field.type !== 'defaultCheck') {
71587               values.push('no');
71588               texts.push(t('inspector.check.no'));
71589           }
71590       }
71591
71592
71593       // Checks tags to see whether an undefined value is "Assumed to be Yes"
71594       function checkImpliedYes() {
71595           _impliedYes = (field.id === 'oneway_yes');
71596
71597           // hack: pretend `oneway` field is a `oneway_yes` field
71598           // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
71599           if (field.id === 'oneway') {
71600               var entity = context.entity(_entityID);
71601               for (var key in entity.tags) {
71602                   if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
71603                       _impliedYes = true;
71604                       texts[0] = t('presets.fields.oneway_yes.options.undefined');
71605                       break;
71606                   }
71607               }
71608           }
71609       }
71610
71611
71612       function reverserHidden() {
71613           if (!select('div.inspector-hover').empty()) return true;
71614           return !(_value === 'yes' || (_impliedYes && !_value));
71615       }
71616
71617
71618       function reverserSetText(selection$$1) {
71619           var entity = context.hasEntity(_entityID);
71620           if (reverserHidden() || !entity) return selection$$1;
71621
71622           var first = entity.first();
71623           var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
71624           var pseudoDirection = first < last;
71625           var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
71626
71627           selection$$1.selectAll('.reverser-span')
71628               .text(t('inspector.check.reverser'))
71629               .call(svgIcon(icon, 'inline'));
71630
71631           return selection$$1;
71632       }
71633
71634
71635       var check = function(selection$$1) {
71636           checkImpliedYes();
71637           selection$$1.classed('checkselect', 'true');
71638
71639           label = selection$$1.selectAll('.preset-input-wrap')
71640               .data([0]);
71641
71642           var enter = label.enter()
71643               .append('label')
71644               .attr('class', 'preset-input-wrap');
71645
71646           enter
71647               .append('input')
71648               .property('indeterminate', field.type !== 'defaultCheck')
71649               .attr('type', 'checkbox')
71650               .attr('id', 'preset-input-' + field.safeid);
71651
71652           enter
71653               .append('span')
71654               .text(texts[0])
71655               .attr('class', 'value');
71656
71657           if (field.type === 'onewayCheck') {
71658               enter
71659                   .append('a')
71660                   .attr('id', 'preset-input-' + field.safeid + '-reverser')
71661                   .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
71662                   .attr('href', '#')
71663                   .append('span')
71664                   .attr('class', 'reverser-span');
71665           }
71666
71667           label = label.merge(enter);
71668           input = label.selectAll('input');
71669           text = label.selectAll('span.value');
71670
71671           input
71672               .on('click', function() {
71673                   event.stopPropagation();
71674                   var t$$1 = {};
71675                   t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
71676
71677                   // Don't cycle through `alternating` or `reversible` states - #4970
71678                   // (They are supported as translated strings, but should not toggle with clicks)
71679                   if (t$$1[field.key] === 'reversible' || t$$1[field.key] === 'alternating') {
71680                       t$$1[field.key] = values[0];
71681                   }
71682
71683                   dispatch$$1.call('change', this, t$$1);
71684               });
71685
71686           if (field.type === 'onewayCheck') {
71687               reverser = label.selectAll('.reverser');
71688
71689               reverser
71690                   .call(reverserSetText)
71691                   .on('click', function() {
71692                       event.preventDefault();
71693                       event.stopPropagation();
71694                       context.perform(
71695                           actionReverse(_entityID),
71696                           t('operations.reverse.annotation')
71697                       );
71698                       select(this)
71699                           .call(reverserSetText);
71700                   });
71701           }
71702       };
71703
71704
71705       check.entity = function(_) {
71706           if (!arguments.length) return context.hasEntity(_entityID);
71707           _entityID = _.id;
71708           return check;
71709       };
71710
71711
71712       check.tags = function(tags) {
71713
71714           function isChecked(val) {
71715               return val !== 'no' && val !== '' && val !== undefined && val !== null;
71716           }
71717
71718           function textFor(val) {
71719               if (val === '') val = undefined;
71720               var index = values.indexOf(val);
71721               return (index !== -1 ? texts[index] : ('"' + val + '"'));
71722           }
71723
71724           checkImpliedYes();
71725           _value = tags[field.key] && tags[field.key].toLowerCase();
71726
71727           if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
71728               _value = 'yes';
71729           }
71730
71731           input
71732               .property('indeterminate', field.type !== 'defaultCheck' && !_value)
71733               .property('checked', isChecked(_value));
71734
71735           text
71736               .text(textFor(_value));
71737
71738           label
71739               .classed('set', !!_value);
71740
71741           if (field.type === 'onewayCheck') {
71742               reverser
71743                   .classed('hide', reverserHidden())
71744                   .call(reverserSetText);
71745           }
71746       };
71747
71748
71749       check.focus = function() {
71750           input.node().focus();
71751       };
71752
71753       return utilRebind(check, dispatch$$1, 'on');
71754   }
71755
71756   /** Used for built-in method references. */
71757   var arrayProto$1 = Array.prototype;
71758
71759   /** Built-in value references. */
71760   var splice$1 = arrayProto$1.splice;
71761
71762   /**
71763    * The base implementation of `_.pullAt` without support for individual
71764    * indexes or capturing the removed elements.
71765    *
71766    * @private
71767    * @param {Array} array The array to modify.
71768    * @param {number[]} indexes The indexes of elements to remove.
71769    * @returns {Array} Returns `array`.
71770    */
71771   function basePullAt(array, indexes) {
71772     var length = array ? indexes.length : 0,
71773         lastIndex = length - 1;
71774
71775     while (length--) {
71776       var index = indexes[length];
71777       if (length == lastIndex || index !== previous) {
71778         var previous = index;
71779         if (isIndex(index)) {
71780           splice$1.call(array, index, 1);
71781         } else {
71782           baseUnset(array, index);
71783         }
71784       }
71785     }
71786     return array;
71787   }
71788
71789   /**
71790    * Removes all elements from `array` that `predicate` returns truthy for
71791    * and returns an array of the removed elements. The predicate is invoked
71792    * with three arguments: (value, index, array).
71793    *
71794    * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
71795    * to pull elements from an array by value.
71796    *
71797    * @static
71798    * @memberOf _
71799    * @since 2.0.0
71800    * @category Array
71801    * @param {Array} array The array to modify.
71802    * @param {Function} [predicate=_.identity] The function invoked per iteration.
71803    * @returns {Array} Returns the new array of removed elements.
71804    * @example
71805    *
71806    * var array = [1, 2, 3, 4];
71807    * var evens = _.remove(array, function(n) {
71808    *   return n % 2 == 0;
71809    * });
71810    *
71811    * console.log(array);
71812    * // => [1, 3]
71813    *
71814    * console.log(evens);
71815    * // => [2, 4]
71816    */
71817   function remove$8(array, predicate) {
71818     var result = [];
71819     if (!(array && array.length)) {
71820       return result;
71821     }
71822     var index = -1,
71823         indexes = [],
71824         length = array.length;
71825
71826     predicate = baseIteratee(predicate, 3);
71827     while (++index < length) {
71828       var value = array[index];
71829       if (predicate(value, index, array)) {
71830         result.push(value);
71831         indexes.push(index);
71832       }
71833     }
71834     basePullAt(array, indexes);
71835     return result;
71836   }
71837
71838   function uiFieldCombo(field, context) {
71839       var dispatch$$1 = dispatch('change'),
71840           nominatim = services.geocoder,
71841           taginfo = services.taginfo,
71842           isMulti = (field.type === 'multiCombo'),
71843           isNetwork = (field.type === 'networkCombo'),
71844           isSemi = (field.type === 'semiCombo'),
71845           optstrings = field.strings && field.strings.options,
71846           optarray = field.options,
71847           snake_case = (field.snake_case || (field.snake_case === undefined)),
71848           caseSensitive = field.caseSensitive,
71849           combobox = d3combobox()
71850               .container(context.container())
71851               .caseSensitive(caseSensitive)
71852               .minItems(isMulti || isSemi ? 1 : 2),
71853           comboData = [],
71854           multiData = [],
71855           container,
71856           input,
71857           entity,
71858           country;
71859
71860       // ensure multiCombo field.key ends with a ':'
71861       if (isMulti && field.key.match(/:$/) === null) {
71862           field.key += ':';
71863       }
71864
71865
71866       function snake(s) {
71867           return s.replace(/\s+/g, '_');
71868       }
71869
71870       function unsnake(s) {
71871           return s.replace(/_+/g, ' ');
71872       }
71873
71874       function clean(s) {
71875           return s.split(';')
71876               .map(function(s) { return s.trim(); })
71877               .join(';');
71878       }
71879
71880
71881       // returns the tag value for a display value
71882       // (for multiCombo, dval should be the key suffix, not the entire key)
71883       function tagValue(dval) {
71884           dval = clean(dval || '');
71885
71886           if (optstrings) {
71887               var match = find$1(comboData, function(o) {
71888                   return o.key && clean(o.value) === dval;
71889               });
71890               if (match) {
71891                   return match.key;
71892               }
71893           }
71894
71895           if (field.type === 'typeCombo' && !dval) {
71896               return 'yes';
71897           }
71898
71899           return (snake_case ? snake(dval) : dval) || undefined;
71900       }
71901
71902
71903       // returns the display value for a tag value
71904       // (for multiCombo, tval should be the key suffix, not the entire key)
71905       function displayValue(tval) {
71906           tval = tval || '';
71907
71908           if (optstrings) {
71909               var match = find$1(comboData, function(o) { return o.key === tval && o.value; });
71910               if (match) {
71911                   return match.value;
71912               }
71913           }
71914
71915           if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
71916               return '';
71917           }
71918
71919           return snake_case ? unsnake(tval) : tval;
71920       }
71921
71922
71923       function objectDifference(a, b) {
71924           return reject(a, function(d1) {
71925               return some(b, function(d2) { return d1.value === d2.value; });
71926           });
71927       }
71928
71929
71930       function initCombo(selection$$1, attachTo) {
71931           if (optstrings) {
71932               selection$$1.attr('readonly', 'readonly');
71933               selection$$1.call(combobox, attachTo);
71934               setStaticValues(setPlaceholder);
71935
71936           } else if (optarray) {
71937               selection$$1.call(combobox, attachTo);
71938               setStaticValues(setPlaceholder);
71939
71940           } else if (taginfo) {
71941               selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
71942               setTaginfoValues('', setPlaceholder);
71943           }
71944       }
71945
71946
71947       function setStaticValues(callback) {
71948           if (!(optstrings || optarray)) return;
71949
71950           if (optstrings) {
71951               comboData = Object.keys(optstrings).map(function(k) {
71952                   var v = field.t('options.' + k, { 'default': optstrings[k] });
71953                   return {
71954                       key: k,
71955                       value: v,
71956                       title: v
71957                   };
71958               });
71959
71960           } else if (optarray) {
71961               comboData = optarray.map(function(k) {
71962                   var v = snake_case ? unsnake(k) : k;
71963                   return {
71964                       key: k,
71965                       value: v,
71966                       title: v
71967                   };
71968               });
71969           }
71970
71971           combobox.data(objectDifference(comboData, multiData));
71972           if (callback) callback(comboData);
71973       }
71974
71975
71976       function setTaginfoValues(q, callback) {
71977           var fn = isMulti ? 'multikeys' : 'values';
71978           var query = (isMulti ? field.key : '') + q;
71979           var hasCountryPrefix = isNetwork && country && country.indexOf(q.toLowerCase()) === 0;
71980           if (hasCountryPrefix) {
71981               query = country + ':';
71982           }
71983
71984           var params = {
71985               debounce: (q !== ''),
71986               key: field.key,
71987               query: query
71988           };
71989
71990           if (entity) {
71991               params.geometry = context.geometry(entity.id);
71992           }
71993
71994           taginfo[fn](params, function(err, data) {
71995               if (err) return;
71996               if (hasCountryPrefix) {
71997                   data = filter(data, function(d) {
71998                       return d.value.toLowerCase().indexOf(country + ':') === 0;
71999                   });
72000               }
72001
72002               comboData = map$3(data, function(d) {
72003                   var k = d.value;
72004                   if (isMulti) k = k.replace(field.key, '');
72005                   var v = snake_case ? unsnake(k) : k;
72006                   return {
72007                       key: k,
72008                       value: v,
72009                       title: isMulti ? v : d.title
72010                   };
72011               });
72012
72013               comboData = objectDifference(comboData, multiData);
72014               if (callback) callback(comboData);
72015           });
72016       }
72017
72018
72019       function setPlaceholder(d) {
72020           var ph;
72021
72022           if (isMulti || isSemi) {
72023               ph = field.placeholder() || t('inspector.add');
72024           } else {
72025               var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
72026                   placeholders = vals.length > 1 ? vals : map$3(d, 'key');
72027               ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
72028           }
72029
72030           if (ph.match(/(…|\.\.\.)$/) === null) {
72031               ph += '…';
72032           }
72033
72034           container.selectAll('input')
72035               .attr('placeholder', ph);
72036       }
72037
72038
72039       function change() {
72040           var val = tagValue(utilGetSetValue(input)),
72041               t$$1 = {};
72042
72043           if (isMulti || isSemi) {
72044               if (!val) return;
72045               container.classed('active', false);
72046               utilGetSetValue(input, '');
72047               if (isMulti) {
72048                   field.keys.push(field.key + val);
72049                   t$$1[field.key + val] = 'yes';
72050               } else if (isSemi) {
72051                   var arr = multiData.map(function(d) { return d.key; });
72052                   arr.push(val);
72053                   t$$1[field.key] = compact(uniq(arr)).join(';');
72054               }
72055               window.setTimeout(function() { input.node().focus(); }, 10);
72056
72057           } else {
72058               t$$1[field.key] = val;
72059           }
72060
72061           dispatch$$1.call('change', this, t$$1);
72062       }
72063
72064
72065       function removeMultikey(d) {
72066           event.stopPropagation();
72067           var t$$1 = {};
72068           if (isMulti) {
72069               t$$1[d.key] = undefined;
72070           } else if (isSemi) {
72071               remove$8(multiData, function(md) { return md.key === d.key; });
72072               var arr = multiData.map(function(md) { return md.key; });
72073               arr = compact(uniq(arr));
72074               t$$1[field.key] = arr.length ? arr.join(';') : undefined;
72075           }
72076           dispatch$$1.call('change', this, t$$1);
72077       }
72078
72079
72080       function combo(selection$$1) {
72081           if (isMulti || isSemi) {
72082               container = selection$$1.selectAll('ul').data([0]);
72083
72084               container = container.enter()
72085                   .append('ul')
72086                   .attr('class', 'form-field-multicombo')
72087                   .on('click', function() {
72088                       window.setTimeout(function() { input.node().focus(); }, 10);
72089                   })
72090                   .merge(container);
72091
72092           } else {
72093               container = selection$$1;
72094           }
72095
72096           input = container.selectAll('input')
72097               .data([0]);
72098
72099           input = input.enter()
72100               .append('input')
72101               .attr('type', 'text')
72102               .attr('id', 'preset-input-' + field.safeid)
72103               .call(utilNoAuto)
72104               .call(initCombo, selection$$1)
72105               .merge(input);
72106
72107           if (isNetwork && nominatim && entity) {
72108               var center = entity.extent(context.graph()).center();
72109               nominatim.countryCode(center, function (err, code) {
72110                   country = code;
72111               });
72112           }
72113
72114           input
72115               .on('change', change)
72116               .on('blur', change);
72117
72118           if (isMulti || isSemi) {
72119               combobox
72120                   .on('accept', function() {
72121                       input.node().blur();
72122                       input.node().focus();
72123                   });
72124
72125               input
72126                   .on('focus', function() { container.classed('active', true); });
72127           }
72128       }
72129
72130
72131       combo.tags = function(tags) {
72132           if (isMulti || isSemi) {
72133               multiData = [];
72134
72135               if (isMulti) {
72136                   // Build multiData array containing keys already set..
72137                   Object.keys(tags).forEach(function(key) {
72138                       if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return;
72139
72140                       var suffix = key.substring(field.key.length);
72141                       multiData.push({
72142                           key: key,
72143                           value: displayValue(suffix)
72144                       });
72145                   });
72146
72147                   // Set keys for form-field modified (needed for undo and reset buttons)..
72148                   field.keys = map$3(multiData, 'key');
72149
72150               } else if (isSemi) {
72151                   var arr = compact(uniq((tags[field.key] || '').split(';')));
72152                   multiData = arr.map(function(key) {
72153                       return {
72154                           key: key,
72155                           value: displayValue(key)
72156                       };
72157                   });
72158               }
72159
72160               // Exclude existing multikeys from combo options..
72161               var available = objectDifference(comboData, multiData);
72162               combobox.data(available);
72163
72164               // Hide 'Add' button if this field uses fixed set of
72165               // translateable optstrings and they're all currently used..
72166               container.selectAll('.combobox-input, .combobox-caret')
72167                   .classed('hide', optstrings && !available.length);
72168
72169
72170               // Render chips
72171               var chips = container.selectAll('.chips')
72172                   .data(multiData);
72173
72174               chips.exit()
72175                   .remove();
72176
72177               var enter = chips.enter()
72178                   .insert('li', 'input')
72179                   .attr('class', 'chips');
72180
72181               enter.append('span');
72182               enter.append('a');
72183
72184               chips = chips.merge(enter);
72185
72186               chips.select('span')
72187                   .text(function(d) { return d.value; });
72188
72189               chips.select('a')
72190                   .on('click', removeMultikey)
72191                   .attr('class', 'remove')
72192                   .text('×');
72193
72194           } else {
72195               utilGetSetValue(input, displayValue(tags[field.key]));
72196           }
72197       };
72198
72199
72200       combo.focus = function() {
72201           input.node().focus();
72202       };
72203
72204
72205       combo.entity = function(_) {
72206           if (!arguments.length) return entity;
72207           entity = _;
72208           return combo;
72209       };
72210
72211
72212       return utilRebind(combo, dispatch$$1, 'on');
72213   }
72214
72215   function uiFieldText(field, context) {
72216       var dispatch$$1 = dispatch('change');
72217       var nominatim = services.geocoder;
72218       var input;
72219       var entity;
72220
72221
72222       function i(selection$$1) {
72223           var fieldId = 'preset-input-' + field.safeid;
72224
72225           input = selection$$1.selectAll('input')
72226               .data([0]);
72227
72228           input = input.enter()
72229               .append('input')
72230               .attr('type', field.type)
72231               .attr('id', fieldId)
72232               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
72233               .call(utilNoAuto)
72234               .merge(input);
72235
72236           input
72237               .on('input', change(true))
72238               .on('blur', change())
72239               .on('change', change());
72240
72241           if (field.type === 'tel' && nominatim && entity) {
72242               var center = entity.extent(context.graph()).center();
72243               nominatim.countryCode(center, function (err, countryCode) {
72244                   if (err || !dataPhoneFormats[countryCode]) return;
72245                   selection$$1.selectAll('#' + fieldId)
72246                       .attr('placeholder', dataPhoneFormats[countryCode]);
72247               });
72248
72249           } else if (field.type === 'number') {
72250               var rtl = (textDirection === 'rtl');
72251
72252               input.attr('type', 'text');
72253
72254               var spinControl = selection$$1.selectAll('.spin-control')
72255                   .data([0]);
72256
72257               var enter = spinControl.enter()
72258                   .append('div')
72259                   .attr('class', 'spin-control');
72260
72261               enter
72262                   .append('button')
72263                   .datum(rtl ? 1 : -1)
72264                   .attr('class', rtl ? 'increment' : 'decrement')
72265                   .attr('tabindex', -1);
72266
72267               enter
72268                   .append('button')
72269                   .datum(rtl ? -1 : 1)
72270                   .attr('class', rtl ? 'decrement' : 'increment')
72271                   .attr('tabindex', -1);
72272
72273               spinControl = spinControl
72274                   .merge(enter);
72275
72276               spinControl.selectAll('button')
72277                   .on('click', function(d) {
72278                       event.preventDefault();
72279                       input.node().value = parsed(input.node().value) + d;
72280                       change()();
72281                   });
72282           }
72283       }
72284
72285
72286       // parse as a number
72287       function parsed(val) {
72288           return parseFloat(val || 0, 10) || 0;
72289       }
72290
72291       // clamp number to min/max
72292       function clamped(num) {
72293           if (field.minValue !== undefined) {
72294               num = Math.max(num, field.minValue);
72295           }
72296           if (field.maxValue !== undefined) {
72297               num = Math.min(num, field.maxValue);
72298           }
72299           return num;
72300       }
72301
72302
72303       function change(onInput) {
72304           return function() {
72305               var t$$1 = {};
72306               var val = utilGetSetValue(input).trim() || undefined;
72307
72308               if (!onInput) {
72309                   if (field.type === 'number' && val !== undefined) {
72310                       val = clamped(parsed(val)) + '';
72311                   }
72312                   utilGetSetValue(input, val || '');
72313               }
72314               t$$1[field.key] = val;
72315               dispatch$$1.call('change', this, t$$1, onInput);
72316           };
72317       }
72318
72319
72320       i.entity = function(_) {
72321           if (!arguments.length) return entity;
72322           entity = _;
72323           return i;
72324       };
72325
72326
72327       i.tags = function(tags) {
72328           utilGetSetValue(input, tags[field.key] || '');
72329       };
72330
72331
72332       i.focus = function() {
72333           var node = input.node();
72334           if (node) node.focus();
72335       };
72336
72337       return utilRebind(i, dispatch$$1, 'on');
72338   }
72339
72340   function uiFieldAccess(field, context) {
72341       var dispatch$$1 = dispatch('change'),
72342           items;
72343
72344       function access(selection$$1) {
72345           var wrap = selection$$1.selectAll('.preset-input-wrap')
72346               .data([0]);
72347
72348           wrap = wrap.enter()
72349               .append('div')
72350               .attr('class', 'cf preset-input-wrap')
72351               .append('ul')
72352               .merge(wrap);
72353
72354           var list = wrap.selectAll('ul')
72355               .data([0]);
72356
72357           list = list.enter()
72358               .append('ul')
72359               .merge(list);
72360
72361
72362           items = list.selectAll('li')
72363               .data(field.keys);
72364
72365           // Enter
72366           var enter = items.enter()
72367               .append('li')
72368               .attr('class', function(d) { return 'cf preset-access-' + d; });
72369
72370           enter
72371               .append('span')
72372               .attr('class', 'col6 label preset-label-access')
72373               .attr('for', function(d) { return 'preset-input-access-' + d; })
72374               .text(function(d) { return field.t('types.' + d); });
72375
72376           enter
72377               .append('div')
72378               .attr('class', 'col6 preset-input-access-wrap')
72379               .append('input')
72380               .attr('type', 'text')
72381               .attr('class', 'preset-input-access')
72382               .attr('id', function(d) { return 'preset-input-access-' + d; })
72383               .call(utilNoAuto)
72384               .each(function(d) {
72385                   select(this)
72386                       .call(d3combobox()
72387                           .container(context.container())
72388                           .data(access.options(d))
72389                       );
72390               });
72391
72392
72393           // Update
72394           items = items.merge(enter);
72395
72396           wrap.selectAll('.preset-input-access')
72397               .on('change', change)
72398               .on('blur', change);
72399       }
72400
72401
72402       function change(d) {
72403           var tag = {};
72404           tag[d] = utilGetSetValue(select(this)) || undefined;
72405           dispatch$$1.call('change', this, tag);
72406       }
72407
72408
72409       access.options = function(type) {
72410           var options = ['no', 'permissive', 'private', 'permit', 'destination'];
72411
72412           if (type !== 'access') {
72413               options.unshift('yes');
72414               options.push('designated');
72415
72416               if (type === 'bicycle') {
72417                   options.push('dismount');
72418               }
72419           }
72420
72421           return options.map(function(option) {
72422               return {
72423                   title: field.t('options.' + option + '.description'),
72424                   value: option
72425               };
72426           });
72427       };
72428
72429
72430       var placeholders = {
72431           footway: {
72432               foot: 'designated',
72433               motor_vehicle: 'no'
72434           },
72435           steps: {
72436               foot: 'yes',
72437               motor_vehicle: 'no',
72438               bicycle: 'no',
72439               horse: 'no'
72440           },
72441           pedestrian: {
72442               foot: 'yes',
72443               motor_vehicle: 'no'
72444           },
72445           cycleway: {
72446               motor_vehicle: 'no',
72447               bicycle: 'designated'
72448           },
72449           bridleway: {
72450               motor_vehicle: 'no',
72451               horse: 'designated'
72452           },
72453           path: {
72454               foot: 'yes',
72455               motor_vehicle: 'no',
72456               bicycle: 'yes',
72457               horse: 'yes'
72458           },
72459           motorway: {
72460               foot: 'no',
72461               motor_vehicle: 'yes',
72462               bicycle: 'no',
72463               horse: 'no'
72464           },
72465           trunk: {
72466               motor_vehicle: 'yes'
72467           },
72468           primary: {
72469               foot: 'yes',
72470               motor_vehicle: 'yes',
72471               bicycle: 'yes',
72472               horse: 'yes'
72473           },
72474           secondary: {
72475               foot: 'yes',
72476               motor_vehicle: 'yes',
72477               bicycle: 'yes',
72478               horse: 'yes'
72479           },
72480           tertiary: {
72481               foot: 'yes',
72482               motor_vehicle: 'yes',
72483               bicycle: 'yes',
72484               horse: 'yes'
72485           },
72486           residential: {
72487               foot: 'yes',
72488               motor_vehicle: 'yes',
72489               bicycle: 'yes',
72490               horse: 'yes'
72491           },
72492           unclassified: {
72493               foot: 'yes',
72494               motor_vehicle: 'yes',
72495               bicycle: 'yes',
72496               horse: 'yes'
72497           },
72498           service: {
72499               foot: 'yes',
72500               motor_vehicle: 'yes',
72501               bicycle: 'yes',
72502               horse: 'yes'
72503           },
72504           motorway_link: {
72505               foot: 'no',
72506               motor_vehicle: 'yes',
72507               bicycle: 'no',
72508               horse: 'no'
72509           },
72510           trunk_link: {
72511               motor_vehicle: 'yes'
72512           },
72513           primary_link: {
72514               foot: 'yes',
72515               motor_vehicle: 'yes',
72516               bicycle: 'yes',
72517               horse: 'yes'
72518           },
72519           secondary_link: {
72520               foot: 'yes',
72521               motor_vehicle: 'yes',
72522               bicycle: 'yes',
72523               horse: 'yes'
72524           },
72525           tertiary_link: {
72526               foot: 'yes',
72527               motor_vehicle: 'yes',
72528               bicycle: 'yes',
72529               horse: 'yes'
72530           }
72531       };
72532
72533
72534       access.tags = function(tags) {
72535           utilGetSetValue(items.selectAll('.preset-input-access'),
72536               function(d) { return tags[d] || ''; })
72537               .attr('placeholder', function() {
72538                   return tags.access ? tags.access : field.placeholder();
72539               });
72540
72541           items.selectAll('#preset-input-access-access')
72542               .attr('placeholder', 'yes');
72543
72544           forEach(placeholders[tags.highway], function(v, k) {
72545               items.selectAll('#preset-input-access-' + k)
72546                   .attr('placeholder', function() { return (tags.access || v); });
72547           });
72548       };
72549
72550
72551       access.focus = function() {
72552           items.selectAll('.preset-input-access')
72553               .node().focus();
72554       };
72555
72556
72557       return utilRebind(access, dispatch$$1, 'on');
72558   }
72559
72560   function uiFieldAddress(field, context) {
72561       var dispatch$$1 = dispatch('init', 'change'),
72562           nominatim = services.geocoder,
72563           wrap = select(null),
72564           isInitialized = false,
72565           entity;
72566
72567       function getNearStreets() {
72568           var extent = entity.extent(context.graph()),
72569               l = extent.center(),
72570               box = geoExtent$$1(l).padByMeters(200);
72571
72572           var streets = context.intersects(box)
72573               .filter(isAddressable)
72574               .map(function(d) {
72575                   var loc = context.projection([
72576                       (extent[0][0] + extent[1][0]) / 2,
72577                       (extent[0][1] + extent[1][1]) / 2]),
72578                       choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
72579                   return {
72580                       title: d.tags.name,
72581                       value: d.tags.name,
72582                       dist: choice.distance
72583                   };
72584               })
72585               .sort(function(a, b) {
72586                   return a.dist - b.dist;
72587               });
72588
72589           return uniqBy(streets, 'value');
72590
72591           function isAddressable(d) {
72592               return d.tags.highway && d.tags.name && d.type === 'way';
72593           }
72594       }
72595
72596
72597       function getNearCities() {
72598           var extent = entity.extent(context.graph()),
72599               l = extent.center(),
72600               box = geoExtent$$1(l).padByMeters(200);
72601
72602           var cities = context.intersects(box)
72603               .filter(isAddressable)
72604               .map(function(d) {
72605                   return {
72606                       title: d.tags['addr:city'] || d.tags.name,
72607                       value: d.tags['addr:city'] || d.tags.name,
72608                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
72609                   };
72610               })
72611               .sort(function(a, b) {
72612                   return a.dist - b.dist;
72613               });
72614
72615           return uniqBy(cities, 'value');
72616
72617
72618           function isAddressable(d) {
72619               if (d.tags.name) {
72620                   if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
72621                       return true;
72622                   if (d.tags.border_type === 'city')
72623                       return true;
72624                   if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
72625                       return true;
72626               }
72627
72628               if (d.tags['addr:city'])
72629                   return true;
72630
72631               return false;
72632           }
72633       }
72634
72635       function getNearValues(key) {
72636           var extent = entity.extent(context.graph()),
72637               l = extent.center(),
72638               box = geoExtent$$1(l).padByMeters(200);
72639
72640           var results = context.intersects(box)
72641               .filter(function hasTag(d) {
72642                   return d.tags[key];
72643               })
72644               .map(function(d) {
72645                   return {
72646                       title: d.tags[key],
72647                       value: d.tags[key],
72648                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
72649                   };
72650               })
72651               .sort(function(a, b) {
72652                   return a.dist - b.dist;
72653               });
72654
72655           return uniqBy(results, 'value');
72656       }
72657
72658
72659       function initCallback(err, countryCode) {
72660           if (err) return;
72661
72662           var addressFormat = find$1(dataAddressFormats, function (a) {
72663               return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
72664           }) || dataAddressFormats[0];
72665
72666           var widths = addressFormat.widths || {
72667               housenumber: 1/3, street: 2/3,
72668               city: 2/3, state: 1/4, postcode: 1/3
72669           };
72670
72671           function row(r) {
72672               // Normalize widths.
72673               var total = reduce(r, function(sum, field) {
72674                   return sum + (widths[field] || 0.5);
72675               }, 0);
72676
72677               return r.map(function (field) {
72678                   return {
72679                       id: field,
72680                       width: (widths[field] || 0.5) / total
72681                   };
72682               });
72683           }
72684
72685           wrap.selectAll('div.addr-row')
72686               .data(addressFormat.format)
72687               .enter()
72688               .append('div')
72689               .attr('class', 'addr-row')
72690               .selectAll('input')
72691               .data(row)
72692               .enter()
72693               .append('input')
72694               .property('type', 'text')
72695               .attr('placeholder', function (d) {
72696                   var localkey = d.id + '!' + countryCode.toLowerCase(),
72697                       tkey = field.strings.placeholders[localkey] ? localkey : d.id;
72698                   return field.t('placeholders.' + tkey);
72699               })
72700               .attr('class', function (d) { return 'addr-' + d.id; })
72701               .call(utilNoAuto)
72702               .style('width', function (d) { return d.width * 100 + '%'; });
72703
72704           // Update
72705
72706           // setup dropdowns for common address tags
72707           var dropdowns = addressFormat.dropdowns || [
72708               'city', 'county', 'country', 'district', 'hamlet',
72709               'neighbourhood', 'place', 'postcode', 'province',
72710               'quarter', 'state', 'street', 'subdistrict', 'suburb'
72711           ];
72712
72713           // If fields exist for any of these tags, create dropdowns to pick nearby values..
72714           dropdowns.forEach(function(tag) {
72715               var nearValues = (tag === 'street') ? getNearStreets
72716                       : (tag === 'city') ? getNearCities
72717                       : getNearValues;
72718
72719               wrap.selectAll('input.addr-' + tag)
72720                   .call(d3combobox()
72721                       .container(context.container())
72722                       .minItems(1)
72723                       .fetcher(function(value, callback) {
72724                           callback(nearValues('addr:' + tag));
72725                       })
72726                   );
72727           });
72728
72729           wrap.selectAll('input')
72730               .on('blur', change())
72731               .on('change', change());
72732
72733           wrap.selectAll('input:not(.combobox-input)')
72734               .on('input', change(true));
72735
72736           dispatch$$1.call('init');
72737           isInitialized = true;
72738       }
72739
72740
72741       function address(selection$$1) {
72742           isInitialized = false;
72743
72744           wrap = selection$$1.selectAll('.preset-input-wrap')
72745               .data([0]);
72746
72747           wrap = wrap.enter()
72748               .append('div')
72749               .attr('class', 'preset-input-wrap')
72750               .merge(wrap);
72751
72752           if (nominatim && entity) {
72753               var center = entity.extent(context.graph()).center();
72754               nominatim.countryCode(center, initCallback);
72755           }
72756       }
72757
72758
72759       function change(onInput) {
72760           return function() {
72761               var tags = {};
72762
72763               wrap.selectAll('input')
72764                   .each(function (field) {
72765                       tags['addr:' + field.id] = this.value || undefined;
72766                   });
72767
72768               dispatch$$1.call('change', this, tags, onInput);
72769           };
72770       }
72771
72772
72773       function updateTags(tags) {
72774           utilGetSetValue(wrap.selectAll('input'), function (field) {
72775               return tags['addr:' + field.id] || '';
72776           });
72777       }
72778
72779
72780       address.entity = function(_) {
72781           if (!arguments.length) return entity;
72782           entity = _;
72783           return address;
72784       };
72785
72786
72787       address.tags = function(tags) {
72788           if (isInitialized) {
72789               updateTags(tags);
72790           } else {
72791               dispatch$$1.on('init', function () {
72792                   dispatch$$1.on('init', null);
72793                   updateTags(tags);
72794               });
72795           }
72796       };
72797
72798
72799       address.focus = function() {
72800           var node = wrap.selectAll('input').node();
72801           if (node) node.focus();
72802       };
72803
72804
72805       return utilRebind(address, dispatch$$1, 'on');
72806   }
72807
72808   function uiFieldCycleway(field, context) {
72809       var dispatch$$1 = dispatch('change'),
72810           items = select(null);
72811
72812
72813       function cycleway(selection$$1) {
72814
72815           function stripcolon(s) {
72816               return s.replace(':', '');
72817           }
72818
72819
72820           var wrap = selection$$1.selectAll('.preset-input-wrap')
72821               .data([0]);
72822
72823           wrap = wrap.enter()
72824               .append('div')
72825               .attr('class', 'cf preset-input-wrap')
72826               .merge(wrap);
72827
72828
72829           var div = wrap.selectAll('ul')
72830               .data([0]);
72831
72832           div = div.enter()
72833               .append('ul')
72834               .merge(div);
72835
72836
72837           items = div.selectAll('li')
72838               .data(field.keys);
72839
72840           var enter = items.enter()
72841               .append('li')
72842               .attr('class', function(d) { return 'cf preset-cycleway-' + stripcolon(d); });
72843
72844           enter
72845               .append('span')
72846               .attr('class', 'col6 label preset-label-cycleway')
72847               .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
72848               .text(function(d) { return field.t('types.' + d); });
72849
72850           enter
72851               .append('div')
72852               .attr('class', 'col6 preset-input-cycleway-wrap')
72853               .append('input')
72854               .attr('type', 'text')
72855               .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
72856               .call(utilNoAuto)
72857               .each(function(d) {
72858                   select(this)
72859                       .call(d3combobox()
72860                           .container(context.container())
72861                           .data(cycleway.options(d))
72862                       );
72863               });
72864
72865
72866           // Update
72867           wrap.selectAll('.preset-input-cycleway')
72868               .on('change', change)
72869               .on('blur', change);
72870       }
72871
72872
72873       function change() {
72874           var left = utilGetSetValue(select('.preset-input-cyclewayleft')),
72875               right = utilGetSetValue(select('.preset-input-cyclewayright')),
72876               tag = {};
72877
72878           if (left === 'none' || left === '') { left = undefined; }
72879           if (right === 'none' || right === '') { right = undefined; }
72880
72881           // Always set both left and right as changing one can affect the other
72882           tag = {
72883               cycleway: undefined,
72884               'cycleway:left': left,
72885               'cycleway:right': right
72886           };
72887
72888           // If the left and right tags match, use the cycleway tag to tag both
72889           // sides the same way
72890           if (left === right) {
72891               tag = {
72892                   cycleway: left,
72893                   'cycleway:left': undefined,
72894                   'cycleway:right': undefined
72895               };
72896           }
72897
72898           dispatch$$1.call('change', this, tag);
72899       }
72900
72901
72902       cycleway.options = function() {
72903           return keys$1(field.strings.options).map(function(option) {
72904               return {
72905                   title: field.t('options.' + option + '.description'),
72906                   value: option
72907               };
72908           });
72909       };
72910
72911
72912       cycleway.tags = function(tags) {
72913           utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
72914                   // If cycleway is set, always return that
72915                   if (tags.cycleway) {
72916                       return tags.cycleway;
72917                   }
72918                   return tags[d] || '';
72919               })
72920               .attr('placeholder', field.placeholder());
72921       };
72922
72923
72924       cycleway.focus = function() {
72925           items.selectAll('.preset-input-cycleway')
72926               .node().focus();
72927       };
72928
72929
72930       return utilRebind(cycleway, dispatch$$1, 'on');
72931   }
72932
72933   function uiFieldLanes(field, context) {
72934       var dispatch$$1 = dispatch('change'),
72935           LANE_WIDTH = 40,
72936           LANE_HEIGHT = 200,
72937           wayID,
72938           lanesData;
72939
72940       function lanes(selection$$1) {
72941           lanesData = context.entity(wayID).lanes();
72942
72943           if (!select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
72944               selection$$1.call(lanes.off);
72945               return;
72946           }
72947
72948           var wrap = selection$$1.selectAll('.preset-input-wrap')
72949               .data([0]);
72950
72951           wrap = wrap.enter()
72952               .append('div')
72953               .attr('class', 'preset-input-wrap')
72954               .merge(wrap);
72955
72956           var surface =  wrap.selectAll('.surface')
72957               .data([0]);
72958
72959           var d = utilGetDimensions(wrap);
72960           var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
72961
72962           surface = surface.enter()
72963               .append('svg')
72964               .attr('width', d[0])
72965               .attr('height', 300)
72966               .attr('class', 'surface')
72967               .merge(surface);
72968
72969
72970           var lanesSelection = surface.selectAll('.lanes')
72971               .data([0]);
72972
72973           lanesSelection = lanesSelection.enter()
72974               .append('g')
72975               .attr('class', 'lanes')
72976               .merge(lanesSelection);
72977
72978           lanesSelection
72979               .attr('transform', function () {
72980                   return 'translate(' + (freeSpace / 2) + ', 0)';
72981               });
72982
72983
72984           var lane = lanesSelection.selectAll('.lane')
72985              .data(lanesData.lanes);
72986
72987           lane.exit()
72988               .remove();
72989
72990           var enter = lane.enter()
72991               .append('g')
72992               .attr('class', 'lane');
72993
72994           enter
72995               .append('g')
72996               .append('rect')
72997               .attr('y', 50)
72998               .attr('width', LANE_WIDTH)
72999               .attr('height', LANE_HEIGHT);
73000
73001           enter
73002               .append('g')
73003               .attr('class', 'forward')
73004               .append('text')
73005               .attr('y', 40)
73006               .attr('x', 14)
73007               .text('▲');
73008
73009           enter
73010               .append('g')
73011               .attr('class', 'bothways')
73012               .append('text')
73013               .attr('y', 40)
73014               .attr('x', 14)
73015               .text('▲▼');
73016
73017           enter
73018               .append('g')
73019               .attr('class', 'backward')
73020               .append('text')
73021               .attr('y', 40)
73022               .attr('x', 14)
73023               .text('▼');
73024
73025
73026           lane = lane
73027               .merge(enter);
73028
73029           lane
73030               .attr('transform', function(d) {
73031                   return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
73032               });
73033
73034           lane.select('.forward')
73035               .style('visibility', function(d) {
73036                   return d.direction === 'forward' ? 'visible' : 'hidden';
73037               });
73038
73039           lane.select('.bothways')
73040               .style('visibility', function(d) {
73041                   return d.direction === 'bothways' ? 'visible' : 'hidden';
73042               });
73043
73044           lane.select('.backward')
73045               .style('visibility', function(d) {
73046                   return d.direction === 'backward' ? 'visible' : 'hidden';
73047               });
73048       }
73049
73050
73051       lanes.entity = function(_) {
73052           if (!wayID || wayID !== _.id) {
73053               wayID = _.id;
73054           }
73055       };
73056
73057       lanes.tags = function() {};
73058       lanes.focus = function() {};
73059       lanes.off = function() {};
73060
73061       return utilRebind(lanes, dispatch$$1, 'on');
73062   }
73063
73064   function uiFieldLocalized(field, context) {
73065       var dispatch$$1 = dispatch('change', 'input'),
73066           wikipedia = services.wikipedia,
73067           input = select(null),
73068           localizedInputs = select(null),
73069           wikiTitles,
73070           entity;
73071
73072
73073       function localized(selection$$1) {
73074           input = selection$$1.selectAll('.localized-main')
73075               .data([0]);
73076
73077           input = input.enter()
73078               .append('input')
73079               .attr('type', 'text')
73080               .attr('id', 'preset-input-' + field.safeid)
73081               .attr('class', 'localized-main')
73082               .attr('placeholder', field.placeholder())
73083               .call(utilNoAuto)
73084               .merge(input);
73085
73086           if (field.id === 'name') {
73087               var preset = context.presets().match(entity, context.graph());
73088               input
73089                   .call(d3combobox()
73090                       .container(context.container())
73091                       .fetcher(utilSuggestNames(preset, dataSuggestions))
73092                   );
73093           }
73094
73095           input
73096               .on('input', change(true))
73097               .on('blur', change())
73098               .on('change', change());
73099
73100
73101           var translateButton = selection$$1.selectAll('.localized-add')
73102               .data([0]);
73103
73104           translateButton = translateButton.enter()
73105               .append('button')
73106               .attr('class', 'button-input-action localized-add minor')
73107               .attr('tabindex', -1)
73108               .call(svgIcon('#iD-icon-plus'))
73109               .call(tooltip()
73110                   .title(t('translate.translate'))
73111                   .placement('left'))
73112               .merge(translateButton);
73113
73114           translateButton
73115               .on('click', addNew);
73116
73117
73118           localizedInputs = selection$$1.selectAll('.localized-wrap')
73119               .data([0]);
73120
73121           localizedInputs = localizedInputs.enter().append('div')
73122               .attr('class', 'localized-wrap')
73123               .merge(localizedInputs);
73124       }
73125
73126
73127       function addNew() {
73128           event.preventDefault();
73129           var data$$1 = localizedInputs.selectAll('div.entry').data();
73130           var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
73131           var langExists = find$1(data$$1, function(datum) { return datum.lang === defaultLang;});
73132           var isLangEn = defaultLang.indexOf('en') > -1;
73133           if (isLangEn || langExists) {
73134               defaultLang = '';
73135           }
73136           data$$1.push({ lang: defaultLang, value: '' });
73137           localizedInputs.call(render, data$$1);
73138       }
73139
73140
73141       function change(onInput) {
73142           return function() {
73143               var t$$1 = {};
73144               t$$1[field.key] = utilGetSetValue(select(this)) || undefined;
73145               dispatch$$1.call('change', this, t$$1, onInput);
73146           };
73147       }
73148
73149
73150       function key(lang) {
73151           return field.key + ':' + lang;
73152       }
73153
73154
73155       function changeLang(d) {
73156           var lang = utilGetSetValue(select(this)),
73157               t$$1 = {},
73158               language = find$1(wikipedia$2, function(d) {
73159                   return d[0].toLowerCase() === lang.toLowerCase() ||
73160                       d[1].toLowerCase() === lang.toLowerCase();
73161               });
73162
73163           if (language) lang = language[2];
73164
73165           if (d.lang && d.lang !== lang) {
73166               t$$1[key(d.lang)] = undefined;
73167           }
73168
73169           var value = utilGetSetValue(select(this.parentNode)
73170               .selectAll('.localized-value'));
73171
73172           if (lang && value) {
73173               t$$1[key(lang)] = value;
73174           } else if (lang && wikiTitles && wikiTitles[d.lang]) {
73175               t$$1[key(lang)] = wikiTitles[d.lang];
73176           }
73177
73178           d.lang = lang;
73179           dispatch$$1.call('change', this, t$$1);
73180       }
73181
73182
73183       function changeValue(d) {
73184           if (!d.lang) return;
73185           var t$$1 = {};
73186           t$$1[key(d.lang)] = utilGetSetValue(select(this)) || undefined;
73187           dispatch$$1.call('change', this, t$$1);
73188       }
73189
73190
73191       function fetcher(value, cb) {
73192           var v = value.toLowerCase();
73193
73194           cb(wikipedia$2.filter(function(d) {
73195               return d[0].toLowerCase().indexOf(v) >= 0 ||
73196               d[1].toLowerCase().indexOf(v) >= 0 ||
73197               d[2].toLowerCase().indexOf(v) >= 0;
73198           }).map(function(d) {
73199               return { value: d[1] };
73200           }));
73201       }
73202
73203
73204       function render(selection$$1, data$$1) {
73205           var wraps = selection$$1.selectAll('div.entry').
73206               data(data$$1, function(d) { return d.lang; });
73207
73208           wraps.exit()
73209               .transition()
73210               .duration(200)
73211               .style('max-height','0px')
73212               .style('opacity', '0')
73213               .style('top','-10px')
73214               .remove();
73215
73216           var innerWrap = wraps.enter()
73217               .insert('div', ':first-child');
73218
73219           innerWrap.attr('class', 'entry')
73220               .each(function() {
73221                   var wrap = select(this);
73222                   var langcombo = d3combobox()
73223                       .container(context.container())
73224                       .fetcher(fetcher)
73225                       .minItems(0);
73226
73227                   var label = wrap
73228                       .append('label')
73229                       .attr('class','form-label')
73230                       .text(t('translate.localized_translation_label'))
73231                       .attr('for','localized-lang');
73232
73233                   label
73234                       .append('button')
73235                       .attr('class', 'minor remove')
73236                       .on('click', function(d){
73237                           event.preventDefault();
73238                           var t$$1 = {};
73239                           t$$1[key(d.lang)] = undefined;
73240                           dispatch$$1.call('change', this, t$$1);
73241                           select(this.parentNode.parentNode)
73242                               .style('top','0')
73243                               .style('max-height','240px')
73244                               .transition()
73245                               .style('opacity', '0')
73246                               .style('max-height','0px')
73247                               .remove();
73248                       })
73249                       .call(svgIcon('#iD-operation-delete'));
73250
73251                   wrap
73252                       .append('input')
73253                       .attr('class', 'localized-lang')
73254                       .attr('type', 'text')
73255                       .attr('placeholder',t('translate.localized_translation_language'))
73256                       .on('blur', changeLang)
73257                       .on('change', changeLang)
73258                       .call(langcombo);
73259
73260                   wrap
73261                       .append('input')
73262                       .on('blur', changeValue)
73263                       .on('change', changeValue)
73264                       .attr('type', 'text')
73265                       .attr('placeholder', t('translate.localized_translation_name'))
73266                       .attr('class', 'localized-value');
73267               });
73268
73269           innerWrap
73270               .style('margin-top', '0px')
73271               .style('max-height', '0px')
73272               .style('opacity', '0')
73273               .transition()
73274               .duration(200)
73275               .style('margin-top', '10px')
73276               .style('max-height', '240px')
73277               .style('opacity', '1')
73278               .on('end', function() {
73279                   select(this)
73280                       .style('max-height', '')
73281                       .style('overflow', 'visible');
73282               });
73283
73284
73285           var entry = selection$$1.selectAll('.entry');
73286
73287           utilGetSetValue(entry.select('.localized-lang'), function(d) {
73288                   var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
73289                   return lang ? lang[1] : d.lang;
73290               });
73291
73292           utilGetSetValue(entry.select('.localized-value'),
73293               function(d) { return d.value; });
73294       }
73295
73296
73297       localized.tags = function(tags) {
73298           // Fetch translations from wikipedia
73299           if (tags.wikipedia && !wikiTitles) {
73300               wikiTitles = {};
73301               var wm = tags.wikipedia.match(/([^:]+):(.+)/);
73302               if (wm && wm[0] && wm[1]) {
73303                   wikipedia.translations(wm[1], wm[2], function(d) {
73304                       wikiTitles = d;
73305                   });
73306               }
73307           }
73308
73309           utilGetSetValue(input, tags[field.key] || '');
73310
73311           var postfixed = [], k, m;
73312           for (k in tags) {
73313               m = k.match(/^(.*):([a-zA-Z_-]+)$/);
73314               if (m && m[1] === field.key && m[2]) {
73315                   postfixed.push({ lang: m[2], value: tags[k] });
73316               }
73317           }
73318
73319           localizedInputs.call(render, postfixed.reverse());
73320       };
73321
73322
73323       localized.focus = function() {
73324           input.node().focus();
73325       };
73326
73327
73328       localized.entity = function(_) {
73329           if (!arguments.length) return entity;
73330           entity = _;
73331           return localized;
73332       };
73333
73334       return utilRebind(localized, dispatch$$1, 'on');
73335   }
73336
73337   function uiFieldMaxspeed(field, context) {
73338       var dispatch$$1 = dispatch('change'),
73339           entity,
73340           isImperial,
73341           unitInput = select(null),
73342           input = select(null),
73343           combobox;
73344
73345       var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
73346           imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
73347
73348
73349       function maxspeed(selection$$1) {
73350           combobox = d3combobox()
73351               .container(context.container());
73352
73353           var unitCombobox = d3combobox()
73354               .container(context.container())
73355               .data(['km/h', 'mph'].map(comboValues));
73356
73357           input = selection$$1.selectAll('#preset-input-' + field.safeid)
73358               .data([0]);
73359
73360           input = input.enter()
73361               .append('input')
73362               .attr('type', 'text')
73363               .attr('id', 'preset-input-' + field.safeid)
73364               .attr('placeholder', field.placeholder())
73365               .call(utilNoAuto)
73366               .call(combobox)
73367               .merge(input);
73368
73369           input
73370               .on('change', change)
73371               .on('blur', change);
73372
73373           var childNodes = context.graph().childNodes(context.entity(entity.id)),
73374               loc = childNodes[~~(childNodes.length/2)].loc;
73375
73376           isImperial = some(dataImperial.features, function(f) {
73377               return some(f.geometry.coordinates, function(d) {
73378                   return geoPointInPolygon(loc, d);
73379               });
73380           });
73381
73382           unitInput = selection$$1.selectAll('input.maxspeed-unit')
73383               .data([0]);
73384
73385           unitInput = unitInput.enter()
73386               .append('input')
73387               .attr('type', 'text')
73388               .attr('class', 'maxspeed-unit')
73389               .call(unitCombobox)
73390               .merge(unitInput);
73391
73392           unitInput
73393               .on('blur', changeUnits)
73394               .on('change', changeUnits);
73395
73396
73397           function changeUnits() {
73398               isImperial = utilGetSetValue(unitInput) === 'mph';
73399               utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
73400               setSuggestions();
73401               change();
73402           }
73403       }
73404
73405
73406       function setSuggestions() {
73407           combobox.data((isImperial ? imperialValues : metricValues).map(comboValues));
73408           utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
73409       }
73410
73411
73412       function comboValues(d) {
73413           return {
73414               value: d.toString(),
73415               title: d.toString()
73416           };
73417       }
73418
73419
73420       function change() {
73421           var tag = {},
73422               value = utilGetSetValue(input);
73423
73424           if (!value) {
73425               tag[field.key] = undefined;
73426           } else if (isNaN(value) || !isImperial) {
73427               tag[field.key] = value;
73428           } else {
73429               tag[field.key] = value + ' mph';
73430           }
73431
73432           dispatch$$1.call('change', this, tag);
73433       }
73434
73435
73436       maxspeed.tags = function(tags) {
73437           var value = tags[field.key];
73438
73439           if (value && value.indexOf('mph') >= 0) {
73440               value = parseInt(value, 10);
73441               isImperial = true;
73442           } else if (value) {
73443               isImperial = false;
73444           }
73445
73446           setSuggestions();
73447           utilGetSetValue(input, value || '');
73448       };
73449
73450
73451       maxspeed.focus = function() {
73452           input.node().focus();
73453       };
73454
73455
73456       maxspeed.entity = function(_) {
73457           entity = _;
73458       };
73459
73460
73461       return utilRebind(maxspeed, dispatch$$1, 'on');
73462   }
73463
73464   /**
73465    * This function is like `baseIndexOf` except that it accepts a comparator.
73466    *
73467    * @private
73468    * @param {Array} array The array to inspect.
73469    * @param {*} value The value to search for.
73470    * @param {number} fromIndex The index to search from.
73471    * @param {Function} comparator The comparator invoked per element.
73472    * @returns {number} Returns the index of the matched value, else `-1`.
73473    */
73474   function baseIndexOfWith(array, value, fromIndex, comparator) {
73475     var index = fromIndex - 1,
73476         length = array.length;
73477
73478     while (++index < length) {
73479       if (comparator(array[index], value)) {
73480         return index;
73481       }
73482     }
73483     return -1;
73484   }
73485
73486   /** Used for built-in method references. */
73487   var arrayProto$2 = Array.prototype;
73488
73489   /** Built-in value references. */
73490   var splice$2 = arrayProto$2.splice;
73491
73492   /**
73493    * The base implementation of `_.pullAllBy` without support for iteratee
73494    * shorthands.
73495    *
73496    * @private
73497    * @param {Array} array The array to modify.
73498    * @param {Array} values The values to remove.
73499    * @param {Function} [iteratee] The iteratee invoked per element.
73500    * @param {Function} [comparator] The comparator invoked per element.
73501    * @returns {Array} Returns `array`.
73502    */
73503   function basePullAll(array, values, iteratee, comparator) {
73504     var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
73505         index = -1,
73506         length = values.length,
73507         seen = array;
73508
73509     if (array === values) {
73510       values = copyArray(values);
73511     }
73512     if (iteratee) {
73513       seen = arrayMap(array, baseUnary(iteratee));
73514     }
73515     while (++index < length) {
73516       var fromIndex = 0,
73517           value = values[index],
73518           computed = iteratee ? iteratee(value) : value;
73519
73520       while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
73521         if (seen !== array) {
73522           splice$2.call(seen, fromIndex, 1);
73523         }
73524         splice$2.call(array, fromIndex, 1);
73525       }
73526     }
73527     return array;
73528   }
73529
73530   /**
73531    * This method is like `_.pull` except that it accepts an array of values to remove.
73532    *
73533    * **Note:** Unlike `_.difference`, this method mutates `array`.
73534    *
73535    * @static
73536    * @memberOf _
73537    * @since 4.0.0
73538    * @category Array
73539    * @param {Array} array The array to modify.
73540    * @param {Array} values The values to remove.
73541    * @returns {Array} Returns `array`.
73542    * @example
73543    *
73544    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
73545    *
73546    * _.pullAll(array, ['a', 'c']);
73547    * console.log(array);
73548    * // => ['b', 'b']
73549    */
73550   function pullAll(array, values) {
73551     return (array && array.length && values && values.length)
73552       ? basePullAll(array, values)
73553       : array;
73554   }
73555
73556   /**
73557    * Removes all given values from `array` using
73558    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
73559    * for equality comparisons.
73560    *
73561    * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
73562    * to remove elements from an array by predicate.
73563    *
73564    * @static
73565    * @memberOf _
73566    * @since 2.0.0
73567    * @category Array
73568    * @param {Array} array The array to modify.
73569    * @param {...*} [values] The values to remove.
73570    * @returns {Array} Returns `array`.
73571    * @example
73572    *
73573    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
73574    *
73575    * _.pull(array, 'a', 'c');
73576    * console.log(array);
73577    * // => ['b', 'b']
73578    */
73579   var pull = baseRest(pullAll);
73580
73581   function uiFieldRadio(field, context) {
73582       var dispatch$$1 = dispatch('change'),
73583           placeholder = select(null),
73584           wrap = select(null),
73585           labels = select(null),
73586           radios = select(null),
73587           radioData = clone(field.options || field.keys),
73588           typeField,
73589           layerField,
73590           oldType = {},
73591           entity;
73592
73593
73594       function selectedKey() {
73595           var node = wrap.selectAll('.toggle-list label.active input');
73596           return !node.empty() && node.datum();
73597       }
73598
73599
73600       function radio(selection$$1) {
73601           selection$$1.classed('preset-radio', true);
73602
73603           wrap = selection$$1.selectAll('.preset-input-wrap')
73604               .data([0]);
73605
73606           var enter = wrap.enter()
73607               .append('div')
73608               .attr('class', 'preset-input-wrap toggle-list');
73609
73610           enter
73611               .append('span')
73612               .attr('class', 'placeholder');
73613
73614           wrap = wrap
73615               .merge(enter);
73616
73617
73618           placeholder = wrap.selectAll('.placeholder');
73619
73620           labels = wrap.selectAll('label')
73621               .data(radioData);
73622
73623           enter = labels.enter()
73624               .append('label');
73625
73626           enter
73627               .append('input')
73628               .attr('type', 'radio')
73629               .attr('name', field.id)
73630               .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
73631               .attr('checked', false);
73632
73633           enter
73634               .append('span')
73635               .text(function(d) { return field.t('options.' + d, { 'default': d }); });
73636
73637           labels = labels
73638               .merge(enter);
73639
73640           radios = labels.selectAll('input')
73641               .on('change', changeRadio);
73642
73643       }
73644
73645
73646       function structureExtras(selection$$1, tags) {
73647           var selected = selectedKey(),
73648               type = context.presets().field(selected),
73649               layer = context.presets().field('layer'),
73650               showLayer = (selected === 'bridge' || selected === 'tunnel');
73651
73652
73653           var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
73654               .data(selected ? [0] : []);
73655
73656           extrasWrap.exit()
73657               .remove();
73658
73659           extrasWrap = extrasWrap.enter()
73660               .append('div')
73661               .attr('class', 'structure-extras-wrap')
73662               .merge(extrasWrap);
73663
73664           var list = extrasWrap.selectAll('ul')
73665               .data([0]);
73666
73667           list = list.enter()
73668               .append('ul')
73669               .merge(list);
73670
73671
73672           // Type
73673           if (type) {
73674               if (!typeField || typeField.id !== selected) {
73675                   typeField = uiField(context, type, entity, { wrap: false })
73676                       .on('change', changeType);
73677               }
73678               typeField.tags(tags);
73679           } else {
73680               typeField = null;
73681           }
73682
73683           var typeItem = list.selectAll('.structure-type-item')
73684               .data(typeField ? [typeField] : [], function(d) { return d.id; });
73685
73686           // Exit
73687           typeItem.exit()
73688               .remove();
73689
73690           // Enter
73691           var typeEnter = typeItem.enter()
73692               .insert('li', ':first-child')
73693               .attr('class', 'cf structure-type-item');
73694
73695           typeEnter
73696               .append('span')
73697               .attr('class', 'col6 label structure-label-type')
73698               .attr('for', 'preset-input-' + selected)
73699               .text(t('inspector.radio.structure.type'));
73700
73701           typeEnter
73702               .append('div')
73703               .attr('class', 'col6 structure-input-type-wrap');
73704
73705           // Update
73706           typeItem = typeItem
73707               .merge(typeEnter);
73708
73709           if (typeField) {
73710               typeItem.selectAll('.structure-input-type-wrap')
73711                   .call(typeField.render);
73712           }
73713
73714
73715           // Layer
73716           if (layer && showLayer) {
73717               if (!layerField) {
73718                   layerField = uiField(context, layer, entity, { wrap: false })
73719                       .on('change', changeLayer);
73720               }
73721               layerField.tags(tags);
73722               field.keys = union(field.keys, ['layer']);
73723           } else {
73724               layerField = null;
73725               pull(field.keys, 'layer');
73726           }
73727
73728           var layerItem = list.selectAll('.structure-layer-item')
73729               .data(layerField ? [layerField] : []);
73730
73731           // Exit
73732           layerItem.exit()
73733               .remove();
73734
73735           // Enter
73736           var layerEnter = layerItem.enter()
73737               .append('li')
73738               .attr('class', 'cf structure-layer-item');
73739
73740           layerEnter
73741               .append('span')
73742               .attr('class', 'col6 label structure-label-layer')
73743               .attr('for', 'preset-input-layer')
73744               .text(t('inspector.radio.structure.layer'));
73745
73746           layerEnter
73747               .append('div')
73748               .attr('class', 'col6 structure-input-layer-wrap');
73749
73750           // Update
73751           layerItem = layerItem
73752               .merge(layerEnter);
73753
73754           if (layerField) {
73755               layerItem.selectAll('.structure-input-layer-wrap')
73756                   .call(layerField.render);
73757           }
73758       }
73759
73760
73761       function changeType(t$$1, onInput) {
73762           var key = selectedKey();
73763           if (!key) return;
73764
73765           var val = t$$1[key];
73766           if (val !== 'no') {
73767               oldType[key] = val;
73768           }
73769
73770           if (field.type === 'structureRadio') {
73771               // remove layer if it should not be set
73772               if (val === 'no' ||
73773                   (key !== 'bridge' && key !== 'tunnel') ||
73774                   (key === 'tunnel' && val === 'building_passage')) {
73775                   t$$1.layer = undefined;
73776               }
73777               // add layer if it should be set
73778               if (t$$1.layer === undefined) {
73779                   if (key === 'bridge' && val !== 'no') {
73780                       t$$1.layer = '1';
73781                   }
73782                   if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
73783                       t$$1.layer = '-1';
73784                   }
73785               }
73786            }
73787
73788           dispatch$$1.call('change', this, t$$1, onInput);
73789       }
73790
73791
73792       function changeLayer(t$$1, onInput) {
73793           if (t$$1.layer === '0') {
73794               t$$1.layer = undefined;
73795           }
73796           dispatch$$1.call('change', this, t$$1, onInput);
73797       }
73798
73799
73800       function changeRadio() {
73801           var t$$1 = {},
73802               activeKey;
73803
73804           if (field.key) {
73805               t$$1[field.key] = undefined;
73806           }
73807
73808           radios.each(function(d) {
73809               var active = select(this).property('checked');
73810               if (active) activeKey = d;
73811
73812               if (field.key) {
73813                   if (active) t$$1[field.key] = d;
73814               } else {
73815                   var val = oldType[activeKey] || 'yes';
73816                   t$$1[d] = active ? val : undefined;
73817               }
73818           });
73819
73820           if (field.type === 'structureRadio') {
73821               if (activeKey === 'bridge') {
73822                   t$$1.layer = '1';
73823               } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
73824                   t$$1.layer = '-1';
73825               } else {
73826                   t$$1.layer = undefined;
73827               }
73828           }
73829
73830           dispatch$$1.call('change', this, t$$1);
73831       }
73832
73833
73834       radio.tags = function(tags) {
73835           function checked(d) {
73836               if (field.key) {
73837                   return tags[field.key] === d;
73838               } else {
73839                   return !!(tags[d] && tags[d].toLowerCase() !== 'no');
73840               }
73841           }
73842
73843           labels.classed('active', checked);
73844           radios.property('checked', checked);
73845
73846           var selection$$1 = radios.filter(function() { return this.checked; });
73847
73848           if (selection$$1.empty()) {
73849               placeholder.text(t('inspector.none'));
73850           } else {
73851               placeholder.text(selection$$1.attr('value'));
73852               oldType[selection$$1.datum()] = tags[selection$$1.datum()];
73853           }
73854
73855           if (field.type === 'structureRadio') {
73856               // For waterways without a tunnel tag, set 'culvert' as
73857               // the oldType to default to if the user picks 'tunnel'
73858               if (!!tags.waterway && !oldType.tunnel) {
73859                   oldType.tunnel = 'culvert';
73860               }
73861
73862               wrap.call(structureExtras, tags);
73863           }
73864       };
73865
73866
73867       radio.focus = function() {
73868           radios.node().focus();
73869       };
73870
73871
73872       radio.entity = function(_) {
73873           if (!arguments.length) return entity;
73874           entity = _;
73875           oldType = {};
73876           return radio;
73877       };
73878
73879
73880       return utilRebind(radio, dispatch$$1, 'on');
73881   }
73882
73883   function uiFieldRestrictions(field, context) {
73884       var dispatch$$1 = dispatch('change');
73885       var breathe = behaviorBreathe(context);
73886       var storedViaWay = context.storage('turn-restriction-via-way');
73887       var storedDistance = context.storage('turn-restriction-distance');
73888
73889       var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
73890       var _maxDistance = storedDistance ? (+storedDistance) : 30;
73891       var _initialized = false;
73892       var _parent = select(null);       // the entire field
73893       var _container = select(null);    // just the map
73894       var _oldTurns;
73895       var _graph;
73896       var _vertexID;
73897       var _intersection;
73898       var _fromWayID;
73899
73900
73901       function restrictions(selection$$1) {
73902           _parent = selection$$1;
73903
73904           // try to reuse the intersection, but always rebuild it if the graph has changed
73905           if (_vertexID && (context.graph() !== _graph || !_intersection)) {
73906               _graph = context.graph();
73907               _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
73908           }
73909
73910           // It's possible for there to be no actual intersection here.
73911           // for example, a vertex of two `highway=path`
73912           // In this case, hide the field.
73913           var isOK = (
73914               _intersection &&
73915               _intersection.vertices.length &&           // has vertices
73916               _intersection.vertices                     // has the vertex that the user selected
73917                   .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
73918               _intersection.ways.length > 2 &&           // has more than 2 ways
73919               _intersection.ways                         // has more than 1 TO way
73920                   .filter(function(way) { return way.__to; }).length > 1
73921           );
73922
73923           // Also hide in the case where
73924           select(selection$$1.node().parentNode).classed('hide', !isOK);
73925
73926           // if form field is hidden or has detached from dom, clean up.
73927           if (!isOK ||
73928               !select('.inspector-wrap.inspector-hidden').empty() ||
73929               !selection$$1.node().parentNode ||
73930               !selection$$1.node().parentNode.parentNode) {
73931               selection$$1.call(restrictions.off);
73932               return;
73933           }
73934
73935
73936           var wrap = selection$$1.selectAll('.preset-input-wrap')
73937               .data([0]);
73938
73939           wrap = wrap.enter()
73940               .append('div')
73941               .attr('class', 'preset-input-wrap')
73942               .merge(wrap);
73943
73944           var container = wrap.selectAll('.restriction-container')
73945               .data([0]);
73946
73947           // enter
73948           var containerEnter = container.enter()
73949               .append('div')
73950               .attr('class', 'restriction-container');
73951
73952           containerEnter
73953               .append('div')
73954               .attr('class', 'restriction-help');
73955
73956           // update
73957           _container = containerEnter
73958               .merge(container)
73959               .call(renderViewer);
73960
73961           var controls = wrap.selectAll('.restriction-controls')
73962               .data([0]);
73963
73964           // enter/update
73965           controls.enter()
73966               .append('div')
73967               .attr('class', 'restriction-controls-container')
73968               .append('div')
73969               .attr('class', 'restriction-controls')
73970               .merge(controls)
73971               .call(renderControls);
73972       }
73973
73974
73975       function renderControls(selection$$1) {
73976           var distControl = selection$$1.selectAll('.restriction-distance')
73977               .data([0]);
73978
73979           distControl.exit()
73980               .remove();
73981
73982           var distControlEnter = distControl.enter()
73983               .append('div')
73984               .attr('class', 'restriction-control restriction-distance');
73985
73986           distControlEnter
73987               .append('span')
73988               .attr('class', 'restriction-control-label restriction-distance-label')
73989               .text(t('restriction.controls.distance') + ':');
73990
73991           distControlEnter
73992               .append('input')
73993               .attr('class', 'restriction-distance-input')
73994               .attr('type', 'range')
73995               .attr('min', '20')
73996               .attr('max', '50')
73997               .attr('step', '5');
73998
73999           distControlEnter
74000               .append('span')
74001               .attr('class', 'restriction-distance-text');
74002
74003           // update
74004           selection$$1.selectAll('.restriction-distance-input')
74005               .property('value', _maxDistance)
74006               .on('input', function() {
74007                   var val = select(this).property('value');
74008                   _maxDistance = +val;
74009                   _intersection = null;
74010                   _container.selectAll('.layer-osm .layer-turns *').remove();
74011                   context.storage('turn-restriction-distance', _maxDistance);
74012                   _parent.call(restrictions);
74013               });
74014
74015           selection$$1.selectAll('.restriction-distance-text')
74016               .text(displayMaxDistance(_maxDistance));
74017
74018
74019           var viaControl = selection$$1.selectAll('.restriction-via-way')
74020               .data([0]);
74021
74022           viaControl.exit()
74023               .remove();
74024
74025           var viaControlEnter = viaControl.enter()
74026               .append('div')
74027               .attr('class', 'restriction-control restriction-via-way');
74028
74029           viaControlEnter
74030               .append('span')
74031               .attr('class', 'restriction-control-label restriction-via-way-label')
74032               .text(t('restriction.controls.via') + ':');
74033
74034           viaControlEnter
74035               .append('input')
74036               .attr('class', 'restriction-via-way-input')
74037               .attr('type', 'range')
74038               .attr('min', '0')
74039               .attr('max', '2')
74040               .attr('step', '1');
74041
74042           viaControlEnter
74043               .append('span')
74044               .attr('class', 'restriction-via-way-text');
74045
74046           // update
74047           selection$$1.selectAll('.restriction-via-way-input')
74048               .property('value', _maxViaWay)
74049               .on('input', function() {
74050                   var val = select(this).property('value');
74051                   _maxViaWay = +val;
74052                   _container.selectAll('.layer-osm .layer-turns *').remove();
74053                   context.storage('turn-restriction-via-way', _maxViaWay);
74054                   _parent.call(restrictions);
74055               });
74056
74057           selection$$1.selectAll('.restriction-via-way-text')
74058               .text(displayMaxVia(_maxViaWay));
74059       }
74060
74061
74062       function renderViewer(selection$$1) {
74063           if (!_intersection) return;
74064
74065           var vgraph = _intersection.graph;
74066           var filter = utilFunctor(true);
74067           var projection = geoRawMercator();
74068
74069           var d = utilGetDimensions(selection$$1);
74070           var c = geoVecScale(d, 0.5);
74071           var z = 22;
74072
74073           projection.scale(geoZoomToScale(z));
74074
74075           // Calculate extent of all key vertices
74076           var extent = geoExtent$$1();
74077           for (var i = 0; i < _intersection.vertices.length; i++) {
74078               extent._extend(_intersection.vertices[i].extent());
74079           }
74080
74081           // If this is a large intersection, adjust zoom to fit extent
74082           if (_intersection.vertices.length > 1) {
74083               var padding = 180;   // in z22 pixels
74084               var tl = projection([extent[0][0], extent[1][1]]);
74085               var br = projection([extent[1][0], extent[0][1]]);
74086               var hFactor = (br[0] - tl[0]) / (d[0] - padding);
74087               var vFactor = (br[1] - tl[1]) / (d[1] - padding);
74088               var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
74089               var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
74090               z = z - Math.max(hZoomDiff, vZoomDiff);
74091               projection.scale(geoZoomToScale(z));
74092           }
74093
74094           var padTop = 35;   // reserve top space for hint text
74095           var extentCenter = projection(extent.center());
74096           extentCenter[1] = extentCenter[1] - padTop;
74097
74098           projection
74099               .translate(geoVecSubtract(c, extentCenter))
74100               .clipExtent([[0, 0], d]);
74101
74102           var drawLayers = svgLayers(projection, context).only('osm').dimensions(d);
74103           var drawVertices = svgVertices$$1(projection, context);
74104           var drawLines = svgLines$$1(projection, context);
74105           var drawTurns = svgTurns(projection, context);
74106
74107           var firstTime = selection$$1.selectAll('.surface').empty();
74108
74109           selection$$1
74110               .call(drawLayers);
74111
74112           var surface = selection$$1.selectAll('.surface')
74113               .classed('tr', true);
74114
74115           if (firstTime) {
74116               _initialized = true;
74117
74118               surface
74119                   .call(breathe);
74120
74121               select(window)
74122                   .on('resize.restrictions', function() {
74123                       utilSetDimensions(_container, null);
74124                       redraw();
74125                   });
74126           }
74127
74128
74129           // This can happen if we've lowered the detail while a FROM way
74130           // is selected, and that way is no longer part of the intersection.
74131           if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
74132               _fromWayID = null;
74133               _oldTurns = null;
74134           }
74135
74136           surface
74137               .call(utilSetDimensions, d)
74138               .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
74139               .call(drawLines, vgraph, _intersection.ways, filter)
74140               .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
74141
74142           surface
74143               .on('click.restrictions', click)
74144               .on('mouseover.restrictions', mouseover);
74145
74146           surface
74147               .selectAll('.selected')
74148               .classed('selected', false);
74149
74150           surface
74151               .selectAll('.related')
74152               .classed('related', false);
74153
74154           if (_fromWayID) {
74155               var way = vgraph.entity(_fromWayID);
74156               surface
74157                   .selectAll('.' + _fromWayID)
74158                   .classed('selected', true)
74159                   .classed('related', true);
74160           }
74161
74162           updateHints(null);
74163
74164
74165           function click() {
74166               surface
74167                   .call(breathe.off)
74168                   .call(breathe);
74169
74170               var datum = event.target.__data__;
74171               var entity = datum && datum.properties && datum.properties.entity;
74172               if (entity) {
74173                   datum = entity;
74174               }
74175
74176               if (datum instanceof osmWay && (datum.__from || datum.__via)) {
74177                   _fromWayID = datum.id;
74178                   _oldTurns = null;
74179                   redraw();
74180
74181               } else if (datum instanceof osmTurn) {
74182                   var actions, extraActions, turns, i;
74183                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
74184
74185                   if (datum.restrictionID && !datum.direct) {
74186                       return;
74187
74188                   } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
74189                       var seen = {};
74190                       var datumOnly = cloneDeep(datum);
74191                       datumOnly.only = true;
74192                       restrictionType = restrictionType.replace(/^no/, 'only');
74193
74194                       // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
74195                       // We will remember them in _oldTurns, and restore them if the user clicks again.
74196                       turns = _intersection.turns(_fromWayID, 2);
74197                       extraActions = [];
74198                       _oldTurns = [];
74199                       for (i = 0; i < turns.length; i++) {
74200                           var turn = turns[i];
74201                           if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
74202
74203                           if (turn.direct && turn.path[1] === datum.path[1]) {
74204                               seen[turns[i].restrictionID] = true;
74205                               turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
74206                               _oldTurns.push(turn);
74207                               extraActions.push(actionUnrestrictTurn(turn));
74208                           }
74209                       }
74210
74211                       actions = _intersection.actions.concat(extraActions, [
74212                           actionRestrictTurn(datumOnly, restrictionType),
74213                           t('operations.restriction.annotation.create')
74214                       ]);
74215
74216                   } else if (datum.restrictionID) {   // ONLY -> Allowed
74217                       // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
74218                       // This relies on the assumption that the intersection was already split up when we
74219                       // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
74220                       turns = _oldTurns || [];
74221                       extraActions = [];
74222                       for (i = 0; i < turns.length; i++) {
74223                           if (turns[i].key !== datum.key) {
74224                               extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
74225                           }
74226                       }
74227                       _oldTurns = null;
74228
74229                       actions = _intersection.actions.concat(extraActions, [
74230                           actionUnrestrictTurn(datum),
74231                           t('operations.restriction.annotation.delete')
74232                       ]);
74233
74234                   } else {    // Allowed -> NO
74235                       actions = _intersection.actions.concat([
74236                           actionRestrictTurn(datum, restrictionType),
74237                           t('operations.restriction.annotation.create')
74238                       ]);
74239                   }
74240
74241                   context.perform.apply(context, actions);
74242
74243                   // At this point the datum will be changed, but will have same key..
74244                   // Refresh it and update the help..
74245                   var s = surface.selectAll('.' + datum.key);
74246                   datum = s.empty() ? null : s.datum();
74247                   updateHints(datum);
74248
74249               } else {
74250                   _fromWayID = null;
74251                   _oldTurns = null;
74252                   redraw();
74253               }
74254           }
74255
74256
74257           function mouseover() {
74258               var datum = event.target.__data__;
74259               updateHints(datum);
74260           }
74261
74262
74263           function redraw() {
74264               if (context.hasEntity(_vertexID)) {
74265                   _container.call(renderViewer);
74266               }
74267           }
74268
74269
74270           function highlightPathsFrom(wayID) {
74271               surface.selectAll('.related')
74272                   .classed('related', false)
74273                   .classed('allow', false)
74274                   .classed('restrict', false)
74275                   .classed('only', false);
74276
74277               surface.selectAll('.' + wayID)
74278                   .classed('related', true);
74279
74280               if (wayID) {
74281                   var turns = _intersection.turns(wayID, _maxViaWay);
74282                   for (var i = 0; i < turns.length; i++) {
74283                       var turn = turns[i];
74284                       var ids = [turn.to.way];
74285                       var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
74286
74287                       if (turn.only || turns.length === 1) {
74288                           if (turn.via.ways) {
74289                               ids = ids.concat(turn.via.ways);
74290                           }
74291                       } else if (turn.to.way === wayID) {
74292                           continue;
74293                       }
74294
74295                       surface.selectAll(utilEntitySelector(ids))
74296                           .classed('related', true)
74297                           .classed('allow', (klass === 'allow'))
74298                           .classed('restrict', (klass === 'restrict'))
74299                           .classed('only', (klass === 'only'));
74300                   }
74301               }
74302           }
74303
74304
74305           function updateHints(datum) {
74306               var help = _container.selectAll('.restriction-help').html('');
74307
74308               var placeholders = {};
74309               ['from', 'via', 'to'].forEach(function(k) {
74310                   placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
74311               });
74312
74313               var entity = datum && datum.properties && datum.properties.entity;
74314               if (entity) {
74315                   datum = entity;
74316               }
74317
74318               if (_fromWayID) {
74319                   way = vgraph.entity(_fromWayID);
74320                   surface
74321                       .selectAll('.' + _fromWayID)
74322                       .classed('selected', true)
74323                       .classed('related', true);
74324               }
74325
74326               // Hovering a way
74327               if (datum instanceof osmWay && datum.__from) {
74328                   way = datum;
74329
74330                   highlightPathsFrom(_fromWayID ? null : way.id);
74331                   surface.selectAll('.' + way.id)
74332                       .classed('related', true);
74333
74334                   var clickSelect = (!_fromWayID || _fromWayID !== way.id);
74335                   help
74336                       .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
74337                       .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
74338                           from: placeholders.from,
74339                           fromName: displayName(way.id, vgraph)
74340                       }));
74341
74342
74343               // Hovering a turn arrow
74344               } else if (datum instanceof osmTurn) {
74345                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
74346                   var turnType = restrictionType.replace(/^(only|no)\_/, '');
74347                   var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
74348                   var klass, turnText, nextText;
74349
74350                   if (datum.no) {
74351                       klass = 'restrict';
74352                       turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
74353                       nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
74354                   } else if (datum.only) {
74355                       klass = 'only';
74356                       turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
74357                       nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
74358                   } else {
74359                       klass = 'allow';
74360                       turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
74361                       nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
74362                   }
74363
74364                   help
74365                       .append('div')      // "NO Right Turn (indirect)"
74366                       .attr('class', 'qualifier ' + klass)
74367                       .text(turnText);
74368
74369                   help
74370                       .append('div')      // "FROM {fromName} TO {toName}"
74371                       .html(t('restriction.help.from_name_to_name', {
74372                           from: placeholders.from,
74373                           fromName: displayName(datum.from.way, vgraph),
74374                           to: placeholders.to,
74375                           toName: displayName(datum.to.way, vgraph)
74376                       }));
74377
74378                   if (datum.via.ways && datum.via.ways.length) {
74379                       var names = [];
74380                       for (var i = 0; i < datum.via.ways.length; i++) {
74381                           var prev = names[names.length - 1];
74382                           var curr = displayName(datum.via.ways[i], vgraph);
74383                           if (!prev || curr !== prev)   // collapse identical names
74384                               names.push(curr);
74385                       }
74386
74387                       help
74388                           .append('div')      // "VIA {viaNames}"
74389                           .html(t('restriction.help.via_names', {
74390                               via: placeholders.via,
74391                               viaNames: names.join(', ')
74392                           }));
74393                   }
74394
74395                   if (!indirect) {
74396                       help
74397                           .append('div')      // Click for "No Right Turn"
74398                           .text(t('restriction.help.toggle', { turn: nextText.trim() }));
74399                   }
74400
74401                   highlightPathsFrom(null);
74402                   var alongIDs = datum.path.slice();
74403                   surface.selectAll(utilEntitySelector(alongIDs))
74404                       .classed('related', true)
74405                       .classed('allow', (klass === 'allow'))
74406                       .classed('restrict', (klass === 'restrict'))
74407                       .classed('only', (klass === 'only'));
74408
74409
74410               // Hovering empty surface
74411               } else {
74412                   highlightPathsFrom(null);
74413                   if (_fromWayID) {
74414                       help
74415                           .append('div')      // "FROM {fromName}"
74416                           .html(t('restriction.help.from_name', {
74417                               from: placeholders.from,
74418                               fromName: displayName(_fromWayID, vgraph)
74419                           }));
74420
74421                   } else {
74422                       help
74423                           .append('div')      // "Click to select a FROM segment."
74424                           .html(t('restriction.help.select_from', {
74425                               from: placeholders.from
74426                           }));
74427                   }
74428               }
74429           }
74430       }
74431
74432
74433       function displayMaxDistance(maxDist) {
74434           var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
74435           var opts;
74436
74437           if (isImperial) {
74438               var distToFeet = {   // imprecise conversion for prettier display
74439                   20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
74440               }[maxDist];
74441               opts = { distance: t('units.feet', { quantity: distToFeet }) };
74442           } else {
74443               opts = { distance: t('units.meters', { quantity: maxDist }) };
74444           }
74445
74446           return t('restriction.controls.distance_up_to', opts);
74447       }
74448
74449
74450       function displayMaxVia(maxVia) {
74451           return maxVia === 0 ? t('restriction.controls.via_node_only')
74452               : maxVia === 1 ? t('restriction.controls.via_up_to_one')
74453               : t('restriction.controls.via_up_to_two');
74454       }
74455
74456
74457       function displayName(entityID, graph) {
74458           var entity = graph.entity(entityID);
74459           var name = utilDisplayName(entity) || '';
74460           var matched = context.presets().match(entity, graph);
74461           var type = (matched && matched.name()) || utilDisplayType(entity.id);
74462           return name || type;
74463       }
74464
74465
74466       restrictions.entity = function(_) {
74467           _intersection = null;
74468           _fromWayID = null;
74469           _oldTurns = null;
74470           _vertexID = _.id;
74471       };
74472
74473
74474       restrictions.tags = function() {};
74475       restrictions.focus = function() {};
74476
74477
74478       restrictions.off = function(selection$$1) {
74479           if (!_initialized) return;
74480
74481           selection$$1.selectAll('.surface')
74482               .call(breathe.off)
74483               .on('click.restrictions', null)
74484               .on('mouseover.restrictions', null);
74485
74486           select(window)
74487               .on('resize.restrictions', null);
74488       };
74489
74490
74491       return utilRebind(restrictions, dispatch$$1, 'on');
74492   }
74493
74494   function uiFieldTextarea(field) {
74495       var dispatch$$1 = dispatch('change'),
74496           input = select(null);
74497
74498
74499       function textarea(selection$$1) {
74500           input = selection$$1.selectAll('textarea')
74501               .data([0]);
74502
74503           input = input.enter()
74504               .append('textarea')
74505               .attr('id', 'preset-input-' + field.safeid)
74506               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
74507               .attr('maxlength', 255)
74508               .call(utilNoAuto)
74509               .on('input', change(true))
74510               .on('blur', change())
74511               .on('change', change())
74512               .merge(input);
74513       }
74514
74515
74516       function change(onInput) {
74517           return function() {
74518               var t$$1 = {};
74519               t$$1[field.key] = utilGetSetValue(input) || undefined;
74520               dispatch$$1.call('change', this, t$$1, onInput);
74521           };
74522       }
74523
74524
74525       textarea.tags = function(tags) {
74526           utilGetSetValue(input, tags[field.key] || '');
74527       };
74528
74529
74530       textarea.focus = function() {
74531           input.node().focus();
74532       };
74533
74534
74535       return utilRebind(textarea, dispatch$$1, 'on');
74536   }
74537
74538   function uiFieldWikipedia(field, context) {
74539       var dispatch$$1 = dispatch('change'),
74540           wikipedia = services.wikipedia,
74541           wikidata = services.wikidata,
74542           link = select(null),
74543           lang = select(null),
74544           title = select(null),
74545           wikiURL = '',
74546           entity;
74547
74548
74549       function wiki(selection$$1) {
74550           var langcombo = d3combobox()
74551               .container(context.container())
74552               .fetcher(function(value, cb) {
74553                   var v = value.toLowerCase();
74554
74555                   cb(wikipedia$2.filter(function(d) {
74556                       return d[0].toLowerCase().indexOf(v) >= 0 ||
74557                           d[1].toLowerCase().indexOf(v) >= 0 ||
74558                           d[2].toLowerCase().indexOf(v) >= 0;
74559                   }).map(function(d) {
74560                       return { value: d[1] };
74561                   }));
74562               });
74563
74564           var titlecombo = d3combobox()
74565               .container(context.container())
74566               .fetcher(function(value, cb) {
74567                   if (!value) {
74568                       value = context.entity(entity.id).tags.name || '';
74569                   }
74570
74571                   var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
74572                   searchfn(language()[2], value, function(query, data$$1) {
74573                       cb(data$$1.map(function(d) {
74574                           return { value: d };
74575                       }));
74576                   });
74577               });
74578
74579
74580           lang = selection$$1.selectAll('input.wiki-lang')
74581               .data([0]);
74582
74583           lang = lang.enter()
74584               .append('input')
74585               .attr('type', 'text')
74586               .attr('class', 'wiki-lang')
74587               .attr('placeholder', t('translate.localized_translation_language'))
74588               .call(utilNoAuto)
74589               .merge(lang);
74590
74591           utilGetSetValue(lang, language()[1]);
74592
74593           lang
74594               .call(langcombo)
74595               .on('blur', changeLang)
74596               .on('change', changeLang);
74597
74598
74599           title = selection$$1.selectAll('input.wiki-title')
74600               .data([0]);
74601
74602           title = title.enter()
74603               .append('input')
74604               .attr('type', 'text')
74605               .attr('class', 'wiki-title')
74606               .attr('id', 'preset-input-' + field.safeid)
74607               .call(utilNoAuto)
74608               .merge(title);
74609
74610           title
74611               .call(titlecombo)
74612               .on('blur', blur)
74613               .on('change', change);
74614
74615
74616           link = selection$$1.selectAll('.wiki-link')
74617               .data([0]);
74618
74619           link = link.enter()
74620               .append('button')
74621               .attr('class', 'button-input-action wiki-link minor')
74622               .attr('tabindex', -1)
74623               .call(svgIcon('#iD-icon-out-link'))
74624               .merge(link);
74625
74626           link
74627               .on('click', function() {
74628                   event.preventDefault();
74629                   if (wikiURL) window.open(wikiURL, '_blank');
74630               });
74631       }
74632
74633
74634       function language() {
74635           var value = utilGetSetValue(lang).toLowerCase();
74636           var locale = utilDetect().locale.toLowerCase();
74637           var localeLanguage;
74638           return find$1(wikipedia$2, function(d) {
74639               if (d[2] === locale) localeLanguage = d;
74640               return d[0].toLowerCase() === value ||
74641                   d[1].toLowerCase() === value ||
74642                   d[2] === value;
74643           }) || localeLanguage || ['English', 'English', 'en'];
74644       }
74645
74646
74647       function changeLang() {
74648           utilGetSetValue(lang, language()[1]);
74649           change(true);
74650       }
74651
74652
74653       function blur() {
74654           change(true);
74655       }
74656
74657
74658       function change(skipWikidata) {
74659           var value = utilGetSetValue(title),
74660               m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/),
74661               l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
74662               syncTags = {};
74663
74664           if (l) {
74665               // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
74666               value = decodeURIComponent(m[2]).replace(/_/g, ' ');
74667               if (m[3]) {
74668                   var anchor;
74669                   try {
74670                       // Best-effort `anchordecode:` implementation
74671                       anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
74672                   } catch (e) {
74673                       anchor = decodeURIComponent(m[3]);
74674                   }
74675                   value += '#' + anchor.replace(/_/g, ' ');
74676               }
74677               value = value.slice(0, 1).toUpperCase() + value.slice(1);
74678               utilGetSetValue(lang, l[1]);
74679               utilGetSetValue(title, value);
74680           }
74681
74682           if (value) {
74683               syncTags.wikipedia = language()[2] + ':' + value;
74684           } else {
74685               syncTags.wikipedia = undefined;
74686               syncTags.wikidata = undefined;
74687           }
74688
74689           dispatch$$1.call('change', this, syncTags);
74690
74691
74692           if (skipWikidata || !value || !language()[2]) return;
74693
74694           // attempt asynchronous update of wikidata tag..
74695           var initGraph = context.graph(),
74696               initEntityId = entity.id;
74697
74698           wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
74699               // If graph has changed, we can't apply this update.
74700               if (context.graph() !== initGraph) return;
74701
74702               if (!data$$1 || !Object.keys(data$$1).length) return;
74703
74704               var qids = Object.keys(data$$1);
74705               var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
74706               var currTags = clone(context.entity(initEntityId).tags);
74707
74708               currTags.wikidata = value;
74709
74710               // Coalesce the update of wikidata tag into the previous tag change
74711               context.overwrite(
74712                   actionChangeTags(initEntityId, currTags),
74713                   context.history().undoAnnotation()
74714               );
74715
74716               // do not dispatch.call('change') here, because entity_editor
74717               // changeTags() is not intended to be called asynchronously
74718           });
74719       }
74720
74721
74722       wiki.tags = function(tags) {
74723           var value = tags[field.key] || '',
74724               m = value.match(/([^:]+):([^#]+)(?:#(.+))?/),
74725               l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
74726               anchor = m && m[3];
74727
74728           // value in correct format
74729           if (l) {
74730               utilGetSetValue(lang, l[1]);
74731               utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
74732               if (anchor) {
74733                   try {
74734                       // Best-effort `anchorencode:` implementation
74735                       anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
74736                   } catch (e) {
74737                       anchor = anchor.replace(/ /g, '_');
74738                   }
74739               }
74740               wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
74741                   m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
74742
74743           // unrecognized value format
74744           } else {
74745               utilGetSetValue(title, value);
74746               if (value && value !== '') {
74747                   utilGetSetValue(lang, '');
74748                   wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
74749               } else {
74750                   wikiURL = '';
74751               }
74752           }
74753       };
74754
74755
74756       wiki.entity = function(_) {
74757           if (!arguments.length) return entity;
74758           entity = _;
74759           return wiki;
74760       };
74761
74762
74763       wiki.focus = function() {
74764           title.node().focus();
74765       };
74766
74767
74768       return utilRebind(wiki, dispatch$$1, 'on');
74769   }
74770
74771   var uiFields = {
74772       access: uiFieldAccess,
74773       address: uiFieldAddress,
74774       check: uiFieldCheck,
74775       combo: uiFieldCombo,
74776       cycleway: uiFieldCycleway,
74777       defaultCheck: uiFieldCheck,
74778       email: uiFieldText,
74779       lanes: uiFieldLanes,
74780       localized: uiFieldLocalized,
74781       maxspeed: uiFieldMaxspeed,
74782       multiCombo: uiFieldCombo,
74783       networkCombo: uiFieldCombo,
74784       number: uiFieldText,
74785       onewayCheck: uiFieldCheck,
74786       radio: uiFieldRadio,
74787       restrictions: uiFieldRestrictions,
74788       semiCombo: uiFieldCombo,
74789       structureRadio: uiFieldRadio,
74790       tel: uiFieldText,
74791       text: uiFieldText,
74792       textarea: uiFieldTextarea,
74793       typeCombo: uiFieldCombo,
74794       url: uiFieldText,
74795       wikipedia: uiFieldWikipedia
74796   };
74797
74798   function uiTagReference(tag) {
74799       var taginfo = services.taginfo;
74800       var tagReference = {};
74801
74802       var _button = select(null);
74803       var _body = select(null);
74804       var _loaded;
74805       var _showing;
74806
74807
74808       function findLocal(data) {
74809           var locale = utilDetect().locale.toLowerCase();
74810           var localized;
74811
74812           if (locale !== 'pt-br') {  // see #3776, prefer 'pt' over 'pt-br'
74813               localized = find$1(data, function(d) {
74814                   return d.lang.toLowerCase() === locale;
74815               });
74816               if (localized) return localized;
74817           }
74818
74819           // try the non-regional version of a language, like
74820           // 'en' if the language is 'en-US'
74821           if (locale.indexOf('-') !== -1) {
74822               var first = locale.split('-')[0];
74823               localized = find$1(data, function(d) {
74824                   return d.lang.toLowerCase() === first;
74825               });
74826               if (localized) return localized;
74827           }
74828
74829           // finally fall back to english
74830           return find$1(data, function(d) {
74831               return d.lang.toLowerCase() === 'en';
74832           });
74833       }
74834
74835
74836       function load(param) {
74837           if (!taginfo) return;
74838
74839           _button
74840               .classed('tag-reference-loading', true);
74841
74842           taginfo.docs(param, function show(err, data) {
74843               var docs;
74844               if (!err && data) {
74845                   docs = findLocal(data);
74846               }
74847
74848               _body.html('');
74849
74850               if (!docs || !docs.title) {
74851                   if (param.hasOwnProperty('value')) {
74852                       load(omit(param, 'value'));   // retry with key only
74853                   } else {
74854                       _body
74855                           .append('p')
74856                           .attr('class', 'tag-reference-description')
74857                           .text(t('inspector.no_documentation_key'));
74858                       done();
74859                   }
74860                   return;
74861               }
74862
74863               if (docs.image && docs.image.thumb_url_prefix) {
74864                   _body
74865                       .append('img')
74866                       .attr('class', 'tag-reference-wiki-image')
74867                       .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
74868                       .on('load', function() { done(); })
74869                       .on('error', function() { select(this).remove(); done(); });
74870               } else {
74871                   done();
74872               }
74873
74874               _body
74875                   .append('p')
74876                   .attr('class', 'tag-reference-description')
74877                   .text(docs.description || t('inspector.documentation_redirect'));
74878
74879               _body
74880                   .append('a')
74881                   .attr('class', 'tag-reference-link')
74882                   .attr('target', '_blank')
74883                   .attr('tabindex', -1)
74884                   .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
74885                   .call(svgIcon('#iD-icon-out-link', 'inline'))
74886                   .append('span')
74887                   .text(t('inspector.reference'));
74888
74889               // Add link to info about "good changeset comments" - #2923
74890               if (param.key === 'comment') {
74891                   _body
74892                       .append('a')
74893                       .attr('class', 'tag-reference-comment-link')
74894                       .attr('target', '_blank')
74895                       .attr('tabindex', -1)
74896                       .call(svgIcon('#iD-icon-out-link', 'inline'))
74897                       .attr('href', t('commit.about_changeset_comments_link'))
74898                       .append('span')
74899                       .text(t('commit.about_changeset_comments'));
74900               }
74901           });
74902       }
74903
74904
74905       function done() {
74906           _loaded = true;
74907
74908           _button
74909               .classed('tag-reference-loading', false);
74910
74911           _body
74912               .classed('expanded', true)
74913               .transition()
74914               .duration(200)
74915               .style('max-height', '200px')
74916               .style('opacity', '1');
74917
74918           _showing = true;
74919       }
74920
74921
74922       function hide() {
74923           _body
74924               .transition()
74925               .duration(200)
74926               .style('max-height', '0px')
74927               .style('opacity', '0')
74928               .on('end', function () {
74929                   _body.classed('expanded', false);
74930               });
74931
74932           _showing = false;
74933       }
74934
74935
74936       tagReference.button = function(selection$$1) {
74937           _button = selection$$1.selectAll('.tag-reference-button')
74938               .data([0]);
74939
74940           _button = _button.enter()
74941               .append('button')
74942               .attr('class', 'tag-reference-button')
74943               .attr('title', t('icons.information'))
74944               .attr('tabindex', -1)
74945               .call(svgIcon('#iD-icon-inspect'))
74946               .merge(_button);
74947
74948           _button
74949               .on('click', function () {
74950                   event.stopPropagation();
74951                   event.preventDefault();
74952                   if (_showing) {
74953                       hide();
74954                   } else if (_loaded) {
74955                       done();
74956                   } else {
74957                       load(tag);
74958                   }
74959               });
74960       };
74961
74962
74963       tagReference.body = function(selection$$1) {
74964           var tagid = tag.rtype || (tag.key + '-' + tag.value);
74965           _body = selection$$1.selectAll('.tag-reference-body')
74966               .data([tagid], function(d) { return d; });
74967
74968           _body.exit()
74969               .remove();
74970
74971           _body = _body.enter()
74972               .append('div')
74973               .attr('class', 'tag-reference-body cf')
74974               .style('max-height', '0')
74975               .style('opacity', '0')
74976               .merge(_body);
74977
74978           if (_showing === false) {
74979               hide();
74980           }
74981       };
74982
74983
74984       tagReference.showing = function(_) {
74985           if (!arguments.length) return _showing;
74986           _showing = _;
74987           return tagReference;
74988       };
74989
74990
74991       return tagReference;
74992   }
74993
74994   function uiField(context, presetField, entity, options) {
74995       options = assignIn({
74996           show: true,
74997           wrap: true,
74998           remove: true,
74999           revert: true,
75000           info: true
75001       }, options);
75002
75003       var dispatch$$1 = dispatch('change');
75004       var field = clone(presetField);
75005       var _show = options.show;
75006       var _state = '';
75007       var _tags = {};
75008
75009
75010       // field implementation
75011       field.impl = uiFields[field.type](field, context)
75012           .on('change', function(t$$1, onInput) {
75013               dispatch$$1.call('change', field, t$$1, onInput);
75014           });
75015
75016       // if this field cares about the entity, pass it along
75017       if (entity && field.impl.entity) {
75018           field.entityID = entity.id;
75019           field.impl.entity(entity);
75020       }
75021
75022       field.keys = field.keys || [field.key];
75023
75024
75025       function isModified() {
75026           if (!entity) return false;
75027           var original = context.graph().base().entities[entity.id];
75028           return some(field.keys, function(key) {
75029               return original ? _tags[key] !== original.tags[key] : _tags[key];
75030           });
75031       }
75032
75033
75034       function isPresent() {
75035           return some(field.keys, function(key) {
75036               return _tags[key];
75037           });
75038       }
75039
75040
75041       function revert(d) {
75042           event.stopPropagation();
75043           event.preventDefault();
75044           if (!entity) return false;
75045
75046           var original = context.graph().base().entities[entity.id];
75047           var t$$1 = {};
75048           d.keys.forEach(function(key) {
75049               t$$1[key] = original ? original.tags[key] : undefined;
75050           });
75051
75052           dispatch$$1.call('change', d, t$$1);
75053       }
75054
75055
75056       function remove(d) {
75057           event.stopPropagation();
75058           event.preventDefault();
75059
75060           var t$$1 = {};
75061           d.keys.forEach(function(key) {
75062               t$$1[key] = undefined;
75063           });
75064
75065           dispatch$$1.call('change', d, t$$1);
75066       }
75067
75068
75069       field.render = function(selection$$1) {
75070           var container = selection$$1.selectAll('.form-field')
75071               .data([field]);
75072
75073           // Enter
75074           var enter = container.enter()
75075               .append('div')
75076               .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
75077               .classed('nowrap', !options.wrap);
75078
75079           if (options.wrap) {
75080               var label = enter
75081                   .append('label')
75082                   .attr('class', 'form-label')
75083                   .attr('for', function(d) { return 'preset-input-' + d.safeid; })
75084                   .text(function(d) { return d.label(); });
75085
75086               var wrap = label
75087                   .append('div')
75088                   .attr('class', 'form-label-button-wrap');
75089
75090               if (options.remove) {
75091                   wrap
75092                       .append('button')
75093                       .attr('class', 'remove-icon')
75094                       .attr('title', t('icons.remove'))
75095                       .attr('tabindex', -1)
75096                       .call(svgIcon('#iD-operation-delete'));
75097               }
75098
75099               if (options.revert) {
75100                   wrap
75101                       .append('button')
75102                       .attr('class', 'modified-icon')
75103                       .attr('title', t('icons.undo'))
75104                       .attr('tabindex', -1)
75105                       .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
75106               }
75107           }
75108
75109
75110           // Update
75111           container = container
75112               .merge(enter);
75113
75114           container.selectAll('.form-label-button-wrap .remove-icon')
75115               .on('click', remove);
75116
75117           container.selectAll('.form-label-button-wrap .modified-icon')
75118               .on('click', revert);
75119
75120           container
75121               .classed('modified', isModified())
75122               .classed('present', isPresent())
75123               .each(function(d) {
75124                   var reference, help;
75125
75126                   // instantiate field help
75127                   if (options.wrap && field.type === 'restrictions') {
75128                       help = uiFieldHelp(context, 'restrictions');
75129                   }
75130
75131                   // instantiate tag reference
75132                   if (options.wrap && options.info) {
75133                       var referenceKey = d.key;
75134                       if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
75135                           referenceKey = referenceKey.replace(/:$/, '');
75136                       }
75137
75138                       reference = uiTagReference(d.reference || { key: referenceKey }, context);
75139                       if (_state === 'hover') {
75140                           reference.showing(false);
75141                       }
75142                   }
75143
75144                   select(this)
75145                       .call(d.impl);
75146
75147                   // add field help components
75148                   if (help) {
75149                       select(this)
75150                           .call(help.body)
75151                           .select('.form-label-button-wrap')
75152                           .call(help.button);
75153                   }
75154
75155                   // add tag reference components
75156                   if (reference) {
75157                       select(this)
75158                           .call(reference.body)
75159                           .select('.form-label-button-wrap')
75160                           .call(reference.button);
75161                   }
75162
75163                   d.impl.tags(_tags);
75164               });
75165       };
75166
75167
75168       field.state = function(_) {
75169           if (!arguments.length) return _state;
75170           _state = _;
75171           return field;
75172       };
75173
75174
75175       field.tags = function(_) {
75176           if (!arguments.length) return _tags;
75177           _tags = _;
75178           return field;
75179       };
75180
75181
75182       field.show = function() {
75183           _show = true;
75184           if (field.default && field.key && _tags[field.key] !== field.default) {
75185               var t$$1 = {};
75186               t$$1[field.key] = field.default;
75187               dispatch$$1.call('change', this, t$$1);
75188           }
75189       };
75190
75191
75192       field.isShown = function() {
75193           return _show || some(field.keys, function(key) { return !!_tags[key]; });
75194       };
75195
75196
75197       field.focus = function() {
75198           field.impl.focus();
75199       };
75200
75201
75202       return utilRebind(field, dispatch$$1, 'on');
75203   }
75204
75205   function uiFormFields(context) {
75206       var _fieldsArr;
75207
75208
75209       function formFields(selection$$1, klass) {
75210           render(selection$$1, klass);
75211       }
75212
75213
75214       function render(selection$$1, klass) {
75215           var shown = _fieldsArr.filter(function(field) { return field.isShown(); });
75216           var notShown = _fieldsArr.filter(function(field) { return !field.isShown(); });
75217
75218           var container = selection$$1.selectAll('.form-fields-container')
75219               .data([0]);
75220
75221           container = container.enter()
75222               .append('div')
75223               .attr('class', 'form-fields-container ' + (klass || ''))
75224               .merge(container);
75225
75226
75227           var fields = container.selectAll('.wrap-form-field')
75228               .data(shown, function(d) { return d.id + (d.entityID || ''); });
75229
75230           fields.exit()
75231               .remove();
75232
75233           // Enter
75234           var enter = fields.enter()
75235               .append('div')
75236               .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
75237
75238           // Update
75239           fields = fields
75240               .merge(enter);
75241
75242           fields
75243               .order()
75244               .each(function(d) {
75245                   select(this)
75246                       .call(d.render);
75247               });
75248
75249
75250           notShown = notShown.map(function(field) {
75251               return {
75252                   title: field.label(),
75253                   value: field.label(),
75254                   field: field
75255               };
75256           });
75257
75258
75259           var more = selection$$1.selectAll('.more-fields')
75260               .data((notShown.length > 0) ? [0] : []);
75261
75262           more.exit()
75263               .remove();
75264
75265           more = more.enter()
75266               .append('div')
75267               .attr('class', 'more-fields')
75268               .append('label')
75269               .text(t('inspector.add_fields'))
75270               .merge(more);
75271
75272
75273           var input = more.selectAll('.value')
75274               .data([0]);
75275
75276           input.exit()
75277               .remove();
75278
75279           input = input.enter()
75280               .append('input')
75281               .attr('class', 'value')
75282               .attr('type', 'text')
75283               .call(utilNoAuto)
75284               .merge(input);
75285
75286           input
75287               .call(utilGetSetValue, '')
75288               .attr('placeholder', function() {
75289                   var placeholder = [];
75290                   for (var field in notShown) {
75291                       placeholder.push(notShown[field].title);
75292                   }
75293                   return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
75294               })
75295               .call(d3combobox()
75296                   .container(context.container())
75297                   .data(notShown)
75298                   .minItems(1)
75299                   .on('accept', function (d) {
75300                       var field = d.field;
75301                       field.show();
75302                       render(selection$$1);
75303                       if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
75304                           field.focus();
75305                       }
75306                   })
75307               );
75308       }
75309
75310
75311       formFields.fieldsArr = function(val) {
75312           if (!arguments.length) return _fieldsArr;
75313           _fieldsArr = val;
75314           return formFields;
75315       };
75316
75317
75318       return formFields;
75319   }
75320
75321   function uiChangesetEditor(context) {
75322       var dispatch$$1 = dispatch('change');
75323       var formFields = uiFormFields(context);
75324       var _fieldsArr;
75325       var _tags;
75326       var _changesetID;
75327
75328
75329       function changesetEditor(selection) {
75330           render(selection);
75331       }
75332
75333
75334       function render(selection) {
75335           var initial = false;
75336
75337           if (!_fieldsArr) {
75338               initial = true;
75339               var presets = context.presets();
75340
75341               _fieldsArr = [
75342                   uiField(context, presets.field('comment'), null, { show: true, revert: false }),
75343                   uiField(context, presets.field('source'), null, { show: false, revert: false }),
75344                   uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
75345               ];
75346
75347               _fieldsArr.forEach(function(field) {
75348                   field
75349                       .on('change', function(t$$1, onInput) {
75350                           dispatch$$1.call('change', field, t$$1, onInput);
75351                       });
75352               });
75353           }
75354
75355           _fieldsArr.forEach(function(field) {
75356               field
75357                   .tags(_tags);
75358           });
75359
75360
75361           selection
75362               .call(formFields.fieldsArr(_fieldsArr));
75363
75364
75365           if (initial) {
75366               var commentField = selection.select('#preset-input-comment');
75367               var commentNode = commentField.node();
75368
75369               if (commentNode) {
75370                   commentNode.focus();
75371                   commentNode.select();
75372               }
75373
75374               // trigger a 'blur' event so that comment field can be cleaned
75375               // and checked for hashtags, even if retrieved from localstorage
75376               utilTriggerEvent(commentField, 'blur');
75377
75378               var osm = context.connection();
75379               if (osm) {
75380                   osm.userChangesets(function (err, changesets) {
75381                       if (err) return;
75382
75383                       var comments = changesets.map(function(changeset) {
75384                           return {
75385                               title: changeset.tags.comment,
75386                               value: changeset.tags.comment
75387                           };
75388                       });
75389
75390                       commentField
75391                           .call(d3combobox()
75392                               .container(context.container())
75393                               .caseSensitive(true)
75394                               .data(uniqBy(comments, 'title'))
75395                           );
75396                   });
75397               }
75398           }
75399
75400           // Add warning if comment mentions Google
75401           var hasGoogle = _tags.comment.match(/google/i);
75402           var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
75403               .data(hasGoogle ? [0] : []);
75404
75405           commentWarning.exit()
75406               .transition()
75407               .duration(200)
75408               .style('opacity', 0)
75409               .remove();
75410
75411           var commentEnter = commentWarning.enter()
75412               .insert('div', '.tag-reference-body')
75413               .attr('class', 'field-warning comment-warning')
75414               .style('opacity', 0);
75415
75416           commentEnter
75417               .append('a')
75418               .attr('target', '_blank')
75419               .attr('tabindex', -1)
75420               .call(svgIcon('#iD-icon-alert', 'inline'))
75421               .attr('href', t('commit.google_warning_link'))
75422               .append('span')
75423               .text(t('commit.google_warning'));
75424
75425           commentEnter
75426               .transition()
75427               .duration(200)
75428               .style('opacity', 1);
75429       }
75430
75431
75432       changesetEditor.tags = function(_) {
75433           if (!arguments.length) return _tags;
75434           _tags = _;
75435           // Don't reset _fieldsArr here.
75436           return changesetEditor;
75437       };
75438
75439
75440       changesetEditor.changesetID = function(_) {
75441           if (!arguments.length) return _changesetID;
75442           if (_changesetID === _) return changesetEditor;
75443           _changesetID = _;
75444           _fieldsArr = null;
75445           return changesetEditor;
75446       };
75447
75448
75449       return utilRebind(changesetEditor, dispatch$$1, 'on');
75450   }
75451
75452   /**
75453    * This method is like `_.union` except that it accepts `iteratee` which is
75454    * invoked for each element of each `arrays` to generate the criterion by
75455    * which uniqueness is computed. Result values are chosen from the first
75456    * array in which the value occurs. The iteratee is invoked with one argument:
75457    * (value).
75458    *
75459    * @static
75460    * @memberOf _
75461    * @since 4.0.0
75462    * @category Array
75463    * @param {...Array} [arrays] The arrays to inspect.
75464    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
75465    * @returns {Array} Returns the new array of combined values.
75466    * @example
75467    *
75468    * _.unionBy([2.1], [1.2, 2.3], Math.floor);
75469    * // => [2.1, 1.2]
75470    *
75471    * // The `_.property` iteratee shorthand.
75472    * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
75473    * // => [{ 'x': 1 }, { 'x': 2 }]
75474    */
75475   var unionBy = baseRest(function(arrays) {
75476     var iteratee = last(arrays);
75477     if (isArrayLikeObject(iteratee)) {
75478       iteratee = undefined;
75479     }
75480     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
75481   });
75482
75483   function uiCommitChanges(context) {
75484       var detected = utilDetect();
75485       var _entityID;
75486
75487
75488       function commitChanges(selection$$1) {
75489           var history = context.history();
75490           var summary = history.difference().summary();
75491
75492           var container = selection$$1.selectAll('.modal-section.commit-section')
75493               .data([0]);
75494
75495           var containerEnter = container.enter()
75496               .append('div')
75497               .attr('class', 'commit-section modal-section fillL2');
75498
75499           containerEnter
75500               .append('h3')
75501               .text(t('commit.changes', { count: summary.length }));
75502
75503           containerEnter
75504               .append('ul')
75505               .attr('class', 'changeset-list');
75506
75507           container = containerEnter
75508               .merge(container);
75509
75510
75511           var items = container.select('ul').selectAll('li')
75512               .data(summary);
75513
75514           var itemsEnter = items.enter()
75515               .append('li')
75516               .attr('class', 'change-item');
75517
75518           itemsEnter
75519               .each(function(d) {
75520                   select(this)
75521                       .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
75522               });
75523
75524           itemsEnter
75525               .append('span')
75526               .attr('class', 'change-type')
75527               .text(function(d) { return t('commit.' + d.changeType) + ' '; });
75528
75529           itemsEnter
75530               .append('strong')
75531               .attr('class', 'entity-type')
75532               .text(function(d) {
75533                   var matched = context.presets().match(d.entity, d.graph);
75534                   return (matched && matched.name()) || utilDisplayType(d.entity.id);
75535               });
75536
75537           itemsEnter
75538               .append('span')
75539               .attr('class', 'entity-name')
75540               .text(function(d) {
75541                   var name = utilDisplayName(d.entity) || '',
75542                       string = '';
75543                   if (name !== '') {
75544                       string += ':';
75545                   }
75546                   return string += ' ' + name;
75547               });
75548
75549           itemsEnter
75550               .style('opacity', 0)
75551               .transition()
75552               .style('opacity', 1);
75553
75554           items = itemsEnter
75555               .merge(items);
75556
75557           items
75558               .on('mouseover', mouseover)
75559               .on('mouseout', mouseout)
75560               .on('click', click);
75561
75562
75563           // Download changeset link
75564           var changeset = new osmChangeset().update({ id: undefined });
75565           var changes = history.changes(actionDiscardTags(history.difference()));
75566
75567           delete changeset.id;  // Export without chnageset_id
75568
75569           var data = JXON.stringify(changeset.osmChangeJXON(changes));
75570           var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
75571           var fileName = 'changes.osc';
75572
75573           var linkEnter = container.selectAll('.download-changes')
75574               .data([0])
75575               .enter()
75576               .append('a')
75577               .attr('class', 'download-changes');
75578
75579           if (detected.download) {      // All except IE11 and Edge
75580               linkEnter                 // download the data as a file
75581                   .attr('href', window.URL.createObjectURL(blob))
75582                   .attr('download', fileName);
75583
75584           } else {                      // IE11 and Edge
75585               linkEnter                 // open data uri in a new tab
75586                   .attr('target', '_blank')
75587                   .on('click.download', function() {
75588                       navigator.msSaveBlob(blob, fileName);
75589                   });
75590           }
75591
75592           linkEnter
75593               .call(svgIcon('#iD-icon-load', 'inline'))
75594               .append('span')
75595               .text(t('commit.download_changes'));
75596
75597
75598           function mouseover(d) {
75599               if (d.entity) {
75600                   context.surface().selectAll(
75601                       utilEntityOrMemberSelector([d.entity.id], context.graph())
75602                   ).classed('hover', true);
75603               }
75604           }
75605
75606
75607           function mouseout() {
75608               context.surface().selectAll('.hover')
75609                   .classed('hover', false);
75610           }
75611
75612
75613           function click(change) {
75614               if (change.changeType === 'deleted') {
75615                   _entityID = null;
75616               } else {
75617                   var entity = change.entity;
75618                   _entityID = change.entity.id;
75619                   context.map().zoomTo(entity);
75620                   context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
75621                       .classed('hover', true);
75622               }
75623           }
75624       }
75625
75626
75627       commitChanges.entityID = function(_) {
75628           if (!arguments.length) return _entityID;
75629           _entityID = _;
75630           return commitChanges;
75631       };
75632
75633
75634       return commitChanges;
75635   }
75636
75637   function uiCommitWarnings(context) {
75638
75639       function commitWarnings(selection) {
75640
75641           var changes = context.history().changes();
75642           var warnings = context.history().validate(changes);
75643
75644           var container = selection.selectAll('.warning-section')
75645               .data(warnings.length ? [0] : []);
75646
75647           container.exit()
75648               .remove();
75649
75650           var containerEnter = container.enter()
75651               .append('div')
75652               .attr('class', 'modal-section warning-section fillL2');
75653
75654           containerEnter
75655               .append('h3')
75656               .text(t('commit.warnings'));
75657
75658           containerEnter
75659               .append('ul')
75660               .attr('class', 'changeset-list');
75661
75662           container = containerEnter
75663               .merge(container);
75664
75665
75666           var items = container.select('ul').selectAll('li')
75667               .data(warnings);
75668
75669           items.exit()
75670               .remove();
75671
75672           var itemsEnter = items.enter()
75673               .append('li')
75674               .attr('class', 'warning-item');
75675
75676           itemsEnter
75677               .call(svgIcon('#iD-icon-alert', 'pre-text'));
75678
75679           itemsEnter
75680               .append('strong')
75681               .text(function(d) { return d.message; });
75682
75683           itemsEnter.filter(function(d) { return d.tooltip; })
75684               .call(tooltip()
75685                   .title(function(d) { return d.tooltip; })
75686                   .placement('top')
75687               );
75688
75689           items = itemsEnter
75690               .merge(items);
75691
75692           items
75693               .on('mouseover', mouseover)
75694               .on('mouseout', mouseout)
75695               .on('click', warningClick);
75696
75697
75698           function mouseover(d) {
75699               if (d.entity) {
75700                   context.surface().selectAll(
75701                       utilEntityOrMemberSelector([d.entity.id], context.graph())
75702                   ).classed('hover', true);
75703               }
75704           }
75705
75706
75707           function mouseout() {
75708               context.surface().selectAll('.hover')
75709                   .classed('hover', false);
75710           }
75711
75712
75713           function warningClick(d) {
75714               if (d.entity) {
75715                   context.map().zoomTo(d.entity);
75716                   context.enter(modeSelect(context, [d.entity.id]));
75717               }
75718           }
75719
75720       }
75721
75722
75723       return commitWarnings;
75724   }
75725
75726   function uiRawTagEditor(context) {
75727       var taginfo = services.taginfo;
75728       var dispatch$$1 = dispatch('change');
75729       var _readOnlyTags = [];
75730       var _showBlank = false;
75731       var _updatePreference = true;
75732       var _expanded = false;
75733       var _newRow;
75734       var _state;
75735       var _preset;
75736       var _tags;
75737       var _entityID;
75738
75739
75740       function rawTagEditor(selection$$1) {
75741           var count = Object.keys(_tags).filter(function(d) { return d; }).length;
75742
75743           var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
75744               .title(t('inspector.all_tags') + ' (' + count + ')')
75745               .on('toggled', toggled)
75746               .updatePreference(_updatePreference)
75747               .content(content);
75748
75749           // Sometimes we want to force the raw_tag_editor to be opened/closed..
75750           // When undefined, uiDisclosure will use the user's stored preference.
75751           if (_expanded !== undefined) {
75752               disclosure.expanded(_expanded);
75753           }
75754
75755           selection$$1.call(disclosure);
75756
75757           function toggled(expanded) {
75758               _expanded = expanded;
75759               if (expanded) {
75760                   selection$$1.node().parentNode.scrollTop += 200;
75761               }
75762           }
75763       }
75764
75765
75766       function content(wrap) {
75767           var entries = map$3(_tags, function(v, k) {
75768               return { key: k, value: v };
75769           });
75770
75771           if (!entries.length || _showBlank) {
75772               _showBlank = false;
75773               entries.push({key: '', value: ''});
75774               _newRow = '';
75775           }
75776
75777           var list = wrap.selectAll('.tag-list')
75778               .data([0]);
75779
75780           list = list.enter()
75781               .append('ul')
75782               .attr('class', 'tag-list')
75783               .merge(list);
75784
75785           var newTag = wrap.selectAll('.add-tag')
75786               .data([0]);
75787
75788           newTag.enter()
75789               .append('button')
75790               .attr('class', 'add-tag')
75791               .on('click', addTag)
75792               .call(svgIcon('#iD-icon-plus', 'light'));
75793
75794
75795           var items = list.selectAll('.tag-row')
75796               .data(entries, function(d) { return d.key; });
75797
75798           items.exit()
75799               .each(unbind)
75800               .remove();
75801
75802           // Enter
75803
75804           var enter = items.enter()
75805               .append('li')
75806               .attr('class', 'tag-row cf')
75807               .classed('readonly', isReadOnly);
75808
75809           enter
75810               .append('div')
75811               .attr('class', 'key-wrap')
75812               .append('input')
75813               .property('type', 'text')
75814               .attr('class', 'key')
75815               .attr('maxlength', 255)
75816               .call(utilNoAuto)
75817               .on('blur', keyChange)
75818               .on('change', keyChange);
75819
75820           enter
75821               .append('div')
75822               .attr('class', 'input-wrap-position')
75823               .append('input')
75824               .property('type', 'text')
75825               .attr('class', 'value')
75826               .attr('maxlength', 255)
75827               .call(utilNoAuto)
75828               .on('blur', valueChange)
75829               .on('change', valueChange)
75830               .on('keydown.push-more', pushMore);
75831
75832           enter
75833               .append('button')
75834               .attr('tabindex', -1)
75835               .attr('class', 'remove minor')
75836               .call(svgIcon('#iD-operation-delete'));
75837
75838
75839           // Update
75840
75841           items = items
75842               .merge(enter)
75843               .sort(function(a, b) {
75844                   return (a.key === _newRow && b.key !== _newRow) ? 1
75845                       : (a.key !== _newRow && b.key === _newRow) ? -1
75846                       : ascending(a.key, b.key);
75847               });
75848
75849           items
75850               .each(function(tag) {
75851                   var row = select(this);
75852                   var key = row.select('input.key');      // propagate bound data to child
75853                   var value = row.select('input.value');  // propagate bound data to child
75854
75855                   if (_entityID && taginfo) {
75856                       bindTypeahead(key, value);
75857                   }
75858
75859                   var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
75860                   var reference;
75861
75862                   if (isRelation && tag.key === 'type') {
75863                       reference = uiTagReference({ rtype: tag.value }, context);
75864                   } else {
75865                       reference = uiTagReference({ key: tag.key, value: tag.value }, context);
75866                   }
75867
75868                   if (_state === 'hover') {
75869                       reference.showing(false);
75870                   }
75871
75872                   row
75873                       .call(reference.button)
75874                       .call(reference.body);
75875               });
75876
75877           items.selectAll('input.key')
75878               .attr('title', function(d) { return d.key; })
75879               .call(utilGetSetValue, function(d) { return d.key; })
75880               .property('disabled', isReadOnly);
75881
75882           items.selectAll('input.value')
75883               .attr('title', function(d) { return d.value; })
75884               .call(utilGetSetValue, function(d) { return d.value; })
75885               .property('disabled', isReadOnly);
75886
75887           items.selectAll('button.remove')
75888               .on('click', removeTag);
75889
75890
75891
75892           function isReadOnly(d) {
75893               for (var i = 0; i < _readOnlyTags.length; i++) {
75894                   if (d.key.match(_readOnlyTags[i]) !== null) {
75895                       return true;
75896                   }
75897               }
75898               return false;
75899           }
75900
75901
75902           function pushMore() {
75903               if (event.keyCode === 9 && !event.shiftKey &&
75904                   list.selectAll('li:last-child input.value').node() === this) {
75905                   addTag();
75906               }
75907           }
75908
75909
75910           function bindTypeahead(key, value) {
75911               if (isReadOnly(key.datum())) return;
75912
75913               var geometry = context.geometry(_entityID);
75914
75915               key.call(d3combobox()
75916                   .container(context.container())
75917                   .fetcher(function(value, callback) {
75918                       taginfo.keys({
75919                           debounce: true,
75920                           geometry: geometry,
75921                           query: value
75922                       }, function(err, data) {
75923                           if (!err) callback(sort(value, data));
75924                       });
75925                   }));
75926
75927               value.call(d3combobox()
75928                   .container(context.container())
75929                   .fetcher(function(value, callback) {
75930                       taginfo.values({
75931                           debounce: true,
75932                           key: utilGetSetValue(key),
75933                           geometry: geometry,
75934                           query: value
75935                       }, function(err, data) {
75936                           if (!err) callback(sort(value, data));
75937                       });
75938                   }));
75939
75940
75941               function sort(value, data) {
75942                   var sameletter = [];
75943                   var other = [];
75944                   for (var i = 0; i < data.length; i++) {
75945                       if (data[i].value.substring(0, value.length) === value) {
75946                           sameletter.push(data[i]);
75947                       } else {
75948                           other.push(data[i]);
75949                       }
75950                   }
75951                   return sameletter.concat(other);
75952               }
75953           }
75954
75955
75956           function unbind() {
75957               var row = select(this);
75958
75959               row.selectAll('input.key')
75960                   .call(d3combobox.off);
75961
75962               row.selectAll('input.value')
75963                   .call(d3combobox.off);
75964           }
75965
75966
75967           function keyChange(d) {
75968               var kOld = d.key;
75969               var kNew = this.value.trim();
75970               var tag = {};
75971
75972               if (isReadOnly({ key: kNew })) {
75973                   this.value = kOld;
75974                   return;
75975               }
75976
75977               if (kNew && kNew !== kOld) {
75978                   var match = kNew.match(/^(.*?)(?:_(\d+))?$/);
75979                   var base = match[1];
75980                   var suffix = +(match[2] || 1);
75981                   while (_tags[kNew]) {  // rename key if already in use
75982                       kNew = base + '_' + suffix++;
75983                   }
75984
75985                   if (includes(kNew, '=')) {
75986                       var splitStr = kNew.split('=').map(function(str) { return str.trim(); });
75987                       var key = splitStr[0];
75988                       var value = splitStr[1];
75989
75990                       kNew = key;
75991                       d.value = value;
75992                   }
75993               }
75994               tag[kOld] = undefined;
75995               tag[kNew] = d.value;
75996
75997               d.key = kNew;  // Maintain DOM identity through the subsequent update.
75998
75999               if (_newRow === kOld) {   // see if this row is still a new row
76000                   _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
76001               }
76002
76003               this.value = kNew;
76004               dispatch$$1.call('change', this, tag);
76005           }
76006
76007
76008           function valueChange(d) {
76009               if (isReadOnly(d)) return;
76010               var tag = {};
76011               tag[d.key] = this.value;
76012
76013               if (_newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
76014                   _newRow = undefined;
76015               }
76016
76017               dispatch$$1.call('change', this, tag);
76018           }
76019
76020
76021           function removeTag(d) {
76022               if (isReadOnly(d)) return;
76023               var tag = {};
76024               tag[d.key] = undefined;
76025               dispatch$$1.call('change', this, tag);
76026               select(this.parentNode).remove();
76027           }
76028
76029
76030           function addTag() {
76031               // Wrapped in a setTimeout in case it's being called from a blur
76032               // handler. Without the setTimeout, the call to `content` would
76033               // wipe out the pending value change.
76034               window.setTimeout(function() {
76035                   _showBlank = true;
76036                   content(wrap);
76037                   list.selectAll('li:last-child input.key').node().focus();
76038               }, 1);
76039           }
76040       }
76041
76042
76043       rawTagEditor.state = function(_) {
76044           if (!arguments.length) return _state;
76045           _state = _;
76046           return rawTagEditor;
76047       };
76048
76049
76050       rawTagEditor.preset = function(_) {
76051           if (!arguments.length) return _preset;
76052           _preset = _;
76053           if (_preset.isFallback()) {
76054               _expanded = true;
76055               _updatePreference = false;
76056           } else {
76057               _expanded = undefined;
76058               _updatePreference = true;
76059           }
76060           return rawTagEditor;
76061       };
76062
76063
76064       rawTagEditor.tags = function(_) {
76065           if (!arguments.length) return _tags;
76066           _tags = _;
76067           return rawTagEditor;
76068       };
76069
76070
76071       rawTagEditor.entityID = function(_) {
76072           if (!arguments.length) return _entityID;
76073           _entityID = _;
76074           return rawTagEditor;
76075       };
76076
76077
76078       rawTagEditor.expanded = function(_) {
76079           if (!arguments.length) return _expanded;
76080           _expanded = _;
76081           _updatePreference = false;
76082           return rawTagEditor;
76083       };
76084
76085
76086       rawTagEditor.readOnlyTags = function(_) {
76087           if (!arguments.length) return _readOnlyTags;
76088           _readOnlyTags = _;
76089           return rawTagEditor;
76090       };
76091
76092
76093       return utilRebind(rawTagEditor, dispatch$$1, 'on');
76094   }
76095
76096   var _changeset$1;
76097   var readOnlyTags = [
76098       /^changesets_count$/,
76099       /^created_by$/,
76100       /^ideditor:/,
76101       /^imagery_used$/,
76102       /^host$/,
76103       /^locale$/
76104   ];
76105
76106   // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
76107   // from https://stackoverflow.com/a/25575009
76108   var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
76109
76110
76111   function uiCommit(context) {
76112       var dispatch$$1 = dispatch('cancel', 'save');
76113       var _userDetails;
76114       var _selection;
76115
76116       var changesetEditor = uiChangesetEditor(context)
76117           .on('change', changeTags);
76118       var rawTagEditor = uiRawTagEditor(context)
76119           .on('change', changeTags);
76120       var commitChanges = uiCommitChanges(context);
76121       var commitWarnings = uiCommitWarnings(context);
76122
76123
76124       function commit(selection$$1) {
76125           _selection = selection$$1;
76126
76127           var osm = context.connection();
76128           if (!osm) return;
76129
76130           // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
76131           var commentDate = +context.storage('commentDate') || 0;
76132           var currDate = Date.now();
76133           var cutoff = 2 * 86400 * 1000;   // 2 days
76134           if (commentDate > currDate || currDate - commentDate > cutoff) {
76135               context.storage('comment', null);
76136               context.storage('hashtags', null);
76137               context.storage('source', null);
76138           }
76139
76140           var tags;
76141           if (!_changeset$1) {
76142               var detected = utilDetect();
76143               tags = {
76144                   comment: context.storage('comment') || '',
76145                   created_by: ('iD ' + context.version).substr(0, 255),
76146                   host: detected.host.substr(0, 255),
76147                   locale: detected.locale.substr(0, 255)
76148               };
76149
76150               // call findHashtags initially - this will remove stored
76151               // hashtags if any hashtags are found in the comment - #4304
76152               findHashtags(tags, true);
76153
76154               var hashtags = context.storage('hashtags');
76155               if (hashtags) {
76156                   tags.hashtags = hashtags;
76157               }
76158
76159               // iD 2.8.1 could write a literal 'undefined' here.. see #5021
76160               // (old source values expire after 2 days, so 'undefined' checks can go away in v2.9)
76161               var source = context.storage('source');
76162               if (source && source !== 'undefined') {
76163                   tags.source = source;
76164               } else if (source === 'undefined') {
76165                   context.storage('source', null);
76166               }
76167
76168               _changeset$1 = new osmChangeset({ tags: tags });
76169           }
76170
76171           tags = clone(_changeset$1.tags);
76172           tags.imagery_used = context.history().imageryUsed().join(';').substr(0, 255);
76173           _changeset$1 = _changeset$1.update({ tags: tags });
76174
76175           var header = selection$$1.selectAll('.header')
76176               .data([0]);
76177
76178           header.enter()
76179               .append('div')
76180               .attr('class', 'header fillL')
76181               .append('h3')
76182               .text(t('commit.title'));
76183
76184           var body = selection$$1.selectAll('.body')
76185               .data([0]);
76186
76187           body = body.enter()
76188               .append('div')
76189               .attr('class', 'body')
76190               .merge(body);
76191
76192
76193           // Changeset Section
76194           var changesetSection = body.selectAll('.changeset-editor')
76195               .data([0]);
76196
76197           changesetSection = changesetSection.enter()
76198               .append('div')
76199               .attr('class', 'modal-section changeset-editor')
76200               .merge(changesetSection);
76201
76202           changesetSection
76203               .call(changesetEditor
76204                   .changesetID(_changeset$1.id)
76205                   .tags(tags)
76206               );
76207
76208
76209           // Warnings
76210           body.call(commitWarnings);
76211
76212
76213           // Upload Explanation
76214           var saveSection = body.selectAll('.save-section')
76215               .data([0]);
76216
76217           saveSection = saveSection.enter()
76218               .append('div')
76219               .attr('class','modal-section save-section fillL cf')
76220               .merge(saveSection);
76221
76222           var prose = saveSection.selectAll('.commit-info')
76223               .data([0]);
76224
76225           prose = prose.enter()
76226               .append('p')
76227               .attr('class', 'commit-info')
76228               .text(t('commit.upload_explanation'))
76229               .merge(prose);
76230
76231           osm.userDetails(function(err, user) {
76232               if (err) return;
76233
76234               var userLink = select(document.createElement('div'));
76235
76236               _userDetails = user;
76237
76238               if (user.image_url) {
76239                   userLink
76240                       .append('img')
76241                       .attr('src', user.image_url)
76242                       .attr('class', 'icon pre-text user-icon');
76243               }
76244
76245               userLink
76246                   .append('a')
76247                   .attr('class', 'user-info')
76248                   .text(user.display_name)
76249                   .attr('href', osm.userURL(user.display_name))
76250                   .attr('tabindex', -1)
76251                   .attr('target', '_blank');
76252
76253               prose
76254                   .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
76255           });
76256
76257
76258           // Request Review
76259           var requestReview = saveSection.selectAll('.request-review')
76260               .data([0]);
76261
76262           // Enter
76263           var requestReviewEnter = requestReview.enter()
76264               .append('div')
76265               .attr('class', 'request-review');
76266
76267           var labelEnter = requestReviewEnter
76268               .append('label')
76269               .attr('for', 'commit-input-request-review');
76270
76271           labelEnter
76272               .append('input')
76273               .attr('type', 'checkbox')
76274               .attr('id', 'commit-input-request-review');
76275
76276           labelEnter
76277               .append('span')
76278               .text(t('commit.request_review'));
76279
76280           // Update
76281           requestReview = requestReview
76282               .merge(requestReviewEnter);
76283
76284           var requestReviewInput = requestReview.selectAll('input')
76285               .property('checked', isReviewRequested(_changeset$1.tags))
76286               .on('change', toggleRequestReview);
76287
76288
76289           // Buttons
76290           var buttonSection = saveSection.selectAll('.buttons')
76291               .data([0]);
76292
76293           // enter
76294           var buttonEnter = buttonSection.enter()
76295               .append('div')
76296               .attr('class', 'buttons fillL cf');
76297
76298           buttonEnter
76299               .append('button')
76300               .attr('class', 'secondary-action button cancel-button')
76301               .append('span')
76302               .attr('class', 'label')
76303               .text(t('commit.cancel'));
76304
76305           buttonEnter
76306               .append('button')
76307               .attr('class', 'action button save-button')
76308               .append('span')
76309               .attr('class', 'label')
76310               .text(t('commit.save'));
76311
76312           // update
76313           buttonSection = buttonSection
76314               .merge(buttonEnter);
76315
76316           buttonSection.selectAll('.cancel-button')
76317               .on('click.cancel', function() {
76318                   var selectedID = commitChanges.entityID();
76319                   dispatch$$1.call('cancel', this, selectedID);
76320               });
76321
76322           buttonSection.selectAll('.save-button')
76323               .attr('disabled', function() {
76324                   var n = select('#preset-input-comment').node();
76325                   return (n && n.value.length) ? null : true;
76326               })
76327               .on('click.save', function() {
76328                   this.blur();    // avoid keeping focus on the button - #4641
76329                   dispatch$$1.call('save', this, _changeset$1);
76330               });
76331
76332
76333           // Raw Tag Editor
76334           var tagSection = body.selectAll('.tag-section.raw-tag-editor')
76335               .data([0]);
76336
76337           tagSection = tagSection.enter()
76338               .append('div')
76339               .attr('class', 'modal-section tag-section raw-tag-editor')
76340               .merge(tagSection);
76341
76342           var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
76343           tagSection
76344               .call(rawTagEditor
76345                   .expanded(expanded)
76346                   .readOnlyTags(readOnlyTags)
76347                   .tags(clone(_changeset$1.tags))
76348               );
76349
76350
76351           // Change summary
76352           body.call(commitChanges);
76353
76354
76355           function toggleRequestReview() {
76356               var rr = requestReviewInput.property('checked');
76357               updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
76358
76359               var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
76360               tagSection
76361                   .call(rawTagEditor
76362                       .expanded(expanded)
76363                       .readOnlyTags(readOnlyTags)
76364                       .tags(clone(_changeset$1.tags))
76365                   );
76366           }
76367       }
76368
76369
76370       function changeTags(changed, onInput) {
76371           if (changed.hasOwnProperty('comment')) {
76372               if (changed.comment === undefined) {
76373                   changed.comment = '';
76374               }
76375               if (!onInput) {
76376                   context.storage('comment', changed.comment);
76377                   context.storage('commentDate', Date.now());
76378               }
76379           }
76380           if (changed.hasOwnProperty('source')) {
76381               if (changed.source === undefined) {
76382                   context.storage('source', null);
76383               } else if (!onInput) {
76384                   context.storage('source', changed.source);
76385                   context.storage('commentDate', Date.now());
76386               }
76387           }
76388
76389           updateChangeset(changed, onInput);
76390
76391           if (_selection) {
76392               _selection.call(commit);
76393           }
76394       }
76395
76396
76397       function findHashtags(tags, commentOnly) {
76398           var inComment = commentTags();
76399           var inHashTags = hashTags();
76400
76401           if (inComment !== null) {                    // when hashtags are detected in comment...
76402               context.storage('hashtags', null);       // always remove stored hashtags - #4304
76403               if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
76404           }
76405           return unionBy(inComment, inHashTags, function (s) {
76406               return s.toLowerCase();
76407           });
76408
76409           // Extract hashtags from `comment`
76410           function commentTags() {
76411               return tags.comment
76412                   .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
76413                   .match(hashtagRegex);
76414           }
76415
76416           // Extract and clean hashtags from `hashtags`
76417           function hashTags() {
76418               var t$$1 = tags.hashtags || '';
76419               return t$$1
76420                   .split(/[,;\s]+/)
76421                   .map(function (s) {
76422                       if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
76423                       var matched = s.match(hashtagRegex);
76424                       return matched && matched[0];
76425                   }).filter(Boolean);                       // exclude falsey
76426           }
76427       }
76428
76429
76430       function isReviewRequested(tags) {
76431           var rr = tags.review_requested;
76432           if (rr === undefined) return false;
76433           rr = rr.trim().toLowerCase();
76434           return !(rr === '' || rr === 'no');
76435       }
76436
76437
76438       function updateChangeset(changed, onInput) {
76439           var tags = clone(_changeset$1.tags);
76440
76441           forEach(changed, function(v, k) {
76442               k = k.trim().substr(0, 255);
76443               if (readOnlyTags.indexOf(k) !== -1) return;
76444
76445               if (k !== '' && v !== undefined) {
76446                   if (onInput) {
76447                       tags[k] = v;
76448                   } else {
76449                       tags[k] = v.trim().substr(0, 255);
76450                   }
76451               } else {
76452                   delete tags[k];
76453               }
76454           });
76455
76456           if (!onInput) {
76457               // when changing the comment, override hashtags with any found in comment.
76458               var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
76459               var arr = findHashtags(tags, commentOnly);
76460               if (arr.length) {
76461                   tags.hashtags = arr.join(';').substr(0, 255);
76462                   context.storage('hashtags', tags.hashtags);
76463               } else {
76464                   delete tags.hashtags;
76465                   context.storage('hashtags', null);
76466               }
76467           }
76468
76469           // always update userdetails, just in case user reauthenticates as someone else
76470           if (_userDetails && _userDetails.changesets_count !== undefined) {
76471               var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
76472               tags.changesets_count = String(changesetsCount);
76473
76474               // first 100 edits - new user
76475               if (changesetsCount <= 100) {
76476                   var s;
76477                   s = context.storage('walkthrough_completed');
76478                   if (s) {
76479                       tags['ideditor:walkthrough_completed'] = s;
76480                   }
76481
76482                   s = context.storage('walkthrough_progress');
76483                   if (s) {
76484                       tags['ideditor:walkthrough_progress'] = s;
76485                   }
76486
76487                   s = context.storage('walkthrough_started');
76488                   if (s) {
76489                       tags['ideditor:walkthrough_started'] = s;
76490                   }
76491               }
76492           } else {
76493               delete tags.changesets_count;
76494           }
76495
76496           if (!isEqual(_changeset$1.tags, tags)) {
76497               _changeset$1 = _changeset$1.update({ tags: tags });
76498           }
76499       }
76500
76501
76502       commit.reset = function() {
76503           _changeset$1 = null;
76504       };
76505
76506
76507       return utilRebind(commit, dispatch$$1, 'on');
76508   }
76509
76510   function uiConflicts(context) {
76511       var dispatch$$1 = dispatch('cancel', 'save');
76512       var keybinding = d3keybinding('conflicts');
76513       var _origChanges;
76514       var _conflictList;
76515
76516
76517       function keybindingOn() {
76518           select(document)
76519               .call(keybinding.on('⎋', cancel, true));
76520       }
76521
76522       function keybindingOff() {
76523           select(document)
76524               .call(keybinding.off);
76525       }
76526
76527       function tryAgain() {
76528           keybindingOff();
76529           dispatch$$1.call('save');
76530       }
76531
76532       function cancel() {
76533           keybindingOff();
76534           dispatch$$1.call('cancel');
76535       }
76536
76537
76538       function conflicts(selection$$1) {
76539           keybindingOn();
76540
76541           var headerEnter = selection$$1.selectAll('.header')
76542               .data([0])
76543               .enter()
76544               .append('div')
76545               .attr('class', 'header fillL');
76546
76547           headerEnter
76548               .append('button')
76549               .attr('class', 'fr')
76550               .on('click', cancel)
76551               .call(svgIcon('#iD-icon-close'));
76552
76553           headerEnter
76554               .append('h3')
76555               .text(t('save.conflict.header'));
76556
76557           var bodyEnter = selection$$1.selectAll('.body')
76558               .data([0])
76559               .enter()
76560               .append('div')
76561               .attr('class', 'body fillL');
76562
76563           var conflictsHelpEnter = bodyEnter
76564               .append('div')
76565               .attr('class', 'conflicts-help')
76566               .text(t('save.conflict.help'));
76567
76568
76569           // Download changes link
76570           var detected = utilDetect();
76571           var changeset = new osmChangeset();
76572
76573           delete changeset.id;  // Export without changeset_id
76574
76575           var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
76576           var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
76577           var fileName = 'changes.osc';
76578
76579           var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
76580               .append('a')
76581               .attr('class', 'download-changes');
76582
76583           if (detected.download) {      // All except IE11 and Edge
76584               linkEnter                 // download the data as a file
76585                   .attr('href', window.URL.createObjectURL(blob))
76586                   .attr('download', fileName);
76587
76588           } else {                      // IE11 and Edge
76589               linkEnter                 // open data uri in a new tab
76590                   .attr('target', '_blank')
76591                   .on('click.download', function() {
76592                       navigator.msSaveBlob(blob, fileName);
76593                   });
76594           }
76595
76596           linkEnter
76597               .call(svgIcon('#iD-icon-load', 'inline'))
76598               .append('span')
76599               .text(t('save.conflict.download_changes'));
76600
76601
76602           bodyEnter
76603               .append('div')
76604               .attr('class', 'conflict-container fillL3')
76605               .call(showConflict, 0);
76606
76607           bodyEnter
76608               .append('div')
76609               .attr('class', 'conflicts-done')
76610               .attr('opacity', 0)
76611               .style('display', 'none')
76612               .text(t('save.conflict.done'));
76613
76614           var buttonsEnter = bodyEnter
76615               .append('div')
76616               .attr('class','buttons col12 joined conflicts-buttons');
76617
76618           buttonsEnter
76619               .append('button')
76620               .attr('disabled', _conflictList.length > 1)
76621               .attr('class', 'action conflicts-button col6')
76622               .text(t('save.title'))
76623               .on('click.try_again', tryAgain);
76624
76625           buttonsEnter
76626               .append('button')
76627               .attr('class', 'secondary-action conflicts-button col6')
76628               .text(t('confirm.cancel'))
76629               .on('click.cancel', cancel);
76630       }
76631
76632
76633       function showConflict(selection$$1, index) {
76634           index = utilWrap(index, _conflictList.length);
76635
76636           var parent = select(selection$$1.node().parentNode);
76637
76638           // enable save button if this is the last conflict being reviewed..
76639           if (index === _conflictList.length - 1) {
76640               window.setTimeout(function() {
76641                   parent.select('.conflicts-button')
76642                       .attr('disabled', null);
76643
76644                   parent.select('.conflicts-done')
76645                       .transition()
76646                       .attr('opacity', 1)
76647                       .style('display', 'block');
76648               }, 250);
76649           }
76650
76651           var conflict = selection$$1
76652               .selectAll('.conflict')
76653               .data([_conflictList[index]]);
76654
76655           conflict.exit()
76656               .remove();
76657
76658           var conflictEnter = conflict.enter()
76659               .append('div')
76660               .attr('class', 'conflict');
76661
76662           conflictEnter
76663               .append('h4')
76664               .attr('class', 'conflict-count')
76665               .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
76666
76667           conflictEnter
76668               .append('a')
76669               .attr('class', 'conflict-description')
76670               .attr('href', '#')
76671               .text(function(d) { return d.name; })
76672               .on('click', function(d) {
76673                   event.preventDefault();
76674                   zoomToEntity(d.id);
76675               });
76676
76677           var details = conflictEnter
76678               .append('div')
76679               .attr('class', 'conflict-detail-container');
76680
76681           details
76682               .append('ul')
76683               .attr('class', 'conflict-detail-list')
76684               .selectAll('li')
76685               .data(function(d) { return d.details || []; })
76686               .enter()
76687               .append('li')
76688               .attr('class', 'conflict-detail-item')
76689               .html(function(d) { return d; });
76690
76691           details
76692               .append('div')
76693               .attr('class', 'conflict-choices')
76694               .call(addChoices);
76695
76696           details
76697               .append('div')
76698               .attr('class', 'conflict-nav-buttons joined cf')
76699               .selectAll('button')
76700               .data(['previous', 'next'])
76701               .enter()
76702               .append('button')
76703               .text(function(d) { return t('save.conflict.' + d); })
76704               .attr('class', 'conflict-nav-button action col6')
76705               .attr('disabled', function(d, i) {
76706                   return (i === 0 && index === 0) ||
76707                       (i === 1 && index === _conflictList.length - 1) || null;
76708               })
76709               .on('click', function(d, i) {
76710                   event.preventDefault();
76711
76712                   var container = parent.selectAll('.conflict-container');
76713                   var sign = (i === 0 ? -1 : 1);
76714
76715                   container
76716                       .selectAll('.conflict')
76717                       .remove();
76718
76719                   container
76720                       .call(showConflict, index + sign);
76721               });
76722
76723       }
76724
76725
76726       function addChoices(selection$$1) {
76727           var choices = selection$$1
76728               .append('ul')
76729               .attr('class', 'layer-list')
76730               .selectAll('li')
76731               .data(function(d) { return d.choices || []; });
76732
76733           // enter
76734           var choicesEnter = choices.enter()
76735               .append('li')
76736               .attr('class', 'layer');
76737
76738           var labelEnter = choicesEnter
76739               .append('label');
76740
76741           labelEnter
76742               .append('input')
76743               .attr('type', 'radio')
76744               .attr('name', function(d) { return d.id; })
76745               .on('change', function(d, i) {
76746                   var ul = this.parentNode.parentNode.parentNode;
76747                   ul.__data__.chosen = i;
76748                   choose(ul, d);
76749               });
76750
76751           labelEnter
76752               .append('span')
76753               .text(function(d) { return d.text; });
76754
76755           // update
76756           choicesEnter
76757               .merge(choices)
76758               .each(function(d, i) {
76759                   var ul = this.parentNode;
76760                   if (ul.__data__.chosen === i) {
76761                       choose(ul, d);
76762                   }
76763               });
76764       }
76765
76766
76767       function choose(ul, datum) {
76768           if (event) event.preventDefault();
76769
76770           select(ul)
76771               .selectAll('li')
76772               .classed('active', function(d) { return d === datum; })
76773               .selectAll('input')
76774               .property('checked', function(d) { return d === datum; });
76775
76776           var extent = geoExtent$$1();
76777           var entity;
76778
76779           entity = context.graph().hasEntity(datum.id);
76780           if (entity) extent._extend(entity.extent(context.graph()));
76781
76782           datum.action();
76783
76784           entity = context.graph().hasEntity(datum.id);
76785           if (entity) extent._extend(entity.extent(context.graph()));
76786
76787           zoomToEntity(datum.id, extent);
76788       }
76789
76790
76791       function zoomToEntity(id, extent) {
76792           context.surface().selectAll('.hover')
76793               .classed('hover', false);
76794
76795           var entity = context.graph().hasEntity(id);
76796           if (entity) {
76797               if (extent) {
76798                   context.map().trimmedExtent(extent);
76799               } else {
76800                   context.map().zoomTo(entity);
76801               }
76802               context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
76803                   .classed('hover', true);
76804           }
76805       }
76806
76807
76808       // The conflict list should be an array of objects like:
76809       // {
76810       //     id: id,
76811       //     name: entityName(local),
76812       //     details: merge.conflicts(),
76813       //     chosen: 1,
76814       //     choices: [
76815       //         choice(id, keepMine, forceLocal),
76816       //         choice(id, keepTheirs, forceRemote)
76817       //     ]
76818       // }
76819       conflicts.conflictList = function(_) {
76820           if (!arguments.length) return _conflictList;
76821           _conflictList = _;
76822           return conflicts;
76823       };
76824
76825
76826       conflicts.origChanges = function(_) {
76827           if (!arguments.length) return _origChanges;
76828           _origChanges = _;
76829           return conflicts;
76830       };
76831
76832
76833       return utilRebind(conflicts, dispatch$$1, 'on');
76834   }
76835
76836   function uiDataEditor$$1(context) {
76837       var dataHeader = uiDataHeader();
76838       var rawTagEditor = uiRawTagEditor(context);
76839       var _datum;
76840
76841
76842       function dataEditor(selection) {
76843           var header = selection.selectAll('.header')
76844               .data([0]);
76845
76846           var headerEnter = header.enter()
76847               .append('div')
76848               .attr('class', 'header fillL');
76849
76850           headerEnter
76851               .append('button')
76852               .attr('class', 'fr data-editor-close')
76853               .on('click', function() {
76854                   context.enter(modeBrowse(context));
76855               })
76856               .call(svgIcon('#iD-icon-close'));
76857
76858           headerEnter
76859               .append('h3')
76860               .text(t('map_data.title'));
76861
76862
76863           var body = selection.selectAll('.body')
76864               .data([0]);
76865
76866           body = body.enter()
76867               .append('div')
76868               .attr('class', 'body')
76869               .merge(body);
76870
76871           var editor = body.selectAll('.data-editor')
76872               .data([0]);
76873
76874           editor.enter()
76875               .append('div')
76876               .attr('class', 'modal-section data-editor')
76877               .merge(editor)
76878               .call(dataHeader.datum(_datum));
76879
76880           var rte = body.selectAll('.raw-tag-editor')
76881               .data([0]);
76882
76883           rte.enter()
76884               .append('div')
76885               .attr('class', 'inspector-border raw-tag-editor inspector-inner data-editor')
76886               .merge(rte)
76887               .call(rawTagEditor
76888                   .expanded(true)
76889                   .readOnlyTags([/./])
76890                   .tags((_datum && _datum.properties) || {})
76891                   .state('hover')
76892               );
76893       }
76894
76895
76896       dataEditor.datum = function(val) {
76897           if (!arguments.length) return _datum;
76898           _datum = val;
76899           return this;
76900       };
76901
76902
76903       return dataEditor;
76904   }
76905
76906   function uiDataHeader() {
76907       var _datum;
76908
76909
76910       function dataHeader(selection) {
76911           var header = selection.selectAll('.data-header')
76912               .data(
76913                   (_datum ? [_datum] : []),
76914                   function(d) { return d.__featurehash__; }
76915               );
76916
76917           header.exit()
76918               .remove();
76919
76920           var headerEnter = header.enter()
76921               .append('div')
76922               .attr('class', 'data-header');
76923
76924           var iconEnter = headerEnter
76925               .append('div')
76926               .attr('class', 'data-header-icon');
76927
76928           iconEnter
76929               .append('div')
76930               .attr('class', 'preset-icon-28')
76931               .call(svgIcon('#iD-icon-data', 'note-fill'));
76932
76933           headerEnter
76934               .append('div')
76935               .attr('class', 'data-header-label')
76936               .text(t('map_data.layers.custom.title'));
76937       }
76938
76939
76940       dataHeader.datum = function(val) {
76941           if (!arguments.length) return _datum;
76942           _datum = val;
76943           return this;
76944       };
76945
76946
76947       return dataHeader;
76948   }
76949
76950   function uiEditMenu(context, operations) {
76951       var menu;
76952       var center = [0, 0];
76953       var offset = [0, 0];
76954       var tooltip;
76955
76956       var p = 8;               // top padding
76957       var m = 4;               // top margin
76958       var h = 15;              // height of icon
76959       var vpBottomMargin = 45; // viewport bottom margin
76960       var vpSideMargin = 35;   // viewport side margin
76961       var buttonWidth = 44;
76962       var buttonHeight = (2 * p + h);
76963       var menuWidth = buttonWidth;
76964       var menuHeight = (2 * m) + operations.length * buttonHeight;
76965       var menuSideMargin = 10;
76966       var tooltipWidth = 200;
76967       var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
76968
76969
76970       var editMenu = function (selection$$1) {
76971           if (!operations.length) return;
76972
76973           selection$$1.node().parentNode.focus();
76974
76975           var isRTL = textDirection === 'rtl';
76976           var viewport = context.surfaceRect();
76977
76978           if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
76979               // menu is going left-to-right and near right viewport edge, go left instead
76980               isRTL = true;
76981           } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
76982               // menu is going right-to-left and near left viewport edge, go right instead
76983               isRTL = false;
76984           }
76985
76986           offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
76987
76988           if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
76989               // menu is near bottom viewport edge, shift upwards
76990               offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
76991           }
76992
76993           var origin = [ center[0] + offset[0], center[1] + offset[1] ];
76994
76995           menu = selection$$1
76996               .append('g')
76997               .attr('class', 'edit-menu')
76998               .attr('transform', 'translate(' + origin + ')')
76999               .attr('opacity', 0);
77000
77001           menu
77002               .transition()
77003               .attr('opacity', 1);
77004
77005           menu
77006               .append('rect')
77007               .attr('class', 'edit-menu-background')
77008               .attr('x', 4)
77009               .attr('rx', 4)
77010               .attr('ry', 4)
77011               .attr('width', menuWidth)
77012               .attr('height', menuHeight)
77013               .attr('stroke-linecap', 'round');
77014
77015
77016           var button = menu.selectAll('.edit-menu-item')
77017               .data(operations)
77018               .enter()
77019               .append('g')
77020               .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
77021               .classed('disabled', function (d) { return d.disabled(); })
77022               .attr('transform', function (d, i) {
77023                   return 'translate(' + geoVecFloor([
77024                       0,
77025                       m + i * buttonHeight
77026                   ]).join(',') + ')';
77027               });
77028
77029           button
77030               .append('rect')
77031               .attr('x', 4)
77032               .attr('width', buttonWidth)
77033               .attr('height', buttonHeight)
77034               .on('click', click)
77035               .on('mousedown', mousedown)
77036               .on('mouseover', mouseover)
77037               .on('mouseout', mouseout);
77038
77039           button
77040               .append('use')
77041               .attr('width', '20')
77042               .attr('height', '20')
77043               .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
77044               .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
77045
77046           tooltip = select(document.body)
77047               .append('div')
77048               .attr('class', 'tooltip-inner edit-menu-tooltip');
77049
77050
77051           function click(operation) {
77052               event.stopPropagation();
77053               if (operation.disabled()) return;
77054               operation();
77055               editMenu.close();
77056           }
77057
77058           function mousedown() {
77059               event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
77060           }
77061
77062           function mouseover(d, i) {
77063               var tipX, tipY;
77064
77065               if (!isRTL) {
77066                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
77067               } else {
77068                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
77069               }
77070
77071               if (tipX + tooltipWidth > viewport.right) {
77072                   // tip is going left-to-right and near right viewport edge, go left instead
77073                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
77074               } else if (tipX < viewport.left) {
77075                   // tip is going right-to-left and near left viewport edge, go right instead
77076                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
77077               }
77078
77079               tipY = viewport.top + origin[1] + (i * buttonHeight);
77080               if (tipY + tooltipHeight > viewport.bottom) {
77081                   // tip is near bottom viewport edge, shift upwards
77082                   tipY -= tipY + tooltipHeight - viewport.bottom;
77083               }
77084
77085               tooltip
77086                   .style('left', tipX + 'px')
77087                   .style('top', tipY + 'px')
77088                   .style('display', 'block')
77089                   .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
77090           }
77091
77092           function mouseout() {
77093               tooltip.style('display', 'none');
77094           }
77095       };
77096
77097
77098       editMenu.close = function () {
77099           if (menu) {
77100               menu
77101                   .style('pointer-events', 'none')
77102                   .transition()
77103                   .attr('opacity', 0)
77104                   .remove();
77105           }
77106
77107           if (tooltip) {
77108               tooltip.remove();
77109           }
77110       };
77111
77112
77113       editMenu.center = function (_) {
77114           if (!arguments.length) return center;
77115           center = _;
77116           return editMenu;
77117       };
77118
77119
77120       return editMenu;
77121   }
77122
77123   function uiPresetIcon() {
77124       var preset, geometry;
77125
77126
77127       function presetIcon(selection$$1) {
77128           selection$$1.each(render);
77129       }
77130
77131
77132       function getIcon(p, geom) {
77133           if (p.icon)
77134               return p.icon;
77135           else if (geom === 'line')
77136               return 'iD-other-line';
77137           else if (geom === 'vertex')
77138               return p.isFallback() ? '' : 'temaki-vertex';
77139           else
77140               return 'maki-marker-stroked';
77141       }
77142
77143
77144       function render() {
77145           var selection$$1 = select(this);
77146           var p = preset.apply(this, arguments);
77147           var geom = geometry.apply(this, arguments);
77148           var picon = getIcon(p, geom);
77149           var isMaki = /^maki-/.test(picon);
77150           var isTemaki = /^temaki-/.test(picon);
77151           var isFa = /^fa[srb]-/.test(picon);
77152           var isPOI = isMaki || isTemaki || isFa;
77153           var isFramed = (geom === 'area' || geom === 'vertex');
77154
77155
77156           function tag_classes(p) {
77157               var s = '';
77158               for (var i in p.tags) {
77159                   s += ' tag-' + i;
77160                   if (p.tags[i] !== '*') {
77161                       s += ' tag-' + i + '-' + p.tags[i];
77162                   }
77163               }
77164               return s;
77165           }
77166
77167
77168           var fill = selection$$1.selectAll('.preset-icon-fill')
77169               .data([0]);
77170
77171           fill = fill.enter()
77172               .append('div')
77173               .merge(fill);
77174
77175           fill
77176               .attr('class', function() {
77177                   return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
77178               });
77179
77180
77181           var areaFrame = selection$$1.selectAll('.preset-icon-frame')
77182               .data((geom === 'area') ? [0] : []);
77183
77184           areaFrame.exit()
77185               .remove();
77186
77187           areaFrame = areaFrame.enter()
77188               .append('div')
77189               .attr('class', 'preset-icon-frame')
77190               .call(svgIcon('#iD-preset-icon-frame'));
77191
77192
77193           var icon = selection$$1.selectAll('.preset-icon')
77194               .data([0]);
77195
77196           icon = icon.enter()
77197               .append('div')
77198               .attr('class', 'preset-icon')
77199               .call(svgIcon(''))
77200               .merge(icon);
77201
77202           icon
77203               .attr('class', 'preset-icon preset-icon-' +
77204                   (isPOI ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
77205               );
77206
77207           icon.selectAll('svg')
77208               .attr('class', function() {
77209                   return 'icon ' + picon + (isPOI ? '' : tag_classes(p));
77210               });
77211
77212           icon.selectAll('use')
77213               .attr('href', '#' + picon + (isMaki ? '-15' : ''));
77214       }
77215
77216
77217       presetIcon.preset = function(_) {
77218           if (!arguments.length) return preset;
77219           preset = utilFunctor(_);
77220           return presetIcon;
77221       };
77222
77223
77224       presetIcon.geometry = function(_) {
77225           if (!arguments.length) return geometry;
77226           geometry = utilFunctor(_);
77227           return presetIcon;
77228       };
77229
77230       return presetIcon;
77231   }
77232
77233   function uiRawMemberEditor(context) {
77234       var taginfo = services.taginfo,
77235           _entityID;
77236
77237
77238       function selectMember(d) {
77239           event.preventDefault();
77240           context.enter(modeSelect(context, [d.id]));
77241       }
77242
77243
77244       function changeRole(d) {
77245           var role = select(this).property('value');
77246           var member = { id: d.id, type: d.type, role: role };
77247           context.perform(
77248               actionChangeMember(d.relation.id, member, d.index),
77249               t('operations.change_role.annotation')
77250           );
77251       }
77252
77253
77254       function deleteMember(d) {
77255           context.perform(
77256               actionDeleteMember(d.relation.id, d.index),
77257               t('operations.delete_member.annotation')
77258           );
77259
77260           if (!context.hasEntity(d.relation.id)) {
77261               context.enter(modeBrowse(context));
77262           }
77263       }
77264
77265
77266       function rawMemberEditor(selection$$1) {
77267           var entity = context.entity(_entityID),
77268               memberships = [];
77269
77270           entity.members.slice(0, 1000).forEach(function(member, index) {
77271               memberships.push({
77272                   index: index,
77273                   id: member.id,
77274                   type: member.type,
77275                   role: member.role,
77276                   relation: entity,
77277                   member: context.hasEntity(member.id)
77278               });
77279           });
77280
77281           var gt = entity.members.length > 1000 ? '>' : '';
77282           selection$$1.call(uiDisclosure(context, 'raw_member_editor', true)
77283               .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
77284               .expanded(true)
77285               .updatePreference(false)
77286               .on('toggled', function(expanded) {
77287                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
77288               })
77289               .content(content)
77290           );
77291
77292
77293           function content(wrap) {
77294               var list = wrap.selectAll('.member-list')
77295                   .data([0]);
77296
77297               list = list.enter()
77298                   .append('ul')
77299                   .attr('class', 'member-list')
77300                   .merge(list);
77301
77302
77303               var items = list.selectAll('li')
77304                   .data(memberships, function(d) {
77305                       return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
77306                           (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
77307                   });
77308
77309               items.exit()
77310                   .each(unbind)
77311                   .remove();
77312
77313               var enter = items.enter()
77314                   .append('li')
77315                   .attr('class', 'member-row form-field')
77316                   .classed('member-incomplete', function(d) { return !d.member; });
77317
77318               enter
77319                   .each(function(d) {
77320                       if (d.member) {
77321                           var label = select(this).append('label')
77322                               .attr('class', 'form-label')
77323                               .append('a')
77324                               .attr('href', '#')
77325                               .on('click', selectMember);
77326
77327                           label.append('span')
77328                               .attr('class', 'member-entity-type')
77329                               .text(function(d) {
77330                                   var matched = context.presets().match(d.member, context.graph());
77331                                   return (matched && matched.name()) || utilDisplayType(d.member.id);
77332                               });
77333
77334                           label.append('span')
77335                               .attr('class', 'member-entity-name')
77336                               .text(function(d) { return utilDisplayName(d.member); });
77337
77338                       } else {
77339                           select(this).append('label')
77340                               .attr('class', 'form-label')
77341                               .text(t('inspector.incomplete', { id: d.id }));
77342                       }
77343                   });
77344
77345               enter
77346                   .append('input')
77347                   .attr('class', 'member-role')
77348                   .property('type', 'text')
77349                   .attr('maxlength', 255)
77350                   .attr('placeholder', t('inspector.role'))
77351                   .call(utilNoAuto)
77352                   .property('value', function(d) { return d.role; })
77353                   .on('change', changeRole);
77354
77355               enter
77356                   .append('button')
77357                   .attr('tabindex', -1)
77358                   .attr('class', 'remove button-input-action member-delete minor')
77359                   .on('click', deleteMember)
77360                   .call(svgIcon('#iD-operation-delete'));
77361
77362               if (taginfo) {
77363                   enter.each(bindTypeahead);
77364               }
77365
77366
77367               function bindTypeahead(d) {
77368                   var row = select(this),
77369                       role = row.selectAll('input.member-role');
77370
77371                   function sort(value, data) {
77372                       var sameletter = [],
77373                           other = [];
77374                       for (var i = 0; i < data.length; i++) {
77375                           if (data[i].value.substring(0, value.length) === value) {
77376                               sameletter.push(data[i]);
77377                           } else {
77378                               other.push(data[i]);
77379                           }
77380                       }
77381                       return sameletter.concat(other);
77382                   }
77383
77384                   role.call(d3combobox()
77385                       .container(context.container())
77386                       .fetcher(function(role, callback) {
77387                           var rtype = entity.tags.type;
77388                           taginfo.roles({
77389                               debounce: true,
77390                               rtype: rtype || '',
77391                               geometry: context.geometry(d.member.id),
77392                               query: role
77393                           }, function(err, data) {
77394                               if (!err) callback(sort(role, data));
77395                           });
77396                       }));
77397               }
77398
77399
77400               function unbind() {
77401                   var row = select(this);
77402
77403                   row.selectAll('input.member-role')
77404                       .call(d3combobox.off);
77405               }
77406           }
77407       }
77408
77409
77410       rawMemberEditor.entityID = function(_) {
77411           if (!arguments.length) return _entityID;
77412           _entityID = _;
77413           return rawMemberEditor;
77414       };
77415
77416
77417       return rawMemberEditor;
77418   }
77419
77420   function uiRawMembershipEditor(context) {
77421       var taginfo = services.taginfo,
77422           _entityID,
77423           _showBlank;
77424
77425
77426       function selectRelation(d) {
77427           event.preventDefault();
77428           context.enter(modeSelect(context, [d.relation.id]));
77429       }
77430
77431
77432       function changeRole(d) {
77433           var role = select(this).property('value');
77434           context.perform(
77435               actionChangeMember(d.relation.id, assignIn({}, d.member, { role: role }), d.index),
77436               t('operations.change_role.annotation')
77437           );
77438       }
77439
77440
77441       function addMembership(d, role) {
77442           _showBlank = false;
77443
77444           var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
77445
77446           if (d.relation) {
77447               context.perform(
77448                   actionAddMember(d.relation.id, member),
77449                   t('operations.add_member.annotation')
77450               );
77451
77452           } else {
77453               var relation = osmRelation();
77454               context.perform(
77455                   actionAddEntity(relation),
77456                   actionAddMember(relation.id, member),
77457                   t('operations.add.annotation.relation')
77458               );
77459
77460               context.enter(modeSelect(context, [relation.id]));
77461           }
77462       }
77463
77464
77465       function deleteMembership(d) {
77466           context.perform(
77467               actionDeleteMember(d.relation.id, d.index),
77468               t('operations.delete_member.annotation')
77469           );
77470       }
77471
77472
77473       function relations(q) {
77474           var newRelation = { relation: null, value: t('inspector.new_relation') };
77475           var result = [];
77476           var graph = context.graph();
77477
77478           context.intersects(context.extent()).forEach(function(entity) {
77479               if (entity.type !== 'relation' || entity.id === _entityID)
77480                   return;
77481
77482               var matched = context.presets().match(entity, graph),
77483                   presetName = (matched && matched.name()) || t('inspector.relation'),
77484                   entityName = utilDisplayName(entity) || '';
77485
77486               var value = presetName + ' ' + entityName;
77487               if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
77488                   return;
77489
77490               result.push({ relation: entity, value: value });
77491           });
77492
77493           result.sort(function(a, b) {
77494               return osmRelation.creationOrder(a.relation, b.relation);
77495           });
77496
77497           // Dedupe identical names by appending relation id - see #2891
77498           var dupeGroups = filter(
77499               groupBy(result, 'value'),
77500               function(v) { return v.length > 1; }
77501           );
77502
77503           dupeGroups.forEach(function(group) {
77504               group.forEach(function(obj) {
77505                   obj.value += ' ' + obj.relation.id;
77506               });
77507           });
77508
77509           forEach(result, function(obj) {
77510               obj.title = obj.value;
77511           });
77512
77513           result.unshift(newRelation);
77514           return result;
77515       }
77516
77517
77518       function rawMembershipEditor(selection$$1) {
77519           var entity = context.entity(_entityID),
77520               parents = context.graph().parentRelations(entity),
77521               memberships = [];
77522
77523           parents.slice(0, 1000).forEach(function(relation) {
77524               relation.members.forEach(function(member, index) {
77525                   if (member.id === entity.id) {
77526                       memberships.push({ relation: relation, member: member, index: index });
77527                   }
77528               });
77529           });
77530
77531           var gt = parents.length > 1000 ? '>' : '';
77532           selection$$1.call(uiDisclosure(context, 'raw_membership_editor', true)
77533               .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
77534               .expanded(true)
77535               .updatePreference(false)
77536               .on('toggled', function(expanded) {
77537                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
77538               })
77539               .content(content)
77540           );
77541
77542
77543           function content(wrap) {
77544               var list = wrap.selectAll('.member-list')
77545                   .data([0]);
77546
77547               list = list.enter()
77548                   .append('ul')
77549                   .attr('class', 'member-list')
77550                   .merge(list);
77551
77552
77553               var items = list.selectAll('li.member-row-normal')
77554                   .data(memberships, function(d) {
77555                       return osmEntity$$1.key(d.relation) + ',' + d.index;
77556                   });
77557
77558               items.exit()
77559                   .each(unbind)
77560                   .remove();
77561
77562               var enter = items.enter()
77563                   .append('li')
77564                   .attr('class', 'member-row member-row-normal form-field');
77565
77566               var label = enter
77567                   .append('label')
77568                   .attr('class', 'form-label')
77569                   .append('a')
77570                   .attr('href', '#')
77571                   .on('click', selectRelation);
77572
77573               label
77574                   .append('span')
77575                   .attr('class', 'member-entity-type')
77576                   .text(function(d) {
77577                       var matched = context.presets().match(d.relation, context.graph());
77578                       return (matched && matched.name()) || t('inspector.relation');
77579                   });
77580
77581               label
77582                   .append('span')
77583                   .attr('class', 'member-entity-name')
77584                   .text(function(d) { return utilDisplayName(d.relation); });
77585
77586               enter
77587                   .append('input')
77588                   .attr('class', 'member-role')
77589                   .property('type', 'text')
77590                   .attr('maxlength', 255)
77591                   .attr('placeholder', t('inspector.role'))
77592                   .call(utilNoAuto)
77593                   .property('value', function(d) { return d.member.role; })
77594                   .on('change', changeRole);
77595
77596               enter
77597                   .append('button')
77598                   .attr('tabindex', -1)
77599                   .attr('class', 'remove button-input-action member-delete minor')
77600                   .on('click', deleteMembership)
77601                   .call(svgIcon('#iD-operation-delete'));
77602
77603               if (taginfo) {
77604                   enter.each(bindTypeahead);
77605               }
77606
77607
77608               var newrow = list.selectAll('.member-row-new')
77609                   .data(_showBlank ? [0] : []);
77610
77611               newrow.exit()
77612                   .remove();
77613
77614               enter = newrow.enter()
77615                   .append('li')
77616                   .attr('class', 'member-row member-row-new form-field');
77617
77618               enter
77619                   .append('input')
77620                   .attr('type', 'text')
77621                   .attr('class', 'member-entity-input')
77622                   .call(utilNoAuto);
77623
77624               enter
77625                   .append('input')
77626                   .attr('class', 'member-role')
77627                   .property('type', 'text')
77628                   .attr('maxlength', 255)
77629                   .attr('placeholder', t('inspector.role'))
77630                   .call(utilNoAuto)
77631                   .on('change', changeRole);
77632
77633               enter
77634                   .append('button')
77635                   .attr('tabindex', -1)
77636                   .attr('class', 'remove button-input-action member-delete minor')
77637                   .on('click', deleteMembership)
77638                   .call(svgIcon('#iD-operation-delete'));
77639
77640               newrow = newrow
77641                   .merge(enter);
77642
77643               newrow.selectAll('.member-entity-input')
77644                   .call(d3combobox()
77645                       .container(context.container())
77646                       .minItems(1)
77647                       .fetcher(function(value, callback) { callback(relations(value)); })
77648                       .on('accept', onAccept)
77649                   );
77650
77651
77652               var addrel = wrap.selectAll('.add-relation')
77653                   .data([0]);
77654
77655               addrel = addrel.enter()
77656                   .append('button')
77657                   .attr('class', 'add-relation')
77658                   .merge(addrel);
77659
77660               addrel
77661                   .call(svgIcon('#iD-icon-plus', 'light'))
77662                   .on('click', function() {
77663                       _showBlank = true;
77664                       content(wrap);
77665                       list.selectAll('.member-entity-input').node().focus();
77666                   });
77667
77668
77669               function onAccept(d) {
77670                   var role = list.selectAll('.member-row-new .member-role').property('value');
77671                   addMembership(d, role);
77672               }
77673
77674
77675               function bindTypeahead(d) {
77676                   var row = select(this),
77677                       role = row.selectAll('input.member-role');
77678
77679                   function sort(value, data) {
77680                       var sameletter = [],
77681                           other = [];
77682                       for (var i = 0; i < data.length; i++) {
77683                           if (data[i].value.substring(0, value.length) === value) {
77684                               sameletter.push(data[i]);
77685                           } else {
77686                               other.push(data[i]);
77687                           }
77688                       }
77689                       return sameletter.concat(other);
77690                   }
77691
77692                   role.call(d3combobox()
77693                       .container(context.container())
77694                       .fetcher(function(role, callback) {
77695                           var rtype = d.relation.tags.type;
77696                           taginfo.roles({
77697                               debounce: true,
77698                               rtype: rtype || '',
77699                               geometry: context.geometry(_entityID),
77700                               query: role
77701                           }, function(err, data) {
77702                               if (!err) callback(sort(role, data));
77703                           });
77704                       }));
77705               }
77706
77707
77708               function unbind() {
77709                   var row = select(this);
77710
77711                   row.selectAll('input.member-role')
77712                       .call(d3combobox.off);
77713               }
77714           }
77715       }
77716
77717
77718       rawMembershipEditor.entityID = function(_) {
77719           if (!arguments.length) return _entityID;
77720           _entityID = _;
77721           return rawMembershipEditor;
77722       };
77723
77724
77725       return rawMembershipEditor;
77726   }
77727
77728   function uiPresetEditor(context) {
77729       var dispatch$$1 = dispatch('change');
77730       var formFields = uiFormFields(context);
77731       var _state;
77732       var _fieldsArr;
77733       var _preset;
77734       var _tags;
77735       var _entityID;
77736
77737
77738       function presetEditor(selection$$1) {
77739           selection$$1.call(uiDisclosure(context, 'preset_fields', true)
77740               .title(t('inspector.all_fields'))
77741               .content(render)
77742           );
77743       }
77744
77745
77746       function render(selection$$1) {
77747           if (!_fieldsArr) {
77748               var entity = context.entity(_entityID);
77749               var geometry = context.geometry(_entityID);
77750               var presets = context.presets();
77751
77752               _fieldsArr = [];
77753
77754               _preset.fields.forEach(function(field) {
77755                   if (field.matchGeometry(geometry)) {
77756                       _fieldsArr.push(
77757                           uiField(context, field, entity)
77758                       );
77759                   }
77760               });
77761
77762               if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
77763                   _fieldsArr.push(
77764                       uiField(context, presets.field('restrictions'), entity)
77765                   );
77766               }
77767
77768               presets.universal().forEach(function(field) {
77769                   if (_preset.fields.indexOf(field) === -1) {
77770                       _fieldsArr.push(
77771                           uiField(context, field, entity, { show: false })
77772                       );
77773                   }
77774               });
77775
77776               _fieldsArr.forEach(function(field) {
77777                   field
77778                       .on('change', function(t$$1, onInput) {
77779                           dispatch$$1.call('change', field, t$$1, onInput);
77780                       });
77781               });
77782           }
77783
77784           _fieldsArr.forEach(function(field) {
77785               field
77786                   .state(_state)
77787                   .tags(_tags);
77788           });
77789
77790
77791           selection$$1
77792               .call(formFields.fieldsArr(_fieldsArr), 'inspector-inner fillL3');
77793
77794
77795           selection$$1.selectAll('.wrap-form-field input')
77796               .on('keydown', function() {
77797                   // if user presses enter, and combobox is not active, accept edits..
77798                   if (event.keyCode === 13 && select('.combobox').empty()) {
77799                       context.enter(modeBrowse(context));
77800                   }
77801               });
77802       }
77803
77804
77805       presetEditor.preset = function(val) {
77806           if (!arguments.length) return _preset;
77807           if (_preset && _preset.id === val.id) return presetEditor;
77808           _preset = val;
77809           _fieldsArr = null;
77810           return presetEditor;
77811       };
77812
77813
77814       presetEditor.state = function(val) {
77815           if (!arguments.length) return _state;
77816           _state = val;
77817           return presetEditor;
77818       };
77819
77820
77821       presetEditor.tags = function(val) {
77822           if (!arguments.length) return _tags;
77823           _tags = val;
77824           // Don't reset _fieldsArr here.
77825           return presetEditor;
77826       };
77827
77828
77829       presetEditor.entityID = function(val) {
77830           if (!arguments.length) return _entityID;
77831           if (_entityID === val) return presetEditor;
77832           _entityID = val;
77833           _fieldsArr = null;
77834           return presetEditor;
77835       };
77836
77837
77838       return utilRebind(presetEditor, dispatch$$1, 'on');
77839   }
77840
77841   function uiEntityEditor(context) {
77842       var dispatch$$1 = dispatch('choose');
77843       var _state = 'select';
77844       var _coalesceChanges = false;
77845       var _modified = false;
77846       var _base;
77847       var _entityID;
77848       var _activePreset;
77849       var _tagReference;
77850
77851       var presetEditor = uiPresetEditor(context)
77852           .on('change', changeTags);
77853       var rawTagEditor = uiRawTagEditor(context)
77854           .on('change', changeTags);
77855
77856
77857       function entityEditor(selection$$1) {
77858           var entity = context.entity(_entityID);
77859           var tags = clone(entity.tags);
77860
77861           // Header
77862           var header = selection$$1.selectAll('.header')
77863               .data([0]);
77864
77865           // Enter
77866           var enter = header.enter()
77867               .append('div')
77868               .attr('class', 'header fillL cf');
77869
77870           enter
77871               .append('button')
77872               .attr('class', 'fl preset-reset preset-choose')
77873               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
77874
77875           enter
77876               .append('button')
77877               .attr('class', 'fr preset-close')
77878               .on('click', function() { context.enter(modeBrowse(context)); })
77879               .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
77880
77881           enter
77882               .append('h3')
77883               .text(t('inspector.edit'));
77884
77885           // Update
77886           header = header
77887               .merge(enter);
77888
77889           header.selectAll('.preset-reset')
77890               .on('click', function() {
77891                   dispatch$$1.call('choose', this, _activePreset);
77892               });
77893
77894
77895           // Body
77896           var body = selection$$1.selectAll('.inspector-body')
77897               .data([0]);
77898
77899           // Enter
77900           enter = body.enter()
77901               .append('div')
77902               .attr('class', 'inspector-body');
77903
77904           enter
77905               .append('div')
77906               .attr('class', 'preset-list-item inspector-inner')
77907               .append('div')
77908               .attr('class', 'preset-list-button-wrap')
77909               .append('button')
77910               .attr('class', 'preset-list-button preset-reset')
77911               .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
77912               .append('div')
77913               .attr('class', 'label');
77914
77915           enter
77916               .append('div')
77917               .attr('class', 'inspector-border preset-editor');
77918
77919           enter
77920               .append('div')
77921               .attr('class', 'inspector-border raw-tag-editor inspector-inner');
77922
77923           enter
77924               .append('div')
77925               .attr('class', 'inspector-border raw-member-editor inspector-inner');
77926
77927           enter
77928               .append('div')
77929               .attr('class', 'raw-membership-editor inspector-inner');
77930
77931           enter
77932               .append('input')
77933               .attr('type', 'text')
77934               .attr('class', 'key-trap');
77935
77936
77937           // Update
77938           body = body
77939               .merge(enter);
77940
77941           if (_tagReference) {
77942               body.selectAll('.preset-list-button-wrap')
77943                   .call(_tagReference.button);
77944
77945               body.selectAll('.preset-list-item')
77946                   .call(_tagReference.body);
77947           }
77948
77949           body.selectAll('.preset-reset')
77950               .on('click', function() {
77951                   dispatch$$1.call('choose', this, _activePreset);
77952               });
77953
77954           body.select('.preset-list-item button')
77955               .call(uiPresetIcon()
77956                   .geometry(context.geometry(_entityID))
77957                   .preset(_activePreset)
77958               );
77959
77960           body.select('.preset-list-item .label')
77961               .text(_activePreset.name());
77962
77963           body.select('.preset-editor')
77964               .call(presetEditor
77965                   .preset(_activePreset)
77966                   .entityID(_entityID)
77967                   .tags(tags)
77968                   .state(_state)
77969               );
77970
77971           body.select('.raw-tag-editor')
77972               .call(rawTagEditor
77973                   .preset(_activePreset)
77974                   .entityID(_entityID)
77975                   .tags(tags)
77976                   .state(_state)
77977               );
77978
77979           if (entity.type === 'relation') {
77980               body.select('.raw-member-editor')
77981                   .style('display', 'block')
77982                   .call(uiRawMemberEditor(context)
77983                       .entityID(_entityID)
77984                   );
77985           } else {
77986               body.select('.raw-member-editor')
77987                   .style('display', 'none');
77988           }
77989
77990           body.select('.raw-membership-editor')
77991               .call(uiRawMembershipEditor(context)
77992                   .entityID(_entityID)
77993               );
77994
77995           body.select('.key-trap')
77996               .on('keydown.key-trap', function() {
77997                   // On tabbing, send focus back to the first field on the inspector-body
77998                   // (probably the `name` field) #4159
77999                   if (event.keyCode === 9 && !event.shiftKey) {
78000                       event.preventDefault();
78001                       body.select('input').node().focus();
78002                   }
78003               });
78004
78005           context.history()
78006               .on('change.entity-editor', historyChanged);
78007
78008
78009           function historyChanged() {
78010               if (_state === 'hide') return;
78011
78012               var entity = context.hasEntity(_entityID);
78013               var graph = context.graph();
78014               if (!entity) return;
78015
78016               var match = context.presets().match(entity, graph);
78017               var activePreset = entityEditor.preset();
78018               var weakPreset = activePreset && isEmpty(activePreset.addTags);
78019
78020               // A "weak" preset doesn't set any tags. (e.g. "Address")
78021               // Don't replace a weak preset with a fallback preset (e.g. "Point")
78022               if (!(weakPreset && match.isFallback())) {
78023                   entityEditor.preset(match);
78024               }
78025               entityEditor.modified(_base !== graph);
78026               entityEditor(selection$$1);
78027           }
78028       }
78029
78030
78031       // Tag changes that fire on input can all get coalesced into a single
78032       // history operation when the user leaves the field.  #2342
78033       function changeTags(changed, onInput) {
78034           var entity = context.entity(_entityID);
78035           var annotation = t('operations.change_tags.annotation');
78036           var tags = clone(entity.tags);
78037
78038           for (var k in changed) {
78039               if (!k) continue;
78040               var v = changed[k];
78041               if (v !== undefined || tags.hasOwnProperty(k)) {
78042                   tags[k] = v;
78043               }
78044           }
78045
78046           if (!onInput) {
78047               tags = utilCleanTags(tags);
78048           }
78049
78050           if (!isEqual(entity.tags, tags)) {
78051               if (_coalesceChanges) {
78052                   context.overwrite(actionChangeTags(_entityID, tags), annotation);
78053               } else {
78054                   context.perform(actionChangeTags(_entityID, tags), annotation);
78055                   _coalesceChanges = !!onInput;
78056               }
78057           }
78058       }
78059
78060
78061       entityEditor.modified = function(_) {
78062           if (!arguments.length) return _modified;
78063           _modified = _;
78064           d3_selectAll('button.preset-close use')
78065               .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
78066           return entityEditor;
78067       };
78068
78069
78070       entityEditor.state = function(_) {
78071           if (!arguments.length) return _state;
78072           _state = _;
78073           return entityEditor;
78074       };
78075
78076
78077       entityEditor.entityID = function(_) {
78078           if (!arguments.length) return _entityID;
78079           _entityID = _;
78080           _base = context.graph();
78081           _coalesceChanges = false;
78082
78083           var presetMatch = context.presets().match(context.entity(_entityID), _base);
78084
78085           return entityEditor
78086               .preset(presetMatch)
78087               .modified(false);
78088       };
78089
78090
78091       entityEditor.preset = function(_) {
78092           if (!arguments.length) return _activePreset;
78093           if (_ !== _activePreset) {
78094               _activePreset = _;
78095               _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
78096                   .showing(false);
78097           }
78098           return entityEditor;
78099       };
78100
78101
78102       return utilRebind(entityEditor, dispatch$$1, 'on');
78103   }
78104
78105   var pair_1 = pair$1;
78106
78107   function search(x, dims, r) {
78108     if (!dims) dims = 'NSEW';
78109     if (typeof x !== 'string') return { val: null, regex: r };
78110
78111     r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
78112
78113     var m = r.exec(x);
78114     if (!m) return { val: null, regex: r };
78115
78116     var dim = m[1] || m[5];
78117     if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
78118
78119     return {
78120       val: (((m[2]) ? parseFloat(m[2]) : 0) +
78121             ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
78122             ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
78123             ((dim === 'S' || dim === 'W') ? -1 : 1),
78124       regex: r,
78125       raw: m[0],
78126       dim: dim
78127     };
78128   }
78129
78130   function pair$1(x, dims) {
78131     x = x.trim();
78132     var one = search(x, dims);
78133     if (one.val === null) return null;
78134     var two = search(x, dims, one.regex);
78135     if (two.val === null) return null;
78136     // null if one/two are not contiguous.
78137     if (one.raw + two.raw !== x) return null;
78138     if (one.dim) {
78139       return swapdim(one.val, two.val, one.dim);
78140     } else {
78141       return [one.val, two.val];
78142     }
78143   }
78144
78145   function swapdim(a, b, dim) {
78146     if (dim === 'N' || dim === 'S') return [a, b];
78147     if (dim === 'W' || dim === 'E') return [b, a];
78148   }
78149
78150   function uiFeatureList(context) {
78151       var keybinding = d3keybinding('uiFeatureList');
78152       var _geocodeResults;
78153
78154
78155       function featureList(selection$$1) {
78156           var header = selection$$1
78157               .append('div')
78158               .attr('class', 'header fillL cf');
78159
78160           header
78161               .append('h3')
78162               .text(t('inspector.feature_list'));
78163
78164           var searchWrap = selection$$1
78165               .append('div')
78166               .attr('class', 'search-header');
78167
78168           var search = searchWrap
78169               .append('input')
78170               .attr('placeholder', t('inspector.search'))
78171               .attr('type', 'search')
78172               .call(utilNoAuto)
78173               .on('keypress', keypress)
78174               .on('keydown', keydown)
78175               .on('input', inputevent);
78176
78177           searchWrap
78178               .call(svgIcon('#iD-icon-search', 'pre-text'));
78179
78180           var listWrap = selection$$1
78181               .append('div')
78182               .attr('class', 'inspector-body');
78183
78184           var list = listWrap
78185               .append('div')
78186               .attr('class', 'feature-list cf');
78187
78188           context
78189               .on('exit.feature-list', clearSearch);
78190           context.map()
78191               .on('drawn.feature-list', mapDrawn);
78192
78193           keybinding
78194               .on(uiCmd('⌘F'), focusSearch);
78195
78196           select(document)
78197               .call(keybinding);
78198
78199
78200           function focusSearch() {
78201               var mode = context.mode() && context.mode().id;
78202               if (mode !== 'browse') return;
78203
78204               event.preventDefault();
78205               search.node().focus();
78206           }
78207
78208
78209           function keydown() {
78210               if (event.keyCode === 27) {  // escape
78211                   search.node().blur();
78212               }
78213           }
78214
78215
78216           function keypress() {
78217               var q = search.property('value'),
78218                   items = list.selectAll('.feature-list-item');
78219               if (event.keyCode === 13 && q.length && items.size()) {  // return
78220                   click(items.datum());
78221               }
78222           }
78223
78224
78225           function inputevent() {
78226               _geocodeResults = undefined;
78227               drawList();
78228           }
78229
78230
78231           function clearSearch() {
78232               search.property('value', '');
78233               drawList();
78234           }
78235
78236
78237           function mapDrawn(e) {
78238               if (e.full) {
78239                   drawList();
78240               }
78241           }
78242
78243
78244           function features() {
78245               var entities = {};
78246               var result = [];
78247               var graph = context.graph();
78248               var q = search.property('value').toLowerCase();
78249
78250               if (!q) return result;
78251
78252               var idMatch = q.match(/^([nwr])([0-9]+)$/);
78253
78254               if (idMatch) {
78255                   result.push({
78256                       id: idMatch[0],
78257                       geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
78258                       type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
78259                       name: idMatch[2]
78260                   });
78261               }
78262
78263               var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
78264
78265               if (locationMatch) {
78266                   var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
78267                   result.push({
78268                       id: -1,
78269                       geometry: 'point',
78270                       type: t('inspector.location'),
78271                       name: dmsCoordinatePair([loc[1], loc[0]]),
78272                       location: loc
78273                   });
78274               }
78275
78276               function addEntity(entity) {
78277                   if (entity.id in entities || result.length > 200)
78278                       return;
78279
78280                   entities[entity.id] = true;
78281
78282                   var name = utilDisplayName(entity) || '';
78283                   if (name.toLowerCase().indexOf(q) >= 0) {
78284                       var matched = context.presets().match(entity, graph);
78285                       var type = (matched && matched.name()) || utilDisplayType(entity.id);
78286
78287                       result.push({
78288                           id: entity.id,
78289                           entity: entity,
78290                           geometry: context.geometry(entity.id),
78291                           type: type,
78292                           name: name
78293                       });
78294                   }
78295
78296                   graph.parentRelations(entity).forEach(function(parent) {
78297                       addEntity(parent);
78298                   });
78299               }
78300
78301               var visible = context.surface().selectAll('.point, .line, .area').nodes();
78302               for (var i = 0; i < visible.length && result.length <= 200; i++) {
78303                   var datum = visible[i].__data__;
78304                   var entity = datum && datum.properties && datum.properties.entity;
78305                   if (entity) { addEntity(entity); }
78306               }
78307
78308               (_geocodeResults || []).forEach(function(d) {
78309                   if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
78310
78311                       // Make a temporary osmEntity so we can preset match
78312                       // and better localize the search result - #4725
78313                       var id = osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id);
78314                       var tags = {};
78315                       tags[d.class] = d.type;
78316
78317                       var attrs = { id: id, type: d.osm_type, tags: tags };
78318                       if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
78319                           attrs.nodes = ['a','a'];  // so that geometry area is possible
78320                       }
78321
78322                       var tempEntity = osmEntity$$1(attrs);
78323                       var tempGraph = coreGraph$$1([tempEntity]);
78324                       var matched = context.presets().match(tempEntity, tempGraph);
78325                       var type = (matched && matched.name()) || utilDisplayType(id);
78326
78327                       result.push({
78328                           id: tempEntity.id,
78329                           geometry: tempEntity.geometry(tempGraph),
78330                           type: type,
78331                           name: d.display_name,
78332                           extent: new geoExtent$$1(
78333                               [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
78334                               [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
78335                       });
78336                   }
78337               });
78338
78339               return result;
78340           }
78341
78342
78343           function drawList() {
78344               var value = search.property('value');
78345               var results = features();
78346
78347               list.classed('filtered', value.length);
78348
78349               var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
78350
78351               var resultsIndicator = list.selectAll('.no-results-item')
78352                   .data([0])
78353                   .enter()
78354                   .append('button')
78355                   .property('disabled', true)
78356                   .attr('class', 'no-results-item')
78357                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
78358
78359               resultsIndicator.append('span')
78360                   .attr('class', 'entity-name');
78361
78362               list.selectAll('.no-results-item .entity-name')
78363                   .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
78364
78365               if (services.geocoder) {
78366                 list.selectAll('.geocode-item')
78367                     .data([0])
78368                     .enter()
78369                     .append('button')
78370                     .attr('class', 'geocode-item')
78371                     .on('click', geocoderSearch)
78372                     .append('div')
78373                     .attr('class', 'label')
78374                     .append('span')
78375                     .attr('class', 'entity-name')
78376                     .text(t('geocoder.search'));
78377               }
78378
78379               list.selectAll('.no-results-item')
78380                   .style('display', (value.length && !results.length) ? 'block' : 'none');
78381
78382               list.selectAll('.geocode-item')
78383                   .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
78384
78385               list.selectAll('.feature-list-item')
78386                   .data([-1])
78387                   .remove();
78388
78389               var items = list.selectAll('.feature-list-item')
78390                   .data(results, function(d) { return d.id; });
78391
78392               var enter = items.enter()
78393                   .insert('button', '.geocode-item')
78394                   .attr('class', 'feature-list-item')
78395                   .on('mouseover', mouseover)
78396                   .on('mouseout', mouseout)
78397                   .on('click', click);
78398
78399               var label = enter
78400                   .append('div')
78401                   .attr('class', 'label');
78402
78403               label
78404                   .each(function(d) {
78405                       select(this)
78406                           .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
78407                   });
78408
78409               label
78410                   .append('span')
78411                   .attr('class', 'entity-type')
78412                   .text(function(d) { return d.type; });
78413
78414               label
78415                   .append('span')
78416                   .attr('class', 'entity-name')
78417                   .text(function(d) { return d.name; });
78418
78419               enter
78420                   .style('opacity', 0)
78421                   .transition()
78422                   .style('opacity', 1);
78423
78424               items.order();
78425
78426               items.exit()
78427                   .remove();
78428           }
78429
78430
78431           function mouseover(d) {
78432               if (d.id === -1) return;
78433
78434               context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
78435                   .classed('hover', true);
78436           }
78437
78438
78439           function mouseout() {
78440               context.surface().selectAll('.hover')
78441                   .classed('hover', false);
78442           }
78443
78444
78445           function click(d) {
78446               event.preventDefault();
78447               if (d.location) {
78448                   context.map().centerZoom([d.location[1], d.location[0]], 19);
78449               }
78450               else if (d.entity) {
78451                   if (d.entity.type === 'node') {
78452                       context.map().center(d.entity.loc);
78453                   } else if (d.entity.type === 'way') {
78454                       var center = context.projection(context.map().center());
78455                       var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
78456                       context.map().center(edge.loc);
78457                   }
78458                   context.enter(modeSelect(context, [d.entity.id]));
78459               } else {
78460                   context.zoomToEntity(d.id);
78461               }
78462           }
78463
78464
78465           function geocoderSearch() {
78466               services.geocoder.search(search.property('value'), function (err, resp) {
78467                   _geocodeResults = resp || [];
78468                   drawList();
78469               });
78470           }
78471       }
78472
78473
78474       return featureList;
78475   }
78476
78477   var _flashTimer;
78478
78479
78480   function uiFlash() {
78481       var _duration = 2000;
78482       var _iconName = '#iD-icon-no';
78483       var _iconClass = 'disabled';
78484       var _text = '';
78485       var _textClass;
78486
78487
78488       function flash() {
78489           if (_flashTimer) {
78490               _flashTimer.stop();
78491           }
78492
78493           select('#footer-wrap')
78494               .attr('class', 'footer-hide');
78495           select('#flash-wrap')
78496               .attr('class', 'footer-show');
78497
78498           var content = select('#flash-wrap').selectAll('.flash-content')
78499               .data([0]);
78500
78501           // Enter
78502           var contentEnter = content.enter()
78503               .append('div')
78504               .attr('class', 'flash-content');
78505
78506           var iconEnter = contentEnter
78507               .append('svg')
78508               .attr('class', 'flash-icon')
78509               .append('g')
78510               .attr('transform', 'translate(10,10)');
78511
78512           iconEnter
78513               .append('circle')
78514               .attr('r', 9);
78515
78516           iconEnter
78517               .append('use')
78518               .attr('transform', 'translate(-7,-7)')
78519               .attr('width', '14')
78520               .attr('height', '14');
78521
78522           contentEnter
78523               .append('div')
78524               .attr('class', 'flash-text');
78525
78526
78527           // Update
78528           content = content
78529               .merge(contentEnter);
78530
78531           content
78532               .selectAll('.flash-icon')
78533               .attr('class', 'flash-icon ' + (_iconClass || ''));
78534
78535           content
78536               .selectAll('.flash-icon use')
78537               .attr('xlink:href', _iconName);
78538
78539           content
78540               .selectAll('.flash-text')
78541               .attr('class', 'flash-text ' + (_textClass || ''))
78542               .text(_text);
78543
78544
78545           _flashTimer = timeout$1(function() {
78546               _flashTimer = null;
78547               select('#footer-wrap')
78548                   .attr('class', 'footer-show');
78549               select('#flash-wrap')
78550                   .attr('class', 'footer-hide');
78551           }, _duration);
78552
78553           return content;
78554       }
78555
78556
78557       flash.duration = function(_) {
78558           if (!arguments.length) return _duration;
78559           _duration = _;
78560           return flash;
78561       };
78562
78563       flash.text = function(_) {
78564           if (!arguments.length) return _text;
78565           _text = _;
78566           return flash;
78567       };
78568
78569       flash.textClass = function(_) {
78570           if (!arguments.length) return _textClass;
78571           _textClass = _;
78572           return flash;
78573       };
78574
78575       flash.iconName = function(_) {
78576           if (!arguments.length) return _iconName;
78577           _iconName = _;
78578           return flash;
78579       };
78580
78581       flash.iconClass = function(_) {
78582           if (!arguments.length) return _iconClass;
78583           _iconClass = _;
78584           return flash;
78585       };
78586
78587       return flash;
78588   }
78589
78590   function uiPresetList(context) {
78591       var dispatch$$1 = dispatch('choose'),
78592           id,
78593           currentPreset,
78594           autofocus = false;
78595
78596
78597       function presetList(selection$$1) {
78598           var entity = context.entity(id),
78599               geometry = context.geometry(id);
78600
78601           // Treat entities on addr:interpolation lines as points, not vertices (#3241)
78602           if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
78603               geometry = 'point';
78604           }
78605
78606           var presets = context.presets().matchGeometry(geometry);
78607
78608           selection$$1.html('');
78609
78610           var messagewrap = selection$$1
78611               .append('div')
78612               .attr('class', 'header fillL cf');
78613
78614           var message = messagewrap
78615               .append('h3')
78616               .text(t('inspector.choose'));
78617
78618           if (context.entity(id).isUsed(context.graph())) {
78619               messagewrap
78620                   .append('button')
78621                   .attr('class', 'preset-choose')
78622                   .on('click', function() { dispatch$$1.call('choose', this, currentPreset); })
78623                   .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
78624           } else {
78625               messagewrap
78626                   .append('button')
78627                   .attr('class', 'close')
78628                   .on('click', function() {
78629                       context.enter(modeBrowse(context));
78630                   })
78631                   .call(svgIcon('#iD-icon-close'));
78632           }
78633
78634           function keydown() {
78635               // hack to let delete shortcut work when search is autofocused
78636               if (search.property('value').length === 0 &&
78637                   (event.keyCode === d3keybinding.keyCodes['⌫'] ||
78638                    event.keyCode === d3keybinding.keyCodes['⌦'])) {
78639                   event.preventDefault();
78640                   event.stopPropagation();
78641                   operationDelete([id], context)();
78642               } else if (search.property('value').length === 0 &&
78643                   (event.ctrlKey || event.metaKey) &&
78644                   event.keyCode === d3keybinding.keyCodes.z) {
78645                   event.preventDefault();
78646                   event.stopPropagation();
78647                   context.undo();
78648               } else if (!event.ctrlKey && !event.metaKey) {
78649                   select(this).on('keydown', null);
78650               }
78651           }
78652
78653           function keypress() {
78654               // enter
78655               var value = search.property('value');
78656               if (event.keyCode === 13 && value.length) {
78657                   list.selectAll('.preset-list-item:first-child').datum().choose();
78658               }
78659           }
78660
78661           function inputevent() {
78662               var value = search.property('value');
78663               list.classed('filtered', value.length);
78664               if (value.length) {
78665                   var results = presets.search(value, geometry);
78666                   message.text(t('inspector.results', {
78667                       n: results.collection.length,
78668                       search: value
78669                   }));
78670                   list.call(drawList, results);
78671               } else {
78672                   list.call(drawList, context.presets().defaults(geometry, 36));
78673                   message.text(t('inspector.choose'));
78674               }
78675           }
78676
78677           var searchWrap = selection$$1
78678               .append('div')
78679               .attr('class', 'search-header');
78680
78681           var search = searchWrap
78682               .append('input')
78683               .attr('class', 'preset-search-input')
78684               .attr('placeholder', t('inspector.search'))
78685               .attr('type', 'search')
78686               .call(utilNoAuto)
78687               .on('keydown', keydown)
78688               .on('keypress', keypress)
78689               .on('input', inputevent);
78690
78691           searchWrap
78692               .call(svgIcon('#iD-icon-search', 'pre-text'));
78693
78694           if (autofocus) {
78695               search.node().focus();
78696           }
78697
78698           var listWrap = selection$$1
78699               .append('div')
78700               .attr('class', 'inspector-body');
78701
78702           var list = listWrap
78703               .append('div')
78704               .attr('class', 'preset-list fillL cf')
78705               .call(drawList, context.presets().defaults(geometry, 36));
78706       }
78707
78708
78709       function drawList(list, presets) {
78710           var collection = presets.collection.map(function(preset) {
78711               return preset.members ? CategoryItem(preset) : PresetItem(preset);
78712           });
78713
78714           var items = list.selectAll('.preset-list-item')
78715               .data(collection, function(d) { return d.preset.id; });
78716
78717           items.order();
78718
78719           items.exit()
78720               .remove();
78721
78722           items.enter()
78723               .append('div')
78724               .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
78725               .classed('current', function(item) { return item.preset === currentPreset; })
78726               .each(function(item) { select(this).call(item); })
78727               .style('opacity', 0)
78728               .transition()
78729               .style('opacity', 1);
78730       }
78731
78732
78733       function CategoryItem(preset) {
78734           var box, sublist, shown = false;
78735
78736           function item(selection$$1) {
78737               var wrap = selection$$1.append('div')
78738                   .attr('class', 'preset-list-button-wrap category col12');
78739
78740               var button = wrap
78741                   .append('button')
78742                   .attr('class', 'preset-list-button')
78743                   .classed('expanded', false)
78744                   .call(uiPresetIcon()
78745                       .geometry(context.geometry(id))
78746                       .preset(preset))
78747                   .on('click', function() {
78748                       var isExpanded = select(this).classed('expanded');
78749                       var iconName = isExpanded ?
78750                           (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
78751                       select(this)
78752                           .classed('expanded', !isExpanded);
78753                       select(this).selectAll('div.label svg.icon use')
78754                           .attr('href', iconName);
78755                       item.choose();
78756                   });
78757
78758               var label = button
78759                   .append('div')
78760                   .attr('class', 'label');
78761
78762               label
78763                   .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
78764                   .append('span')
78765                   .html(function() { return preset.name() + '&hellip;'; });
78766
78767               box = selection$$1.append('div')
78768                   .attr('class', 'subgrid col12')
78769                   .style('max-height', '0px')
78770                   .style('opacity', 0);
78771
78772               box.append('div')
78773                   .attr('class', 'arrow');
78774
78775               sublist = box.append('div')
78776                   .attr('class', 'preset-list fillL3 cf fl');
78777           }
78778
78779
78780           item.choose = function() {
78781               if (!box || !sublist) return;
78782
78783               if (shown) {
78784                   shown = false;
78785                   box.transition()
78786                       .duration(200)
78787                       .style('opacity', '0')
78788                       .style('max-height', '0px')
78789                       .style('padding-bottom', '0px');
78790               } else {
78791                   shown = true;
78792                   sublist.call(drawList, preset.members);
78793                   box.transition()
78794                       .duration(200)
78795                       .style('opacity', '1')
78796                       .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
78797                       .style('padding-bottom', '20px');
78798               }
78799           };
78800
78801           item.preset = preset;
78802
78803           return item;
78804       }
78805
78806
78807       function PresetItem(preset) {
78808           function item(selection$$1) {
78809               var wrap = selection$$1.append('div')
78810                   .attr('class', 'preset-list-button-wrap col12');
78811
78812               wrap.append('button')
78813                   .attr('class', 'preset-list-button')
78814                   .call(uiPresetIcon()
78815                       .geometry(context.geometry(id))
78816                       .preset(preset))
78817                   .on('click', item.choose)
78818                   .append('div')
78819                   .attr('class', 'label')
78820                   .text(preset.name());
78821
78822               wrap.call(item.reference.button);
78823               selection$$1.call(item.reference.body);
78824           }
78825
78826           item.choose = function() {
78827               context.presets().choose(preset);
78828
78829               context.perform(
78830                   actionChangePreset(id, currentPreset, preset),
78831                   t('operations.change_tags.annotation')
78832               );
78833
78834               dispatch$$1.call('choose', this, preset);
78835           };
78836
78837           item.help = function() {
78838               event.stopPropagation();
78839               item.reference.toggle();
78840           };
78841
78842           item.preset = preset;
78843           item.reference = uiTagReference(preset.reference(context.geometry(id)), context);
78844
78845           return item;
78846       }
78847
78848
78849       presetList.autofocus = function(_) {
78850           if (!arguments.length) return autofocus;
78851           autofocus = _;
78852           return presetList;
78853       };
78854
78855
78856       presetList.entityID = function(_) {
78857           if (!arguments.length) return id;
78858           id = _;
78859           presetList.preset(context.presets().match(context.entity(id), context.graph()));
78860           return presetList;
78861       };
78862
78863
78864       presetList.preset = function(_) {
78865           if (!arguments.length) return currentPreset;
78866           currentPreset = _;
78867           return presetList;
78868       };
78869
78870
78871       return utilRebind(presetList, dispatch$$1, 'on');
78872   }
78873
78874   function uiViewOnOSM(context) {
78875       var _what;   // an osmEntity or osmNote
78876
78877
78878       function viewOnOSM(selection) {
78879           var url;
78880           if (_what instanceof osmEntity$$1) {
78881               url = context.connection().entityURL(_what);
78882           } else if (_what instanceof osmNote) {
78883               url = context.connection().noteURL(_what);
78884           }
78885
78886           var data = ((!_what || _what.isNew()) ? [] : [_what]);
78887           var link = selection.selectAll('.view-on-osm')
78888               .data(data, function(d) { return d.id; });
78889
78890           // exit
78891           link.exit()
78892               .remove();
78893
78894           // enter
78895           var linkEnter = link.enter()
78896               .append('a')
78897               .attr('class', 'view-on-osm')
78898               .attr('target', '_blank')
78899               .attr('href', url)
78900               .call(svgIcon('#iD-icon-out-link', 'inline'));
78901
78902           linkEnter
78903               .append('span')
78904               .text(t('inspector.view_on_osm'));
78905       }
78906
78907
78908       viewOnOSM.what = function(_) {
78909           if (!arguments.length) return _what;
78910           _what = _;
78911           return viewOnOSM;
78912       };
78913
78914       return viewOnOSM;
78915   }
78916
78917   function uiInspector(context) {
78918       var presetList = uiPresetList(context);
78919       var entityEditor = uiEntityEditor(context);
78920       var _state = 'select';
78921       var _entityID;
78922       var _newFeature = false;
78923
78924
78925       function inspector(selection$$1) {
78926           presetList
78927               .entityID(_entityID)
78928               .autofocus(_newFeature)
78929               .on('choose', setPreset);
78930
78931           entityEditor
78932               .state(_state)
78933               .entityID(_entityID)
78934               .on('choose', showList);
78935
78936           var wrap = selection$$1.selectAll('.panewrap')
78937               .data([0]);
78938
78939           var enter = wrap.enter()
78940               .append('div')
78941               .attr('class', 'panewrap');
78942
78943           enter
78944               .append('div')
78945               .attr('class', 'preset-list-pane pane');
78946
78947           enter
78948               .append('div')
78949               .attr('class', 'entity-editor-pane pane');
78950
78951           wrap = wrap.merge(enter);
78952           var presetPane = wrap.selectAll('.preset-list-pane');
78953           var editorPane = wrap.selectAll('.entity-editor-pane');
78954
78955           var graph = context.graph();
78956           var entity = context.entity(_entityID);
78957
78958           var showEditor = _state === 'hover' ||
78959               entity.isUsed(graph) ||
78960               entity.isHighwayIntersection(graph);
78961
78962           if (showEditor) {
78963               wrap.style('right', '0%');
78964               editorPane.call(entityEditor);
78965           } else {
78966               wrap.style('right', '-100%');
78967               presetPane.call(presetList);
78968           }
78969
78970           var footer = selection$$1.selectAll('.footer')
78971               .data([0]);
78972
78973           footer = footer.enter()
78974               .append('div')
78975               .attr('class', 'footer')
78976               .merge(footer);
78977
78978           footer
78979               .call(uiViewOnOSM(context)
78980                   .what(context.hasEntity(_entityID))
78981               );
78982
78983
78984           function showList(preset) {
78985               wrap.transition()
78986                   .styleTween('right', function() { return interpolate('0%', '-100%'); });
78987
78988               presetPane
78989                   .call(presetList.preset(preset).autofocus(true));
78990           }
78991
78992
78993           function setPreset(preset) {
78994               wrap.transition()
78995                   .styleTween('right', function() { return interpolate('-100%', '0%'); });
78996
78997               editorPane
78998                   .call(entityEditor.preset(preset));
78999           }
79000       }
79001
79002
79003       inspector.state = function(_) {
79004           if (!arguments.length) return _state;
79005           _state = _;
79006           entityEditor.state(_state);
79007
79008           // remove any old field help overlay that might have gotten attached to the inspector
79009           d3_selectAll('.field-help-body').remove();
79010
79011           return inspector;
79012       };
79013
79014
79015       inspector.entityID = function(_) {
79016           if (!arguments.length) return _entityID;
79017           _entityID = _;
79018           return inspector;
79019       };
79020
79021
79022       inspector.newFeature = function(_) {
79023           if (!arguments.length) return _newFeature;
79024           _newFeature = _;
79025           return inspector;
79026       };
79027
79028
79029       return inspector;
79030   }
79031
79032   function uiLasso(context) {
79033       var group, polygon;
79034
79035       lasso.coordinates = [];
79036
79037       function lasso(selection$$1) {
79038           context.container()
79039               .classed('lasso', true);
79040
79041           group = selection$$1
79042               .append('g')
79043               .attr('class', 'lasso hide');
79044
79045           polygon = group
79046               .append('path')
79047               .attr('class', 'lasso-path');
79048
79049           group
79050               .call(uiToggle(true));
79051       }
79052
79053
79054       function draw() {
79055           if (polygon) {
79056               polygon.data([lasso.coordinates])
79057                   .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
79058           }
79059       }
79060
79061
79062       lasso.extent = function () {
79063           return lasso.coordinates.reduce(function(extent, point$$1) {
79064               return extent.extend(geoExtent$$1(point$$1));
79065           }, geoExtent$$1());
79066       };
79067
79068
79069       lasso.p = function(_) {
79070           if (!arguments.length) return lasso;
79071           lasso.coordinates.push(_);
79072           draw();
79073           return lasso;
79074       };
79075
79076
79077       lasso.close = function() {
79078           if (group) {
79079               group.call(uiToggle(false, function() {
79080                   select(this).remove();
79081               }));
79082           }
79083           context.container().classed('lasso', false);
79084       };
79085
79086
79087       return lasso;
79088   }
79089
79090   function uiNoteComments() {
79091       var _note;
79092
79093
79094       function noteComments(selection$$1) {
79095           if (_note.isNew()) return; // don't draw .comments-container
79096
79097           var comments = selection$$1.selectAll('.comments-container')
79098               .data([0]);
79099
79100           comments = comments.enter()
79101               .append('div')
79102               .attr('class', 'comments-container')
79103               .merge(comments);
79104
79105           var commentEnter = comments.selectAll('.comment')
79106               .data(_note.comments)
79107               .enter()
79108               .append('div')
79109               .attr('class', 'comment');
79110
79111           commentEnter
79112               .append('div')
79113               .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
79114               .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
79115
79116           var mainEnter = commentEnter
79117               .append('div')
79118               .attr('class', 'comment-main');
79119
79120           var metadataEnter = mainEnter
79121               .append('div')
79122               .attr('class', 'comment-metadata');
79123
79124           metadataEnter
79125               .append('div')
79126               .attr('class', 'comment-author')
79127               .each(function(d) {
79128                   var selection$$1 = select(this);
79129                   var osm = services.osm;
79130                   if (osm && d.user) {
79131                       selection$$1 = selection$$1
79132                           .append('a')
79133                           .attr('class', 'comment-author-link')
79134                           .attr('href', osm.userURL(d.user))
79135                           .attr('tabindex', -1)
79136                           .attr('target', '_blank');
79137                   }
79138                   selection$$1
79139                       .text(function(d) { return d.user || t('note.anonymous'); });
79140               });
79141
79142           metadataEnter
79143               .append('div')
79144               .attr('class', 'comment-date')
79145               .text(function(d) {
79146                   return t('note.status.' + d.action, { when: localeDateString(d.date) });
79147               });
79148
79149           mainEnter
79150               .append('div')
79151               .attr('class', 'comment-text')
79152               .html(function(d) { return d.html; });
79153
79154           comments
79155               .call(replaceAvatars);
79156       }
79157
79158
79159       function replaceAvatars(selection$$1) {
79160           var osm = services.osm;
79161           if (!osm) return;
79162
79163           var uids = {};  // gather uids in the comment thread
79164           _note.comments.forEach(function(d) {
79165               if (d.uid) uids[d.uid] = true;
79166           });
79167
79168           Object.keys(uids).forEach(function(uid) {
79169               osm.loadUser(uid, function(err, user) {
79170                   if (!user || !user.image_url) return;
79171
79172                   selection$$1.selectAll('.comment-avatar.user-' + uid)
79173                       .html('')
79174                       .append('img')
79175                       .attr('class', 'icon comment-avatar-icon')
79176                       .attr('src', user.image_url)
79177                       .attr('alt', user.display_name);
79178               });
79179           });
79180       }
79181
79182
79183       function localeDateString(s) {
79184           if (!s) return null;
79185           var detected = utilDetect();
79186           var options = { day: 'numeric', month: 'short', year: 'numeric' };
79187           s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
79188           var d = new Date(s);
79189           if (isNaN(d.getTime())) return null;
79190           return d.toLocaleDateString(detected.locale, options);
79191       }
79192
79193
79194       noteComments.note = function(_) {
79195           if (!arguments.length) return _note;
79196           _note = _;
79197           return noteComments;
79198       };
79199
79200
79201       return noteComments;
79202   }
79203
79204   function uiNoteEditor$$1(context) {
79205       var dispatch$$1 = dispatch('change');
79206       var noteComments = uiNoteComments();
79207       var noteHeader = uiNoteHeader();
79208
79209       // var formFields = uiFormFields(context);
79210
79211       var _note;
79212       // var _fieldsArr;
79213
79214
79215       function noteEditor(selection$$1) {
79216           var header = selection$$1.selectAll('.header')
79217               .data([0]);
79218
79219           var headerEnter = header.enter()
79220               .append('div')
79221               .attr('class', 'header fillL');
79222
79223           headerEnter
79224               .append('button')
79225               .attr('class', 'fr note-editor-close')
79226               .on('click', function() {
79227                   context.enter(modeBrowse(context));
79228               })
79229               .call(svgIcon('#iD-icon-close'));
79230
79231           headerEnter
79232               .append('h3')
79233               .text(t('note.title'));
79234
79235
79236           var body = selection$$1.selectAll('.body')
79237               .data([0]);
79238
79239           body = body.enter()
79240               .append('div')
79241               .attr('class', 'body')
79242               .merge(body);
79243
79244           var editor = body.selectAll('.note-editor')
79245               .data([0]);
79246
79247           editor.enter()
79248               .append('div')
79249               .attr('class', 'modal-section note-editor')
79250               .merge(editor)
79251               .call(noteHeader.note(_note))
79252               .call(noteComments.note(_note))
79253               .call(noteSaveSection);
79254
79255
79256           var footer = selection$$1.selectAll('.footer')
79257               .data([0]);
79258
79259           footer.enter()
79260               .append('div')
79261               .attr('class', 'footer')
79262               .merge(footer)
79263               .call(uiViewOnOSM(context).what(_note))
79264               .call(uiNoteReport(context).note(_note));
79265
79266
79267           // rerender the note editor on any auth change
79268           var osm = services.osm;
79269           if (osm) {
79270               osm.on('change.note-save', function() {
79271                   selection$$1.call(noteEditor);
79272               });
79273           }
79274       }
79275
79276
79277       function noteSaveSection(selection$$1) {
79278           var isSelected = (_note && _note.id === context.selectedNoteID());
79279           var noteSave = selection$$1.selectAll('.note-save')
79280               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
79281
79282           // exit
79283           noteSave.exit()
79284               .remove();
79285
79286           // enter
79287           var noteSaveEnter = noteSave.enter()
79288               .append('div')
79289               .attr('class', 'note-save save-section cf');
79290
79291           // // if new note, show categories to pick from
79292           // if (_note.isNew()) {
79293           //     var presets = context.presets();
79294
79295           //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
79296           //     _fieldsArr = [
79297           //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
79298           //     ];
79299
79300           //     _fieldsArr.forEach(function(field) {
79301           //         field
79302           //             .on('change', changeCategory);
79303           //     });
79304
79305           //     noteSaveEnter
79306           //         .append('div')
79307           //         .attr('class', 'note-category')
79308           //         .call(formFields.fieldsArr(_fieldsArr));
79309           // }
79310
79311           // function changeCategory() {
79312           //     // NOTE: perhaps there is a better way to get value
79313           //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
79314
79315           //     // store the unsaved category with the note itself
79316           //     _note = _note.update({ newCategory: val });
79317           //     var osm = services.osm;
79318           //     if (osm) {
79319           //         osm.replaceNote(_note);  // update note cache
79320           //     }
79321           //     noteSave
79322           //         .call(noteSaveButtons);
79323           // }
79324
79325           noteSaveEnter
79326               .append('h4')
79327               .attr('class', '.note-save-header')
79328               .text(function() {
79329                   return _note.isNew() ? t('note.newDescription') : t('note.newComment');
79330               });
79331
79332           noteSaveEnter
79333               .append('textarea')
79334               .attr('id', 'new-comment-input')
79335               .attr('placeholder', t('note.inputPlaceholder'))
79336               .attr('maxlength', 1000)
79337               .property('value', function(d) { return d.newComment; })
79338               .call(utilNoAuto)
79339               .on('keydown.note-input', keydown)
79340               .on('input.note-input', changeInput)
79341               .on('blur.note-input', changeInput);
79342
79343           // update
79344           noteSave = noteSaveEnter
79345               .merge(noteSave)
79346               .call(userDetails)
79347               .call(noteSaveButtons);
79348
79349
79350           // fast submit if user presses cmd+enter
79351           function keydown() {
79352               if (!(event.keyCode === 13 && event.metaKey)) return;
79353
79354               var osm = services.osm;
79355               if (!osm) return;
79356
79357               var hasAuth = osm.authenticated();
79358               if (!hasAuth) return;
79359
79360               if (!_note.newComment) return;
79361
79362               event.preventDefault();
79363
79364               select(this)
79365                   .on('keydown.note-input', null);
79366
79367               // focus on button and submit
79368               window.setTimeout(function() {
79369                   if (_note.isNew()) {
79370                       noteSave.selectAll('.save-button').node().focus();
79371                       clickSave(_note);
79372                   } else  {
79373                       noteSave.selectAll('.comment-button').node().focus();
79374                       clickComment(_note);
79375                   }
79376               }, 10);
79377           }
79378
79379
79380           function changeInput() {
79381               var input = select(this);
79382               var val = input.property('value').trim() || undefined;
79383
79384               // store the unsaved comment with the note itself
79385               _note = _note.update({ newComment: val });
79386
79387               var osm = services.osm;
79388               if (osm) {
79389                   osm.replaceNote(_note);  // update note cache
79390               }
79391
79392               noteSave
79393                   .call(noteSaveButtons);
79394           }
79395       }
79396
79397
79398       function userDetails(selection$$1) {
79399           var detailSection = selection$$1.selectAll('.detail-section')
79400               .data([0]);
79401
79402           detailSection = detailSection.enter()
79403               .append('div')
79404               .attr('class', 'detail-section')
79405               .merge(detailSection);
79406
79407           var osm = services.osm;
79408           if (!osm) return;
79409
79410           // Add warning if user is not logged in
79411           var hasAuth = osm.authenticated();
79412           var authWarning = detailSection.selectAll('.auth-warning')
79413               .data(hasAuth ? [] : [0]);
79414
79415           authWarning.exit()
79416               .transition()
79417               .duration(200)
79418               .style('opacity', 0)
79419               .remove();
79420
79421           var authEnter = authWarning.enter()
79422               .insert('div', '.tag-reference-body')
79423               .attr('class', 'field-warning auth-warning')
79424               .style('opacity', 0);
79425
79426           authEnter
79427               .call(svgIcon('#iD-icon-alert', 'inline'));
79428
79429           authEnter
79430               .append('span')
79431               .text(t('note.login'));
79432
79433           authEnter
79434               .append('a')
79435               .attr('target', '_blank')
79436               .call(svgIcon('#iD-icon-out-link', 'inline'))
79437               .append('span')
79438               .text(t('login'))
79439               .on('click.note-login', function() {
79440                   event.preventDefault();
79441                   osm.authenticate();
79442               });
79443
79444           authEnter
79445               .transition()
79446               .duration(200)
79447               .style('opacity', 1);
79448
79449
79450           var prose = detailSection.selectAll('.note-save-prose')
79451               .data(hasAuth ? [0] : []);
79452
79453           prose.exit()
79454               .remove();
79455
79456           prose = prose.enter()
79457               .append('p')
79458               .attr('class', 'note-save-prose')
79459               .text(t('note.upload_explanation'))
79460               .merge(prose);
79461
79462           osm.userDetails(function(err, user) {
79463               if (err) return;
79464
79465               var userLink = select(document.createElement('div'));
79466
79467               if (user.image_url) {
79468                   userLink
79469                       .append('img')
79470                       .attr('src', user.image_url)
79471                       .attr('class', 'icon pre-text user-icon');
79472               }
79473
79474               userLink
79475                   .append('a')
79476                   .attr('class', 'user-info')
79477                   .text(user.display_name)
79478                   .attr('href', osm.userURL(user.display_name))
79479                   .attr('tabindex', -1)
79480                   .attr('target', '_blank');
79481
79482               prose
79483                   .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
79484           });
79485       }
79486
79487
79488       function noteSaveButtons(selection$$1) {
79489           var osm = services.osm;
79490           var hasAuth = osm && osm.authenticated();
79491
79492           var isSelected = (_note && _note.id === context.selectedNoteID());
79493           var buttonSection = selection$$1.selectAll('.buttons')
79494               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
79495
79496           // exit
79497           buttonSection.exit()
79498               .remove();
79499
79500           // enter
79501           var buttonEnter = buttonSection.enter()
79502               .append('div')
79503               .attr('class', 'buttons');
79504
79505           if (_note.isNew()) {
79506               buttonEnter
79507                   .append('button')
79508                   .attr('class', 'button cancel-button secondary-action')
79509                   .text(t('confirm.cancel'));
79510
79511               buttonEnter
79512                   .append('button')
79513                   .attr('class', 'button save-button action')
79514                   .text(t('note.save'));
79515
79516           } else {
79517               buttonEnter
79518                   .append('button')
79519                   .attr('class', 'button status-button action');
79520
79521               buttonEnter
79522                   .append('button')
79523                   .attr('class', 'button comment-button action')
79524                   .text(t('note.comment'));
79525           }
79526
79527
79528           // update
79529           buttonSection = buttonSection
79530               .merge(buttonEnter);
79531
79532           buttonSection.select('.cancel-button')   // select and propagate data
79533               .on('click.cancel', clickCancel);
79534
79535           buttonSection.select('.save-button')     // select and propagate data
79536               .attr('disabled', isSaveDisabled)
79537               .on('click.save', clickSave);
79538
79539           buttonSection.select('.status-button')   // select and propagate data
79540               .attr('disabled', (hasAuth ? null : true))
79541               .text(function(d) {
79542                   var action = (d.status === 'open' ? 'close' : 'open');
79543                   var andComment = (d.newComment ? '_comment' : '');
79544                   return t('note.' + action + andComment);
79545               })
79546               .on('click.status', clickStatus);
79547
79548           buttonSection.select('.comment-button')   // select and propagate data
79549               .attr('disabled', isSaveDisabled)
79550               .on('click.comment', clickComment);
79551
79552
79553           function isSaveDisabled(d) {
79554               return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
79555           }
79556       }
79557
79558
79559
79560       function clickCancel(d) {
79561           this.blur();    // avoid keeping focus on the button - #4641
79562           var osm = services.osm;
79563           if (osm) {
79564               osm.removeNote(d);
79565           }
79566           context.enter(modeBrowse(context));
79567           dispatch$$1.call('change');
79568       }
79569
79570
79571       function clickSave(d) {
79572           this.blur();    // avoid keeping focus on the button - #4641
79573           var osm = services.osm;
79574           if (osm) {
79575               osm.postNoteCreate(d, function(err, note) {
79576                   dispatch$$1.call('change', note);
79577               });
79578           }
79579       }
79580
79581
79582       function clickStatus(d) {
79583           this.blur();    // avoid keeping focus on the button - #4641
79584           var osm = services.osm;
79585           if (osm) {
79586               var setStatus = (d.status === 'open' ? 'closed' : 'open');
79587               osm.postNoteUpdate(d, setStatus, function(err, note) {
79588                   dispatch$$1.call('change', note);
79589               });
79590           }
79591       }
79592
79593       function clickComment(d) {
79594           this.blur();    // avoid keeping focus on the button - #4641
79595           var osm = services.osm;
79596           if (osm) {
79597               osm.postNoteUpdate(d, d.status, function(err, note) {
79598                   dispatch$$1.call('change', note);
79599               });
79600           }
79601       }
79602
79603
79604       noteEditor.note = function(_) {
79605           if (!arguments.length) return _note;
79606           _note = _;
79607           return noteEditor;
79608       };
79609
79610
79611       return utilRebind(noteEditor, dispatch$$1, 'on');
79612   }
79613
79614   function uiNoteHeader() {
79615       var _note;
79616
79617
79618       function noteHeader(selection) {
79619           var header = selection.selectAll('.note-header')
79620               .data(
79621                   (_note ? [_note] : []),
79622                   function(d) { return d.status + d.id; }
79623               );
79624
79625           header.exit()
79626               .remove();
79627
79628           var headerEnter = header.enter()
79629               .append('div')
79630               .attr('class', 'note-header');
79631
79632           var iconEnter = headerEnter
79633               .append('div')
79634               .attr('class', function(d) { return 'note-header-icon ' + d.status; })
79635               .classed('new', function(d) { return d.id < 0; });
79636
79637           iconEnter
79638               .append('div')
79639               .attr('class', 'preset-icon-28')
79640               .call(svgIcon('#iD-icon-note', 'note-fill'));
79641
79642           iconEnter.each(function(d) {
79643               var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
79644               iconEnter
79645                   .append('div')
79646                   .attr('class', 'note-icon-annotation')
79647                   .call(svgIcon(statusIcon, 'note-annotation'));
79648           });
79649
79650           headerEnter
79651               .append('div')
79652               .attr('class', 'note-header-label')
79653               .text(function(d) {
79654                   if (_note.isNew()) { return t('note.new'); }
79655                   return t('note.note') + ' ' + d.id + ' ' +
79656                       (d.status === 'closed' ? t('note.closed') : '');
79657               });
79658       }
79659
79660
79661       noteHeader.note = function(_) {
79662           if (!arguments.length) return _note;
79663           _note = _;
79664           return noteHeader;
79665       };
79666
79667
79668       return noteHeader;
79669   }
79670
79671   function uiNoteReport() {
79672       var _note;
79673       var url = 'https://www.openstreetmap.org/reports/new?reportable_id=';
79674
79675       function noteReport(selection) {
79676
79677           if (!(_note instanceof osmNote)) return;
79678
79679           url += _note.id + '&reportable_type=Note';
79680
79681           var data = ((!_note || _note.isNew()) ? [] : [_note]);
79682           var link = selection.selectAll('.note-report')
79683               .data(data, function(d) { return d.id; });
79684
79685           // exit
79686           link.exit()
79687               .remove();
79688
79689           // enter
79690           var linkEnter = link.enter()
79691               .append('a')
79692               .attr('class', 'note-report')
79693               .attr('target', '_blank')
79694               .attr('href', url)
79695               .call(svgIcon('#iD-icon-out-link', 'inline'));
79696
79697           linkEnter
79698               .append('span')
79699               .text(t('note.report'));
79700       }
79701
79702
79703       noteReport.note = function(_) {
79704           if (!arguments.length) return _note;
79705           _note = _;
79706           return noteReport;
79707       };
79708
79709       return noteReport;
79710   }
79711
79712   function uiRadialMenu(context, operations) {
79713       var menu;
79714       var center = [0, 0];
79715       var tooltip;
79716
79717
79718       var radialMenu = function(selection$$1) {
79719           if (!operations.length) return;
79720
79721           selection$$1.node().parentNode.focus();
79722
79723           function click(operation) {
79724               event.stopPropagation();
79725               if (operation.disabled()) return;
79726               operation();
79727               radialMenu.close();
79728           }
79729
79730           menu = selection$$1
79731               .append('g')
79732               .attr('class', 'radial-menu')
79733               .attr('transform', 'translate(' + center + ')')
79734               .attr('opacity', 0);
79735
79736           menu
79737               .transition()
79738               .attr('opacity', 1);
79739
79740           var r = 50;
79741           var a = Math.PI / 4;
79742           var a0 = -Math.PI / 4;
79743           var a1 = a0 + (operations.length - 1) * a;
79744
79745           menu
79746               .append('path')
79747               .attr('class', 'radial-menu-background')
79748               .attr('d', 'M' + r * Math.sin(a0) + ',' +
79749                                r * Math.cos(a0) +
79750                         ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
79751                                (r * Math.sin(a1) + 1e-3) + ',' +
79752                                (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
79753               .attr('stroke-width', 50)
79754               .attr('stroke-linecap', 'round');
79755
79756           var button = menu.selectAll()
79757               .data(operations)
79758               .enter()
79759               .append('g')
79760               .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
79761               .classed('disabled', function(d) { return d.disabled(); })
79762               .attr('transform', function(d, i) {
79763                   return 'translate(' + geoVecFloor([
79764                           r * Math.sin(a0 + i * a),
79765                           r * Math.cos(a0 + i * a)]).join(',') + ')';
79766               });
79767
79768           button
79769               .append('circle')
79770               .attr('r', 15)
79771               .on('click', click)
79772               .on('mousedown', mousedown)
79773               .on('mouseover', mouseover)
79774               .on('mouseout', mouseout);
79775
79776           button
79777               .append('use')
79778               .attr('transform', 'translate(-10,-10)')
79779               .attr('width', '20')
79780               .attr('height', '20')
79781               .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
79782
79783           tooltip = select(document.body)
79784               .append('div')
79785               .attr('class', 'tooltip-inner radial-menu-tooltip');
79786
79787           function mousedown() {
79788               event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
79789           }
79790
79791           function mouseover(d, i) {
79792               var rect = context.surfaceRect();
79793               var angle = a0 + i * a;
79794               var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
79795               var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
79796               var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
79797               var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
79798
79799               tooltip
79800                   .style('top', null)
79801                   .style('left', null)
79802                   .style('bottom', null)
79803                   .style('right', null)
79804                   .style('display', 'block')
79805                   .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
79806
79807               if (i === 0) {
79808                   tooltip
79809                       .style('right', right)
79810                       .style('top', top);
79811               } else if (i >= 4) {
79812                   tooltip
79813                       .style('left', left)
79814                       .style('bottom', bottom);
79815               } else {
79816                   tooltip
79817                       .style('left', left)
79818                       .style('top', top);
79819               }
79820           }
79821
79822           function mouseout() {
79823               tooltip.style('display', 'none');
79824           }
79825       };
79826
79827
79828       radialMenu.close = function() {
79829           if (menu) {
79830               menu
79831                   .style('pointer-events', 'none')
79832                   .transition()
79833                   .attr('opacity', 0)
79834                   .remove();
79835           }
79836
79837           if (tooltip) {
79838               tooltip.remove();
79839           }
79840       };
79841
79842
79843       radialMenu.center = function(_) {
79844           if (!arguments.length) return center;
79845           center = _;
79846           return radialMenu;
79847       };
79848
79849
79850       return radialMenu;
79851   }
79852
79853   function uiSelectionList(context, selectedIDs) {
79854
79855       function selectEntity(entity) {
79856           context.enter(modeSelect(context, [entity.id]));
79857       }
79858
79859
79860       function deselectEntity(entity) {
79861           event.stopPropagation();
79862           var index = selectedIDs.indexOf(entity.id);
79863           if (index > -1) {
79864               selectedIDs.splice(index, 1);
79865           }
79866           context.enter(modeSelect(context, selectedIDs));
79867       }
79868
79869
79870       function selectionList(selection$$1) {
79871           selection$$1.classed('selection-list-pane', true);
79872
79873           var header = selection$$1
79874               .append('div')
79875               .attr('class', 'header fillL cf');
79876
79877           header
79878               .append('h3')
79879               .text(t('inspector.multiselect'));
79880
79881           var listWrap = selection$$1
79882               .append('div')
79883               .attr('class', 'inspector-body');
79884
79885           var list = listWrap
79886               .append('div')
79887               .attr('class', 'feature-list cf');
79888
79889           context.history().on('change.selection-list', drawList);
79890           drawList();
79891
79892
79893           function drawList() {
79894               var entities = selectedIDs
79895                   .map(function(id) { return context.hasEntity(id); })
79896                   .filter(function(entity) { return entity; });
79897
79898               var items = list.selectAll('.feature-list-item')
79899                   .data(entities, osmEntity$$1.key);
79900
79901               items.exit()
79902                   .remove();
79903
79904               // Enter
79905               var enter = items.enter()
79906                   .append('div')
79907                   .attr('class', 'feature-list-item')
79908                   .on('click', selectEntity);
79909
79910               var label = enter
79911                   .append('button')
79912                   .attr('class', 'label');
79913
79914               enter
79915                   .append('button')
79916                   .attr('class', 'close')
79917                   .on('click', deselectEntity)
79918                   .call(svgIcon('#iD-icon-close'));
79919
79920               label
79921                   .append('span')
79922                   .attr('class', 'entity-geom-icon')
79923                   .call(svgIcon('', 'pre-text'));
79924
79925               label
79926                   .append('span')
79927                   .attr('class', 'entity-type');
79928
79929               label
79930                   .append('span')
79931                   .attr('class', 'entity-name');
79932
79933               // Update
79934               items = items.merge(enter);
79935
79936               items.selectAll('.entity-geom-icon use')
79937                   .attr('href', function() {
79938                       var entity = this.parentNode.parentNode.__data__;
79939                       return '#iD-icon-' + context.geometry(entity.id);
79940                   });
79941
79942               items.selectAll('.entity-type')
79943                   .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
79944
79945               items.selectAll('.entity-name')
79946                   .text(function(entity) { return utilDisplayName(entity); });
79947           }
79948       }
79949
79950       return selectionList;
79951   }
79952
79953   function uiSourceSwitch(context) {
79954       var keys;
79955
79956
79957       function click() {
79958           event.preventDefault();
79959
79960           var osm = context.connection();
79961           if (!osm) return;
79962
79963           if (context.inIntro()) return;
79964
79965           if (context.history().hasChanges() &&
79966               !window.confirm(t('source_switch.lose_changes'))) return;
79967
79968           var isLive = select(this)
79969               .classed('live');
79970
79971           isLive = !isLive;
79972           context.enter(modeBrowse(context));
79973           context.history().clearSaved();          // remove saved history
79974           context.flush();                         // remove stored data
79975
79976           select(this)
79977               .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
79978               .classed('live', isLive);
79979
79980           osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
79981       }
79982
79983       var sourceSwitch = function(selection$$1) {
79984           selection$$1
79985               .append('a')
79986               .attr('href', '#')
79987               .text(t('source_switch.live'))
79988               .classed('live', true)
79989               .attr('tabindex', -1)
79990               .on('click', click);
79991       };
79992
79993
79994       sourceSwitch.keys = function(_) {
79995           if (!arguments.length) return keys;
79996           keys = _;
79997           return sourceSwitch;
79998       };
79999
80000
80001       return sourceSwitch;
80002   }
80003
80004   function uiSuccess$$1(context) {
80005       var MAXEVENTS = 2;
80006
80007       // All else being equal, rank more "social" communities higher
80008       // (anything not in this list receives no adjustment)
80009       var COMMUNITYRANK = {
80010           'meetup': +5,
80011           'slack': +4,
80012           'facebook': +3,
80013           'reddit': +2,
80014           'forum': -2,
80015           'mailinglist': -3,
80016           'irc': -4
80017       };
80018
80019       var detected = utilDetect();
80020       var dispatch$$1 = dispatch('cancel');
80021       var _changeset;
80022       var _location;
80023
80024
80025       // string-to-date parsing in JavaScript is weird
80026       function parseEventDate(when) {
80027           if (!when) return;
80028
80029           var raw = when.trim();
80030           if (!raw) return;
80031
80032           if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
80033               raw += 'Z';           // this forces date to be parsed as a UTC date
80034           }
80035
80036           var parsed = new Date(raw);
80037           return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
80038       }
80039
80040
80041       function success(selection$$1) {
80042           var header = selection$$1
80043               .append('div')
80044               .attr('class', 'header fillL');
80045
80046           header
80047               .append('button')
80048               .attr('class', 'fr')
80049               .on('click', function() { dispatch$$1.call('cancel'); })
80050               .call(svgIcon('#iD-icon-close'));
80051
80052           header
80053               .append('h3')
80054               .text(t('success.just_edited'));
80055
80056           var body = selection$$1
80057               .append('div')
80058               .attr('class', 'body save-success fillL');
80059
80060           var summary = body
80061               .append('div')
80062               .attr('class', 'save-summary');
80063
80064           summary
80065               .append('h3')
80066               .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
80067
80068           summary
80069               .append('p')
80070               .text(t('success.help_html'))
80071               .append('a')
80072               .attr('class', 'link-out')
80073               .attr('target', '_blank')
80074               .attr('tabindex', -1)
80075               .attr('href', t('success.help_link_url'))
80076               .call(svgIcon('#iD-icon-out-link', 'inline'))
80077               .append('span')
80078               .text(t('success.help_link_text'));
80079
80080           var osm = context.connection();
80081           if (!osm) return;
80082
80083           var changesetURL = osm.changesetURL(_changeset.id);
80084
80085           var table = summary
80086               .append('table')
80087               .attr('class', 'summary-table');
80088
80089           var row = table
80090               .append('tr')
80091               .attr('class', 'summary-row');
80092
80093           row
80094               .append('td')
80095               .attr('class', 'cell-icon summary-icon')
80096               .append('a')
80097               .attr('target', '_blank')
80098               .attr('href', changesetURL)
80099               .append('svg')
80100               .attr('class', 'logo-small')
80101               .append('use')
80102               .attr('xlink:href', '#iD-logo-osm');
80103
80104           var summaryDetail = row
80105               .append('td')
80106               .attr('class', 'cell-detail summary-detail');
80107
80108           summaryDetail
80109               .append('a')
80110               .attr('class', 'cell-detail summary-view-on-osm')
80111               .attr('target', '_blank')
80112               .attr('href', changesetURL)
80113               .text(t('success.view_on_osm'));
80114
80115           summaryDetail
80116               .append('div')
80117               .text(t('success.changeset_id', { changeset_id: _changeset.id }));
80118
80119
80120           // Gather community polygon IDs intersecting the map..
80121           var matchFeatures = data.community.query(context.map().center(), true) || [];
80122           var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
80123
80124           // Gather community resources that are either global or match a polygon.
80125           var matchResources = filter(data.community.resources, function(v) {
80126               return !v.featureId || matchIDs.indexOf(v.featureId) !== -1;
80127           });
80128
80129           if (matchResources.length) {
80130               // sort by size ascending, then by community rank
80131               matchResources.sort(function(a, b) {
80132                   var aSize = Infinity;
80133                   var bSize = Infinity;
80134                   var aRank = COMMUNITYRANK[a.type] || 0;
80135                   var bRank = COMMUNITYRANK[b.type] || 0;
80136
80137                   if (a.featureId) {
80138                       aSize = data.community.features[a.featureId].properties.area;
80139                   }
80140                   if (b.featureId) {
80141                       bSize = data.community.features[b.featureId].properties.area;
80142                   }
80143
80144                   return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
80145               });
80146
80147               body
80148                   .call(showCommunityLinks, matchResources);
80149           }
80150       }
80151
80152
80153       function showCommunityLinks(selection$$1, matchResources) {
80154           var communityLinks = selection$$1
80155               .append('div')
80156               .attr('class', 'save-communityLinks');
80157
80158           communityLinks
80159               .append('h3')
80160               .text(t('success.like_osm'));
80161
80162           var table = communityLinks
80163               .append('table')
80164               .attr('class', 'community-table');
80165
80166           var row = table.selectAll('.community-row')
80167               .data(matchResources);
80168
80169           var rowEnter = row.enter()
80170               .append('tr')
80171               .attr('class', 'community-row');
80172
80173           rowEnter
80174               .append('td')
80175               .attr('class', 'cell-icon community-icon')
80176               .append('a')
80177               .attr('target', '_blank')
80178               .attr('href', function(d) { return d.url; })
80179               .append('svg')
80180               .attr('class', 'logo-small')
80181               .append('use')
80182               .attr('xlink:href', function(d) { return '#community-' + d.type; });
80183
80184           var communityDetail = rowEnter
80185               .append('td')
80186               .attr('class', 'cell-detail community-detail');
80187
80188           communityDetail
80189               .each(showCommunityDetails);
80190
80191           communityLinks
80192               .append('div')
80193               .attr('class', 'community-missing')
80194               .text(t('success.missing'))
80195               .append('a')
80196               .attr('class', 'link-out')
80197               .attr('target', '_blank')
80198               .attr('tabindex', -1)
80199               .call(svgIcon('#iD-icon-out-link', 'inline'))
80200               .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
80201               .append('span')
80202               .text(t('success.tell_us'));
80203       }
80204
80205
80206       function showCommunityDetails(d) {
80207           var selection$$1 = select(this);
80208           var communityID = d.id;
80209           var replacements = {
80210               url: linkify(d.url),
80211               signupUrl: linkify(d.signupUrl || d.url)
80212           };
80213
80214           selection$$1
80215               .append('div')
80216               .attr('class', 'community-name')
80217               .append('a')
80218               .attr('target', '_blank')
80219               .attr('href', d.url)
80220               .text(t('community.' + d.id + '.name'));
80221
80222           var descriptionHTML = t('community.' + d.id + '.description', replacements);
80223
80224           if (d.type === 'reddit') {   // linkify subreddits  #4997
80225               descriptionHTML = descriptionHTML
80226                   .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
80227           }
80228
80229           selection$$1
80230               .append('div')
80231               .attr('class', 'community-description')
80232               .html(descriptionHTML);
80233
80234           if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
80235               selection$$1
80236                   .append('div')
80237                   .call(uiDisclosure(context, 'community-more-' + d.id, false)
80238                       .expanded(false)
80239                       .updatePreference(false)
80240                       .title(t('success.more'))
80241                       .content(showMore)
80242                   );
80243           }
80244
80245           var nextEvents = (d.events || [])
80246               .map(function(event$$1) {
80247                   event$$1.date = parseEventDate(event$$1.when);
80248                   return event$$1;
80249               })
80250               .filter(function(event$$1) {               // date is valid and future (or today)
80251                   var t$$1 = event$$1.date.getTime();
80252                   var now = (new Date()).setHours(0,0,0,0);
80253                   return !isNaN(t$$1) && t$$1 >= now;
80254               })
80255               .sort(function(a, b) {                  // sort by date ascending
80256                   return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
80257               })
80258               .slice(0, MAXEVENTS);                   // limit number of events shown
80259
80260           if (nextEvents.length) {
80261               selection$$1
80262                   .append('div')
80263                   .call(uiDisclosure(context, 'community-events-' + d.id, false)
80264                       .expanded(false)
80265                       .updatePreference(false)
80266                       .title(t('success.events'))
80267                       .content(showNextEvents)
80268                   )
80269                   .select('.hide-toggle')
80270                   .append('span')
80271                   .attr('class', 'badge-text')
80272                   .text(nextEvents.length);
80273           }
80274
80275
80276           function showMore(selection$$1) {
80277               var more = selection$$1
80278                   .append('div')
80279                   .attr('class', 'community-more');
80280
80281               if (d.extendedDescription) {
80282                   more
80283                       .append('div')
80284                       .attr('class', 'community-extended-description')
80285                       .html(t('community.' + d.id + '.extendedDescription', replacements));
80286               }
80287
80288               if (d.languageCodes && d.languageCodes.length) {
80289                   more
80290                       .append('div')
80291                       .attr('class', 'community-languages')
80292                       .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
80293               }
80294           }
80295
80296
80297           function showNextEvents(selection$$1) {
80298               var events = selection$$1
80299                   .append('div')
80300                   .attr('class', 'community-events');
80301
80302               var item = events.selectAll('.community-event')
80303                   .data(nextEvents);
80304
80305               var itemEnter = item.enter()
80306                   .append('div')
80307                   .attr('class', 'community-event');
80308
80309               itemEnter
80310                   .append('div')
80311                   .attr('class', 'community-event-name')
80312                   .append('a')
80313                   .attr('target', '_blank')
80314                   .attr('href', function(d) { return d.url; })
80315                   .text(function(d) {
80316                       var name = d.name;
80317                       if (d.i18n && d.id) {
80318                           name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
80319                       }
80320                       return name;
80321                   });
80322
80323               itemEnter
80324                   .append('div')
80325                   .attr('class', 'community-event-when')
80326                   .text(function(d) {
80327                       var options = {
80328                           weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
80329                       };
80330                       if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
80331                           options.hour = 'numeric';
80332                           options.minute = 'numeric';
80333                       }
80334                       return d.date.toLocaleString(detected.locale, options);
80335                   });
80336
80337               itemEnter
80338                   .append('div')
80339                   .attr('class', 'community-event-where')
80340                   .text(function(d) {
80341                       var where = d.where;
80342                       if (d.i18n && d.id) {
80343                           where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
80344                       }
80345                       return where;
80346                   });
80347
80348               itemEnter
80349                   .append('div')
80350                   .attr('class', 'community-event-description')
80351                   .text(function(d) {
80352                       var description = d.description;
80353                       if (d.i18n && d.id) {
80354                           description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
80355                       }
80356                       return description;
80357                   });
80358           }
80359
80360
80361           function linkify(url, text) {
80362               text = text || url;
80363               return '<a target="_blank" href="' + url + '">' + text + '</a>';
80364           }
80365       }
80366
80367
80368       success.changeset = function(_) {
80369           if (!arguments.length) return _changeset;
80370           _changeset = _;
80371           return success;
80372       };
80373
80374
80375       success.location = function(_) {
80376           if (!arguments.length) return _location;
80377           _location = _;
80378           return success;
80379       };
80380
80381
80382       return utilRebind(success, dispatch$$1, 'on');
80383   }
80384
80385   function coreHistory(context) {
80386       var imageryUsed = ['Bing'];
80387       var dispatch$$1 = dispatch('change', 'undone', 'redone');
80388       var lock = utilSessionMutex('lock');
80389       var duration = 150;
80390       var _checkpoints = {};
80391       var _stack;
80392       var _index;
80393       var _tree;
80394
80395
80396       // internal _act, accepts list of actions and eased time
80397       function _act(actions, t) {
80398           actions = Array.prototype.slice.call(actions);
80399
80400           var annotation;
80401           if (!isFunction(actions[actions.length - 1])) {
80402               annotation = actions.pop();
80403           }
80404
80405           _stack[_index].transform = context.projection.transform();
80406           _stack[_index].selectedIDs = context.selectedIDs();
80407
80408           var graph = _stack[_index].graph;
80409           for (var i = 0; i < actions.length; i++) {
80410               graph = actions[i](graph, t);
80411           }
80412
80413           return {
80414               graph: graph,
80415               annotation: annotation,
80416               imageryUsed: imageryUsed
80417           };
80418       }
80419
80420
80421       // internal _perform with eased time
80422       function _perform(args, t) {
80423           var previous = _stack[_index].graph;
80424           _stack = _stack.slice(0, _index + 1);
80425           _stack.push(_act(args, t));
80426           _index++;
80427           return change(previous);
80428       }
80429
80430
80431       // internal _replace with eased time
80432       function _replace(args, t) {
80433           var previous = _stack[_index].graph;
80434           // assert(_index == _stack.length - 1)
80435           _stack[_index] = _act(args, t);
80436           return change(previous);
80437       }
80438
80439
80440       // internal _overwrite with eased time
80441       function _overwrite(args, t) {
80442           var previous = _stack[_index].graph;
80443           if (_index > 0) {
80444               _index--;
80445               _stack.pop();
80446           }
80447           _stack = _stack.slice(0, _index + 1);
80448           _stack.push(_act(args, t));
80449           _index++;
80450           return change(previous);
80451       }
80452
80453
80454       // determine diffrence and dispatch a change event
80455       function change(previous) {
80456           var difference$$1 = coreDifference(previous, history.graph());
80457           dispatch$$1.call('change', this, difference$$1);
80458           return difference$$1;
80459       }
80460
80461
80462       // iD uses namespaced keys so multiple installations do not conflict
80463       function getKey(n) {
80464           return 'iD_' + window.location.origin + '_' + n;
80465       }
80466
80467
80468       var history = {
80469
80470           graph: function() {
80471               return _stack[_index].graph;
80472           },
80473
80474
80475           base: function() {
80476               return _stack[0].graph;
80477           },
80478
80479
80480           merge: function(entities, extent) {
80481               _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
80482               _tree.rebase(entities, false);
80483
80484               dispatch$$1.call('change', this, undefined, extent);
80485           },
80486
80487
80488           perform: function() {
80489               // complete any transition already in progress
80490               select(document).interrupt('history.perform');
80491
80492               var transitionable = false;
80493               var action0 = arguments[0];
80494
80495               if (arguments.length === 1 ||
80496                   arguments.length === 2 && !isFunction(arguments[1])) {
80497                   transitionable = !!action0.transitionable;
80498               }
80499
80500               if (transitionable) {
80501                   var origArguments = arguments;
80502                   select(document)
80503                       .transition('history.perform')
80504                       .duration(duration)
80505                       .ease(linear$1)
80506                       .tween('history.tween', function() {
80507                           return function(t) {
80508                               if (t < 1) _overwrite([action0], t);
80509                           };
80510                       })
80511                       .on('start', function() {
80512                           _perform([action0], 0);
80513                       })
80514                       .on('end interrupt', function() {
80515                           _overwrite(origArguments, 1);
80516                       });
80517
80518               } else {
80519                   return _perform(arguments);
80520               }
80521           },
80522
80523
80524           replace: function() {
80525               select(document).interrupt('history.perform');
80526               return _replace(arguments, 1);
80527           },
80528
80529
80530           // Same as calling pop and then perform
80531           overwrite: function() {
80532               select(document).interrupt('history.perform');
80533               return _overwrite(arguments, 1);
80534           },
80535
80536
80537           pop: function(n) {
80538               select(document).interrupt('history.perform');
80539
80540               var previous = _stack[_index].graph;
80541               if (isNaN(+n) || +n < 0) {
80542                   n = 1;
80543               }
80544               while (n-- > 0 && _index > 0) {
80545                   _index--;
80546                   _stack.pop();
80547               }
80548               return change(previous);
80549           },
80550
80551
80552           // Back to the previous annotated state or _index = 0.
80553           undo: function() {
80554               select(document).interrupt('history.perform');
80555
80556               var previous = _stack[_index].graph;
80557               while (_index > 0) {
80558                   _index--;
80559                   if (_stack[_index].annotation) break;
80560               }
80561
80562               dispatch$$1.call('undone', this, _stack[_index]);
80563               return change(previous);
80564           },
80565
80566
80567           // Forward to the next annotated state.
80568           redo: function() {
80569               select(document).interrupt('history.perform');
80570
80571               var previous = _stack[_index].graph;
80572               var tryIndex = _index;
80573               while (tryIndex < _stack.length - 1) {
80574                   tryIndex++;
80575                   if (_stack[tryIndex].annotation) {
80576                       _index = tryIndex;
80577                       dispatch$$1.call('redone', this, _stack[_index]);
80578                       break;
80579                   }
80580               }
80581
80582               return change(previous);
80583           },
80584
80585
80586           undoAnnotation: function() {
80587               var i = _index;
80588               while (i >= 0) {
80589                   if (_stack[i].annotation) return _stack[i].annotation;
80590                   i--;
80591               }
80592           },
80593
80594
80595           redoAnnotation: function() {
80596               var i = _index + 1;
80597               while (i <= _stack.length - 1) {
80598                   if (_stack[i].annotation) return _stack[i].annotation;
80599                   i++;
80600               }
80601           },
80602
80603
80604           intersects: function(extent) {
80605               return _tree.intersects(extent, _stack[_index].graph);
80606           },
80607
80608
80609           difference: function() {
80610               var base = _stack[0].graph;
80611               var head = _stack[_index].graph;
80612               return coreDifference(base, head);
80613           },
80614
80615
80616           changes: function(action) {
80617               var base = _stack[0].graph;
80618               var head = _stack[_index].graph;
80619
80620               if (action) {
80621                   head = action(head);
80622               }
80623
80624               var difference$$1 = coreDifference(base, head);
80625
80626               return {
80627                   modified: difference$$1.modified(),
80628                   created: difference$$1.created(),
80629                   deleted: difference$$1.deleted()
80630               };
80631           },
80632
80633
80634           validate: function(changes) {
80635               return flatten(
80636                   map$3(Validations, function(fn) { return fn()(changes, _stack[_index].graph); })
80637               );
80638           },
80639
80640
80641           hasChanges: function() {
80642               return this.difference().length() > 0;
80643           },
80644
80645
80646           imageryUsed: function(sources) {
80647               if (sources) {
80648                   imageryUsed = sources;
80649                   return history;
80650               } else {
80651                   var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
80652                   return without(uniq(flatten(arr)), 'Custom');
80653               }
80654           },
80655
80656
80657           // save the current history state
80658           checkpoint: function(key) {
80659               _checkpoints[key] = {
80660                   stack: cloneDeep(_stack),
80661                   index: _index
80662               };
80663               return history;
80664           },
80665
80666
80667           // restore history state to a given checkpoint or reset completely
80668           reset: function(key) {
80669               if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
80670                   _stack = cloneDeep(_checkpoints[key].stack);
80671                   _index = _checkpoints[key].index;
80672               } else {
80673                   _stack = [{graph: coreGraph$$1()}];
80674                   _index = 0;
80675                   _tree = coreTree(_stack[0].graph);
80676                   _checkpoints = {};
80677               }
80678               dispatch$$1.call('change');
80679               return history;
80680           },
80681
80682
80683           toIntroGraph: function() {
80684               var nextId = { n: 0, r: 0, w: 0 };
80685               var permIds = {};
80686               var graph = this.graph();
80687               var baseEntities = {};
80688
80689               // clone base entities..
80690               forEach(graph.base().entities, function(entity) {
80691                   var copy = cloneDeepWith(entity, customizer);
80692                   baseEntities[copy.id] = copy;
80693               });
80694
80695               // replace base entities with head entities..
80696               forEach(graph.entities, function(entity, id) {
80697                   if (entity) {
80698                       var copy = cloneDeepWith(entity, customizer);
80699                       baseEntities[copy.id] = copy;
80700                   } else {
80701                       delete baseEntities[id];
80702                   }
80703               });
80704
80705               // swap temporary for permanent ids..
80706               forEach(baseEntities, function(entity) {
80707                   if (Array.isArray(entity.nodes)) {
80708                       entity.nodes = entity.nodes.map(function(node) {
80709                           return permIds[node] || node;
80710                       });
80711                   }
80712                   if (Array.isArray(entity.members)) {
80713                       entity.members = entity.members.map(function(member) {
80714                           member.id = permIds[member.id] || member.id;
80715                           return member;
80716                       });
80717                   }
80718               });
80719
80720               return JSON.stringify({ dataIntroGraph: baseEntities });
80721
80722
80723               function customizer(src) {
80724                   var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
80725                   if (isEmpty(copy.tags)) {
80726                       delete copy.tags;
80727                   }
80728
80729                   if (Array.isArray(copy.loc)) {
80730                       copy.loc[0] = +copy.loc[0].toFixed(6);
80731                       copy.loc[1] = +copy.loc[1].toFixed(6);
80732                   }
80733
80734                   var match = src.id.match(/([nrw])-\d*/);  // temporary id
80735                   if (match !== null) {
80736                       var nrw = match[1], permId;
80737                       do { permId = nrw + (++nextId[nrw]); }
80738                       while (baseEntities.hasOwnProperty(permId));
80739
80740                       copy.id = permIds[src.id] = permId;
80741                   }
80742                   return copy;
80743               }
80744           },
80745
80746
80747           toJSON: function() {
80748               if (!this.hasChanges()) return;
80749
80750               var allEntities = {};
80751               var baseEntities = {};
80752               var base = _stack[0];
80753
80754               var s = _stack.map(function(i) {
80755                   var modified = [], deleted = [];
80756
80757                   forEach(i.graph.entities, function(entity, id) {
80758                       if (entity) {
80759                           var key = osmEntity$$1.key(entity);
80760                           allEntities[key] = entity;
80761                           modified.push(key);
80762                       } else {
80763                           deleted.push(id);
80764                       }
80765
80766                       // make sure that the originals of changed or deleted entities get merged
80767                       // into the base of the _stack after restoring the data from JSON.
80768                       if (id in base.graph.entities) {
80769                           baseEntities[id] = base.graph.entities[id];
80770                       }
80771                       // get originals of parent entities too
80772                       forEach(base.graph._parentWays[id], function(parentId) {
80773                           if (parentId in base.graph.entities) {
80774                               baseEntities[parentId] = base.graph.entities[parentId];
80775                           }
80776                       });
80777                   });
80778
80779                   var x = {};
80780
80781                   if (modified.length) x.modified = modified;
80782                   if (deleted.length) x.deleted = deleted;
80783                   if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
80784                   if (i.annotation) x.annotation = i.annotation;
80785
80786                   return x;
80787               });
80788
80789               return JSON.stringify({
80790                   version: 3,
80791                   entities: values$1(allEntities),
80792                   baseEntities: values$1(baseEntities),
80793                   stack: s,
80794                   nextIDs: osmEntity$$1.id.next,
80795                   index: _index
80796               });
80797           },
80798
80799
80800           fromJSON: function(json, loadChildNodes) {
80801               var h = JSON.parse(json);
80802               var loadComplete = true;
80803
80804               osmEntity$$1.id.next = h.nextIDs;
80805               _index = h.index;
80806
80807               if (h.version === 2 || h.version === 3) {
80808                   var allEntities = {};
80809
80810                   h.entities.forEach(function(entity) {
80811                       allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
80812                   });
80813
80814                   if (h.version === 3) {
80815                       // This merges originals for changed entities into the base of
80816                       // the _stack even if the current _stack doesn't have them (for
80817                       // example when iD has been restarted in a different region)
80818                       var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
80819                       _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
80820                       _tree.rebase(baseEntities, true);
80821
80822                       // When we restore a modified way, we also need to fetch any missing
80823                       // childnodes that would normally have been downloaded with it.. #2142
80824                       if (loadChildNodes) {
80825                           var osm = context.connection();
80826                           var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
80827                           var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
80828
80829                           if (!isEmpty(missing) && osm) {
80830                               loadComplete = false;
80831                               context.redrawEnable(false);
80832
80833                               var loading = uiLoading(context).blocking(true);
80834                               context.container().call(loading);
80835
80836                               var childNodesLoaded = function(err, result) {
80837                                   if (!err) {
80838                                       var visible = groupBy(result.data, 'visible');
80839                                       if (!isEmpty(visible.true)) {
80840                                           missing = difference(missing, map$3(visible.true, 'id'));
80841                                           _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
80842                                           _tree.rebase(visible.true, true);
80843                                       }
80844
80845                                       // fetch older versions of nodes that were deleted..
80846                                       forEach(visible.false, function(entity) {
80847                                           osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
80848                                       });
80849                                   }
80850
80851                                   if (err || isEmpty(missing)) {
80852                                       loading.close();
80853                                       context.redrawEnable(true);
80854                                       dispatch$$1.call('change');
80855                                   }
80856                               };
80857
80858                               osm.loadMultiple(missing, childNodesLoaded);
80859                           }
80860                       }
80861                   }
80862
80863                   _stack = h.stack.map(function(d) {
80864                       var entities = {}, entity;
80865
80866                       if (d.modified) {
80867                           d.modified.forEach(function(key) {
80868                               entity = allEntities[key];
80869                               entities[entity.id] = entity;
80870                           });
80871                       }
80872
80873                       if (d.deleted) {
80874                           d.deleted.forEach(function(id) {
80875                               entities[id] = undefined;
80876                           });
80877                       }
80878
80879                       return {
80880                           graph: coreGraph$$1(_stack[0].graph).load(entities),
80881                           annotation: d.annotation,
80882                           imageryUsed: d.imageryUsed
80883                       };
80884                   });
80885
80886               } else { // original version
80887                   _stack = h.stack.map(function(d) {
80888                       var entities = {};
80889
80890                       for (var i in d.entities) {
80891                           var entity = d.entities[i];
80892                           entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
80893                       }
80894
80895                       d.graph = coreGraph$$1(_stack[0].graph).load(entities);
80896                       return d;
80897                   });
80898               }
80899
80900               if (loadComplete) {
80901                   dispatch$$1.call('change');
80902               }
80903
80904               return history;
80905           },
80906
80907
80908           save: function() {
80909               if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
80910               return history;
80911           },
80912
80913
80914           clearSaved: function() {
80915               context.debouncedSave.cancel();
80916               if (lock.locked()) context.storage(getKey('saved_history'), null);
80917               return history;
80918           },
80919
80920
80921           lock: function() {
80922               return lock.lock();
80923           },
80924
80925
80926           unlock: function() {
80927               lock.unlock();
80928           },
80929
80930
80931           // is iD not open in another window and it detects that
80932           // there's a history stored in localStorage that's recoverable?
80933           restorableChanges: function() {
80934               return lock.locked() && !!context.storage(getKey('saved_history'));
80935           },
80936
80937
80938           // load history from a version stored in localStorage
80939           restore: function() {
80940               if (!lock.locked()) return;
80941
80942               var json = context.storage(getKey('saved_history'));
80943               if (json) history.fromJSON(json, true);
80944           },
80945
80946
80947           _getKey: getKey
80948
80949       };
80950
80951
80952       history.reset();
80953
80954       return utilRebind(history, dispatch$$1, 'on');
80955   }
80956
80957   /** Used to store function metadata. */
80958   var metaMap = WeakMap && new WeakMap;
80959
80960   /**
80961    * The base implementation of `setData` without support for hot loop shorting.
80962    *
80963    * @private
80964    * @param {Function} func The function to associate metadata with.
80965    * @param {*} data The metadata.
80966    * @returns {Function} Returns `func`.
80967    */
80968   var baseSetData = !metaMap ? identity$8 : function(func, data) {
80969     metaMap.set(func, data);
80970     return func;
80971   };
80972
80973   /**
80974    * Creates a function that produces an instance of `Ctor` regardless of
80975    * whether it was invoked as part of a `new` expression or by `call` or `apply`.
80976    *
80977    * @private
80978    * @param {Function} Ctor The constructor to wrap.
80979    * @returns {Function} Returns the new wrapped function.
80980    */
80981   function createCtor(Ctor) {
80982     return function() {
80983       // Use a `switch` statement to work with class constructors. See
80984       // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
80985       // for more details.
80986       var args = arguments;
80987       switch (args.length) {
80988         case 0: return new Ctor;
80989         case 1: return new Ctor(args[0]);
80990         case 2: return new Ctor(args[0], args[1]);
80991         case 3: return new Ctor(args[0], args[1], args[2]);
80992         case 4: return new Ctor(args[0], args[1], args[2], args[3]);
80993         case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
80994         case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
80995         case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
80996       }
80997       var thisBinding = baseCreate(Ctor.prototype),
80998           result = Ctor.apply(thisBinding, args);
80999
81000       // Mimic the constructor's `return` behavior.
81001       // See https://es5.github.io/#x13.2.2 for more details.
81002       return isObject(result) ? result : thisBinding;
81003     };
81004   }
81005
81006   /** Used to compose bitmasks for function metadata. */
81007   var WRAP_BIND_FLAG = 1;
81008
81009   /**
81010    * Creates a function that wraps `func` to invoke it with the optional `this`
81011    * binding of `thisArg`.
81012    *
81013    * @private
81014    * @param {Function} func The function to wrap.
81015    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81016    * @param {*} [thisArg] The `this` binding of `func`.
81017    * @returns {Function} Returns the new wrapped function.
81018    */
81019   function createBind(func, bitmask, thisArg) {
81020     var isBind = bitmask & WRAP_BIND_FLAG,
81021         Ctor = createCtor(func);
81022
81023     function wrapper() {
81024       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
81025       return fn.apply(isBind ? thisArg : this, arguments);
81026     }
81027     return wrapper;
81028   }
81029
81030   /* Built-in method references for those with the same name as other `lodash` methods. */
81031   var nativeMax$5 = Math.max;
81032
81033   /**
81034    * Creates an array that is the composition of partially applied arguments,
81035    * placeholders, and provided arguments into a single array of arguments.
81036    *
81037    * @private
81038    * @param {Array} args The provided arguments.
81039    * @param {Array} partials The arguments to prepend to those provided.
81040    * @param {Array} holders The `partials` placeholder indexes.
81041    * @params {boolean} [isCurried] Specify composing for a curried function.
81042    * @returns {Array} Returns the new array of composed arguments.
81043    */
81044   function composeArgs(args, partials, holders, isCurried) {
81045     var argsIndex = -1,
81046         argsLength = args.length,
81047         holdersLength = holders.length,
81048         leftIndex = -1,
81049         leftLength = partials.length,
81050         rangeLength = nativeMax$5(argsLength - holdersLength, 0),
81051         result = Array(leftLength + rangeLength),
81052         isUncurried = !isCurried;
81053
81054     while (++leftIndex < leftLength) {
81055       result[leftIndex] = partials[leftIndex];
81056     }
81057     while (++argsIndex < holdersLength) {
81058       if (isUncurried || argsIndex < argsLength) {
81059         result[holders[argsIndex]] = args[argsIndex];
81060       }
81061     }
81062     while (rangeLength--) {
81063       result[leftIndex++] = args[argsIndex++];
81064     }
81065     return result;
81066   }
81067
81068   /* Built-in method references for those with the same name as other `lodash` methods. */
81069   var nativeMax$6 = Math.max;
81070
81071   /**
81072    * This function is like `composeArgs` except that the arguments composition
81073    * is tailored for `_.partialRight`.
81074    *
81075    * @private
81076    * @param {Array} args The provided arguments.
81077    * @param {Array} partials The arguments to append to those provided.
81078    * @param {Array} holders The `partials` placeholder indexes.
81079    * @params {boolean} [isCurried] Specify composing for a curried function.
81080    * @returns {Array} Returns the new array of composed arguments.
81081    */
81082   function composeArgsRight(args, partials, holders, isCurried) {
81083     var argsIndex = -1,
81084         argsLength = args.length,
81085         holdersIndex = -1,
81086         holdersLength = holders.length,
81087         rightIndex = -1,
81088         rightLength = partials.length,
81089         rangeLength = nativeMax$6(argsLength - holdersLength, 0),
81090         result = Array(rangeLength + rightLength),
81091         isUncurried = !isCurried;
81092
81093     while (++argsIndex < rangeLength) {
81094       result[argsIndex] = args[argsIndex];
81095     }
81096     var offset = argsIndex;
81097     while (++rightIndex < rightLength) {
81098       result[offset + rightIndex] = partials[rightIndex];
81099     }
81100     while (++holdersIndex < holdersLength) {
81101       if (isUncurried || argsIndex < argsLength) {
81102         result[offset + holders[holdersIndex]] = args[argsIndex++];
81103       }
81104     }
81105     return result;
81106   }
81107
81108   /**
81109    * Gets the number of `placeholder` occurrences in `array`.
81110    *
81111    * @private
81112    * @param {Array} array The array to inspect.
81113    * @param {*} placeholder The placeholder to search for.
81114    * @returns {number} Returns the placeholder count.
81115    */
81116   function countHolders(array, placeholder) {
81117     var length = array.length,
81118         result = 0;
81119
81120     while (length--) {
81121       if (array[length] === placeholder) {
81122         ++result;
81123       }
81124     }
81125     return result;
81126   }
81127
81128   /**
81129    * The function whose prototype chain sequence wrappers inherit from.
81130    *
81131    * @private
81132    */
81133   function baseLodash() {
81134     // No operation performed.
81135   }
81136
81137   /** Used as references for the maximum length and index of an array. */
81138   var MAX_ARRAY_LENGTH = 4294967295;
81139
81140   /**
81141    * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
81142    *
81143    * @private
81144    * @constructor
81145    * @param {*} value The value to wrap.
81146    */
81147   function LazyWrapper(value) {
81148     this.__wrapped__ = value;
81149     this.__actions__ = [];
81150     this.__dir__ = 1;
81151     this.__filtered__ = false;
81152     this.__iteratees__ = [];
81153     this.__takeCount__ = MAX_ARRAY_LENGTH;
81154     this.__views__ = [];
81155   }
81156
81157   // Ensure `LazyWrapper` is an instance of `baseLodash`.
81158   LazyWrapper.prototype = baseCreate(baseLodash.prototype);
81159   LazyWrapper.prototype.constructor = LazyWrapper;
81160
81161   /**
81162    * Gets metadata for `func`.
81163    *
81164    * @private
81165    * @param {Function} func The function to query.
81166    * @returns {*} Returns the metadata for `func`.
81167    */
81168   var getData = !metaMap ? noop$3 : function(func) {
81169     return metaMap.get(func);
81170   };
81171
81172   /** Used to lookup unminified function names. */
81173   var realNames = {};
81174
81175   /** Used for built-in method references. */
81176   var objectProto$k = Object.prototype;
81177
81178   /** Used to check objects for own properties. */
81179   var hasOwnProperty$h = objectProto$k.hasOwnProperty;
81180
81181   /**
81182    * Gets the name of `func`.
81183    *
81184    * @private
81185    * @param {Function} func The function to query.
81186    * @returns {string} Returns the function name.
81187    */
81188   function getFuncName(func) {
81189     var result = (func.name + ''),
81190         array = realNames[result],
81191         length = hasOwnProperty$h.call(realNames, result) ? array.length : 0;
81192
81193     while (length--) {
81194       var data = array[length],
81195           otherFunc = data.func;
81196       if (otherFunc == null || otherFunc == func) {
81197         return data.name;
81198       }
81199     }
81200     return result;
81201   }
81202
81203   /**
81204    * The base constructor for creating `lodash` wrapper objects.
81205    *
81206    * @private
81207    * @param {*} value The value to wrap.
81208    * @param {boolean} [chainAll] Enable explicit method chain sequences.
81209    */
81210   function LodashWrapper(value, chainAll) {
81211     this.__wrapped__ = value;
81212     this.__actions__ = [];
81213     this.__chain__ = !!chainAll;
81214     this.__index__ = 0;
81215     this.__values__ = undefined;
81216   }
81217
81218   LodashWrapper.prototype = baseCreate(baseLodash.prototype);
81219   LodashWrapper.prototype.constructor = LodashWrapper;
81220
81221   /**
81222    * Creates a clone of `wrapper`.
81223    *
81224    * @private
81225    * @param {Object} wrapper The wrapper to clone.
81226    * @returns {Object} Returns the cloned wrapper.
81227    */
81228   function wrapperClone(wrapper) {
81229     if (wrapper instanceof LazyWrapper) {
81230       return wrapper.clone();
81231     }
81232     var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
81233     result.__actions__ = copyArray(wrapper.__actions__);
81234     result.__index__  = wrapper.__index__;
81235     result.__values__ = wrapper.__values__;
81236     return result;
81237   }
81238
81239   /** Used for built-in method references. */
81240   var objectProto$l = Object.prototype;
81241
81242   /** Used to check objects for own properties. */
81243   var hasOwnProperty$i = objectProto$l.hasOwnProperty;
81244
81245   /**
81246    * Creates a `lodash` object which wraps `value` to enable implicit method
81247    * chain sequences. Methods that operate on and return arrays, collections,
81248    * and functions can be chained together. Methods that retrieve a single value
81249    * or may return a primitive value will automatically end the chain sequence
81250    * and return the unwrapped value. Otherwise, the value must be unwrapped
81251    * with `_#value`.
81252    *
81253    * Explicit chain sequences, which must be unwrapped with `_#value`, may be
81254    * enabled using `_.chain`.
81255    *
81256    * The execution of chained methods is lazy, that is, it's deferred until
81257    * `_#value` is implicitly or explicitly called.
81258    *
81259    * Lazy evaluation allows several methods to support shortcut fusion.
81260    * Shortcut fusion is an optimization to merge iteratee calls; this avoids
81261    * the creation of intermediate arrays and can greatly reduce the number of
81262    * iteratee executions. Sections of a chain sequence qualify for shortcut
81263    * fusion if the section is applied to an array and iteratees accept only
81264    * one argument. The heuristic for whether a section qualifies for shortcut
81265    * fusion is subject to change.
81266    *
81267    * Chaining is supported in custom builds as long as the `_#value` method is
81268    * directly or indirectly included in the build.
81269    *
81270    * In addition to lodash methods, wrappers have `Array` and `String` methods.
81271    *
81272    * The wrapper `Array` methods are:
81273    * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
81274    *
81275    * The wrapper `String` methods are:
81276    * `replace` and `split`
81277    *
81278    * The wrapper methods that support shortcut fusion are:
81279    * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
81280    * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
81281    * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
81282    *
81283    * The chainable wrapper methods are:
81284    * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
81285    * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
81286    * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
81287    * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
81288    * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
81289    * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
81290    * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
81291    * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
81292    * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
81293    * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
81294    * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
81295    * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
81296    * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
81297    * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
81298    * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
81299    * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
81300    * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
81301    * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
81302    * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
81303    * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
81304    * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
81305    * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
81306    * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
81307    * `zipObject`, `zipObjectDeep`, and `zipWith`
81308    *
81309    * The wrapper methods that are **not** chainable by default are:
81310    * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
81311    * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
81312    * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
81313    * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
81314    * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
81315    * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
81316    * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
81317    * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
81318    * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
81319    * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
81320    * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
81321    * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
81322    * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
81323    * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
81324    * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
81325    * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
81326    * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
81327    * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
81328    * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
81329    * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
81330    * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
81331    * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
81332    * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
81333    * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
81334    * `upperFirst`, `value`, and `words`
81335    *
81336    * @name _
81337    * @constructor
81338    * @category Seq
81339    * @param {*} value The value to wrap in a `lodash` instance.
81340    * @returns {Object} Returns the new `lodash` wrapper instance.
81341    * @example
81342    *
81343    * function square(n) {
81344    *   return n * n;
81345    * }
81346    *
81347    * var wrapped = _([1, 2, 3]);
81348    *
81349    * // Returns an unwrapped value.
81350    * wrapped.reduce(_.add);
81351    * // => 6
81352    *
81353    * // Returns a wrapped value.
81354    * var squares = wrapped.map(square);
81355    *
81356    * _.isArray(squares);
81357    * // => false
81358    *
81359    * _.isArray(squares.value());
81360    * // => true
81361    */
81362   function lodash(value) {
81363     if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
81364       if (value instanceof LodashWrapper) {
81365         return value;
81366       }
81367       if (hasOwnProperty$i.call(value, '__wrapped__')) {
81368         return wrapperClone(value);
81369       }
81370     }
81371     return new LodashWrapper(value);
81372   }
81373
81374   // Ensure wrappers are instances of `baseLodash`.
81375   lodash.prototype = baseLodash.prototype;
81376   lodash.prototype.constructor = lodash;
81377
81378   /**
81379    * Checks if `func` has a lazy counterpart.
81380    *
81381    * @private
81382    * @param {Function} func The function to check.
81383    * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
81384    *  else `false`.
81385    */
81386   function isLaziable(func) {
81387     var funcName = getFuncName(func),
81388         other = lodash[funcName];
81389
81390     if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
81391       return false;
81392     }
81393     if (func === other) {
81394       return true;
81395     }
81396     var data = getData(other);
81397     return !!data && func === data[0];
81398   }
81399
81400   /**
81401    * Sets metadata for `func`.
81402    *
81403    * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
81404    * period of time, it will trip its breaker and transition to an identity
81405    * function to avoid garbage collection pauses in V8. See
81406    * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
81407    * for more details.
81408    *
81409    * @private
81410    * @param {Function} func The function to associate metadata with.
81411    * @param {*} data The metadata.
81412    * @returns {Function} Returns `func`.
81413    */
81414   var setData = shortOut(baseSetData);
81415
81416   /** Used to match wrap detail comments. */
81417   var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
81418       reSplitDetails = /,? & /;
81419
81420   /**
81421    * Extracts wrapper details from the `source` body comment.
81422    *
81423    * @private
81424    * @param {string} source The source to inspect.
81425    * @returns {Array} Returns the wrapper details.
81426    */
81427   function getWrapDetails(source) {
81428     var match = source.match(reWrapDetails);
81429     return match ? match[1].split(reSplitDetails) : [];
81430   }
81431
81432   /** Used to match wrap detail comments. */
81433   var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
81434
81435   /**
81436    * Inserts wrapper `details` in a comment at the top of the `source` body.
81437    *
81438    * @private
81439    * @param {string} source The source to modify.
81440    * @returns {Array} details The details to insert.
81441    * @returns {string} Returns the modified source.
81442    */
81443   function insertWrapDetails(source, details) {
81444     var length = details.length;
81445     if (!length) {
81446       return source;
81447     }
81448     var lastIndex = length - 1;
81449     details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
81450     details = details.join(length > 2 ? ', ' : ' ');
81451     return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
81452   }
81453
81454   /** Used to compose bitmasks for function metadata. */
81455   var WRAP_BIND_FLAG$1 = 1,
81456       WRAP_BIND_KEY_FLAG = 2,
81457       WRAP_CURRY_FLAG = 8,
81458       WRAP_CURRY_RIGHT_FLAG = 16,
81459       WRAP_PARTIAL_FLAG = 32,
81460       WRAP_PARTIAL_RIGHT_FLAG = 64,
81461       WRAP_ARY_FLAG = 128,
81462       WRAP_REARG_FLAG = 256,
81463       WRAP_FLIP_FLAG = 512;
81464
81465   /** Used to associate wrap methods with their bit flags. */
81466   var wrapFlags = [
81467     ['ary', WRAP_ARY_FLAG],
81468     ['bind', WRAP_BIND_FLAG$1],
81469     ['bindKey', WRAP_BIND_KEY_FLAG],
81470     ['curry', WRAP_CURRY_FLAG],
81471     ['curryRight', WRAP_CURRY_RIGHT_FLAG],
81472     ['flip', WRAP_FLIP_FLAG],
81473     ['partial', WRAP_PARTIAL_FLAG],
81474     ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
81475     ['rearg', WRAP_REARG_FLAG]
81476   ];
81477
81478   /**
81479    * Updates wrapper `details` based on `bitmask` flags.
81480    *
81481    * @private
81482    * @returns {Array} details The details to modify.
81483    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81484    * @returns {Array} Returns `details`.
81485    */
81486   function updateWrapDetails(details, bitmask) {
81487     arrayEach(wrapFlags, function(pair) {
81488       var value = '_.' + pair[0];
81489       if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
81490         details.push(value);
81491       }
81492     });
81493     return details.sort();
81494   }
81495
81496   /**
81497    * Sets the `toString` method of `wrapper` to mimic the source of `reference`
81498    * with wrapper details in a comment at the top of the source body.
81499    *
81500    * @private
81501    * @param {Function} wrapper The function to modify.
81502    * @param {Function} reference The reference function.
81503    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81504    * @returns {Function} Returns `wrapper`.
81505    */
81506   function setWrapToString(wrapper, reference, bitmask) {
81507     var source = (reference + '');
81508     return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
81509   }
81510
81511   /** Used to compose bitmasks for function metadata. */
81512   var WRAP_BIND_FLAG$2 = 1,
81513       WRAP_BIND_KEY_FLAG$1 = 2,
81514       WRAP_CURRY_BOUND_FLAG = 4,
81515       WRAP_CURRY_FLAG$1 = 8,
81516       WRAP_PARTIAL_FLAG$1 = 32,
81517       WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
81518
81519   /**
81520    * Creates a function that wraps `func` to continue currying.
81521    *
81522    * @private
81523    * @param {Function} func The function to wrap.
81524    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81525    * @param {Function} wrapFunc The function to create the `func` wrapper.
81526    * @param {*} placeholder The placeholder value.
81527    * @param {*} [thisArg] The `this` binding of `func`.
81528    * @param {Array} [partials] The arguments to prepend to those provided to
81529    *  the new function.
81530    * @param {Array} [holders] The `partials` placeholder indexes.
81531    * @param {Array} [argPos] The argument positions of the new function.
81532    * @param {number} [ary] The arity cap of `func`.
81533    * @param {number} [arity] The arity of `func`.
81534    * @returns {Function} Returns the new wrapped function.
81535    */
81536   function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
81537     var isCurry = bitmask & WRAP_CURRY_FLAG$1,
81538         newHolders = isCurry ? holders : undefined,
81539         newHoldersRight = isCurry ? undefined : holders,
81540         newPartials = isCurry ? partials : undefined,
81541         newPartialsRight = isCurry ? undefined : partials;
81542
81543     bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
81544     bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
81545
81546     if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
81547       bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
81548     }
81549     var newData = [
81550       func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
81551       newHoldersRight, argPos, ary, arity
81552     ];
81553
81554     var result = wrapFunc.apply(undefined, newData);
81555     if (isLaziable(func)) {
81556       setData(result, newData);
81557     }
81558     result.placeholder = placeholder;
81559     return setWrapToString(result, func, bitmask);
81560   }
81561
81562   /**
81563    * Gets the argument placeholder value for `func`.
81564    *
81565    * @private
81566    * @param {Function} func The function to inspect.
81567    * @returns {*} Returns the placeholder value.
81568    */
81569   function getHolder(func) {
81570     var object = func;
81571     return object.placeholder;
81572   }
81573
81574   /* Built-in method references for those with the same name as other `lodash` methods. */
81575   var nativeMin$2 = Math.min;
81576
81577   /**
81578    * Reorder `array` according to the specified indexes where the element at
81579    * the first index is assigned as the first element, the element at
81580    * the second index is assigned as the second element, and so on.
81581    *
81582    * @private
81583    * @param {Array} array The array to reorder.
81584    * @param {Array} indexes The arranged array indexes.
81585    * @returns {Array} Returns `array`.
81586    */
81587   function reorder(array, indexes) {
81588     var arrLength = array.length,
81589         length = nativeMin$2(indexes.length, arrLength),
81590         oldArray = copyArray(array);
81591
81592     while (length--) {
81593       var index = indexes[length];
81594       array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
81595     }
81596     return array;
81597   }
81598
81599   /** Used as the internal argument placeholder. */
81600   var PLACEHOLDER = '__lodash_placeholder__';
81601
81602   /**
81603    * Replaces all `placeholder` elements in `array` with an internal placeholder
81604    * and returns an array of their indexes.
81605    *
81606    * @private
81607    * @param {Array} array The array to modify.
81608    * @param {*} placeholder The placeholder to replace.
81609    * @returns {Array} Returns the new array of placeholder indexes.
81610    */
81611   function replaceHolders(array, placeholder) {
81612     var index = -1,
81613         length = array.length,
81614         resIndex = 0,
81615         result = [];
81616
81617     while (++index < length) {
81618       var value = array[index];
81619       if (value === placeholder || value === PLACEHOLDER) {
81620         array[index] = PLACEHOLDER;
81621         result[resIndex++] = index;
81622       }
81623     }
81624     return result;
81625   }
81626
81627   /** Used to compose bitmasks for function metadata. */
81628   var WRAP_BIND_FLAG$3 = 1,
81629       WRAP_BIND_KEY_FLAG$2 = 2,
81630       WRAP_CURRY_FLAG$2 = 8,
81631       WRAP_CURRY_RIGHT_FLAG$1 = 16,
81632       WRAP_ARY_FLAG$1 = 128,
81633       WRAP_FLIP_FLAG$1 = 512;
81634
81635   /**
81636    * Creates a function that wraps `func` to invoke it with optional `this`
81637    * binding of `thisArg`, partial application, and currying.
81638    *
81639    * @private
81640    * @param {Function|string} func The function or method name to wrap.
81641    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81642    * @param {*} [thisArg] The `this` binding of `func`.
81643    * @param {Array} [partials] The arguments to prepend to those provided to
81644    *  the new function.
81645    * @param {Array} [holders] The `partials` placeholder indexes.
81646    * @param {Array} [partialsRight] The arguments to append to those provided
81647    *  to the new function.
81648    * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
81649    * @param {Array} [argPos] The argument positions of the new function.
81650    * @param {number} [ary] The arity cap of `func`.
81651    * @param {number} [arity] The arity of `func`.
81652    * @returns {Function} Returns the new wrapped function.
81653    */
81654   function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
81655     var isAry = bitmask & WRAP_ARY_FLAG$1,
81656         isBind = bitmask & WRAP_BIND_FLAG$3,
81657         isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
81658         isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
81659         isFlip = bitmask & WRAP_FLIP_FLAG$1,
81660         Ctor = isBindKey ? undefined : createCtor(func);
81661
81662     function wrapper() {
81663       var length = arguments.length,
81664           args = Array(length),
81665           index = length;
81666
81667       while (index--) {
81668         args[index] = arguments[index];
81669       }
81670       if (isCurried) {
81671         var placeholder = getHolder(wrapper),
81672             holdersCount = countHolders(args, placeholder);
81673       }
81674       if (partials) {
81675         args = composeArgs(args, partials, holders, isCurried);
81676       }
81677       if (partialsRight) {
81678         args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
81679       }
81680       length -= holdersCount;
81681       if (isCurried && length < arity) {
81682         var newHolders = replaceHolders(args, placeholder);
81683         return createRecurry(
81684           func, bitmask, createHybrid, wrapper.placeholder, thisArg,
81685           args, newHolders, argPos, ary, arity - length
81686         );
81687       }
81688       var thisBinding = isBind ? thisArg : this,
81689           fn = isBindKey ? thisBinding[func] : func;
81690
81691       length = args.length;
81692       if (argPos) {
81693         args = reorder(args, argPos);
81694       } else if (isFlip && length > 1) {
81695         args.reverse();
81696       }
81697       if (isAry && ary < length) {
81698         args.length = ary;
81699       }
81700       if (this && this !== root$2 && this instanceof wrapper) {
81701         fn = Ctor || createCtor(fn);
81702       }
81703       return fn.apply(thisBinding, args);
81704     }
81705     return wrapper;
81706   }
81707
81708   /**
81709    * Creates a function that wraps `func` to enable currying.
81710    *
81711    * @private
81712    * @param {Function} func The function to wrap.
81713    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81714    * @param {number} arity The arity of `func`.
81715    * @returns {Function} Returns the new wrapped function.
81716    */
81717   function createCurry(func, bitmask, arity) {
81718     var Ctor = createCtor(func);
81719
81720     function wrapper() {
81721       var length = arguments.length,
81722           args = Array(length),
81723           index = length,
81724           placeholder = getHolder(wrapper);
81725
81726       while (index--) {
81727         args[index] = arguments[index];
81728       }
81729       var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
81730         ? []
81731         : replaceHolders(args, placeholder);
81732
81733       length -= holders.length;
81734       if (length < arity) {
81735         return createRecurry(
81736           func, bitmask, createHybrid, wrapper.placeholder, undefined,
81737           args, holders, undefined, undefined, arity - length);
81738       }
81739       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
81740       return apply(fn, this, args);
81741     }
81742     return wrapper;
81743   }
81744
81745   /** Used to compose bitmasks for function metadata. */
81746   var WRAP_BIND_FLAG$4 = 1;
81747
81748   /**
81749    * Creates a function that wraps `func` to invoke it with the `this` binding
81750    * of `thisArg` and `partials` prepended to the arguments it receives.
81751    *
81752    * @private
81753    * @param {Function} func The function to wrap.
81754    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81755    * @param {*} thisArg The `this` binding of `func`.
81756    * @param {Array} partials The arguments to prepend to those provided to
81757    *  the new function.
81758    * @returns {Function} Returns the new wrapped function.
81759    */
81760   function createPartial(func, bitmask, thisArg, partials) {
81761     var isBind = bitmask & WRAP_BIND_FLAG$4,
81762         Ctor = createCtor(func);
81763
81764     function wrapper() {
81765       var argsIndex = -1,
81766           argsLength = arguments.length,
81767           leftIndex = -1,
81768           leftLength = partials.length,
81769           args = Array(leftLength + argsLength),
81770           fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
81771
81772       while (++leftIndex < leftLength) {
81773         args[leftIndex] = partials[leftIndex];
81774       }
81775       while (argsLength--) {
81776         args[leftIndex++] = arguments[++argsIndex];
81777       }
81778       return apply(fn, isBind ? thisArg : this, args);
81779     }
81780     return wrapper;
81781   }
81782
81783   /** Used as the internal argument placeholder. */
81784   var PLACEHOLDER$1 = '__lodash_placeholder__';
81785
81786   /** Used to compose bitmasks for function metadata. */
81787   var WRAP_BIND_FLAG$5 = 1,
81788       WRAP_BIND_KEY_FLAG$3 = 2,
81789       WRAP_CURRY_BOUND_FLAG$1 = 4,
81790       WRAP_CURRY_FLAG$3 = 8,
81791       WRAP_ARY_FLAG$2 = 128,
81792       WRAP_REARG_FLAG$1 = 256;
81793
81794   /* Built-in method references for those with the same name as other `lodash` methods. */
81795   var nativeMin$3 = Math.min;
81796
81797   /**
81798    * Merges the function metadata of `source` into `data`.
81799    *
81800    * Merging metadata reduces the number of wrappers used to invoke a function.
81801    * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
81802    * may be applied regardless of execution order. Methods like `_.ary` and
81803    * `_.rearg` modify function arguments, making the order in which they are
81804    * executed important, preventing the merging of metadata. However, we make
81805    * an exception for a safe combined case where curried functions have `_.ary`
81806    * and or `_.rearg` applied.
81807    *
81808    * @private
81809    * @param {Array} data The destination metadata.
81810    * @param {Array} source The source metadata.
81811    * @returns {Array} Returns `data`.
81812    */
81813   function mergeData(data, source) {
81814     var bitmask = data[1],
81815         srcBitmask = source[1],
81816         newBitmask = bitmask | srcBitmask,
81817         isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
81818
81819     var isCombo =
81820       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
81821       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
81822       ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
81823
81824     // Exit early if metadata can't be merged.
81825     if (!(isCommon || isCombo)) {
81826       return data;
81827     }
81828     // Use source `thisArg` if available.
81829     if (srcBitmask & WRAP_BIND_FLAG$5) {
81830       data[2] = source[2];
81831       // Set when currying a bound function.
81832       newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
81833     }
81834     // Compose partial arguments.
81835     var value = source[3];
81836     if (value) {
81837       var partials = data[3];
81838       data[3] = partials ? composeArgs(partials, value, source[4]) : value;
81839       data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
81840     }
81841     // Compose partial right arguments.
81842     value = source[5];
81843     if (value) {
81844       partials = data[5];
81845       data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
81846       data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
81847     }
81848     // Use source `argPos` if available.
81849     value = source[7];
81850     if (value) {
81851       data[7] = value;
81852     }
81853     // Use source `ary` if it's smaller.
81854     if (srcBitmask & WRAP_ARY_FLAG$2) {
81855       data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
81856     }
81857     // Use source `arity` if one is not provided.
81858     if (data[9] == null) {
81859       data[9] = source[9];
81860     }
81861     // Use source `func` and merge bitmasks.
81862     data[0] = source[0];
81863     data[1] = newBitmask;
81864
81865     return data;
81866   }
81867
81868   /** Error message constants. */
81869   var FUNC_ERROR_TEXT$4 = 'Expected a function';
81870
81871   /** Used to compose bitmasks for function metadata. */
81872   var WRAP_BIND_FLAG$6 = 1,
81873       WRAP_BIND_KEY_FLAG$4 = 2,
81874       WRAP_CURRY_FLAG$4 = 8,
81875       WRAP_CURRY_RIGHT_FLAG$2 = 16,
81876       WRAP_PARTIAL_FLAG$2 = 32,
81877       WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
81878
81879   /* Built-in method references for those with the same name as other `lodash` methods. */
81880   var nativeMax$7 = Math.max;
81881
81882   /**
81883    * Creates a function that either curries or invokes `func` with optional
81884    * `this` binding and partially applied arguments.
81885    *
81886    * @private
81887    * @param {Function|string} func The function or method name to wrap.
81888    * @param {number} bitmask The bitmask flags.
81889    *    1 - `_.bind`
81890    *    2 - `_.bindKey`
81891    *    4 - `_.curry` or `_.curryRight` of a bound function
81892    *    8 - `_.curry`
81893    *   16 - `_.curryRight`
81894    *   32 - `_.partial`
81895    *   64 - `_.partialRight`
81896    *  128 - `_.rearg`
81897    *  256 - `_.ary`
81898    *  512 - `_.flip`
81899    * @param {*} [thisArg] The `this` binding of `func`.
81900    * @param {Array} [partials] The arguments to be partially applied.
81901    * @param {Array} [holders] The `partials` placeholder indexes.
81902    * @param {Array} [argPos] The argument positions of the new function.
81903    * @param {number} [ary] The arity cap of `func`.
81904    * @param {number} [arity] The arity of `func`.
81905    * @returns {Function} Returns the new wrapped function.
81906    */
81907   function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
81908     var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
81909     if (!isBindKey && typeof func != 'function') {
81910       throw new TypeError(FUNC_ERROR_TEXT$4);
81911     }
81912     var length = partials ? partials.length : 0;
81913     if (!length) {
81914       bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
81915       partials = holders = undefined;
81916     }
81917     ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
81918     arity = arity === undefined ? arity : toInteger(arity);
81919     length -= holders ? holders.length : 0;
81920
81921     if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
81922       var partialsRight = partials,
81923           holdersRight = holders;
81924
81925       partials = holders = undefined;
81926     }
81927     var data = isBindKey ? undefined : getData(func);
81928
81929     var newData = [
81930       func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
81931       argPos, ary, arity
81932     ];
81933
81934     if (data) {
81935       mergeData(newData, data);
81936     }
81937     func = newData[0];
81938     bitmask = newData[1];
81939     thisArg = newData[2];
81940     partials = newData[3];
81941     holders = newData[4];
81942     arity = newData[9] = newData[9] === undefined
81943       ? (isBindKey ? 0 : func.length)
81944       : nativeMax$7(newData[9] - length, 0);
81945
81946     if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
81947       bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
81948     }
81949     if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
81950       var result = createBind(func, bitmask, thisArg);
81951     } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
81952       result = createCurry(func, bitmask, arity);
81953     } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
81954       result = createPartial(func, bitmask, thisArg, partials);
81955     } else {
81956       result = createHybrid.apply(undefined, newData);
81957     }
81958     var setter = data ? baseSetData : setData;
81959     return setWrapToString(setter(result, newData), func, bitmask);
81960   }
81961
81962   /** Used to compose bitmasks for function metadata. */
81963   var WRAP_BIND_FLAG$7 = 1,
81964       WRAP_PARTIAL_FLAG$3 = 32;
81965
81966   /**
81967    * Creates a function that invokes `func` with the `this` binding of `thisArg`
81968    * and `partials` prepended to the arguments it receives.
81969    *
81970    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
81971    * may be used as a placeholder for partially applied arguments.
81972    *
81973    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
81974    * property of bound functions.
81975    *
81976    * @static
81977    * @memberOf _
81978    * @since 0.1.0
81979    * @category Function
81980    * @param {Function} func The function to bind.
81981    * @param {*} thisArg The `this` binding of `func`.
81982    * @param {...*} [partials] The arguments to be partially applied.
81983    * @returns {Function} Returns the new bound function.
81984    * @example
81985    *
81986    * function greet(greeting, punctuation) {
81987    *   return greeting + ' ' + this.user + punctuation;
81988    * }
81989    *
81990    * var object = { 'user': 'fred' };
81991    *
81992    * var bound = _.bind(greet, object, 'hi');
81993    * bound('!');
81994    * // => 'hi fred!'
81995    *
81996    * // Bound with placeholders.
81997    * var bound = _.bind(greet, object, _, '!');
81998    * bound('hi');
81999    * // => 'hi fred!'
82000    */
82001   var bind$2 = baseRest(function(func, thisArg, partials) {
82002     var bitmask = WRAP_BIND_FLAG$7;
82003     if (partials.length) {
82004       var holders = replaceHolders(partials, getHolder(bind$2));
82005       bitmask |= WRAP_PARTIAL_FLAG$3;
82006     }
82007     return createWrap(func, bitmask, thisArg, partials, holders);
82008   });
82009
82010   // Assign default placeholders.
82011   bind$2.placeholder = {};
82012
82013   function presetCollection(collection) {
82014       var maxSearchResults = 50,
82015           maxSuggestionResults = 10;
82016
82017       var presets = {
82018
82019           collection: collection,
82020
82021
82022           item: function(id) {
82023               return find$1(this.collection, function(d) {
82024                   return d.id === id;
82025               });
82026           },
82027
82028
82029           matchGeometry: function(geometry) {
82030               return presetCollection(this.collection.filter(function(d) {
82031                   return d.matchGeometry(geometry);
82032               }));
82033           },
82034
82035
82036           search: function(value, geometry) {
82037               if (!value) return this;
82038
82039               function leading(a) {
82040                   var index = a.indexOf(value);
82041                   return index === 0 || a[index - 1] === ' ';
82042               }
82043
82044               function suggestionName(name) {
82045                   var nameArray = name.split(' - ');
82046                   if (nameArray.length > 1) {
82047                       name = nameArray.slice(0, nameArray.length - 1).join(' - ');
82048                   }
82049                   return name.toLowerCase();
82050               }
82051
82052
82053               value = value.toLowerCase();
82054
82055               var searchable = filter(this.collection, function(a) {
82056                       return a.searchable !== false && a.suggestion !== true;
82057                   }),
82058                   suggestions = filter(this.collection, function(a) {
82059                       return a.suggestion === true;
82060                   });
82061
82062
82063               // matches value to preset.name
82064               var leading_name = filter(searchable, function(a) {
82065                       return leading(a.name().toLowerCase());
82066                   }).sort(function(a, b) {
82067                       var aCompare = a.name().toLowerCase(),
82068                           bCompare = b.name().toLowerCase(),
82069                           i;
82070
82071                       // priority if search string matches preset name exactly - #4325
82072                       if (value === aCompare) return -1;
82073                       if (value === bCompare) return 1;
82074
82075                       // priority for higher matchScore
82076                       i = b.originalScore - a.originalScore;
82077                       if (i !== 0) return i;
82078
82079                       // priority if search string appears earlier in preset name
82080                       i = aCompare.indexOf(value) - bCompare.indexOf(value);
82081                       if (i !== 0) return i;
82082
82083                       // priority for shorter preset names
82084                       return a.name().length - b.name().length;
82085                   });
82086
82087               // matches value to preset.terms values
82088               var leading_terms = filter(searchable, function(a) {
82089                       return some(a.terms() || [], leading);
82090                   });
82091
82092               // matches value to preset.tags values
82093               var leading_tag_values = filter(searchable, function(a) {
82094                       return some(without(values$1(a.tags || {}), '*'), leading);
82095                   });
82096
82097
82098               // finds close matches to value in preset.name
82099               var similar_name = searchable.map(function(a) {
82100                       return {
82101                           preset: a,
82102                           dist: utilEditDistance(value, a.name())
82103                       };
82104                   }).filter(function(a) {
82105                       return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
82106                   }).sort(function(a, b) {
82107                       return a.dist - b.dist;
82108                   }).map(function(a) {
82109                       return a.preset;
82110                   });
82111
82112               // finds close matches to value in preset.terms
82113               var similar_terms = filter(searchable, function(a) {
82114                       return some(a.terms() || [], function(b) {
82115                           return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
82116                       });
82117                   });
82118
82119               var leading_suggestions = filter(suggestions, function(a) {
82120                       return leading(suggestionName(a.name()));
82121                   }).sort(function(a, b) {
82122                       a = suggestionName(a.name());
82123                       b = suggestionName(b.name());
82124                       var i = a.indexOf(value) - b.indexOf(value);
82125                       if (i === 0) return a.length - b.length;
82126                       else return i;
82127                   });
82128
82129               var similar_suggestions = suggestions.map(function(a) {
82130                       return {
82131                           preset: a,
82132                           dist: utilEditDistance(value, suggestionName(a.name()))
82133                       };
82134                   }).filter(function(a) {
82135                       return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
82136                   }).sort(function(a, b) {
82137                       return a.dist - b.dist;
82138                   }).map(function(a) {
82139                       return a.preset;
82140                   });
82141
82142               var other = presets.item(geometry);
82143
82144               var results = leading_name.concat(
82145                       leading_terms,
82146                       leading_tag_values,
82147                       leading_suggestions.slice(0, maxSuggestionResults + 5),
82148                       similar_name,
82149                       similar_terms,
82150                       similar_suggestions.slice(0, maxSuggestionResults)
82151                   ).slice(0, maxSearchResults - 1);
82152
82153               return presetCollection(uniq(results.concat(other)));
82154           }
82155       };
82156
82157
82158       return presets;
82159   }
82160
82161   function presetCategory(id, category, all) {
82162       category = clone(category);
82163
82164       category.id = id;
82165
82166
82167       category.members = presetCollection(category.members.map(function(id) {
82168           return all.item(id);
82169       }));
82170
82171
82172       category.matchGeometry = function(geometry) {
82173           return category.geometry.indexOf(geometry) >= 0;
82174       };
82175
82176
82177       category.matchScore = function() {
82178           return -1;
82179       };
82180
82181
82182       category.name = function() {
82183           return t('presets.categories.' + id + '.name', {'default': id});
82184       };
82185
82186
82187       category.terms = function() {
82188           return [];
82189       };
82190
82191
82192       return category;
82193   }
82194
82195   function presetField(id, field) {
82196       field = clone(field);
82197
82198       field.id = id;
82199
82200       // for use in classes, element ids, css selectors
82201       field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
82202
82203       field.matchGeometry = function(geometry) {
82204           return !field.geometry || field.geometry === geometry;
82205       };
82206
82207
82208       field.t = function(scope, options) {
82209           return t('presets.fields.' + id + '.' + scope, options);
82210       };
82211
82212
82213       field.label = function() {
82214           return field.t('label', {'default': id});
82215       };
82216
82217
82218       var placeholder = field.placeholder;
82219       field.placeholder = function() {
82220           return field.t('placeholder', {'default': placeholder});
82221       };
82222
82223
82224       return field;
82225   }
82226
82227   function presetPreset(id, preset, fields) {
82228       preset = clone(preset);
82229
82230       preset.id = id;
82231       preset.fields = (preset.fields || []).map(getFields);
82232       preset.geometry = (preset.geometry || []);
82233
82234
82235       function getFields(f) {
82236           return fields[f];
82237       }
82238
82239
82240       preset.matchGeometry = function(geometry) {
82241           return preset.geometry.indexOf(geometry) >= 0;
82242       };
82243
82244
82245       preset.originalScore = preset.matchScore || 1;
82246
82247
82248       preset.matchScore = function(entity) {
82249           var tags = preset.tags,
82250               score = 0;
82251
82252           for (var t$$1 in tags) {
82253               if (entity.tags[t$$1] === tags[t$$1]) {
82254                   score += preset.originalScore;
82255               } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
82256                   score += preset.originalScore / 2;
82257               } else {
82258                   return -1;
82259               }
82260           }
82261
82262           return score;
82263       };
82264
82265
82266       preset.t = function(scope, options) {
82267           return t('presets.presets.' + id + '.' + scope, options);
82268       };
82269
82270
82271       var origName = preset.name || '';
82272       preset.name = function() {
82273           if (preset.suggestion) {
82274               id = id.split('/');
82275               id = id[0] + '/' + id[1];
82276               return origName + ' - ' + t('presets.presets.' + id + '.name');
82277           }
82278           return preset.t('name', { 'default': origName });
82279       };
82280
82281       var origTerms = (preset.terms || []).join();
82282       preset.terms = function() {
82283           return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
82284       };
82285
82286
82287       preset.isFallback = function() {
82288           var tagCount = Object.keys(preset.tags).length;
82289           return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
82290       };
82291
82292
82293       var reference = preset.reference || {};
82294       preset.reference = function(geometry) {
82295           var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
82296               value = reference.value || preset.tags[key];
82297
82298           if (geometry === 'relation' && key === 'type') {
82299               if (value in preset.tags) {
82300                   key = value;
82301                   value = preset.tags[key];
82302               } else {
82303                   return { rtype: value };
82304               }
82305           }
82306
82307           if (value === '*') {
82308               return { key: key };
82309           } else {
82310               return { key: key, value: value };
82311           }
82312       };
82313
82314
82315       var removeTags = preset.removeTags || preset.tags || {};
82316       preset.removeTags = function(tags, geometry) {
82317           tags = omit(tags, keys$1(removeTags));
82318
82319           for (var f in preset.fields) {
82320               var field = preset.fields[f];
82321               if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
82322                   delete tags[field.key];
82323               }
82324           }
82325
82326           delete tags.area;
82327           return tags;
82328       };
82329
82330
82331       var applyTags = preset.addTags || preset.tags || {};
82332       preset.applyTags = function(tags, geometry) {
82333           var k;
82334
82335           tags = clone(tags);
82336
82337           for (k in applyTags) {
82338               if (applyTags[k] === '*') {
82339                   tags[k] = 'yes';
82340               } else {
82341                   tags[k] = applyTags[k];
82342               }
82343           }
82344
82345           // Add area=yes if necessary.
82346           // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
82347           // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
82348           // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
82349           if (!applyTags.hasOwnProperty('area')) {
82350               delete tags.area;
82351               if (geometry === 'area') {
82352                   var needsAreaTag = true;
82353                   if (preset.geometry.indexOf('line') === -1) {
82354                       for (k in applyTags) {
82355                           if (k in areaKeys) {
82356                               needsAreaTag = false;
82357                               break;
82358                           }
82359                       }
82360                   }
82361                   if (needsAreaTag) {
82362                       tags.area = 'yes';
82363                   }
82364               }
82365           }
82366
82367           for (var f in preset.fields) {
82368               var field = preset.fields[f];
82369               if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
82370                   tags[field.key] = field.default;
82371               }
82372           }
82373
82374           return tags;
82375       };
82376
82377
82378       return preset;
82379   }
82380
82381   function presetIndex() {
82382       // a presetCollection with methods for
82383       // loading new data and returning defaults
82384
82385       var all = presetCollection([]);
82386       var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
82387       var _fields = {};
82388       var _universal = [];
82389       var _recent = presetCollection([]);
82390
82391       // Index of presets by (geometry, tag key).
82392       var _index = {
82393           point: {},
82394           vertex: {},
82395           line: {},
82396           area: {},
82397           relation: {}
82398       };
82399
82400       all.match = function(entity, resolver) {
82401           var geometry = entity.geometry(resolver);
82402           var address;
82403
82404           // Treat entities on addr:interpolation lines as points, not vertices - #3241
82405           if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
82406               geometry = 'point';
82407           }
82408
82409           var geometryMatches = _index[geometry];
82410           var best = -1;
82411           var match;
82412
82413           for (var k in entity.tags) {
82414               // If any part of an address is present,
82415               // allow fallback to "Address" preset - #4353
82416               if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
82417                   address = geometryMatches['addr:*'][0];
82418               }
82419
82420               var keyMatches = geometryMatches[k];
82421               if (!keyMatches) continue;
82422
82423               for (var i = 0; i < keyMatches.length; i++) {
82424                   var score = keyMatches[i].matchScore(entity);
82425                   if (score > best) {
82426                       best = score;
82427                       match = keyMatches[i];
82428                   }
82429               }
82430           }
82431
82432           if (address && (!match || match.isFallback())) {
82433               match = address;
82434           }
82435
82436           return match || all.item(geometry);
82437       };
82438
82439
82440       // Because of the open nature of tagging, iD will never have a complete
82441       // list of tags used in OSM, so we want it to have logic like "assume
82442       // that a closed way with an amenity tag is an area, unless the amenity
82443       // is one of these specific types". This function computes a structure
82444       // that allows testing of such conditions, based on the presets designated
82445       // as as supporting (or not supporting) the area geometry.
82446       //
82447       // The returned object L is a whitelist/blacklist of tags. A closed way
82448       // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
82449       // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
82450       // and the subkeys form the blacklist.
82451       all.areaKeys = function() {
82452           var areaKeys = {};
82453           var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
82454           var presets = reject(all.collection, 'suggestion');
82455
82456           // whitelist
82457           presets.forEach(function(d) {
82458               for (var key in d.tags) break;
82459               if (!key) return;
82460               if (ignore.indexOf(key) !== -1) return;
82461
82462               if (d.geometry.indexOf('area') !== -1) {    // probably an area..
82463                   areaKeys[key] = areaKeys[key] || {};
82464               }
82465           });
82466
82467           // blacklist
82468           presets.forEach(function(d) {
82469               for (var key in d.tags) break;
82470               if (!key) return;
82471               if (ignore.indexOf(key) !== -1) return;
82472
82473               var value = d.tags[key];
82474               if (key in areaKeys &&                      // probably an area...
82475                   d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
82476                   value !== '*') {
82477                   areaKeys[key][value] = true;
82478               }
82479           });
82480
82481           return areaKeys;
82482       };
82483
82484
82485       all.init = function() {
82486           var d = data.presets;
82487
82488           all.collection = [];
82489           _recent.collection = [];
82490           _fields = {};
82491           _universal = [];
82492           _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
82493
82494           if (d.fields) {
82495               forEach(d.fields, function(d, id) {
82496                   _fields[id] = presetField(id, d);
82497                   if (d.universal) {
82498                       _universal.push(_fields[id]);
82499                   }
82500               });
82501           }
82502
82503           if (d.presets) {
82504               forEach(d.presets, function(d, id) {
82505                   all.collection.push(presetPreset(id, d, _fields));
82506               });
82507           }
82508
82509           if (d.categories) {
82510               forEach(d.categories, function(d, id) {
82511                   all.collection.push(presetCategory(id, d, all));
82512               });
82513           }
82514
82515           if (d.defaults) {
82516               var getItem = bind$2(all.item, all);
82517               _defaults = {
82518                   area: presetCollection(d.defaults.area.map(getItem)),
82519                   line: presetCollection(d.defaults.line.map(getItem)),
82520                   point: presetCollection(d.defaults.point.map(getItem)),
82521                   vertex: presetCollection(d.defaults.vertex.map(getItem)),
82522                   relation: presetCollection(d.defaults.relation.map(getItem))
82523               };
82524           }
82525
82526           for (var i = 0; i < all.collection.length; i++) {
82527               var preset = all.collection[i];
82528               var geometry = preset.geometry;
82529
82530               for (var j = 0; j < geometry.length; j++) {
82531                   var g = _index[geometry[j]];
82532                   for (var k in preset.tags) {
82533                       (g[k] = g[k] || []).push(preset);
82534                   }
82535               }
82536           }
82537
82538           return all;
82539       };
82540
82541       all.field = function(id) {
82542           return _fields[id];
82543       };
82544
82545       all.universal = function() {
82546           return _universal;
82547       };
82548
82549       all.defaults = function(geometry, n) {
82550           var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
82551           var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
82552           return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
82553       };
82554
82555       all.choose = function(preset) {
82556           _recent = presetCollection(uniq([preset].concat(_recent.collection)));
82557           return all;
82558       };
82559
82560       return all;
82561   }
82562
82563   var areaKeys = {};
82564
82565   function setAreaKeys(value) {
82566       areaKeys = value;
82567   }
82568
82569
82570   function coreContext() {
82571       var context = {};
82572       context.version = '2.11.1';
82573
82574       // create a special translation that contains the keys in place of the strings
82575       var tkeys = cloneDeep(en);
82576       var parents = [];
82577
82578       function traverser(v, k, obj) {
82579           parents.push(k);
82580           if (isObject(v)) {
82581               forOwn(v, traverser);
82582           } else if (isString(v)) {
82583               obj[k] = parents.join('.');
82584           }
82585           parents.pop();
82586       }
82587
82588       forOwn(tkeys, traverser);
82589       addTranslation('_tkeys_', tkeys);
82590
82591       addTranslation('en', en);
82592       setLocale('en');
82593
82594       var dispatch$$1 = dispatch('enter', 'exit', 'change');
82595
82596       // https://github.com/openstreetmap/iD/issues/772
82597       // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
82598       var storage;
82599       try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
82600       storage = storage || (function() {
82601           var s = {};
82602           return {
82603               getItem: function(k) { return s[k]; },
82604               setItem: function(k, v) { s[k] = v; },
82605               removeItem: function(k) { delete s[k]; }
82606           };
82607       })();
82608
82609       context.storage = function(k, v) {
82610           try {
82611               if (arguments.length === 1) return storage.getItem(k);
82612               else if (v === null) storage.removeItem(k);
82613               else storage.setItem(k, v);
82614           } catch (e) {
82615               // localstorage quota exceeded
82616               /* eslint-disable no-console */
82617               if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
82618               /* eslint-enable no-console */
82619           }
82620       };
82621
82622
82623       /* Straight accessors. Avoid using these if you can. */
82624       var ui, connection, history;
82625       context.ui = function() { return ui; };
82626       context.connection = function() { return connection; };
82627       context.history = function() { return history; };
82628
82629
82630       /* Connection */
82631       context.preauth = function(options) {
82632           if (connection) {
82633               connection.switch(options);
82634           }
82635           return context;
82636       };
82637
82638       context.loadTiles = utilCallWhenIdle(function(projection, callback) {
82639           var cid;
82640           function done(err, result) {
82641               if (connection.getConnectionId() !== cid) {
82642                   if (callback) callback({ message: 'Connection Switched', status: -1 });
82643                   return;
82644               }
82645               if (!err) history.merge(result.data, result.extent);
82646               if (callback) callback(err, result);
82647           }
82648           if (connection && context.editable()) {
82649               cid = connection.getConnectionId();
82650               connection.loadTiles(projection, done);
82651           }
82652       });
82653
82654       context.loadEntity = function(entityID, callback) {
82655           var cid;
82656           function done(err, result) {
82657               if (connection.getConnectionId() !== cid) {
82658                   if (callback) callback({ message: 'Connection Switched', status: -1 });
82659                   return;
82660               }
82661               if (!err) history.merge(result.data, result.extent);
82662               if (callback) callback(err, result);
82663           }
82664           if (connection) {
82665               cid = connection.getConnectionId();
82666               connection.loadEntity(entityID, done);
82667           }
82668       };
82669
82670       context.zoomToEntity = function(entityID, zoomTo) {
82671           if (zoomTo !== false) {
82672               this.loadEntity(entityID, function(err, result) {
82673                   if (err) return;
82674                   var entity = find$1(result.data, function(e) { return e.id === entityID; });
82675                   if (entity) { map.zoomTo(entity); }
82676               });
82677           }
82678
82679           map.on('drawn.zoomToEntity', function() {
82680               if (!context.hasEntity(entityID)) return;
82681               map.on('drawn.zoomToEntity', null);
82682               context.on('enter.zoomToEntity', null);
82683               context.enter(modeSelect(context, [entityID]));
82684           });
82685
82686           context.on('enter.zoomToEntity', function() {
82687               if (mode.id !== 'browse') {
82688                   map.on('drawn.zoomToEntity', null);
82689                   context.on('enter.zoomToEntity', null);
82690               }
82691           });
82692       };
82693
82694       var minEditableZoom = 16;
82695       context.minEditableZoom = function(_) {
82696           if (!arguments.length) return minEditableZoom;
82697           minEditableZoom = _;
82698           if (connection) {
82699               connection.tileZoom(_);
82700           }
82701           return context;
82702       };
82703
82704
82705       /* History */
82706       var inIntro = false;
82707       context.inIntro = function(_) {
82708           if (!arguments.length) return inIntro;
82709           inIntro = _;
82710           return context;
82711       };
82712
82713       context.save = function() {
82714           // no history save, no message onbeforeunload
82715           if (inIntro || select('.modal').size()) return;
82716
82717           var canSave;
82718           if (mode && mode.id === 'save') {
82719               canSave = false;
82720
82721               // Attempt to prevent user from creating duplicate changes - see #5200
82722               if (services.osm && services.osm.isChangesetInflight()) {
82723                   history.clearSaved();
82724                   return;
82725               }
82726
82727           } else {
82728               canSave = context.selectedIDs().every(function(id) {
82729                   var entity = context.hasEntity(id);
82730                   return entity && !entity.isDegenerate();
82731               });
82732           }
82733
82734           if (canSave) {
82735               history.save();
82736           }
82737           if (history.hasChanges()) {
82738               return t('save.unsaved_changes');
82739           }
82740       };
82741
82742
82743       /* Graph */
82744       context.hasEntity = function(id) {
82745           return history.graph().hasEntity(id);
82746       };
82747       context.entity = function(id) {
82748           return history.graph().entity(id);
82749       };
82750       context.childNodes = function(way) {
82751           return history.graph().childNodes(way);
82752       };
82753       context.geometry = function(id) {
82754           return context.entity(id).geometry(history.graph());
82755       };
82756
82757
82758       /* Modes */
82759       var mode;
82760       context.mode = function() {
82761           return mode;
82762       };
82763       context.enter = function(newMode) {
82764           if (mode) {
82765               mode.exit();
82766               dispatch$$1.call('exit', this, mode);
82767           }
82768
82769           mode = newMode;
82770           mode.enter();
82771           dispatch$$1.call('enter', this, mode);
82772       };
82773
82774       context.selectedIDs = function() {
82775           if (mode && mode.selectedIDs) {
82776               return mode.selectedIDs();
82777           } else {
82778               return [];
82779           }
82780       };
82781
82782       context.activeID = function() {
82783           return mode && mode.activeID && mode.activeID();
82784       };
82785
82786       var _selectedNoteID;
82787       context.selectedNoteID = function(noteID) {
82788           if (!arguments.length) return _selectedNoteID;
82789           _selectedNoteID = noteID;
82790           return context;
82791       };
82792
82793
82794       /* Behaviors */
82795       context.install = function(behavior) {
82796           context.surface().call(behavior);
82797       };
82798       context.uninstall = function(behavior) {
82799           context.surface().call(behavior.off);
82800       };
82801
82802
82803       /* Copy/Paste */
82804       var copyIDs = [], copyGraph;
82805       context.copyGraph = function() { return copyGraph; };
82806       context.copyIDs = function(_) {
82807           if (!arguments.length) return copyIDs;
82808           copyIDs = _;
82809           copyGraph = history.graph();
82810           return context;
82811       };
82812
82813
82814       /* Background */
82815       var background;
82816       context.background = function() { return background; };
82817
82818
82819       /* Features */
82820       var features;
82821       context.features = function() { return features; };
82822       context.hasHiddenConnections = function(id) {
82823           var graph = history.graph(),
82824               entity = graph.entity(id);
82825           return features.hasHiddenConnections(entity, graph);
82826       };
82827
82828
82829       /* Presets */
82830       var presets;
82831       context.presets = function() { return presets; };
82832
82833
82834       /* Map */
82835       var map;
82836       context.map = function() { return map; };
82837       context.layers = function() { return map.layers; };
82838       context.surface = function() { return map.surface; };
82839       context.editable = function() { return map.editable(); };
82840       context.surfaceRect = function() {
82841           return map.surface.node().getBoundingClientRect();
82842       };
82843
82844
82845       /* Debug */
82846       var debugFlags = {
82847           tile: false,        // tile boundaries
82848           collision: false,   // label collision bounding boxes
82849           imagery: false,     // imagery bounding polygons
82850           community: false,   // community bounding polygons
82851           imperial: false,    // imperial (not metric) bounding polygons
82852           driveLeft: false,   // driveLeft bounding polygons
82853           target: false       // touch targets
82854       };
82855       context.debugFlags = function() {
82856           return debugFlags;
82857       };
82858       context.setDebug = function(flag, val) {
82859           if (arguments.length === 1) val = true;
82860           debugFlags[flag] = val;
82861           dispatch$$1.call('change');
82862           return context;
82863       };
82864       context.getDebug = function(flag) {
82865           return flag && debugFlags[flag];
82866       };
82867
82868
82869       /* Container */
82870       var container = select(document.body);
82871       context.container = function(_) {
82872           if (!arguments.length) return container;
82873           container = _;
82874           container.classed('id-container', true);
82875           return context;
82876       };
82877       var embed;
82878       context.embed = function(_) {
82879           if (!arguments.length) return embed;
82880           embed = _;
82881           return context;
82882       };
82883
82884
82885       /* Assets */
82886       var assetPath = '';
82887       context.assetPath = function(_) {
82888           if (!arguments.length) return assetPath;
82889           assetPath = _;
82890           return context;
82891       };
82892
82893       var assetMap = {};
82894       context.assetMap = function(_) {
82895           if (!arguments.length) return assetMap;
82896           assetMap = _;
82897           return context;
82898       };
82899
82900       context.asset = function(_) {
82901           var filename = assetPath + _;
82902           return assetMap[filename] || filename;
82903       };
82904
82905       context.imagePath = function(_) {
82906           return context.asset('img/' + _);
82907       };
82908
82909
82910       /* locales */
82911       // `locale` variable contains a "requested locale".
82912       // It won't become the `currentLocale` until after loadLocale() is called.
82913       var locale, localePath;
82914
82915       context.locale = function(loc, path) {
82916           if (!arguments.length) return currentLocale;
82917           locale = loc;
82918           localePath = path;
82919           return context;
82920       };
82921
82922       context.loadLocale = function(callback) {
82923           if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
82924               localePath = localePath || context.asset('locales/' + locale + '.json');
82925               d3_json(localePath, function(err, result) {
82926                   if (!err) {
82927                       addTranslation(locale, result[locale]);
82928                       setLocale(locale);
82929                       utilDetect(true);
82930                   }
82931                   if (callback) {
82932                       callback(err);
82933                   }
82934               });
82935           } else {
82936               if (locale) {
82937                   setLocale(locale);
82938                   utilDetect(true);
82939               }
82940               if (callback) {
82941                   callback();
82942               }
82943           }
82944       };
82945
82946
82947       /* reset (aka flush) */
82948       context.reset = context.flush = function() {
82949           context.debouncedSave.cancel();
82950           forEach(services, function(service) {
82951               if (service && typeof service.reset === 'function') {
82952                   service.reset(context);
82953               }
82954           });
82955           features.reset();
82956           history.reset();
82957           return context;
82958       };
82959
82960
82961       /* Init */
82962
82963       context.projection = geoRawMercator();
82964       context.curtainProjection = geoRawMercator();
82965
82966       locale = utilDetect().locale;
82967       if (locale && !dataLocales.hasOwnProperty(locale)) {
82968           locale = locale.split('-')[0];
82969       }
82970
82971       history = coreHistory(context);
82972       context.graph = history.graph;
82973       context.changes = history.changes;
82974       context.intersects = history.intersects;
82975
82976       // Debounce save, since it's a synchronous localStorage write,
82977       // and history changes can happen frequently (e.g. when dragging).
82978       context.debouncedSave = debounce(context.save, 350);
82979       function withDebouncedSave(fn) {
82980           return function() {
82981               var result = fn.apply(history, arguments);
82982               context.debouncedSave();
82983               return result;
82984           };
82985       }
82986
82987       context.perform = withDebouncedSave(history.perform);
82988       context.replace = withDebouncedSave(history.replace);
82989       context.pop = withDebouncedSave(history.pop);
82990       context.overwrite = withDebouncedSave(history.overwrite);
82991       context.undo = withDebouncedSave(history.undo);
82992       context.redo = withDebouncedSave(history.redo);
82993
82994       ui = uiInit(context);
82995
82996       connection = services.osm;
82997       background = rendererBackground(context);
82998       features = rendererFeatures(context);
82999       presets = presetIndex();
83000
83001       map = rendererMap(context);
83002       context.mouse = map.mouse;
83003       context.extent = map.extent;
83004       context.pan = map.pan;
83005       context.zoomIn = map.zoomIn;
83006       context.zoomOut = map.zoomOut;
83007       context.zoomInFurther = map.zoomInFurther;
83008       context.zoomOutFurther = map.zoomOutFurther;
83009       context.redrawEnable = map.redrawEnable;
83010
83011       forEach(services, function(service) {
83012           if (service && typeof service.init === 'function') {
83013               service.init(context);
83014           }
83015       });
83016
83017       background.init();
83018       features.init();
83019       presets.init();
83020       areaKeys = presets.areaKeys();
83021
83022
83023       return utilRebind(context, dispatch$$1, 'on');
83024   }
83025
83026   function osmWay() {
83027       if (!(this instanceof osmWay)) {
83028           return (new osmWay()).initialize(arguments);
83029       } else if (arguments.length) {
83030           this.initialize(arguments);
83031       }
83032   }
83033
83034
83035   osmEntity$$1.way = osmWay;
83036
83037   osmWay.prototype = Object.create(osmEntity$$1.prototype);
83038
83039
83040   assignIn(osmWay.prototype, {
83041       type: 'way',
83042       nodes: [],
83043
83044
83045       copy: function(resolver, copies) {
83046           if (copies[this.id]) return copies[this.id];
83047
83048           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
83049
83050           var nodes = this.nodes.map(function(id) {
83051               return resolver.entity(id).copy(resolver, copies).id;
83052           });
83053
83054           copy = copy.update({ nodes: nodes });
83055           copies[this.id] = copy;
83056
83057           return copy;
83058       },
83059
83060
83061       extent: function(resolver) {
83062           return resolver.transient(this, 'extent', function() {
83063               var extent = geoExtent$$1();
83064               for (var i = 0; i < this.nodes.length; i++) {
83065                   var node = resolver.hasEntity(this.nodes[i]);
83066                   if (node) {
83067                       extent._extend(node.extent());
83068                   }
83069               }
83070               return extent;
83071           });
83072       },
83073
83074
83075       first: function() {
83076           return this.nodes[0];
83077       },
83078
83079
83080       last: function() {
83081           return this.nodes[this.nodes.length - 1];
83082       },
83083
83084
83085       contains: function(node) {
83086           return this.nodes.indexOf(node) >= 0;
83087       },
83088
83089
83090       affix: function(node) {
83091           if (this.nodes[0] === node) return 'prefix';
83092           if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
83093       },
83094
83095
83096       layer: function() {
83097           // explicit layer tag, clamp between -10, 10..
83098           if (isFinite(this.tags.layer)) {
83099               return Math.max(-10, Math.min(+(this.tags.layer), 10));
83100           }
83101
83102           // implied layer tag..
83103           if (this.tags.covered === 'yes') return -1;
83104           if (this.tags.location === 'overground') return 1;
83105           if (this.tags.location === 'underground') return -1;
83106           if (this.tags.location === 'underwater') return -10;
83107
83108           if (this.tags.power === 'line') return 10;
83109           if (this.tags.power === 'minor_line') return 10;
83110           if (this.tags.aerialway) return 10;
83111           if (this.tags.bridge) return 1;
83112           if (this.tags.cutting) return -1;
83113           if (this.tags.tunnel) return -1;
83114           if (this.tags.waterway) return -1;
83115           if (this.tags.man_made === 'pipeline') return -10;
83116           if (this.tags.boundary) return -10;
83117           return 0;
83118       },
83119
83120
83121       isOneWay: function() {
83122           // explicit oneway tag..
83123           var values = {
83124               'yes': true,
83125               '1': true,
83126               '-1': true,
83127               'reversible': true,
83128               'alternating': true,
83129               'no': false,
83130               '0': false
83131           };
83132           if (values[this.tags.oneway] !== undefined) {
83133               return values[this.tags.oneway];
83134           }
83135
83136           // implied oneway tag..
83137           for (var key in this.tags) {
83138               if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
83139                   return true;
83140           }
83141           return false;
83142       },
83143
83144
83145       lanes: function() {
83146           return osmLanes(this);
83147       },
83148
83149
83150       isClosed: function() {
83151           return this.nodes.length > 1 && this.first() === this.last();
83152       },
83153
83154
83155       isConvex: function(resolver) {
83156           if (!this.isClosed() || this.isDegenerate()) return null;
83157
83158           var nodes = uniq(resolver.childNodes(this));
83159           var coords = map$3(nodes, 'loc');
83160           var curr = 0;
83161           var prev = 0;
83162
83163           for (var i = 0; i < coords.length; i++) {
83164               var o = coords[(i+1) % coords.length];
83165               var a = coords[i];
83166               var b = coords[(i+2) % coords.length];
83167               var res = geoVecCross(a, b, o);
83168
83169               curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
83170               if (curr === 0) {
83171                   continue;
83172               } else if (prev && curr !== prev) {
83173                   return false;
83174               }
83175               prev = curr;
83176           }
83177           return true;
83178       },
83179
83180
83181       isArea: function() {
83182           // `highway` and `railway` are typically linear features, but there
83183           // are a few exceptions that should be treated as areas, even in the
83184           // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
83185           var lineKeys = {
83186               highway: {
83187                   rest_area: true,
83188                   services: true
83189               },
83190               railway: {
83191                   roundhouse: true,
83192                   station: true,
83193                   traverser: true,
83194                   turntable: true,
83195                   wash: true
83196               }
83197           };
83198
83199           if (this.tags.area === 'yes')
83200               return true;
83201           if (!this.isClosed() || this.tags.area === 'no')
83202               return false;
83203           for (var key in this.tags) {
83204               if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
83205                   return true;
83206               }
83207               if (key in lineKeys && this.tags[key] in lineKeys[key]) {
83208                   return true;
83209               }
83210           }
83211           return false;
83212       },
83213
83214
83215       isDegenerate: function() {
83216           return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
83217       },
83218
83219
83220       areAdjacent: function(n1, n2) {
83221           for (var i = 0; i < this.nodes.length; i++) {
83222               if (this.nodes[i] === n1) {
83223                   if (this.nodes[i - 1] === n2) return true;
83224                   if (this.nodes[i + 1] === n2) return true;
83225               }
83226           }
83227           return false;
83228       },
83229
83230
83231       geometry: function(graph) {
83232           return graph.transient(this, 'geometry', function() {
83233               return this.isArea() ? 'area' : 'line';
83234           });
83235       },
83236
83237
83238       // If this way is not closed, append the beginning node to the end of the nodelist to close it.
83239       close: function() {
83240           if (this.isClosed() || !this.nodes.length) return this;
83241
83242           var nodes = this.nodes.slice();
83243           nodes = nodes.filter(noRepeatNodes);
83244           nodes.push(nodes[0]);
83245           return this.update({ nodes: nodes });
83246       },
83247
83248
83249       // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
83250       unclose: function() {
83251           if (!this.isClosed()) return this;
83252
83253           var nodes = this.nodes.slice();
83254           var connector = this.first();
83255           var i = nodes.length - 1;
83256
83257           // remove trailing connectors..
83258           while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
83259               nodes.splice(i, 1);
83260               i = nodes.length - 1;
83261           }
83262
83263           nodes = nodes.filter(noRepeatNodes);
83264           return this.update({ nodes: nodes });
83265       },
83266
83267
83268       // Adds a node (id) in front of the node which is currently at position index.
83269       // If index is undefined, the node will be added to the end of the way for linear ways,
83270       //   or just before the final connecting node for circular ways.
83271       // Consecutive duplicates are eliminated including existing ones.
83272       // Circularity is always preserved when adding a node.
83273       addNode: function(id, index) {
83274           var nodes = this.nodes.slice();
83275           var isClosed = this.isClosed();
83276           var max = isClosed ? nodes.length - 1 : nodes.length;
83277
83278           if (index === undefined) {
83279               index = max;
83280           }
83281
83282           if (index < 0 || index > max) {
83283               throw new RangeError('index ' + index + ' out of range 0..' + max);
83284           }
83285
83286           // If this is a closed way, remove all connector nodes except the first one
83287           // (there may be duplicates) and adjust index if necessary..
83288           if (isClosed) {
83289               var connector = this.first();
83290
83291               // leading connectors..
83292               var i = 1;
83293               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
83294                   nodes.splice(i, 1);
83295                   if (index > i) index--;
83296               }
83297
83298               // trailing connectors..
83299               i = nodes.length - 1;
83300               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
83301                   nodes.splice(i, 1);
83302                   if (index > i) index--;
83303                   i = nodes.length - 1;
83304               }
83305           }
83306
83307           nodes.splice(index, 0, id);
83308           nodes = nodes.filter(noRepeatNodes);
83309
83310           // If the way was closed before, append a connector node to keep it closed..
83311           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
83312               nodes.push(nodes[0]);
83313           }
83314
83315           return this.update({ nodes: nodes });
83316       },
83317
83318
83319       // Replaces the node which is currently at position index with the given node (id).
83320       // Consecutive duplicates are eliminated including existing ones.
83321       // Circularity is preserved when updating a node.
83322       updateNode: function(id, index) {
83323           var nodes = this.nodes.slice();
83324           var isClosed = this.isClosed();
83325           var max = nodes.length - 1;
83326
83327           if (index === undefined || index < 0 || index > max) {
83328               throw new RangeError('index ' + index + ' out of range 0..' + max);
83329           }
83330
83331           // If this is a closed way, remove all connector nodes except the first one
83332           // (there may be duplicates) and adjust index if necessary..
83333           if (isClosed) {
83334               var connector = this.first();
83335
83336               // leading connectors..
83337               var i = 1;
83338               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
83339                   nodes.splice(i, 1);
83340                   if (index > i) index--;
83341               }
83342
83343               // trailing connectors..
83344               i = nodes.length - 1;
83345               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
83346                   nodes.splice(i, 1);
83347                   if (index === i) index = 0;  // update leading connector instead
83348                   i = nodes.length - 1;
83349               }
83350           }
83351
83352           nodes.splice(index, 1, id);
83353           nodes = nodes.filter(noRepeatNodes);
83354
83355           // If the way was closed before, append a connector node to keep it closed..
83356           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
83357               nodes.push(nodes[0]);
83358           }
83359
83360           return this.update({nodes: nodes});
83361       },
83362
83363
83364       // Replaces each occurrence of node id needle with replacement.
83365       // Consecutive duplicates are eliminated including existing ones.
83366       // Circularity is preserved.
83367       replaceNode: function(needleID, replacementID) {
83368           var nodes = this.nodes.slice();
83369           var isClosed = this.isClosed();
83370
83371           for (var i = 0; i < nodes.length; i++) {
83372               if (nodes[i] === needleID) {
83373                   nodes[i] = replacementID;
83374               }
83375           }
83376
83377           nodes = nodes.filter(noRepeatNodes);
83378
83379           // If the way was closed before, append a connector node to keep it closed..
83380           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
83381               nodes.push(nodes[0]);
83382           }
83383
83384           return this.update({nodes: nodes});
83385       },
83386
83387
83388       // Removes each occurrence of node id.
83389       // Consecutive duplicates are eliminated including existing ones.
83390       // Circularity is preserved.
83391       removeNode: function(id) {
83392           var nodes = this.nodes.slice();
83393           var isClosed = this.isClosed();
83394
83395           nodes = nodes
83396               .filter(function(node) { return node !== id; })
83397               .filter(noRepeatNodes);
83398
83399           // If the way was closed before, append a connector node to keep it closed..
83400           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
83401               nodes.push(nodes[0]);
83402           }
83403
83404           return this.update({nodes: nodes});
83405       },
83406
83407
83408       asJXON: function(changeset_id) {
83409           var r = {
83410               way: {
83411                   '@id': this.osmId(),
83412                   '@version': this.version || 0,
83413                   nd: map$3(this.nodes, function(id) {
83414                       return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
83415                   }),
83416                   tag: map$3(this.tags, function(v, k) {
83417                       return { keyAttributes: { k: k, v: v } };
83418                   })
83419               }
83420           };
83421           if (changeset_id) {
83422               r.way['@changeset'] = changeset_id;
83423           }
83424           return r;
83425       },
83426
83427
83428       asGeoJSON: function(resolver) {
83429           return resolver.transient(this, 'GeoJSON', function() {
83430               var coordinates = map$3(resolver.childNodes(this), 'loc');
83431               if (this.isArea() && this.isClosed()) {
83432                   return {
83433                       type: 'Polygon',
83434                       coordinates: [coordinates]
83435                   };
83436               } else {
83437                   return {
83438                       type: 'LineString',
83439                       coordinates: coordinates
83440                   };
83441               }
83442           });
83443       },
83444
83445
83446       area: function(resolver) {
83447           return resolver.transient(this, 'area', function() {
83448               var nodes = resolver.childNodes(this);
83449
83450               var json = {
83451                   type: 'Polygon',
83452                   coordinates: [map$3(nodes, 'loc')]
83453               };
83454
83455               if (!this.isClosed() && nodes.length) {
83456                   json.coordinates[0].push(nodes[0].loc);
83457               }
83458
83459               var area = d3_geoArea(json);
83460
83461               // Heuristic for detecting counterclockwise winding order. Assumes
83462               // that OpenStreetMap polygons are not hemisphere-spanning.
83463               if (area > 2 * Math.PI) {
83464                   json.coordinates[0] = json.coordinates[0].reverse();
83465                   area = d3_geoArea(json);
83466               }
83467
83468               return isNaN(area) ? 0 : area;
83469           });
83470       }
83471   });
83472
83473
83474   // Filter function to eliminate consecutive duplicates.
83475   function noRepeatNodes(node, i, arr) {
83476       return i === 0 || node !== arr[i - 1];
83477   }
83478
83479   // For fixing up rendering of multipolygons with tags on the outer member.
83480   // https://github.com/openstreetmap/iD/issues/613
83481   function osmIsSimpleMultipolygonOuterMember(entity, graph) {
83482       if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
83483           return false;
83484
83485       var parents = graph.parentRelations(entity);
83486       if (parents.length !== 1)
83487           return false;
83488
83489       var parent = parents[0];
83490       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
83491           return false;
83492
83493       var members = parent.members, member;
83494       for (var i = 0; i < members.length; i++) {
83495           member = members[i];
83496           if (member.id === entity.id && member.role && member.role !== 'outer')
83497               return false; // Not outer member
83498           if (member.id !== entity.id && (!member.role || member.role === 'outer'))
83499               return false; // Not a simple multipolygon
83500       }
83501
83502       return parent;
83503   }
83504
83505
83506   function osmSimpleMultipolygonOuterMember(entity, graph) {
83507       if (entity.type !== 'way')
83508           return false;
83509
83510       var parents = graph.parentRelations(entity);
83511       if (parents.length !== 1)
83512           return false;
83513
83514       var parent = parents[0];
83515       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
83516           return false;
83517
83518       var members = parent.members, member, outerMember;
83519       for (var i = 0; i < members.length; i++) {
83520           member = members[i];
83521           if (!member.role || member.role === 'outer') {
83522               if (outerMember)
83523                   return false; // Not a simple multipolygon
83524               outerMember = member;
83525           }
83526       }
83527
83528       if (!outerMember)
83529           return false;
83530
83531       var outerEntity = graph.hasEntity(outerMember.id);
83532       if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
83533           return false;
83534
83535       return outerEntity;
83536   }
83537
83538
83539   // Join `toJoin` array into sequences of connecting ways.
83540
83541   // Segments which share identical start/end nodes will, as much as possible,
83542   // be connected with each other.
83543   //
83544   // The return value is a nested array. Each constituent array contains elements
83545   // of `toJoin` which have been determined to connect.
83546   //
83547   // Each consitituent array also has a `nodes` property whose value is an
83548   // ordered array of member nodes, with appropriate order reversal and
83549   // start/end coordinate de-duplication.
83550   //
83551   // Members of `toJoin` must have, at minimum, `type` and `id` properties.
83552   // Thus either an array of `osmWay`s or a relation member array may be used.
83553   //
83554   // If an member is an `osmWay`, its tags and childnodes may be reversed via
83555   // `actionReverse` in the output.
83556   //
83557   // The returned sequences array also has an `actions` array property, containing
83558   // any reversal actions that should be applied to the graph, should the calling
83559   // code attempt to actually join the given ways.
83560   //
83561   // Incomplete members (those for which `graph.hasEntity(element.id)` returns
83562   // false) and non-way members are ignored.
83563   //
83564   function osmJoinWays(toJoin, graph) {
83565       function resolve(member) {
83566           return graph.childNodes(graph.entity(member.id));
83567       }
83568
83569       function reverse(item) {
83570           var action = actionReverse(item.id, { reverseOneway: true });
83571           sequences.actions.push(action);
83572           return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
83573       }
83574
83575       // make a copy containing only the items to join
83576       toJoin = toJoin.filter(function(member) {
83577           return member.type === 'way' && graph.hasEntity(member.id);
83578       });
83579
83580       // Are the things we are joining relation members or `osmWays`?
83581       // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
83582       var i;
83583       var joinAsMembers = true;
83584       for (i = 0; i < toJoin.length; i++) {
83585           if (toJoin[i] instanceof osmWay) {
83586               joinAsMembers = false;
83587               break;
83588           }
83589       }
83590
83591       var sequences = [];
83592       sequences.actions = [];
83593
83594       while (toJoin.length) {
83595           // start a new sequence
83596           var item = toJoin.shift();
83597           var currWays = [item];
83598           var currNodes = resolve(item).slice();
83599           var doneSequence = false;
83600
83601           // add to it
83602           while (toJoin.length && !doneSequence) {
83603               var start = currNodes[0];
83604               var end = currNodes[currNodes.length - 1];
83605               var fn = null;
83606               var nodes = null;
83607
83608               // Find the next way/member to join.
83609               for (i = 0; i < toJoin.length; i++) {
83610                   item = toJoin[i];
83611                   nodes = resolve(item);
83612
83613                   // (for member ordering only, not way ordering - see #4872)
83614                   // Strongly prefer to generate a forward path that preserves the order
83615                   // of the members array. For multipolygons and most relations, member
83616                   // order does not matter - but for routes, it does. (see #4589)
83617                   // If we started this sequence backwards (i.e. next member way attaches to
83618                   // the start node and not the end node), reverse the initial way before continuing.
83619                   if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
83620                       (nodes[nodes.length - 1] === start || nodes[0] === start)
83621                   ) {
83622                       currWays[0] = reverse(currWays[0]);
83623                       currNodes.reverse();
83624                       start = currNodes[0];
83625                       end = currNodes[currNodes.length - 1];
83626                   }
83627
83628                   if (nodes[0] === end) {
83629                       fn = currNodes.push;               // join to end
83630                       nodes = nodes.slice(1);
83631                       break;
83632                   } else if (nodes[nodes.length - 1] === end) {
83633                       fn = currNodes.push;               // join to end
83634                       nodes = nodes.slice(0, -1).reverse();
83635                       item = reverse(item);
83636                       break;
83637                   } else if (nodes[nodes.length - 1] === start) {
83638                       fn = currNodes.unshift;            // join to beginning
83639                       nodes = nodes.slice(0, -1);
83640                       break;
83641                   } else if (nodes[0] === start) {
83642                       fn = currNodes.unshift;            // join to beginning
83643                       nodes = nodes.slice(1).reverse();
83644                       item = reverse(item);
83645                       break;
83646                   } else {
83647                       fn = nodes = null;
83648                   }
83649               }
83650
83651               if (!nodes) {     // couldn't find a joinable way/member
83652                   doneSequence = true;
83653                   break;
83654               }
83655
83656               fn.apply(currWays, [item]);
83657               fn.apply(currNodes, nodes);
83658
83659               toJoin.splice(i, 1);
83660           }
83661
83662           currWays.nodes = currNodes;
83663           sequences.push(currWays);
83664       }
83665
83666       return sequences;
83667   }
83668
83669   function osmRelation() {
83670       if (!(this instanceof osmRelation)) {
83671           return (new osmRelation()).initialize(arguments);
83672       } else if (arguments.length) {
83673           this.initialize(arguments);
83674       }
83675   }
83676
83677
83678   osmEntity$$1.relation = osmRelation;
83679
83680   osmRelation.prototype = Object.create(osmEntity$$1.prototype);
83681
83682
83683   osmRelation.creationOrder = function(a, b) {
83684       var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
83685       var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
83686
83687       if (aId < 0 || bId < 0) return aId - bId;
83688       return bId - aId;
83689   };
83690
83691
83692   assignIn(osmRelation.prototype, {
83693       type: 'relation',
83694       members: [],
83695
83696
83697       copy: function(resolver, copies) {
83698           if (copies[this.id]) return copies[this.id];
83699
83700           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
83701
83702           var members = this.members.map(function(member) {
83703               return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
83704           });
83705
83706           copy = copy.update({members: members});
83707           copies[this.id] = copy;
83708
83709           return copy;
83710       },
83711
83712
83713       extent: function(resolver, memo) {
83714           return resolver.transient(this, 'extent', function() {
83715               if (memo && memo[this.id]) return geoExtent$$1();
83716               memo = memo || {};
83717               memo[this.id] = true;
83718
83719               var extent = geoExtent$$1();
83720               for (var i = 0; i < this.members.length; i++) {
83721                   var member = resolver.hasEntity(this.members[i].id);
83722                   if (member) {
83723                       extent._extend(member.extent(resolver, memo));
83724                   }
83725               }
83726               return extent;
83727           });
83728       },
83729
83730
83731       geometry: function(graph) {
83732           return graph.transient(this, 'geometry', function() {
83733               return this.isMultipolygon() ? 'area' : 'relation';
83734           });
83735       },
83736
83737
83738       isDegenerate: function() {
83739           return this.members.length === 0;
83740       },
83741
83742
83743       // Return an array of members, each extended with an 'index' property whose value
83744       // is the member index.
83745       indexedMembers: function() {
83746           var result = new Array(this.members.length);
83747           for (var i = 0; i < this.members.length; i++) {
83748               result[i] = assignIn({}, this.members[i], {index: i});
83749           }
83750           return result;
83751       },
83752
83753
83754       // Return the first member with the given role. A copy of the member object
83755       // is returned, extended with an 'index' property whose value is the member index.
83756       memberByRole: function(role) {
83757           for (var i = 0; i < this.members.length; i++) {
83758               if (this.members[i].role === role) {
83759                   return assignIn({}, this.members[i], {index: i});
83760               }
83761           }
83762       },
83763
83764       // Same as memberByRole, but returns all members with the given role
83765       membersByRole: function(role) {
83766           var result = [];
83767           for (var i = 0; i < this.members.length; i++) {
83768               if (this.members[i].role === role) {
83769                   result.push(assignIn({}, this.members[i], {index: i}));
83770               }
83771           }
83772           return result;
83773       },
83774
83775       // Return the first member with the given id. A copy of the member object
83776       // is returned, extended with an 'index' property whose value is the member index.
83777       memberById: function(id) {
83778           for (var i = 0; i < this.members.length; i++) {
83779               if (this.members[i].id === id) {
83780                   return assignIn({}, this.members[i], {index: i});
83781               }
83782           }
83783       },
83784
83785
83786       // Return the first member with the given id and role. A copy of the member object
83787       // is returned, extended with an 'index' property whose value is the member index.
83788       memberByIdAndRole: function(id, role) {
83789           for (var i = 0; i < this.members.length; i++) {
83790               if (this.members[i].id === id && this.members[i].role === role) {
83791                   return assignIn({}, this.members[i], {index: i});
83792               }
83793           }
83794       },
83795
83796
83797       addMember: function(member, index) {
83798           var members = this.members.slice();
83799           members.splice(index === undefined ? members.length : index, 0, member);
83800           return this.update({members: members});
83801       },
83802
83803
83804       updateMember: function(member, index) {
83805           var members = this.members.slice();
83806           members.splice(index, 1, assignIn({}, members[index], member));
83807           return this.update({members: members});
83808       },
83809
83810
83811       removeMember: function(index) {
83812           var members = this.members.slice();
83813           members.splice(index, 1);
83814           return this.update({members: members});
83815       },
83816
83817
83818       removeMembersWithID: function(id) {
83819           var members = reject(this.members, function(m) { return m.id === id; });
83820           return this.update({members: members});
83821       },
83822
83823
83824       // Wherever a member appears with id `needle.id`, replace it with a member
83825       // with id `replacement.id`, type `replacement.type`, and the original role,
83826       // By default, adding a duplicate member (by id and role) is prevented.
83827       // Return an updated relation.
83828       replaceMember: function(needle, replacement, keepDuplicates) {
83829           if (!this.memberById(needle.id))
83830               return this;
83831
83832           var members = [];
83833
83834           for (var i = 0; i < this.members.length; i++) {
83835               var member = this.members[i];
83836               if (member.id !== needle.id) {
83837                   members.push(member);
83838               } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
83839                   members.push({id: replacement.id, type: replacement.type, role: member.role});
83840               }
83841           }
83842
83843           return this.update({members: members});
83844       },
83845
83846
83847       asJXON: function(changeset_id) {
83848           var r = {
83849               relation: {
83850                   '@id': this.osmId(),
83851                   '@version': this.version || 0,
83852                   member: map$3(this.members, function(member) {
83853                       return {
83854                           keyAttributes: {
83855                               type: member.type,
83856                               role: member.role,
83857                               ref: osmEntity$$1.id.toOSM(member.id)
83858                           }
83859                       };
83860                   }),
83861                   tag: map$3(this.tags, function(v, k) {
83862                       return { keyAttributes: { k: k, v: v } };
83863                   })
83864               }
83865           };
83866           if (changeset_id) r.relation['@changeset'] = changeset_id;
83867           return r;
83868       },
83869
83870
83871       asGeoJSON: function(resolver) {
83872           return resolver.transient(this, 'GeoJSON', function () {
83873               if (this.isMultipolygon()) {
83874                   return {
83875                       type: 'MultiPolygon',
83876                       coordinates: this.multipolygon(resolver)
83877                   };
83878               } else {
83879                   return {
83880                       type: 'FeatureCollection',
83881                       properties: this.tags,
83882                       features: this.members.map(function (member) {
83883                           return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
83884                       })
83885                   };
83886               }
83887           });
83888       },
83889
83890
83891       area: function(resolver) {
83892           return resolver.transient(this, 'area', function() {
83893               return d3_geoArea(this.asGeoJSON(resolver));
83894           });
83895       },
83896
83897
83898       isMultipolygon: function() {
83899           return this.tags.type === 'multipolygon';
83900       },
83901
83902
83903       isComplete: function(resolver) {
83904           for (var i = 0; i < this.members.length; i++) {
83905               if (!resolver.hasEntity(this.members[i].id)) {
83906                   return false;
83907               }
83908           }
83909           return true;
83910       },
83911
83912
83913       isRestriction: function() {
83914           return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
83915       },
83916
83917
83918       isValidRestriction: function() {
83919           if (!this.isRestriction()) return false;
83920
83921           var froms = this.members.filter(function(m) { return m.role === 'from'; });
83922           var vias = this.members.filter(function(m) { return m.role === 'via'; });
83923           var tos = this.members.filter(function(m) { return m.role === 'to'; });
83924
83925           if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
83926           if (froms.some(function(m) { return m.type !== 'way'; })) return false;
83927
83928           if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
83929           if (tos.some(function(m) { return m.type !== 'way'; })) return false;
83930
83931           if (vias.length === 0) return false;
83932           if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
83933
83934           return true;
83935       },
83936
83937
83938       // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
83939       // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
83940       //
83941       // This corresponds to the structure needed for rendering a multipolygon path using a
83942       // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
83943       //
83944       // In the case of invalid geometries, this function will still return a result which
83945       // includes the nodes of all way members, but some Nds may be unclosed and some inner
83946       // rings not matched with the intended outer ring.
83947       //
83948       multipolygon: function(resolver) {
83949           var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
83950           var inners = this.members.filter(function(m) { return 'inner' === m.role; });
83951
83952           outers = osmJoinWays(outers, resolver);
83953           inners = osmJoinWays(inners, resolver);
83954
83955           outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
83956           inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
83957
83958           var result = outers.map(function(o) {
83959               // Heuristic for detecting counterclockwise winding order. Assumes
83960               // that OpenStreetMap polygons are not hemisphere-spanning.
83961               return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
83962           });
83963
83964           function findOuter(inner) {
83965               var o, outer;
83966
83967               for (o = 0; o < outers.length; o++) {
83968                   outer = outers[o];
83969                   if (geoPolygonContainsPolygon(outer, inner))
83970                       return o;
83971               }
83972
83973               for (o = 0; o < outers.length; o++) {
83974                   outer = outers[o];
83975                   if (geoPolygonIntersectsPolygon(outer, inner, false))
83976                       return o;
83977               }
83978           }
83979
83980           for (var i = 0; i < inners.length; i++) {
83981               var inner = inners[i];
83982
83983               if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
83984                   inner = inner.reverse();
83985               }
83986
83987               var o = findOuter(inners[i]);
83988               if (o !== undefined)
83989                   result[o].push(inners[i]);
83990               else
83991                   result.push([inners[i]]); // Invalid geometry
83992           }
83993
83994           return result;
83995       }
83996   });
83997
83998   function osmTurn(turn) {
83999       if (!(this instanceof osmTurn)) {
84000           return new osmTurn(turn);
84001       }
84002       assignIn(this, turn);
84003   }
84004
84005
84006   function osmIntersection(graph, startVertexId, maxDistance) {
84007       maxDistance = maxDistance || 30;    // in meters
84008       var vgraph = coreGraph$$1();           // virtual graph
84009       var i, j, k;
84010
84011
84012       function memberOfRestriction(entity) {
84013           return graph.parentRelations(entity)
84014               .some(function(r) { return r.isRestriction(); });
84015       }
84016
84017       function isRoad(way) {
84018           if (way.isArea() || way.isDegenerate()) return false;
84019           var roads = {
84020               'motorway': true,
84021               'motorway_link': true,
84022               'trunk': true,
84023               'trunk_link': true,
84024               'primary': true,
84025               'primary_link': true,
84026               'secondary': true,
84027               'secondary_link': true,
84028               'tertiary': true,
84029               'tertiary_link': true,
84030               'residential': true,
84031               'unclassified': true,
84032               'living_street': true,
84033               'service': true,
84034               'road': true,
84035               'track': true
84036           };
84037           return roads[way.tags.highway];
84038       }
84039
84040
84041       var startNode = graph.entity(startVertexId);
84042       var checkVertices = [startNode];
84043       var checkWays;
84044       var vertices = [];
84045       var vertexIds = [];
84046       var vertex;
84047       var ways = [];
84048       var wayIds = [];
84049       var way;
84050       var nodes = [];
84051       var node;
84052       var parents = [];
84053       var parent;
84054
84055       // `actions` will store whatever actions must be performed to satisfy
84056       // preconditions for adding a turn restriction to this intersection.
84057       //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
84058       //  - Reverse oneways so that they are drawn in the forward direction
84059       //  - Split ways on key vertices
84060       var actions = [];
84061
84062
84063       // STEP 1:  walk the graph outwards from starting vertex to search
84064       //  for more key vertices and ways to include in the intersection..
84065
84066       while (checkVertices.length) {
84067           vertex = checkVertices.pop();
84068
84069           // check this vertex for parent ways that are roads
84070           checkWays = graph.parentWays(vertex);
84071           var hasWays = false;
84072           for (i = 0; i < checkWays.length; i++) {
84073               way = checkWays[i];
84074               if (!isRoad(way) && !memberOfRestriction(way)) continue;
84075
84076               ways.push(way);   // it's a road, or it's already in a turn restriction
84077               hasWays = true;
84078
84079               // check the way's children for more key vertices
84080               nodes = uniq(graph.childNodes(way));
84081               for (j = 0; j < nodes.length; j++) {
84082                   node = nodes[j];
84083                   if (node === vertex) continue;                                           // same thing
84084                   if (vertices.indexOf(node) !== -1) continue;                             // seen it already
84085                   if (node.loc && startNode.loc &&
84086                       geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
84087
84088                   // a key vertex will have parents that are also roads
84089                   var hasParents = false;
84090                   parents = graph.parentWays(node);
84091                   for (k = 0; k < parents.length; k++) {
84092                       parent = parents[k];
84093                       if (parent === way) continue;                 // same thing
84094                       if (ways.indexOf(parent) !== -1) continue;    // seen it already
84095                       if (!isRoad(parent)) continue;                // not a road
84096                       hasParents = true;
84097                       break;
84098                   }
84099
84100                   if (hasParents) {
84101                       checkVertices.push(node);
84102                   }
84103               }
84104           }
84105
84106           if (hasWays) {
84107               vertices.push(vertex);
84108           }
84109       }
84110
84111       vertices = uniq(vertices);
84112       ways = uniq(ways);
84113
84114
84115       // STEP 2:  Build a virtual graph containing only the entities in the intersection..
84116       // Everything done after this step should act on the virtual graph
84117       // Any actions that must be performed later to the main graph go in `actions` array
84118       ways.forEach(function(way) {
84119           graph.childNodes(way).forEach(function(node) {
84120               vgraph = vgraph.replace(node);
84121           });
84122
84123           vgraph = vgraph.replace(way);
84124
84125           graph.parentRelations(way).forEach(function(relation) {
84126               if (relation.isRestriction()) {
84127                   if (relation.isValidRestriction(graph)) {
84128                       vgraph = vgraph.replace(relation);
84129                   } else if (relation.isComplete(graph)) {
84130                       actions.push(actionDeleteRelation(relation.id));
84131                   }
84132               }
84133           });
84134       });
84135
84136
84137       // STEP 3:  Force all oneways to be drawn in the forward direction
84138       ways.forEach(function(w) {
84139           var way = vgraph.entity(w.id);
84140           if (way.tags.oneway === '-1') {
84141               var action = actionReverse(way.id, { reverseOneway: true });
84142               actions.push(action);
84143               vgraph = action(vgraph);
84144           }
84145       });
84146
84147
84148       // STEP 4:  Split ways on key vertices
84149       var origCount = osmEntity$$1.id.next.way;
84150       vertices.forEach(function(v) {
84151           // This is an odd way to do it, but we need to find all the ways that
84152           // will be split here, then split them one at a time to ensure that these
84153           // actions can be replayed on the main graph exactly in the same order.
84154           // (It is unintuitive, but the order of ways returned from graph.parentWays()
84155           // is arbitrary, depending on how the main graph and vgraph were built)
84156           var splitAll = actionSplit(v.id);
84157           if (!splitAll.disabled(vgraph)) {
84158               splitAll.ways(vgraph).forEach(function(way) {
84159                   var splitOne = actionSplit(v.id).limitWays([way.id]);
84160                   actions.push(splitOne);
84161                   vgraph = splitOne(vgraph);
84162               });
84163           }
84164       });
84165
84166       // In here is where we should also split the intersection at nearby junction.
84167       //   for https://github.com/mapbox/iD-internal/issues/31
84168       // nearbyVertices.forEach(function(v) {
84169       // });
84170
84171       // Reasons why we reset the way id count here:
84172       //  1. Continuity with way ids created by the splits so that we can replay
84173       //     these actions later if the user decides to create a turn restriction
84174       //  2. Avoids churning way ids just by hovering over a vertex
84175       //     and displaying the turn restriction editor
84176       osmEntity$$1.id.next.way = origCount;
84177
84178
84179       // STEP 5:  Update arrays to point to vgraph entities
84180       vertexIds = vertices.map(function(v) { return v.id; });
84181       vertices = [];
84182       ways = [];
84183
84184       vertexIds.forEach(function(id) {
84185           var vertex = vgraph.entity(id);
84186           var parents = vgraph.parentWays(vertex);
84187           vertices.push(vertex);
84188           ways = ways.concat(parents);
84189       });
84190
84191       vertices = uniq(vertices);
84192       ways = uniq(ways);
84193
84194       vertexIds = vertices.map(function(v) { return v.id; });
84195       wayIds = ways.map(function(w) { return w.id; });
84196
84197
84198       // STEP 6:  Update the ways with some metadata that will be useful for
84199       // walking the intersection graph later and rendering turn arrows.
84200
84201       function withMetadata(way, vertexIds) {
84202           var __oneWay = way.isOneWay();
84203
84204           // which affixes are key vertices?
84205           var __first = (vertexIds.indexOf(way.first()) !== -1);
84206           var __last = (vertexIds.indexOf(way.last()) !== -1);
84207
84208           // what roles is this way eligible for?
84209           var __via = (__first && __last);
84210           var __from = ((__first && !__oneWay) || __last);
84211           var __to = (__first || (__last && !__oneWay));
84212
84213           return way.update({
84214               __first:  __first,
84215               __last:  __last,
84216               __from:  __from,
84217               __via: __via,
84218               __to:  __to,
84219               __oneWay:  __oneWay
84220           });
84221       }
84222
84223       ways = [];
84224       wayIds.forEach(function(id) {
84225           var way = withMetadata(vgraph.entity(id), vertexIds);
84226           vgraph = vgraph.replace(way);
84227           ways.push(way);
84228       });
84229
84230
84231       // STEP 7:  Simplify - This is an iterative process where we:
84232       //  1. Find trivial vertices with only 2 parents
84233       //  2. trim off the leaf way from those vertices and remove from vgraph
84234
84235       var keepGoing;
84236       var removeWayIds = [];
84237       var removeVertexIds = [];
84238
84239       do {
84240           keepGoing = false;
84241           checkVertices = vertexIds.slice();
84242
84243           for (i = 0; i < checkVertices.length; i++) {
84244               var vertexId = checkVertices[i];
84245               vertex = vgraph.hasEntity(vertexId);
84246
84247               if (!vertex) {
84248                   if (vertexIds.indexOf(vertexId) !== -1) {
84249                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
84250                   }
84251                   removeVertexIds.push(vertexId);
84252                   continue;
84253               }
84254
84255               parents = vgraph.parentWays(vertex);
84256               if (parents.length < 3) {
84257                   if (vertexIds.indexOf(vertexId) !== -1) {
84258                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
84259                   }
84260               }
84261
84262               if (parents.length === 2) {     // vertex with 2 parents is trivial
84263                   var a = parents[0];
84264                   var b = parents[1];
84265                   var aIsLeaf = a && !a.__via;
84266                   var bIsLeaf = b && !b.__via;
84267                   var leaf, survivor;
84268
84269                   if (aIsLeaf && !bIsLeaf) {
84270                       leaf = a;
84271                       survivor = b;
84272                   } else if (!aIsLeaf && bIsLeaf) {
84273                       leaf = b;
84274                       survivor = a;
84275                   }
84276
84277                   if (leaf && survivor) {
84278                       survivor = withMetadata(survivor, vertexIds);      // update survivor way
84279                       vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
84280                       removeWayIds.push(leaf.id);
84281                       keepGoing = true;
84282                   }
84283               }
84284
84285               parents = vgraph.parentWays(vertex);
84286
84287               if (parents.length < 2) {     // vertex is no longer a key vertex
84288                   if (vertexIds.indexOf(vertexId) !== -1) {
84289                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
84290                   }
84291                   removeVertexIds.push(vertexId);
84292                   keepGoing = true;
84293               }
84294
84295               if (parents.length < 1) {     // vertex is no longer attached to anything
84296                   vgraph = vgraph.remove(vertex);
84297               }
84298
84299           }
84300       } while (keepGoing);
84301
84302
84303       vertices = vertices
84304           .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
84305           .map(function(vertex) { return vgraph.entity(vertex.id); });
84306       ways = ways
84307           .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
84308           .map(function(way) { return vgraph.entity(way.id); });
84309
84310
84311       // OK!  Here is our intersection..
84312       var intersection = {
84313           graph: vgraph,
84314           actions: actions,
84315           vertices: vertices,
84316           ways: ways,
84317       };
84318
84319
84320
84321       // Get all the valid turns through this intersection given a starting way id.
84322       // This operates on the virtual graph for everything.
84323       //
84324       // Basically, walk through all possible paths from starting way,
84325       //   honoring the existing turn restrictions as we go (watch out for loops!)
84326       //
84327       // For each path found, generate and return a `osmTurn` datastructure.
84328       //
84329       intersection.turns = function(fromWayId, maxViaWay) {
84330           if (!fromWayId) return [];
84331           if (!maxViaWay) maxViaWay = 0;
84332
84333           var vgraph = intersection.graph;
84334           var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
84335
84336           var start = vgraph.entity(fromWayId);
84337           if (!start || !(start.__from || start.__via)) return [];
84338
84339           // maxViaWay=0   from-*-to              (0 vias)
84340           // maxViaWay=1   from-*-via-*-to        (1 via max)
84341           // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
84342           var maxPathLength = (maxViaWay * 2) + 3;
84343           var turns = [];
84344
84345           step(start);
84346           return turns;
84347
84348
84349           // traverse the intersection graph and find all the valid paths
84350           function step(entity, currPath, currRestrictions, matchedRestriction) {
84351               currPath = clone(currPath || []);
84352               if (currPath.length >= maxPathLength) return;
84353               currPath.push(entity.id);
84354               currRestrictions = clone(currRestrictions || []);
84355               var i, j;
84356
84357               if (entity.type === 'node') {
84358                   var parents = vgraph.parentWays(entity);
84359                   var nextWays = [];
84360
84361                   // which ways can we step into?
84362                   for (i = 0; i < parents.length; i++) {
84363                       var way = parents[i];
84364
84365                       // if next way is a oneway incoming to this vertex, skip
84366                       if (way.__oneWay && way.nodes[0] !== entity.id) continue;
84367
84368                       // if we have seen it before (allowing for an initial u-turn), skip
84369                       if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
84370
84371                       // Check all "current" restrictions (where we've already walked the `FROM`)
84372                       var restrict = undefined;
84373                       for (j = 0; j < currRestrictions.length; j++) {
84374                           var restriction = currRestrictions[j];
84375                           var f = restriction.memberByRole('from');
84376                           var v = restriction.membersByRole('via');
84377                           var t = restriction.memberByRole('to');
84378                           var isOnly = /^only_/.test(restriction.tags.restriction);
84379
84380                           // Does the current path match this turn restriction?
84381                           var matchesFrom = (f.id === fromWayId);
84382                           var matchesViaTo = false;
84383                           var isAlongOnlyPath = false;
84384
84385                           if (t.id === way.id) {     // match TO
84386
84387                               if (v.length === 1 && v[0].type === 'node') {    // match VIA node
84388                                   matchesViaTo = (v[0].id === entity.id && (
84389                                       (matchesFrom && currPath.length === 2) ||
84390                                       (!matchesFrom && currPath.length > 2)
84391                                   ));
84392
84393                               } else {                                         // match all VIA ways
84394                                   var pathVias = [];
84395                                   for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
84396                                       pathVias.push(currPath[k]);              // (path goes way-node-way...)
84397                                   }
84398                                   var restrictionVias = [];
84399                                   for (k = 0; k < v.length; k++) {
84400                                       if (v[k].type === 'way') {
84401                                           restrictionVias.push(v[k].id);
84402                                       }
84403                                   }
84404                                   var diff = difference(pathVias, restrictionVias);
84405                                   matchesViaTo = !diff.length;
84406                               }
84407
84408                           } else if (isOnly) {
84409                               for (k = 0; k < v.length; k++) {
84410                                   // way doesn't match TO, but is one of the via ways along the path of an "only"
84411                                   if (v[k].type === 'way' && v[k].id === way.id) {
84412                                       isAlongOnlyPath = true;
84413                                       break;
84414                                   }
84415                               }
84416                           }
84417
84418                           if (matchesViaTo) {
84419                               if (isOnly) {
84420                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
84421                               } else {
84422                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
84423                               }
84424                           } else {    // indirect - caused by a different nearby restriction
84425                               if (isAlongOnlyPath) {
84426                                   restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
84427                               } else if (isOnly) {
84428                                   restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
84429                               }
84430                           }
84431
84432                           // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
84433                           if (restrict && restrict.direct)
84434                               break;
84435                       }
84436
84437                       nextWays.push({ way: way, restrict: restrict });
84438                   }
84439
84440                   nextWays.forEach(function(nextWay) {
84441                       step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
84442                   });
84443
84444
84445               } else {  // entity.type === 'way'
84446                   if (currPath.length >= 3) {     // this is a "complete" path..
84447                       var turnPath = clone(currPath);
84448
84449                       // an indirect restriction - only include the partial path (starting at FROM)
84450                       if (matchedRestriction && matchedRestriction.direct === false) {
84451                           for (i = 0; i < turnPath.length; i++) {
84452                               if (turnPath[i] === matchedRestriction.from) {
84453                                   turnPath = turnPath.slice(i);
84454                                   break;
84455                               }
84456                           }
84457                       }
84458
84459                       var turn = pathToTurn(turnPath);
84460                       if (turn) {
84461                           if (matchedRestriction) {
84462                               turn.restrictionID = matchedRestriction.id;
84463                               turn.no = matchedRestriction.no;
84464                               turn.only = matchedRestriction.only;
84465                               turn.direct = matchedRestriction.direct;
84466                           }
84467                           turns.push(osmTurn(turn));
84468                       }
84469
84470                       if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
84471                   }
84472
84473                   if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
84474
84475                   // which nodes can we step into?
84476                   var n1 = vgraph.entity(entity.first());
84477                   var n2 = vgraph.entity(entity.last());
84478                   var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
84479                   var nextNodes = [];
84480
84481                   if (currPath.length > 1) {
84482                       if (dist > maxDistance) return;   // the next node is too far
84483                       if (!entity.__via) return;        // this way is a leaf / can't be a via
84484                   }
84485
84486                   if (!entity.__oneWay &&                     // bidirectional..
84487                       keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
84488                       currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
84489                       nextNodes.push(n1);                     // can advance to first node
84490                   }
84491                   if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
84492                       currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
84493                       nextNodes.push(n2);                     // can advance to last node
84494                   }
84495
84496                   nextNodes.forEach(function(nextNode) {
84497                       // gather restrictions FROM this way
84498                       var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
84499                           if (!r.isRestriction()) return false;
84500
84501                           var f = r.memberByRole('from');
84502                           if (!f || f.id !== entity.id) return false;
84503
84504                           var isOnly = /^only_/.test(r.tags.restriction);
84505                           if (!isOnly) return true;
84506
84507                           // `only_` restrictions only matter along the direction of the VIA - #4849
84508                           var isOnlyVia = false;
84509                           var v = r.membersByRole('via');
84510                           if (v.length === 1 && v[0].type === 'node') {   // via node
84511                               isOnlyVia = (v[0].id === nextNode.id);
84512                           } else {                                        // via way(s)
84513                               for (var i = 0; i < v.length; i++) {
84514                                   if (v[i].type !== 'way') continue;
84515                                   var viaWay = vgraph.entity(v[i].id);
84516                                   if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
84517                                       isOnlyVia = true;
84518                                       break;
84519                                   }
84520                               }
84521                           }
84522                           return isOnlyVia;
84523                       });
84524
84525                       step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
84526                   });
84527               }
84528           }
84529
84530
84531           // assumes path is alternating way-node-way of odd length
84532           function pathToTurn(path) {
84533               if (path.length < 3) return;
84534               var fromWayId, fromNodeId, fromVertexId;
84535               var toWayId, toNodeId, toVertexId;
84536               var viaWayIds, viaNodeId, isUturn;
84537
84538               fromWayId = path[0];
84539               toWayId = path[path.length - 1];
84540
84541               if (path.length === 3 && fromWayId === toWayId) {  // u turn
84542                   var way = vgraph.entity(fromWayId);
84543                   if (way.__oneWay) return null;
84544
84545                   isUturn = true;
84546                   viaNodeId = fromVertexId = toVertexId = path[1];
84547                   fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
84548
84549               } else {
84550                   isUturn = false;
84551                   fromVertexId = path[1];
84552                   fromNodeId = adjacentNode(fromWayId, fromVertexId);
84553                   toVertexId = path[path.length - 2];
84554                   toNodeId = adjacentNode(toWayId, toVertexId);
84555
84556                   if (path.length === 3) {
84557                       viaNodeId = path[1];
84558                   } else {
84559                       viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
84560                       viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
84561                   }
84562               }
84563
84564               return {
84565                   key:  path.join('_'),
84566                   path: path,
84567                   from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
84568                   via:  { node: viaNodeId,  ways: viaWayIds },
84569                   to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
84570                   u:    isUturn
84571               };
84572
84573
84574               function adjacentNode(wayId, affixId) {
84575                   var nodes = vgraph.entity(wayId).nodes;
84576                   return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
84577               }
84578           }
84579
84580       };
84581
84582       return intersection;
84583   }
84584
84585
84586   function osmInferRestriction(graph, turn, projection) {
84587       var fromWay = graph.entity(turn.from.way);
84588       var fromNode = graph.entity(turn.from.node);
84589       var fromVertex = graph.entity(turn.from.vertex);
84590       var toWay = graph.entity(turn.to.way);
84591       var toNode = graph.entity(turn.to.node);
84592       var toVertex = graph.entity(turn.to.vertex);
84593
84594       var fromOneWay = (fromWay.tags.oneway === 'yes');
84595       var toOneWay = (toWay.tags.oneway === 'yes');
84596       var angle = (geoAngle(fromVertex, fromNode, projection) -
84597                   geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
84598
84599       while (angle < 0)
84600           angle += 360;
84601
84602       if (fromNode === toNode)
84603           return 'no_u_turn';
84604       if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
84605           return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
84606       if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
84607           return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
84608       if (angle < 158)
84609           return 'no_right_turn';
84610       if (angle > 202)
84611           return 'no_left_turn';
84612
84613       return 'no_straight_on';
84614   }
84615
84616   function actionAddMember(relationId, member, memberIndex, insertPair) {
84617
84618       return function action(graph) {
84619           var relation = graph.entity(relationId);
84620
84621           // There are some special rules for Public Transport v2 routes.
84622           var isPTv2 = /stop|platform/.test(member.role);
84623
84624           if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
84625               // Try to perform sensible inserts based on how the ways join together
84626               graph = addWayMember(relation, graph);
84627           } else {
84628               // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
84629               // Stops and Platforms for PTv2 should be ordered first.
84630               // hack: We do not currently have the ability to place them in the exactly correct order.
84631               if (isPTv2 && isNaN(memberIndex)) {
84632                   memberIndex = 0;
84633               }
84634
84635               graph = graph.replace(relation.addMember(member, memberIndex));
84636           }
84637
84638           return graph;
84639       };
84640
84641
84642       // Add a way member into the relation "wherever it makes sense".
84643       // In this situation we were not supplied a memberIndex.
84644       function addWayMember(relation, graph) {
84645           var groups, tempWay, item, i, j, k;
84646
84647           // remove PTv2 stops and platforms before doing anything.
84648           var PTv2members = [];
84649           var members = [];
84650           for (i = 0; i < relation.members.length; i++) {
84651               var m = relation.members[i];
84652               if (/stop|platform/.test(m.role)) {
84653                   PTv2members.push(m);
84654               } else {
84655                   members.push(m);
84656               }
84657           }
84658           relation = relation.update({ members: members });
84659
84660
84661           if (insertPair) {
84662               // We're adding a member that must stay paired with an existing member.
84663               // (This feature is used by `actionSplit`)
84664               //
84665               // This is tricky because the members may exist multiple times in the
84666               // member list, and with different A-B/B-A ordering and different roles.
84667               // (e.g. a bus route that loops out and back - #4589).
84668               //
84669               // Replace the existing member with a temporary way,
84670               // so that `osmJoinWays` can treat the pair like a single way.
84671               tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
84672               graph = graph.replace(tempWay);
84673               var tempMember = { id: tempWay.id, type: 'way', role: member.role };
84674               var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
84675               groups = groupBy(tempRelation.members, function(m) { return m.type; });
84676               groups.way = groups.way || [];
84677
84678           } else {
84679               // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
84680               groups = groupBy(relation.members, function(m) { return m.type; });
84681               groups.way = groups.way || [];
84682               groups.way.push(member);
84683           }
84684
84685           members = withIndex(groups.way);
84686           var joined = osmJoinWays(members, graph);
84687
84688           // `joined` might not contain all of the way members,
84689           // But will contain only the completed (downloaded) members
84690           for (i = 0; i < joined.length; i++) {
84691               var segment = joined[i];
84692               var nodes = segment.nodes.slice();
84693               var startIndex = segment[0].index;
84694
84695               // j = array index in `members` where this segment starts
84696               for (j = 0; j < members.length; j++) {
84697                   if (members[j].index === startIndex) {
84698                       break;
84699                   }
84700               }
84701
84702               // k = each member in segment
84703               for (k = 0; k < segment.length; k++) {
84704                   item = segment[k];
84705                   var way = graph.entity(item.id);
84706
84707                   // If this is a paired item, generate members in correct order and role
84708                   if (tempWay && item.id === tempWay.id) {
84709                       if (nodes[0].id === insertPair.nodes[0]) {
84710                           item.pair = [
84711                               { id: insertPair.originalID, type: 'way', role: item.role },
84712                               { id: insertPair.insertedID, type: 'way', role: item.role }
84713                           ];
84714                       } else {
84715                           item.pair = [
84716                               { id: insertPair.insertedID, type: 'way', role: item.role },
84717                               { id: insertPair.originalID, type: 'way', role: item.role }
84718                           ];
84719                       }
84720                   }
84721
84722                   // reorder `members` if necessary
84723                   if (k > 0) {
84724                       if (j+k >= members.length || item.index !== members[j+k].index) {
84725                           moveMember(members, item.index, j+k);
84726                       }
84727                   }
84728
84729                   nodes.splice(0, way.nodes.length - 1);
84730               }
84731           }
84732
84733           if (tempWay) {
84734               graph = graph.remove(tempWay);
84735           }
84736
84737           // Final pass: skip dead items, split pairs, remove index properties
84738           var wayMembers = [];
84739           for (i = 0; i < members.length; i++) {
84740               item = members[i];
84741               if (item.index === -1) continue;
84742
84743               if (item.pair) {
84744                   wayMembers.push(item.pair[0]);
84745                   wayMembers.push(item.pair[1]);
84746               } else {
84747                   wayMembers.push(omit(item, 'index'));
84748               }
84749           }
84750
84751           // Put stops and platforms first, then nodes, ways, relations
84752           // This is recommended for Public Transport v2 routes:
84753           // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
84754           var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
84755
84756           return graph.replace(relation.update({members: newMembers}));
84757
84758
84759           // `moveMember()` changes the `members` array in place by splicing
84760           // the item with `.index = findIndex` to where it belongs,
84761           // and marking the old position as "dead" with `.index = -1`
84762           //
84763           // j=5, k=0                jk
84764           // segment                 5 4 7 6
84765           // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
84766           //
84767           // j=5, k=1                j k
84768           // segment                 5 4 7 6
84769           // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
84770           // members       0 1 2 3 x 5 4 6 7 8 9      moved
84771           //
84772           // j=5, k=2                j   k
84773           // segment                 5 4 7 6
84774           // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
84775           // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
84776           //
84777           // j=5, k=3                j     k
84778           // segment                 5 4 7 6
84779           // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
84780           //
84781           function moveMember(arr, findIndex, toIndex) {
84782               for (var i = 0; i < arr.length; i++) {
84783                   if (arr[i].index === findIndex) {
84784                       break;
84785                   }
84786               }
84787
84788               var item = clone(arr[i]);
84789               arr[i].index = -1;   // mark as dead
84790               item.index = toIndex;
84791               arr.splice(toIndex, 0, item);
84792           }
84793
84794
84795           // This is the same as `Relation.indexedMembers`,
84796           // Except we don't want to index all the members, only the ways
84797           function withIndex(arr) {
84798               var result = new Array(arr.length);
84799               for (var i = 0; i < arr.length; i++) {
84800                   result[i] = arr[i];
84801                   result[i].index = i;
84802               }
84803               return result;
84804           }
84805       }
84806
84807   }
84808
84809   function actionAddMidpoint(midpoint, node) {
84810       return function(graph) {
84811           graph = graph.replace(node.move(midpoint.loc));
84812
84813           var parents = intersection(
84814               graph.parentWays(graph.entity(midpoint.edge[0])),
84815               graph.parentWays(graph.entity(midpoint.edge[1])));
84816
84817           parents.forEach(function(way) {
84818               for (var i = 0; i < way.nodes.length - 1; i++) {
84819                   if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
84820                       graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
84821
84822                       // Add only one midpoint on doubled-back segments,
84823                       // turning them into self-intersections.
84824                       return;
84825                   }
84826               }
84827           });
84828
84829           return graph;
84830       };
84831   }
84832
84833   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
84834   function actionAddVertex(wayId, nodeId, index) {
84835       return function(graph) {
84836           return graph.replace(graph.entity(wayId).addNode(nodeId, index));
84837       };
84838   }
84839
84840   function actionChangeMember(relationId, member, memberIndex) {
84841       return function(graph) {
84842           return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
84843       };
84844   }
84845
84846   function actionChangePreset(entityId, oldPreset, newPreset) {
84847       return function(graph) {
84848           var entity = graph.entity(entityId),
84849               geometry = entity.geometry(graph),
84850               tags = entity.tags;
84851
84852           if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
84853           if (newPreset) tags = newPreset.applyTags(tags, geometry);
84854
84855           return graph.replace(entity.update({tags: tags}));
84856       };
84857   }
84858
84859   function actionChangeTags(entityId, tags) {
84860       return function(graph) {
84861           var entity = graph.entity(entityId);
84862           return graph.replace(entity.update({tags: tags}));
84863       };
84864   }
84865
84866   function actionCircularize(wayId, projection, maxAngle) {
84867       maxAngle = (maxAngle || 20) * Math.PI / 180;
84868
84869
84870       var action = function(graph, t) {
84871           if (t === null || !isFinite(t)) t = 1;
84872           t = Math.min(Math.max(+t, 0), 1);
84873
84874           var way = graph.entity(wayId),
84875               origNodes = {};
84876
84877           graph.childNodes(way).forEach(function(node) {
84878               if (!origNodes[node.id]) origNodes[node.id] = node;
84879           });
84880
84881           if (!way.isConvex(graph)) {
84882               graph = action.makeConvex(graph);
84883           }
84884
84885           var nodes = uniq(graph.childNodes(way)),
84886               keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
84887               points = nodes.map(function(n) { return projection(n.loc); }),
84888               keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
84889               centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
84890               radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
84891               sign = d3_polygonArea(points) > 0 ? 1 : -1,
84892               ids;
84893
84894           // we need atleast two key nodes for the algorithm to work
84895           if (!keyNodes.length) {
84896               keyNodes = [nodes[0]];
84897               keyPoints = [points[0]];
84898           }
84899
84900           if (keyNodes.length === 1) {
84901               var index = nodes.indexOf(keyNodes[0]),
84902                   oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
84903
84904               keyNodes.push(nodes[oppositeIndex]);
84905               keyPoints.push(points[oppositeIndex]);
84906           }
84907
84908           // key points and nodes are those connected to the ways,
84909           // they are projected onto the circle, inbetween nodes are moved
84910           // to constant intervals between key nodes, extra inbetween nodes are
84911           // added if necessary.
84912           for (var i = 0; i < keyPoints.length; i++) {
84913               var nextKeyNodeIndex = (i + 1) % keyNodes.length,
84914                   startNode = keyNodes[i],
84915                   endNode = keyNodes[nextKeyNodeIndex],
84916                   startNodeIndex = nodes.indexOf(startNode),
84917                   endNodeIndex = nodes.indexOf(endNode),
84918                   numberNewPoints = -1,
84919                   indexRange = endNodeIndex - startNodeIndex,
84920                   nearNodes = {},
84921                   inBetweenNodes = [],
84922                   startAngle, endAngle, totalAngle, eachAngle,
84923                   angle, loc, node, origNode, j;
84924
84925               if (indexRange < 0) {
84926                   indexRange += nodes.length;
84927               }
84928
84929               // position this key node
84930               var distance = geoVecLength(centroid, keyPoints[i]);
84931               if (distance === 0) { distance = 1e-4; }
84932               keyPoints[i] = [
84933                   centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
84934                   centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
84935               ];
84936               loc = projection.invert(keyPoints[i]);
84937               node = keyNodes[i];
84938               origNode = origNodes[node.id];
84939               node = node.move(geoVecInterp(origNode.loc, loc, t));
84940               graph = graph.replace(node);
84941
84942               // figure out the between delta angle we want to match to
84943               startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
84944               endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
84945               totalAngle = endAngle - startAngle;
84946
84947               // detects looping around -pi/pi
84948               if (totalAngle * sign > 0) {
84949                   totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
84950               }
84951
84952               do {
84953                   numberNewPoints++;
84954                   eachAngle = totalAngle / (indexRange + numberNewPoints);
84955               } while (Math.abs(eachAngle) > maxAngle);
84956
84957
84958               // move existing nodes
84959               for (j = 1; j < indexRange; j++) {
84960                   angle = startAngle + j * eachAngle;
84961                   loc = projection.invert([
84962                       centroid[0] + Math.cos(angle) * radius,
84963                       centroid[1] + Math.sin(angle) * radius
84964                   ]);
84965
84966                   node = nodes[(j + startNodeIndex) % nodes.length];
84967                   origNode = origNodes[node.id];
84968                   nearNodes[node.id] = angle;
84969
84970                   node = node.move(geoVecInterp(origNode.loc, loc, t));
84971                   graph = graph.replace(node);
84972               }
84973
84974               // add new inbetween nodes if necessary
84975               for (j = 0; j < numberNewPoints; j++) {
84976                   angle = startAngle + (indexRange + j) * eachAngle;
84977                   loc = projection.invert([
84978                       centroid[0] + Math.cos(angle) * radius,
84979                       centroid[1] + Math.sin(angle) * radius
84980                   ]);
84981
84982                   // choose a nearnode to use as the original
84983                   var min$$1 = Infinity;
84984                   for (var nodeId in nearNodes) {
84985                       var nearAngle = nearNodes[nodeId],
84986                           dist = Math.abs(nearAngle - angle);
84987                       if (dist < min$$1) {
84988                           dist = min$$1;
84989                           origNode = origNodes[nodeId];
84990                       }
84991                   }
84992
84993                   node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
84994                   graph = graph.replace(node);
84995
84996                   nodes.splice(endNodeIndex + j, 0, node);
84997                   inBetweenNodes.push(node.id);
84998               }
84999
85000               // Check for other ways that share these keyNodes..
85001               // If keyNodes are adjacent in both ways,
85002               // we can add inBetween nodes to that shared way too..
85003               if (indexRange === 1 && inBetweenNodes.length) {
85004                   var startIndex1 = way.nodes.lastIndexOf(startNode.id),
85005                       endIndex1 = way.nodes.lastIndexOf(endNode.id),
85006                       wayDirection1 = (endIndex1 - startIndex1);
85007                   if (wayDirection1 < -1) { wayDirection1 = 1; }
85008
85009                   /* eslint-disable no-loop-func */
85010                   forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
85011                       if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
85012                           var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
85013                               endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
85014                               wayDirection2 = (endIndex2 - startIndex2),
85015                               insertAt = endIndex2;
85016                           if (wayDirection2 < -1) { wayDirection2 = 1; }
85017
85018                           if (wayDirection1 !== wayDirection2) {
85019                               inBetweenNodes.reverse();
85020                               insertAt = startIndex2;
85021                           }
85022                           for (j = 0; j < inBetweenNodes.length; j++) {
85023                               sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
85024                           }
85025                           graph = graph.replace(sharedWay);
85026                       }
85027                   });
85028                   /* eslint-enable no-loop-func */
85029               }
85030
85031           }
85032
85033           // update the way to have all the new nodes
85034           ids = nodes.map(function(n) { return n.id; });
85035           ids.push(ids[0]);
85036
85037           way = way.update({nodes: ids});
85038           graph = graph.replace(way);
85039
85040           return graph;
85041       };
85042
85043
85044       action.makeConvex = function(graph) {
85045           var way = graph.entity(wayId),
85046               nodes = uniq(graph.childNodes(way)),
85047               points = nodes.map(function(n) { return projection(n.loc); }),
85048               sign = d3_polygonArea(points) > 0 ? 1 : -1,
85049               hull = d3_polygonHull(points);
85050
85051           // D3 convex hulls go counterclockwise..
85052           if (sign === -1) {
85053               nodes.reverse();
85054               points.reverse();
85055           }
85056
85057           for (var i = 0; i < hull.length - 1; i++) {
85058               var startIndex = points.indexOf(hull[i]),
85059                   endIndex = points.indexOf(hull[i+1]),
85060                   indexRange = (endIndex - startIndex);
85061
85062               if (indexRange < 0) {
85063                   indexRange += nodes.length;
85064               }
85065
85066               // move interior nodes to the surface of the convex hull..
85067               for (var j = 1; j < indexRange; j++) {
85068                   var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
85069                       node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
85070                   graph = graph.replace(node);
85071               }
85072           }
85073           return graph;
85074       };
85075
85076
85077       action.disabled = function(graph) {
85078           if (!graph.entity(wayId).isClosed())
85079               return 'not_closed';
85080       };
85081
85082
85083       action.transitionable = true;
85084
85085
85086       return action;
85087   }
85088
85089   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
85090   function actionDeleteWay(wayId) {
85091
85092
85093       function canDeleteNode(node, graph) {
85094           return !graph.parentWays(node).length &&
85095               !graph.parentRelations(node).length &&
85096               !node.hasInterestingTags();
85097       }
85098
85099
85100       var action = function(graph) {
85101           var way = graph.entity(wayId);
85102
85103           graph.parentRelations(way)
85104               .forEach(function(parent) {
85105                   parent = parent.removeMembersWithID(wayId);
85106                   graph = graph.replace(parent);
85107
85108                   if (parent.isDegenerate()) {
85109                       graph = actionDeleteRelation(parent.id)(graph);
85110                   }
85111               });
85112
85113           uniq(way.nodes).forEach(function(nodeId) {
85114               graph = graph.replace(way.removeNode(nodeId));
85115
85116               var node = graph.entity(nodeId);
85117               if (canDeleteNode(node, graph)) {
85118                   graph = graph.remove(node);
85119               }
85120           });
85121
85122           return graph.remove(way);
85123       };
85124
85125
85126       return action;
85127   }
85128
85129   function actionDeleteMultiple(ids) {
85130       var actions = {
85131           way: actionDeleteWay,
85132           node: actionDeleteNode,
85133           relation: actionDeleteRelation
85134       };
85135
85136
85137       var action = function(graph) {
85138           ids.forEach(function(id) {
85139               if (graph.hasEntity(id)) { // It may have been deleted aready.
85140                   graph = actions[graph.entity(id).type](id)(graph);
85141               }
85142           });
85143
85144           return graph;
85145       };
85146
85147
85148       return action;
85149   }
85150
85151   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
85152   function actionDeleteRelation(relationId) {
85153
85154
85155       function canDeleteEntity(entity, graph) {
85156           return !graph.parentWays(entity).length &&
85157               !graph.parentRelations(entity).length &&
85158               !entity.hasInterestingTags();
85159       }
85160
85161
85162       var action = function(graph) {
85163           var relation = graph.entity(relationId);
85164
85165           graph.parentRelations(relation)
85166               .forEach(function(parent) {
85167                   parent = parent.removeMembersWithID(relationId);
85168                   graph = graph.replace(parent);
85169
85170                   if (parent.isDegenerate()) {
85171                       graph = actionDeleteRelation(parent.id)(graph);
85172                   }
85173               });
85174
85175           uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
85176               graph = graph.replace(relation.removeMembersWithID(memberId));
85177
85178               var entity = graph.entity(memberId);
85179               if (canDeleteEntity(entity, graph)) {
85180                   graph = actionDeleteMultiple([memberId])(graph);
85181               }
85182           });
85183
85184           return graph.remove(relation);
85185       };
85186
85187
85188       return action;
85189   }
85190
85191   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
85192   function actionDeleteNode(nodeId) {
85193       var action = function(graph) {
85194           var node = graph.entity(nodeId);
85195
85196           graph.parentWays(node)
85197               .forEach(function(parent) {
85198                   parent = parent.removeNode(nodeId);
85199                   graph = graph.replace(parent);
85200
85201                   if (parent.isDegenerate()) {
85202                       graph = actionDeleteWay(parent.id)(graph);
85203                   }
85204               });
85205
85206           graph.parentRelations(node)
85207               .forEach(function(parent) {
85208                   parent = parent.removeMembersWithID(nodeId);
85209                   graph = graph.replace(parent);
85210
85211                   if (parent.isDegenerate()) {
85212                       graph = actionDeleteRelation(parent.id)(graph);
85213                   }
85214               });
85215
85216           return graph.remove(node);
85217       };
85218
85219
85220       return action;
85221   }
85222
85223   // Connect the ways at the given nodes.
85224   //
85225   // First choose a node to be the survivor, with preference given
85226   // to an existing (not new) node.
85227   //
85228   // Tags and relation memberships of of non-surviving nodes are merged
85229   // to the survivor.
85230   //
85231   // This is the inverse of `iD.actionDisconnect`.
85232   //
85233   // Reference:
85234   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
85235   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
85236   //
85237   function actionConnect(nodeIDs) {
85238       var action = function(graph) {
85239           var survivor;
85240           var node;
85241           var parents;
85242           var i, j;
85243
85244           // Choose a survivor node, prefer an existing (not new) node - #4974
85245           for (i = 0; i < nodeIDs.length; i++) {
85246               survivor = graph.entity(nodeIDs[i]);
85247               if (survivor.version) break;  // found one
85248           }
85249
85250           // Replace all non-surviving nodes with the survivor and merge tags.
85251           for (i = 0; i < nodeIDs.length; i++) {
85252               node = graph.entity(nodeIDs[i]);
85253               if (node.id === survivor.id) continue;
85254
85255               parents = graph.parentWays(node);
85256               for (j = 0; j < parents.length; j++) {
85257                   if (!parents[j].areAdjacent(node.id, survivor.id)) {
85258                       graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
85259                   }
85260               }
85261
85262               parents = graph.parentRelations(node);
85263               for (j = 0; j < parents.length; j++) {
85264                   graph = graph.replace(parents[j].replaceMember(node, survivor));
85265               }
85266
85267               survivor = survivor.mergeTags(node.tags);
85268               graph = actionDeleteNode(node.id)(graph);
85269           }
85270
85271           graph = graph.replace(survivor);
85272
85273           return graph;
85274       };
85275
85276
85277       action.disabled = function(graph) {
85278           var seen = {};
85279           var restrictionIDs = [];
85280           var survivor;
85281           var node, way;
85282           var relations, relation, role;
85283           var i, j, k;
85284
85285           // Choose a survivor node, prefer an existing (not new) node - #4974
85286           for (i = 0; i < nodeIDs.length; i++) {
85287               survivor = graph.entity(nodeIDs[i]);
85288               if (survivor.version) break;  // found one
85289           }
85290
85291           // 1. disable if the nodes being connected have conflicting relation roles
85292           for (i = 0; i < nodeIDs.length; i++) {
85293               node = graph.entity(nodeIDs[i]);
85294               relations = graph.parentRelations(node);
85295
85296               for (j = 0; j < relations.length; j++) {
85297                   relation = relations[j];
85298                   role = relation.memberById(node.id).role || '';
85299
85300                   // if this node is a via node in a restriction, remember for later
85301                   if (relation.isValidRestriction()) {
85302                       restrictionIDs.push(relation.id);
85303                   }
85304
85305                   if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
85306                       return 'relation';
85307                   } else {
85308                       seen[relation.id] = role;
85309                   }
85310               }
85311           }
85312
85313           // gather restrictions for parent ways
85314           for (i = 0; i < nodeIDs.length; i++) {
85315               node = graph.entity(nodeIDs[i]);
85316
85317               var parents = graph.parentWays(node);
85318               for (j = 0; j < parents.length; j++) {
85319                   var parent = parents[j];
85320                   relations = graph.parentRelations(parent);
85321
85322                   for (k = 0; k < relations.length; k++) {
85323                       relation = relations[k];
85324                       if (relation.isValidRestriction()) {
85325                           restrictionIDs.push(relation.id);
85326                       }
85327                   }
85328               }
85329           }
85330
85331
85332           // test restrictions
85333           restrictionIDs = uniq(restrictionIDs);
85334           for (i = 0; i < restrictionIDs.length; i++) {
85335               relation = graph.entity(restrictionIDs[i]);
85336               if (!relation.isComplete(graph)) continue;
85337
85338               var memberWays = relation.members
85339                   .filter(function(m) { return m.type === 'way'; })
85340                   .map(function(m) { return graph.entity(m.id); });
85341
85342               memberWays = uniq(memberWays);
85343               var f = relation.memberByRole('from');
85344               var t = relation.memberByRole('to');
85345               var isUturn = (f.id === t.id);
85346
85347               // 2a. disable if connection would damage a restriction
85348               // (a key node is a node at the junction of ways)
85349               var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
85350               for (j = 0; j < relation.members.length; j++) {
85351                   collectNodes(relation.members[j], nodes);
85352               }
85353
85354               nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
85355               nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
85356
85357               var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
85358               nodes.from = nodes.from.filter(filter);
85359               nodes.via = nodes.via.filter(filter);
85360               nodes.to = nodes.to.filter(filter);
85361
85362               var connectFrom = false;
85363               var connectVia = false;
85364               var connectTo = false;
85365               var connectKeyFrom = false;
85366               var connectKeyTo = false;
85367
85368               for (j = 0; j < nodeIDs.length; j++) {
85369                   var n = nodeIDs[j];
85370                   if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
85371                   if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
85372                   if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
85373                   if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
85374                   if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
85375               }
85376               if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
85377               if (connectFrom && connectVia) { return 'restriction'; }
85378               if (connectTo   && connectVia) { return 'restriction'; }
85379
85380               // connecting to a key node -
85381               // if both nodes are on a member way (i.e. part of the turn restriction),
85382               // the connecting node must be adjacent to the key node.
85383               if (connectKeyFrom || connectKeyTo) {
85384                   if (nodeIDs.length !== 2) { return 'restriction'; }
85385
85386                   var n0 = null;
85387                   var n1 = null;
85388                   for (j = 0; j < memberWays.length; j++) {
85389                       way = memberWays[j];
85390                       if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
85391                       if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
85392                   }
85393
85394                   if (n0 && n1) {    // both nodes are part of the restriction
85395                       var ok = false;
85396                       for (j = 0; j < memberWays.length; j++) {
85397                           way = memberWays[j];
85398                           if (way.areAdjacent(n0, n1)) {
85399                               ok = true;
85400                               break;
85401                           }
85402                       }
85403                       if (!ok) {
85404                           return 'restriction';
85405                       }
85406                   }
85407               }
85408
85409               // 2b. disable if nodes being connected will destroy a member way in a restriction
85410               // (to test, make a copy and try actually connecting the nodes)
85411               for (j = 0; j < memberWays.length; j++) {
85412                   way = memberWays[j].update({});   // make copy
85413                   for (k = 0; k < nodeIDs.length; k++) {
85414                       if (nodeIDs[k] === survivor.id) continue;
85415
85416                       if (way.areAdjacent(nodeIDs[k], survivor.id)) {
85417                           way = way.removeNode(nodeIDs[k]);
85418                       } else {
85419                           way = way.replaceNode(nodeIDs[k], survivor.id);
85420                       }
85421                   }
85422                   if (way.isDegenerate()) {
85423                       return 'restriction';
85424                   }
85425               }
85426           }
85427
85428           return false;
85429
85430
85431           // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
85432           function hasDuplicates(n, i, arr) {
85433               return arr.indexOf(n) !== arr.lastIndexOf(n);
85434           }
85435
85436           function keyNodeFilter(froms, tos) {
85437               return function(n) {
85438                   return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
85439               };
85440           }
85441
85442           function collectNodes(member, collection) {
85443               var entity = graph.hasEntity(member.id);
85444               if (!entity) return;
85445
85446               var role = member.role || '';
85447               if (!collection[role]) {
85448                   collection[role] = [];
85449               }
85450
85451               if (member.type === 'node') {
85452                   collection[role].push(member.id);
85453                   if (role === 'via') {
85454                       collection.keyfrom.push(member.id);
85455                       collection.keyto.push(member.id);
85456                   }
85457
85458               } else if (member.type === 'way') {
85459                   collection[role].push.apply(collection[role], entity.nodes);
85460                   if (role === 'from' || role === 'via') {
85461                       collection.keyfrom.push(entity.first());
85462                       collection.keyfrom.push(entity.last());
85463                   }
85464                   if (role === 'to' || role === 'via') {
85465                       collection.keyto.push(entity.first());
85466                       collection.keyto.push(entity.last());
85467                   }
85468               }
85469           }
85470       };
85471
85472
85473       return action;
85474   }
85475
85476   function actionCopyEntities(ids, fromGraph) {
85477       var copies = {};
85478
85479
85480       var action = function(graph) {
85481           ids.forEach(function(id) {
85482               fromGraph.entity(id).copy(fromGraph, copies);
85483           });
85484
85485           for (var id in copies) {
85486               graph = graph.replace(copies[id]);
85487           }
85488
85489           return graph;
85490       };
85491
85492
85493       action.copies = function() {
85494           return copies;
85495       };
85496
85497
85498       return action;
85499   }
85500
85501   function actionDeleteMember(relationId, memberIndex) {
85502       return function(graph) {
85503           var relation = graph.entity(relationId)
85504               .removeMember(memberIndex);
85505
85506           graph = graph.replace(relation);
85507
85508           if (relation.isDegenerate())
85509               graph = actionDeleteRelation(relation.id)(graph);
85510
85511           return graph;
85512       };
85513   }
85514
85515   function actionDeprecateTags(entityId) {
85516
85517       return function(graph) {
85518           var entity = graph.entity(entityId),
85519               newtags = clone(entity.tags),
85520               change = false,
85521               rule;
85522
85523           // This handles dataDeprecated tags with a single condition
85524           for (var i = 0; i < dataDeprecated.length; i++) {
85525
85526               rule = dataDeprecated[i];
85527               var match = toPairs(rule.old)[0],
85528                   replacements = rule.replace ? toPairs(rule.replace) : null;
85529
85530               if (entity.tags[match[0]] && match[1] === '*') {
85531
85532                   var value = entity.tags[match[0]];
85533                   if (replacements && !newtags[replacements[0][0]]) {
85534                       newtags[replacements[0][0]] = value;
85535                   }
85536                   delete newtags[match[0]];
85537                   change = true;
85538
85539               } else if (entity.tags[match[0]] === match[1]) {
85540                   newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
85541                   change = true;
85542               }
85543           }
85544
85545           if (change) {
85546               return graph.replace(entity.update({tags: newtags}));
85547           } else {
85548               return graph;
85549           }
85550       };
85551   }
85552
85553   function actionDiscardTags(difference) {
85554
85555       return function(graph) {
85556           function discardTags(entity) {
85557               var tags = {};
85558               var keys = Object.keys(entity.tags);
85559               var discarded = false;
85560
85561               for (var i = 0; i < keys.length; i++) {
85562                   var k = keys[i];
85563                   if (dataDiscarded[k] || !entity.tags[k]) {
85564                       discarded = true;
85565                   } else {
85566                       tags[k] = entity.tags[k];
85567                   }
85568               }
85569
85570               if (discarded) {
85571                   graph = graph.replace(entity.update({ tags: tags }));
85572               }
85573           }
85574
85575           difference.modified().forEach(discardTags);
85576           difference.created().forEach(discardTags);
85577
85578           return graph;
85579       };
85580   }
85581
85582   // Disconect the ways at the given node.
85583   //
85584   // Optionally, disconnect only the given ways.
85585   //
85586   // For testing convenience, accepts an ID to assign to the (first) new node.
85587   // Normally, this will be undefined and the way will automatically
85588   // be assigned a new ID.
85589   //
85590   // This is the inverse of `iD.actionConnect`.
85591   //
85592   // Reference:
85593   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
85594   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
85595   //
85596   function actionDisconnect(nodeId, newNodeId) {
85597       var wayIds;
85598
85599
85600       var action = function(graph) {
85601           var node = graph.entity(nodeId);
85602           var connections = action.connections(graph);
85603
85604           connections.forEach(function(connection) {
85605               var way = graph.entity(connection.wayID);
85606               var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
85607
85608               graph = graph.replace(newNode);
85609               if (connection.index === 0 && way.isArea()) {
85610                   // replace shared node with shared node..
85611                   graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
85612               } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
85613                   // replace closing node with new new node..
85614                   graph = graph.replace(way.unclose().addNode(newNode.id));
85615               } else {
85616                   // replace shared node with multiple new nodes..
85617                   graph = graph.replace(way.updateNode(newNode.id, connection.index));
85618               }
85619           });
85620
85621           return graph;
85622       };
85623
85624
85625       action.connections = function(graph) {
85626           var candidates = [];
85627           var keeping = false;
85628           var parentWays = graph.parentWays(graph.entity(nodeId));
85629
85630           parentWays.forEach(function(way) {
85631               if (wayIds && wayIds.indexOf(way.id) === -1) {
85632                   keeping = true;
85633                   return;
85634               }
85635               if (way.isArea() && (way.nodes[0] === nodeId)) {
85636                   candidates.push({ wayID: way.id, index: 0 });
85637               } else {
85638                   way.nodes.forEach(function(waynode, index) {
85639                       if (waynode === nodeId) {
85640                           candidates.push({ wayID: way.id, index: index });
85641                       }
85642                   });
85643               }
85644           });
85645
85646           return keeping ? candidates : candidates.slice(1);
85647       };
85648
85649
85650       action.disabled = function(graph) {
85651           var connections = action.connections(graph);
85652           if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
85653               return 'not_connected';
85654
85655           var parentWays = graph.parentWays(graph.entity(nodeId));
85656           var seenRelationIds = {};
85657           var sharedRelation;
85658
85659           parentWays.forEach(function(way) {
85660               if (wayIds && wayIds.indexOf(way.id) === -1)
85661                   return;
85662
85663               var relations = graph.parentRelations(way);
85664               relations.forEach(function(relation) {
85665                   if (relation.id in seenRelationIds) {
85666                       sharedRelation = relation;
85667                   } else {
85668                       seenRelationIds[relation.id] = true;
85669                   }
85670               });
85671           });
85672
85673           if (sharedRelation)
85674               return 'relation';
85675       };
85676
85677
85678       action.limitWays = function(_) {
85679           if (!arguments.length) return wayIds;
85680           wayIds = _;
85681           return action;
85682       };
85683
85684
85685       return action;
85686   }
85687
85688   // Join ways at the end node they share.
85689   //
85690   // This is the inverse of `iD.actionSplit`.
85691   //
85692   // Reference:
85693   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
85694   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
85695   //
85696   function actionJoin(ids) {
85697
85698       function groupEntitiesByGeometry(graph) {
85699           var entities = ids.map(function(id) { return graph.entity(id); });
85700           return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
85701       }
85702
85703
85704       var action = function(graph) {
85705           var ways = ids.map(graph.entity, graph);
85706           var survivorID = ways[0].id;
85707
85708           // Prefer to keep an existing way.
85709           for (var i = 0; i < ways.length; i++) {
85710               if (!ways[i].isNew()) {
85711                   survivorID = ways[i].id;
85712                   break;
85713               }
85714           }
85715
85716           var sequences = osmJoinWays(ways, graph);
85717           var joined = sequences[0];
85718
85719           // We might need to reverse some of these ways before joining them.  #4688
85720           // `joined.actions` property will contain any actions we need to apply.
85721           graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
85722
85723           var survivor = graph.entity(survivorID);
85724           survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
85725           graph = graph.replace(survivor);
85726
85727           joined.forEach(function(way) {
85728               if (way.id === survivorID) return;
85729
85730               graph.parentRelations(way).forEach(function(parent) {
85731                   graph = graph.replace(parent.replaceMember(way, survivor));
85732               });
85733
85734               survivor = survivor.mergeTags(way.tags);
85735
85736               graph = graph.replace(survivor);
85737               graph = actionDeleteWay(way.id)(graph);
85738           });
85739
85740           return graph;
85741       };
85742
85743
85744       action.disabled = function(graph) {
85745           var geometries = groupEntitiesByGeometry(graph);
85746           if (ids.length < 2 || ids.length !== geometries.line.length)
85747               return 'not_eligible';
85748
85749           var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
85750           if (joined.length > 1)
85751               return 'not_adjacent';
85752
85753           var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
85754           var relation;
85755           var tags = {};
85756           var conflicting = false;
85757
85758           joined[0].forEach(function(way) {
85759               var parents = graph.parentRelations(way);
85760               parents.forEach(function(parent) {
85761                   if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
85762                       relation = parent;
85763               });
85764
85765               for (var k in way.tags) {
85766                   if (!(k in tags)) {
85767                       tags[k] = way.tags[k];
85768                   } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
85769                       conflicting = true;
85770                   }
85771               }
85772           });
85773
85774           if (relation)
85775               return 'restriction';
85776
85777           if (conflicting)
85778               return 'conflicting_tags';
85779       };
85780
85781
85782       return action;
85783   }
85784
85785   function actionMerge(ids) {
85786
85787       function groupEntitiesByGeometry(graph) {
85788           var entities = ids.map(function(id) { return graph.entity(id); });
85789           return assignIn({point: [], area: [], line: [], relation: []},
85790               groupBy(entities, function(entity) { return entity.geometry(graph); }));
85791       }
85792
85793
85794       var action = function(graph) {
85795           var geometries = groupEntitiesByGeometry(graph),
85796               target = geometries.area[0] || geometries.line[0],
85797               points = geometries.point;
85798
85799           points.forEach(function(point) {
85800               target = target.mergeTags(point.tags);
85801               graph = graph.replace(target);
85802
85803               graph.parentRelations(point).forEach(function(parent) {
85804                   graph = graph.replace(parent.replaceMember(point, target));
85805               });
85806
85807               var nodes = uniq(graph.childNodes(target)),
85808                   removeNode = point;
85809
85810               for (var i = 0; i < nodes.length; i++) {
85811                   var node = nodes[i];
85812                   if (graph.parentWays(node).length > 1 ||
85813                       graph.parentRelations(node).length ||
85814                       node.hasInterestingTags()) {
85815                       continue;
85816                   }
85817
85818                   // Found an uninteresting child node on the target way.
85819                   // Move orig point into its place to preserve point's history. #3683
85820                   graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
85821                   target = target.replaceNode(node.id, point.id);
85822                   graph = graph.replace(target);
85823                   removeNode = node;
85824                   break;
85825               }
85826
85827               graph = graph.remove(removeNode);
85828           });
85829
85830           return graph;
85831       };
85832
85833
85834       action.disabled = function(graph) {
85835           var geometries = groupEntitiesByGeometry(graph);
85836           if (geometries.point.length === 0 ||
85837               (geometries.area.length + geometries.line.length) !== 1 ||
85838               geometries.relation.length !== 0)
85839               return 'not_eligible';
85840       };
85841
85842
85843       return action;
85844   }
85845
85846   // `actionMergeNodes` is just a combination of:
85847   //
85848   // 1. move all the nodes to a common location
85849   // 2. `actionConnect` them
85850
85851   function actionMergeNodes(nodeIDs) {
85852
85853       // If there is a single "interesting" node, use that as the location.
85854       // Otherwise return the average location of all the nodes.
85855       function chooseLoc(graph) {
85856           if (!nodeIDs.length) return null;
85857           var sum = [0,0];
85858           var interestingCount = 0;
85859           var interestingLoc;
85860
85861           for (var i = 0; i < nodeIDs.length; i++) {
85862               var node = graph.entity(nodeIDs[i]);
85863               if (node.hasInterestingTags()) {
85864                   interestingLoc = (++interestingCount === 1) ? node.loc : null;
85865               }
85866               sum = geoVecAdd(sum, node.loc);
85867           }
85868
85869           return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
85870       }
85871
85872
85873       var action = function(graph) {
85874           if (nodeIDs.length < 2) return graph;
85875           var toLoc = chooseLoc(graph);
85876
85877           for (var i = 0; i < nodeIDs.length; i++) {
85878               var node = graph.entity(nodeIDs[i]);
85879               graph = graph.replace(node.move(toLoc));
85880           }
85881
85882           return actionConnect(nodeIDs)(graph);
85883       };
85884
85885
85886       action.disabled = function(graph) {
85887           if (nodeIDs.length < 2) return 'not_eligible';
85888
85889           for (var i = 0; i < nodeIDs.length; i++) {
85890               var entity = graph.entity(nodeIDs[i]);
85891               if (entity.type !== 'node') return 'not_eligible';
85892           }
85893
85894           return actionConnect(nodeIDs).disabled(graph);
85895       };
85896
85897       return action;
85898   }
85899
85900   function actionMergePolygon(ids, newRelationId) {
85901
85902       function groupEntities(graph) {
85903           var entities = ids.map(function (id) { return graph.entity(id); });
85904           return assignIn({
85905                   closedWay: [],
85906                   multipolygon: [],
85907                   other: []
85908               }, groupBy(entities, function(entity) {
85909                   if (entity.type === 'way' && entity.isClosed()) {
85910                       return 'closedWay';
85911                   } else if (entity.type === 'relation' && entity.isMultipolygon()) {
85912                       return 'multipolygon';
85913                   } else {
85914                       return 'other';
85915                   }
85916               }));
85917       }
85918
85919
85920       var action = function(graph) {
85921           var entities = groupEntities(graph);
85922
85923           // An array representing all the polygons that are part of the multipolygon.
85924           //
85925           // Each element is itself an array of objects with an id property, and has a
85926           // locs property which is an array of the locations forming the polygon.
85927           var polygons = entities.multipolygon.reduce(function(polygons, m) {
85928               return polygons.concat(osmJoinWays(m.members, graph));
85929           }, []).concat(entities.closedWay.map(function(d) {
85930               var member = [{id: d.id}];
85931               member.nodes = graph.childNodes(d);
85932               return member;
85933           }));
85934
85935           // contained is an array of arrays of boolean values,
85936           // where contained[j][k] is true iff the jth way is
85937           // contained by the kth way.
85938           var contained = polygons.map(function(w, i) {
85939               return polygons.map(function(d, n) {
85940                   if (i === n) return null;
85941                   return geoPolygonContainsPolygon(
85942                       map$3(d.nodes, 'loc'),
85943                       map$3(w.nodes, 'loc'));
85944               });
85945           });
85946
85947           // Sort all polygons as either outer or inner ways
85948           var members = [],
85949               outer = true;
85950
85951           while (polygons.length) {
85952               extractUncontained(polygons);
85953               polygons = polygons.filter(isContained);
85954               contained = contained.filter(isContained).map(filterContained);
85955           }
85956
85957           function isContained(d, i) {
85958               return some(contained[i]);
85959           }
85960
85961           function filterContained(d) {
85962               return d.filter(isContained);
85963           }
85964
85965           function extractUncontained(polygons) {
85966               polygons.forEach(function(d, i) {
85967                   if (!isContained(d, i)) {
85968                       d.forEach(function(member) {
85969                           members.push({
85970                               type: 'way',
85971                               id: member.id,
85972                               role: outer ? 'outer' : 'inner'
85973                           });
85974                       });
85975                   }
85976               });
85977               outer = !outer;
85978           }
85979
85980           // Move all tags to one relation
85981           var relation = entities.multipolygon[0] ||
85982               osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
85983
85984           entities.multipolygon.slice(1).forEach(function(m) {
85985               relation = relation.mergeTags(m.tags);
85986               graph = graph.remove(m);
85987           });
85988
85989           entities.closedWay.forEach(function(way) {
85990               function isThisOuter(m) {
85991                   return m.id === way.id && m.role !== 'inner';
85992               }
85993               if (members.some(isThisOuter)) {
85994                   relation = relation.mergeTags(way.tags);
85995                   graph = graph.replace(way.update({ tags: {} }));
85996               }
85997           });
85998
85999           return graph.replace(relation.update({
86000               members: members,
86001               tags: omit(relation.tags, 'area')
86002           }));
86003       };
86004
86005
86006       action.disabled = function(graph) {
86007           var entities = groupEntities(graph);
86008           if (entities.other.length > 0 ||
86009               entities.closedWay.length + entities.multipolygon.length < 2)
86010               return 'not_eligible';
86011           if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
86012               return 'incomplete_relation';
86013       };
86014
86015
86016       return action;
86017   }
86018
86019   // Text diff algorithm following Hunt and McIlroy 1976.
86020   // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
86021   // comparison, Bell Telephone Laboratories CSTR #41 (1976)
86022   // http://www.cs.dartmouth.edu/~doug/
86023   //
86024   // Expects two arrays of strings.
86025   function LCS(file1, file2) {
86026     var equivalenceClasses;
86027     var file2indices;
86028     var newCandidate;
86029     var candidates;
86030     var line;
86031     var c, i, j, jX, r, s;
86032
86033     equivalenceClasses = {};
86034     for (j = 0; j < file2.length; j++) {
86035       line = file2[j];
86036       if (equivalenceClasses[line]) {
86037         equivalenceClasses[line].push(j);
86038       } else {
86039         equivalenceClasses[line] = [j];
86040       }
86041     }
86042
86043     candidates = [
86044       { file1index: -1, file2index: -1, chain: null }
86045     ];
86046
86047     for (i = 0; i < file1.length; i++) {
86048       line = file1[i];
86049       file2indices = equivalenceClasses[line] || [];
86050
86051       r = 0;
86052       c = candidates[0];
86053
86054       for (jX = 0; jX < file2indices.length; jX++) {
86055         j = file2indices[jX];
86056
86057         for (s = r; s < candidates.length; s++) {
86058           if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
86059             break;
86060           }
86061         }
86062
86063         if (s < candidates.length) {
86064           newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
86065           if (r === candidates.length) {
86066             candidates.push(c);
86067           } else {
86068             candidates[r] = c;
86069           }
86070           r = s + 1;
86071           c = newCandidate;
86072           if (r === candidates.length) {
86073             break; // no point in examining further (j)s
86074           }
86075         }
86076       }
86077
86078       candidates[r] = c;
86079     }
86080
86081     // At this point, we know the LCS: it's in the reverse of the
86082     // linked-list through .chain of candidates[candidates.length - 1].
86083
86084     return candidates[candidates.length - 1];
86085   }
86086
86087
86088   // We apply the LCS to give a simple representation of the
86089   // offsets and lengths of mismatched chunks in the input
86090   // files. This is used by diff3MergeIndices below.
86091   function diffIndices(file1, file2) {
86092     var result = [];
86093     var tail1 = file1.length;
86094     var tail2 = file2.length;
86095
86096     for (var candidate = LCS(file1, file2);
86097        candidate !== null;
86098        candidate = candidate.chain)
86099     {
86100       var mismatchLength1 = tail1 - candidate.file1index - 1;
86101       var mismatchLength2 = tail2 - candidate.file2index - 1;
86102       tail1 = candidate.file1index;
86103       tail2 = candidate.file2index;
86104
86105       if (mismatchLength1 || mismatchLength2) {
86106         result.push({
86107           file1: [tail1 + 1, mismatchLength1],
86108           file2: [tail2 + 1, mismatchLength2]
86109         });
86110       }
86111     }
86112
86113     result.reverse();
86114     return result;
86115   }
86116
86117
86118   // Given three files, A, O, and B, where both A and B are
86119   // independently derived from O, returns a fairly complicated
86120   // internal representation of merge decisions it's taken. The
86121   // interested reader may wish to consult
86122   //
86123   // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
86124   // 'A Formal Investigation of ' In Arvind and Prasad,
86125   // editors, Foundations of Software Technology and Theoretical
86126   // Computer Science (FSTTCS), December 2007.
86127   //
86128   // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
86129   function diff3MergeIndices(a, o, b) {
86130     var i;
86131     var m1 = diffIndices(o, a);
86132     var m2 = diffIndices(o, b);
86133
86134     var hunks = [];
86135     function addHunk(h, side) {
86136       hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
86137     }
86138     for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
86139     for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
86140     hunks.sort(function (x, y) { return x[0] - y[0]; });
86141
86142     var result = [];
86143     var commonOffset = 0;
86144     function copyCommon(targetOffset) {
86145       if (targetOffset > commonOffset) {
86146         result.push([1, commonOffset, targetOffset - commonOffset]);
86147         commonOffset = targetOffset;
86148       }
86149     }
86150
86151     for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
86152       var firstHunkIndex = hunkIndex;
86153       var hunk = hunks[hunkIndex];
86154       var regionLhs = hunk[0];
86155       var regionRhs = regionLhs + hunk[2];
86156       while (hunkIndex < hunks.length - 1) {
86157         var maybeOverlapping = hunks[hunkIndex + 1];
86158         var maybeLhs = maybeOverlapping[0];
86159         if (maybeLhs > regionRhs) {
86160           break;
86161         }
86162         regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
86163         hunkIndex++;
86164       }
86165
86166       copyCommon(regionLhs);
86167       if (firstHunkIndex === hunkIndex) {
86168         // The 'overlap' was only one hunk long, meaning that
86169         // there's no conflict here. Either a and o were the
86170         // same, or b and o were the same.
86171         if (hunk[4] > 0) {
86172           result.push([hunk[1], hunk[3], hunk[4]]);
86173         }
86174       } else {
86175         // A proper conflict. Determine the extents of the
86176         // regions involved from a, o and b. Effectively merge
86177         // all the hunks on the left into one giant hunk, and
86178         // do the same for the right; then, correct for skew
86179         // in the regions of o that each side changed, and
86180         // report appropriate spans for the three sides.
86181         var regions = {
86182           0: [a.length, -1, o.length, -1],
86183           2: [b.length, -1, o.length, -1]
86184         };
86185         for (i = firstHunkIndex; i <= hunkIndex; i++) {
86186           hunk = hunks[i];
86187           var side = hunk[1];
86188           var r = regions[side];
86189           var oLhs = hunk[0];
86190           var oRhs = oLhs + hunk[2];
86191           var abLhs = hunk[3];
86192           var abRhs = abLhs + hunk[4];
86193           r[0] = Math.min(abLhs, r[0]);
86194           r[1] = Math.max(abRhs, r[1]);
86195           r[2] = Math.min(oLhs, r[2]);
86196           r[3] = Math.max(oRhs, r[3]);
86197         }
86198         var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
86199         var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
86200         var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
86201         var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
86202         result.push([-1,
86203                      aLhs,      aRhs      - aLhs,
86204                      regionLhs, regionRhs - regionLhs,
86205                      bLhs,      bRhs      - bLhs]);
86206       }
86207       commonOffset = regionRhs;
86208     }
86209
86210     copyCommon(o.length);
86211     return result;
86212   }
86213
86214
86215   // Applies the output of diff3MergeIndices to actually
86216   // construct the merged file; the returned result alternates
86217   // between 'ok' and 'conflict' blocks.
86218   function diff3Merge(a, o, b, excludeFalseConflicts) {
86219     var result = [];
86220     var files = [a, o, b];
86221     var indices = diff3MergeIndices(a, o, b);
86222
86223     var okLines = [];
86224     function flushOk() {
86225       if (okLines.length) {
86226         result.push({ok: okLines});
86227       }
86228       okLines = [];
86229     }
86230     function pushOk(xs) {
86231       for (var j = 0; j < xs.length; j++) {
86232         okLines.push(xs[j]);
86233       }
86234     }
86235
86236     function isTrueConflict(rec) {
86237       if (rec[2] !== rec[6]) return true;
86238       var aoff = rec[1];
86239       var boff = rec[5];
86240       for (var j = 0; j < rec[2]; j++) {
86241         if (a[j + aoff] !== b[j + boff]) {
86242           return true;
86243         }
86244       }
86245       return false;
86246     }
86247
86248     for (var i = 0; i < indices.length; i++) {
86249       var x = indices[i];
86250       var side = x[0];
86251       if (side === -1) {
86252         if (excludeFalseConflicts && !isTrueConflict(x)) {
86253           pushOk(files[0].slice(x[1], x[1] + x[2]));
86254         } else {
86255           flushOk();
86256           result.push({
86257             conflict: {
86258               a: a.slice(x[1], x[1] + x[2]),
86259               aIndex: x[1],
86260               o: o.slice(x[3], x[3] + x[4]),
86261               oIndex: x[3],
86262               b: b.slice(x[5], x[5] + x[6]),
86263               bIndex: x[5]
86264             }
86265           });
86266         }
86267       } else {
86268         pushOk(files[side].slice(x[1], x[1] + x[2]));
86269       }
86270     }
86271
86272     flushOk();
86273     return result;
86274   }
86275
86276   function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
86277       var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
86278       var _conflicts = [];
86279
86280
86281       function user(d) {
86282           return isFunction(formatUser) ? formatUser(d) : d;
86283       }
86284
86285
86286       function mergeLocation(remote, target) {
86287           function pointEqual(a, b) {
86288               var epsilon = 1e-6;
86289               return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
86290           }
86291
86292           if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
86293               return target;
86294           }
86295           if (_option === 'force_remote') {
86296               return target.update({loc: remote.loc});
86297           }
86298
86299           _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
86300           return target;
86301       }
86302
86303
86304       function mergeNodes(base, remote, target) {
86305           if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
86306               return target;
86307           }
86308           if (_option === 'force_remote') {
86309               return target.update({nodes: remote.nodes});
86310           }
86311
86312           var ccount = _conflicts.length;
86313           var o = base.nodes || [];
86314           var a = target.nodes || [];
86315           var b = remote.nodes || [];
86316           var nodes = [];
86317           var hunks = diff3Merge(a, o, b, true);
86318
86319           for (var i = 0; i < hunks.length; i++) {
86320               var hunk = hunks[i];
86321               if (hunk.ok) {
86322                   nodes.push.apply(nodes, hunk.ok);
86323               } else {
86324                   // for all conflicts, we can assume c.a !== c.b
86325                   // because `diff3Merge` called with `true` option to exclude false conflicts..
86326                   var c = hunk.conflict;
86327                   if (isEqual(c.o, c.a)) {  // only changed remotely
86328                       nodes.push.apply(nodes, c.b);
86329                   } else if (isEqual(c.o, c.b)) {  // only changed locally
86330                       nodes.push.apply(nodes, c.a);
86331                   } else {       // changed both locally and remotely
86332                       _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
86333                       break;
86334                   }
86335               }
86336           }
86337
86338           return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
86339       }
86340
86341
86342       function mergeChildren(targetWay, children, updates, graph) {
86343           function isUsed(node, targetWay) {
86344               var parentWays = map$3(graph.parentWays(node), 'id');
86345               return node.hasInterestingTags() ||
86346                   without(parentWays, targetWay.id).length > 0 ||
86347                   graph.parentRelations(node).length > 0;
86348           }
86349
86350           var ccount = _conflicts.length;
86351
86352           for (var i = 0; i < children.length; i++) {
86353               var id = children[i];
86354               var node = graph.hasEntity(id);
86355
86356               // remove unused childNodes..
86357               if (targetWay.nodes.indexOf(id) === -1) {
86358                   if (node && !isUsed(node, targetWay)) {
86359                       updates.removeIds.push(id);
86360                   }
86361                   continue;
86362               }
86363
86364               // restore used childNodes..
86365               var local = localGraph.hasEntity(id);
86366               var remote = remoteGraph.hasEntity(id);
86367               var target;
86368
86369               if (_option === 'force_remote' && remote && remote.visible) {
86370                   updates.replacements.push(remote);
86371
86372               } else if (_option === 'force_local' && local) {
86373                   target = osmEntity$$1(local);
86374                   if (remote) {
86375                       target = target.update({ version: remote.version });
86376                   }
86377                   updates.replacements.push(target);
86378
86379               } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
86380                   target = osmEntity$$1(local, { version: remote.version });
86381                   if (remote.visible) {
86382                       target = mergeLocation(remote, target);
86383                   } else {
86384                       _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
86385                   }
86386
86387                   if (_conflicts.length !== ccount) break;
86388                   updates.replacements.push(target);
86389               }
86390           }
86391
86392           return targetWay;
86393       }
86394
86395
86396       function updateChildren(updates, graph) {
86397           for (var i = 0; i < updates.replacements.length; i++) {
86398               graph = graph.replace(updates.replacements[i]);
86399           }
86400           if (updates.removeIds.length) {
86401               graph = actionDeleteMultiple(updates.removeIds)(graph);
86402           }
86403           return graph;
86404       }
86405
86406
86407       function mergeMembers(remote, target) {
86408           if (_option === 'force_local' || isEqual(target.members, remote.members)) {
86409               return target;
86410           }
86411           if (_option === 'force_remote') {
86412               return target.update({members: remote.members});
86413           }
86414
86415           _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
86416           return target;
86417       }
86418
86419
86420       function mergeTags(base, remote, target) {
86421           function ignoreKey(k) {
86422               return dataDiscarded[k];
86423           }
86424
86425           if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
86426               return target;
86427           }
86428           if (_option === 'force_remote') {
86429               return target.update({tags: remote.tags});
86430           }
86431
86432           var ccount = _conflicts.length;
86433           var o = base.tags || {};
86434           var a = target.tags || {};
86435           var b = remote.tags || {};
86436           var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
86437           var tags = clone(a);
86438           var changed = false;
86439
86440           for (var i = 0; i < keys.length; i++) {
86441               var k = keys[i];
86442
86443               if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
86444                   if (o[k] !== a[k]) {      // changed locally..
86445                       _conflicts.push(t('merge_remote_changes.conflict.tags',
86446                           { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
86447
86448                   } else {                  // unchanged locally, accept remote change..
86449                       if (b.hasOwnProperty(k)) {
86450                           tags[k] = b[k];
86451                       } else {
86452                           delete tags[k];
86453                       }
86454                       changed = true;
86455                   }
86456               }
86457           }
86458
86459           return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
86460       }
86461
86462
86463       //  `graph.base()` is the common ancestor of the two graphs.
86464       //  `localGraph` contains user's edits up to saving
86465       //  `remoteGraph` contains remote edits to modified nodes
86466       //  `graph` must be a descendent of `localGraph` and may include
86467       //      some conflict resolution actions performed on it.
86468       //
86469       //                  --- ... --- `localGraph` -- ... -- `graph`
86470       //                 /
86471       //  `graph.base()` --- ... --- `remoteGraph`
86472       //
86473       var action = function(graph) {
86474           var updates = { replacements: [], removeIds: [] };
86475           var base = graph.base().entities[id];
86476           var local = localGraph.entity(id);
86477           var remote = remoteGraph.entity(id);
86478           var target = osmEntity$$1(local, { version: remote.version });
86479
86480           // delete/undelete
86481           if (!remote.visible) {
86482               if (_option === 'force_remote') {
86483                   return actionDeleteMultiple([id])(graph);
86484
86485               } else if (_option === 'force_local') {
86486                   if (target.type === 'way') {
86487                       target = mergeChildren(target, uniq(local.nodes), updates, graph);
86488                       graph = updateChildren(updates, graph);
86489                   }
86490                   return graph.replace(target);
86491
86492               } else {
86493                   _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
86494                   return graph;  // do nothing
86495               }
86496           }
86497
86498           // merge
86499           if (target.type === 'node') {
86500               target = mergeLocation(remote, target);
86501
86502           } else if (target.type === 'way') {
86503               // pull in any child nodes that may not be present locally..
86504               graph.rebase(remoteGraph.childNodes(remote), [graph], false);
86505               target = mergeNodes(base, remote, target);
86506               target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
86507
86508           } else if (target.type === 'relation') {
86509               target = mergeMembers(remote, target);
86510           }
86511
86512           target = mergeTags(base, remote, target);
86513
86514           if (!_conflicts.length) {
86515               graph = updateChildren(updates, graph).replace(target);
86516           }
86517
86518           return graph;
86519       };
86520
86521
86522       action.withOption = function(opt) {
86523           _option = opt;
86524           return action;
86525       };
86526
86527
86528       action.conflicts = function() {
86529           return _conflicts;
86530       };
86531
86532
86533       return action;
86534   }
86535
86536   // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
86537   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
86538   function actionMove(moveIds, tryDelta, projection, cache) {
86539       var _delta = tryDelta;
86540
86541       function setupCache(graph) {
86542           function canMove(nodeId) {
86543               // Allow movement of any node that is in the selectedIDs list..
86544               if (moveIds.indexOf(nodeId) !== -1) return true;
86545
86546               // Allow movement of a vertex where 2 ways meet..
86547               var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
86548               if (parents.length < 3) return true;
86549
86550               // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
86551               var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
86552               if (!parentsMoving) delete cache.moving[nodeId];
86553
86554               return parentsMoving;
86555           }
86556
86557           function cacheEntities(ids) {
86558               for (var i = 0; i < ids.length; i++) {
86559                   var id = ids[i];
86560                   if (cache.moving[id]) continue;
86561                   cache.moving[id] = true;
86562
86563                   var entity = graph.hasEntity(id);
86564                   if (!entity) continue;
86565
86566                   if (entity.type === 'node') {
86567                       cache.nodes.push(id);
86568                       cache.startLoc[id] = entity.loc;
86569                   } else if (entity.type === 'way') {
86570                       cache.ways.push(id);
86571                       cacheEntities(entity.nodes);
86572                   } else {
86573                       cacheEntities(entity.members.map(function(member) {
86574                           return member.id;
86575                       }));
86576                   }
86577               }
86578           }
86579
86580           function cacheIntersections(ids) {
86581               function isEndpoint(way, id) {
86582                   return !way.isClosed() && !!way.affix(id);
86583               }
86584
86585               for (var i = 0; i < ids.length; i++) {
86586                   var id = ids[i];
86587
86588                   // consider only intersections with 1 moved and 1 unmoved way.
86589                   var childNodes = graph.childNodes(graph.entity(id));
86590                   for (var j = 0; j < childNodes.length; j++) {
86591                       var node = childNodes[j];
86592                       var parents = graph.parentWays(node);
86593                       if (parents.length !== 2) continue;
86594
86595                       var moved = graph.entity(id);
86596                       var unmoved = null;
86597                       for (var k = 0; k < parents.length; k++) {
86598                           var way = parents[k];
86599                           if (!cache.moving[way.id]) {
86600                               unmoved = way;
86601                               break;
86602                           }
86603                       }
86604                       if (!unmoved) continue;
86605
86606                       // exclude ways that are overly connected..
86607                       if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
86608                       if (moved.isArea() || unmoved.isArea()) continue;
86609
86610                       cache.intersections.push({
86611                           nodeId: node.id,
86612                           movedId: moved.id,
86613                           unmovedId: unmoved.id,
86614                           movedIsEP: isEndpoint(moved, node.id),
86615                           unmovedIsEP: isEndpoint(unmoved, node.id)
86616                       });
86617                   }
86618               }
86619           }
86620
86621
86622           if (!cache) {
86623               cache = {};
86624           }
86625           if (!cache.ok) {
86626               cache.moving = {};
86627               cache.intersections = [];
86628               cache.replacedVertex = {};
86629               cache.startLoc = {};
86630               cache.nodes = [];
86631               cache.ways = [];
86632
86633               cacheEntities(moveIds);
86634               cacheIntersections(cache.ways);
86635               cache.nodes = filter(cache.nodes, canMove);
86636
86637               cache.ok = true;
86638           }
86639       }
86640
86641
86642       // Place a vertex where the moved vertex used to be, to preserve way shape..
86643       //
86644       //  Start:
86645       //      b ---- e
86646       //     / \
86647       //    /   \
86648       //   /     \
86649       //  a       c
86650       //
86651       //      *               node '*' added to preserve shape
86652       //     / \
86653       //    /   b ---- e      way `b,e` moved here:
86654       //   /     \
86655       //  a       c
86656       //
86657       //
86658       function replaceMovedVertex(nodeId, wayId, graph, delta) {
86659           var way = graph.entity(wayId);
86660           var moved = graph.entity(nodeId);
86661           var movedIndex = way.nodes.indexOf(nodeId);
86662           var len, prevIndex, nextIndex;
86663
86664           if (way.isClosed()) {
86665               len = way.nodes.length - 1;
86666               prevIndex = (movedIndex + len - 1) % len;
86667               nextIndex = (movedIndex + len + 1) % len;
86668           } else {
86669               len = way.nodes.length;
86670               prevIndex = movedIndex - 1;
86671               nextIndex = movedIndex + 1;
86672           }
86673
86674           var prev = graph.hasEntity(way.nodes[prevIndex]);
86675           var next = graph.hasEntity(way.nodes[nextIndex]);
86676
86677           // Don't add orig vertex at endpoint..
86678           if (!prev || !next) return graph;
86679
86680           var key = wayId + '_' + nodeId;
86681           var orig = cache.replacedVertex[key];
86682           if (!orig) {
86683               orig = osmNode();
86684               cache.replacedVertex[key] = orig;
86685               cache.startLoc[orig.id] = cache.startLoc[nodeId];
86686           }
86687
86688           var start, end;
86689           if (delta) {
86690               start = projection(cache.startLoc[nodeId]);
86691               end = projection.invert(geoVecAdd(start, delta));
86692           } else {
86693               end = cache.startLoc[nodeId];
86694           }
86695           orig = orig.move(end);
86696
86697           var angle = Math.abs(geoAngle(orig, prev, projection) -
86698                   geoAngle(orig, next, projection)) * 180 / Math.PI;
86699
86700           // Don't add orig vertex if it would just make a straight line..
86701           if (angle > 175 && angle < 185) return graph;
86702
86703           // moving forward or backward along way?
86704           var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
86705           var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
86706           var d1 = geoPathLength(p1);
86707           var d2 = geoPathLength(p2);
86708           var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
86709
86710           // moving around closed loop?
86711           if (way.isClosed() && insertAt === 0) insertAt = len;
86712
86713           way = way.addNode(orig.id, insertAt);
86714           return graph.replace(orig).replace(way);
86715       }
86716
86717
86718       // Remove duplicate vertex that might have been added by
86719       // replaceMovedVertex.  This is done after the unzorro checks.
86720       function removeDuplicateVertices(wayId, graph) {
86721           var way = graph.entity(wayId);
86722           var epsilon = 1e-6;
86723           var prev, curr;
86724
86725           function isInteresting(node, graph) {
86726               return graph.parentWays(node).length > 1 ||
86727                   graph.parentRelations(node).length ||
86728                   node.hasInterestingTags();
86729           }
86730
86731           for (var i = 0; i < way.nodes.length; i++) {
86732               curr = graph.entity(way.nodes[i]);
86733
86734               if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
86735                   if (!isInteresting(prev, graph)) {
86736                       way = way.removeNode(prev.id);
86737                       graph = graph.replace(way).remove(prev);
86738                   } else if (!isInteresting(curr, graph)) {
86739                       way = way.removeNode(curr.id);
86740                       graph = graph.replace(way).remove(curr);
86741                   }
86742               }
86743
86744               prev = curr;
86745           }
86746
86747           return graph;
86748       }
86749
86750
86751       // Reorder nodes around intersections that have moved..
86752       //
86753       //  Start:                way1.nodes: b,e         (moving)
86754       //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
86755       //      |                 vertex: b
86756       //      e                 isEP1: true,  isEP2, false
86757       //
86758       //  way1 `b,e` moved here:
86759       //  a ----- c = b - d
86760       //              |
86761       //              e
86762       //
86763       //  reorder nodes         way1.nodes: b,e
86764       //  a ----- c - b - d     way2.nodes: a,c,b,d
86765       //              |
86766       //              e
86767       //
86768       function unZorroIntersection(intersection$$1, graph) {
86769           var vertex = graph.entity(intersection$$1.nodeId);
86770           var way1 = graph.entity(intersection$$1.movedId);
86771           var way2 = graph.entity(intersection$$1.unmovedId);
86772           var isEP1 = intersection$$1.movedIsEP;
86773           var isEP2 = intersection$$1.unmovedIsEP;
86774
86775           // don't move the vertex if it is the endpoint of both ways.
86776           if (isEP1 && isEP2) return graph;
86777
86778           var nodes1 = without(graph.childNodes(way1), vertex);
86779           var nodes2 = without(graph.childNodes(way2), vertex);
86780
86781           if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
86782           if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
86783
86784           var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
86785           var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
86786           var loc;
86787
86788           // snap vertex to nearest edge (or some point between them)..
86789           if (!isEP1 && !isEP2) {
86790               var epsilon = 1e-6, maxIter = 10;
86791               for (var i = 0; i < maxIter; i++) {
86792                   loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
86793                   edge1 = geoChooseEdge(nodes1, projection(loc), projection);
86794                   edge2 = geoChooseEdge(nodes2, projection(loc), projection);
86795                   if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
86796               }
86797           } else if (!isEP1) {
86798               loc = edge1.loc;
86799           } else {
86800               loc = edge2.loc;
86801           }
86802
86803           graph = graph.replace(vertex.move(loc));
86804
86805           // if zorro happened, reorder nodes..
86806           if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
86807               way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
86808               graph = graph.replace(way1);
86809           }
86810           if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
86811               way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
86812               graph = graph.replace(way2);
86813           }
86814
86815           return graph;
86816       }
86817
86818
86819       function cleanupIntersections(graph) {
86820           for (var i = 0; i < cache.intersections.length; i++) {
86821               var obj = cache.intersections[i];
86822               graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
86823               graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
86824               graph = unZorroIntersection(obj, graph);
86825               graph = removeDuplicateVertices(obj.movedId, graph);
86826               graph = removeDuplicateVertices(obj.unmovedId, graph);
86827           }
86828
86829           return graph;
86830       }
86831
86832
86833       // check if moving way endpoint can cross an unmoved way, if so limit delta..
86834       function limitDelta(graph) {
86835           function moveNode(loc) {
86836               return geoVecAdd(projection(loc), _delta);
86837           }
86838
86839           for (var i = 0; i < cache.intersections.length; i++) {
86840               var obj = cache.intersections[i];
86841
86842               // Don't limit movement if this is vertex joins 2 endpoints..
86843               if (obj.movedIsEP && obj.unmovedIsEP) continue;
86844               // Don't limit movement if this vertex is not an endpoint anyway..
86845               if (!obj.movedIsEP) continue;
86846
86847               var node = graph.entity(obj.nodeId);
86848               var start = projection(node.loc);
86849               var end = geoVecAdd(start, _delta);
86850               var movedNodes = graph.childNodes(graph.entity(obj.movedId));
86851               var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
86852               var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
86853               var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
86854               var hits = geoPathIntersections(movedPath, unmovedPath);
86855
86856               for (var j = 0; i < hits.length; i++) {
86857                   if (isEqual(hits[j], end)) continue;
86858                   var edge = geoChooseEdge(unmovedNodes, end, projection);
86859                   _delta = geoVecSubtract(projection(edge.loc), start);
86860               }
86861           }
86862       }
86863
86864
86865       var action = function(graph) {
86866           if (_delta[0] === 0 && _delta[1] === 0) return graph;
86867
86868           setupCache(graph);
86869
86870           if (cache.intersections.length) {
86871               limitDelta(graph);
86872           }
86873
86874           for (var i = 0; i < cache.nodes.length; i++) {
86875               var node = graph.entity(cache.nodes[i]);
86876               var start = projection(node.loc);
86877               var end = geoVecAdd(start, _delta);
86878               graph = graph.replace(node.move(projection.invert(end)));
86879           }
86880
86881           if (cache.intersections.length) {
86882               graph = cleanupIntersections(graph);
86883           }
86884
86885           return graph;
86886       };
86887
86888
86889       action.delta = function() {
86890           return _delta;
86891       };
86892
86893
86894       return action;
86895   }
86896
86897   function actionMoveNode(nodeID, toLoc) {
86898
86899       var action = function(graph, t) {
86900           if (t === null || !isFinite(t)) t = 1;
86901           t = Math.min(Math.max(+t, 0), 1);
86902
86903           var node = graph.entity(nodeID);
86904           return graph.replace(
86905               node.move(geoVecInterp(node.loc, toLoc, t))
86906           );
86907       };
86908
86909       action.transitionable = true;
86910
86911       return action;
86912   }
86913
86914   function actionNoop() {
86915       return function(graph) {
86916           return graph;
86917       };
86918   }
86919
86920   /*
86921    * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
86922    */
86923   function actionOrthogonalize(wayId, projection) {
86924       var threshold = 12, // degrees within right or straight to alter
86925           lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
86926           upperThreshold = Math.cos(threshold * Math.PI / 180);
86927
86928
86929       var action = function(graph, t) {
86930           if (t === null || !isFinite(t)) t = 1;
86931           t = Math.min(Math.max(+t, 0), 1);
86932
86933           var way = graph.entity(wayId),
86934               nodes = graph.childNodes(way),
86935               points = uniq(nodes).map(function(n) { return projection(n.loc); }),
86936               corner = {i: 0, dotp: 1},
86937               epsilon = 1e-4,
86938               node, loc, score, motions, i, j;
86939
86940           if (points.length === 3) {   // move only one vertex for right triangle
86941               for (i = 0; i < 1000; i++) {
86942                   motions = points.map(calcMotion);
86943                   points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
86944                   score = corner.dotp;
86945                   if (score < epsilon) {
86946                       break;
86947                   }
86948               }
86949
86950               node = graph.entity(nodes[corner.i].id);
86951               loc = projection.invert(points[corner.i]);
86952               graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
86953
86954           } else {
86955               var best,
86956                   originalPoints = clone(points);
86957               score = Infinity;
86958
86959               for (i = 0; i < 1000; i++) {
86960                   motions = points.map(calcMotion);
86961                   for (j = 0; j < motions.length; j++) {
86962                       points[j] = addPoints(points[j],motions[j]);
86963                   }
86964                   var newScore = squareness(points);
86965                   if (newScore < score) {
86966                       best = clone(points);
86967                       score = newScore;
86968                   }
86969                   if (score < epsilon) {
86970                       break;
86971                   }
86972               }
86973
86974               points = best;
86975
86976               for (i = 0; i < points.length; i++) {
86977                   // only move the points that actually moved
86978                   if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
86979                       loc = projection.invert(points[i]);
86980                       node = graph.entity(nodes[i].id);
86981                       graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
86982                   }
86983               }
86984
86985               // remove empty nodes on straight sections
86986               for (i = 0; t === 1 && i < points.length; i++) {
86987                   node = graph.entity(nodes[i].id);
86988
86989                   if (graph.parentWays(node).length > 1 ||
86990                       graph.parentRelations(node).length ||
86991                       node.hasInterestingTags()) {
86992                       continue;
86993                   }
86994
86995                   var dotp = normalizedDotProduct(i, points);
86996                   if (dotp < -1 + epsilon) {
86997                       graph = actionDeleteNode(node.id)(graph);
86998                   }
86999               }
87000           }
87001
87002           return graph;
87003
87004
87005           function calcMotion(b, i, array) {
87006               var a = array[(i - 1 + array.length) % array.length],
87007                   c = array[(i + 1) % array.length],
87008                   p = subtractPoints(a, b),
87009                   q = subtractPoints(c, b),
87010                   scale, dotp;
87011
87012               scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
87013               p = normalizePoint(p, 1.0);
87014               q = normalizePoint(q, 1.0);
87015
87016               dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
87017
87018               // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
87019               if (array.length > 3) {
87020                   if (dotp < -0.707106781186547) {
87021                       dotp += 1.0;
87022                   }
87023               } else if (dotp && Math.abs(dotp) < corner.dotp) {
87024                   corner.i = i;
87025                   corner.dotp = Math.abs(dotp);
87026               }
87027
87028               return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
87029           }
87030       };
87031
87032
87033       function squareness(points) {
87034           return points.reduce(function(sum, val, i, array) {
87035               var dotp = normalizedDotProduct(i, array);
87036
87037               dotp = filterDotProduct(dotp);
87038               return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
87039           }, 0);
87040       }
87041
87042
87043       function normalizedDotProduct(i, points) {
87044           var a = points[(i - 1 + points.length) % points.length],
87045               b = points[i],
87046               c = points[(i + 1) % points.length],
87047               p = subtractPoints(a, b),
87048               q = subtractPoints(c, b);
87049
87050           p = normalizePoint(p, 1.0);
87051           q = normalizePoint(q, 1.0);
87052
87053           return p[0] * q[0] + p[1] * q[1];
87054       }
87055
87056
87057       function subtractPoints(a, b) {
87058           return [a[0] - b[0], a[1] - b[1]];
87059       }
87060
87061
87062       function addPoints(a, b) {
87063           return [a[0] + b[0], a[1] + b[1]];
87064       }
87065
87066
87067       function normalizePoint(point, scale) {
87068           var vector = [0, 0];
87069           var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
87070           if (length !== 0) {
87071               vector[0] = point[0] / length;
87072               vector[1] = point[1] / length;
87073           }
87074
87075           vector[0] *= scale;
87076           vector[1] *= scale;
87077
87078           return vector;
87079       }
87080
87081
87082       function filterDotProduct(dotp) {
87083           if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
87084               return dotp;
87085           }
87086
87087           return 0;
87088       }
87089
87090
87091       action.disabled = function(graph) {
87092           var way = graph.entity(wayId),
87093               nodes = graph.childNodes(way),
87094               points = uniq(nodes).map(function(n) { return projection(n.loc); });
87095
87096           if (squareness(points)) {
87097               return false;
87098           }
87099
87100           return 'not_squarish';
87101       };
87102
87103
87104       action.transitionable = true;
87105
87106
87107       return action;
87108   }
87109
87110   // `actionRestrictTurn` creates a turn restriction relation.
87111   //
87112   // `turn` must be an `osmTurn` object
87113   // see osm/intersection.js, pathToTurn()
87114   //
87115   // This specifies a restriction of type `restriction` when traveling from
87116   // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
87117   // (The action does not check that these entities form a valid intersection.)
87118   //
87119   // From, to, and via ways should be split before calling this action.
87120   // (old versions of the code would split the ways here, but we no longer do it)
87121   //
87122   // For testing convenience, accepts a restrictionID to assign to the new
87123   // relation. Normally, this will be undefined and the relation will
87124   // automatically be assigned a new ID.
87125   //
87126   function actionRestrictTurn(turn, restrictionType, restrictionID) {
87127
87128       return function(graph) {
87129           var fromWay = graph.entity(turn.from.way);
87130           var toWay = graph.entity(turn.to.way);
87131           var viaNode = turn.via.node && graph.entity(turn.via.node);
87132           var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
87133           var members = [];
87134
87135           members.push({ id: fromWay.id, type: 'way',  role: 'from' });
87136
87137           if (viaNode) {
87138               members.push({ id: viaNode.id,  type: 'node', role: 'via' });
87139           } else if (viaWays) {
87140               viaWays.forEach(function(viaWay) {
87141                   members.push({ id: viaWay.id,  type: 'way', role: 'via' });
87142               });
87143           }
87144
87145           members.push({ id: toWay.id, type: 'way',  role: 'to' });
87146
87147           return graph.replace(osmRelation({
87148               id: restrictionID,
87149               tags: {
87150                   type: 'restriction',
87151                   restriction: restrictionType
87152               },
87153               members: members
87154           }));
87155       };
87156   }
87157
87158   function actionRevert(id) {
87159       var action = function(graph) {
87160           var entity = graph.hasEntity(id),
87161               base = graph.base().entities[id];
87162
87163           if (entity && !base) {    // entity will be removed..
87164               if (entity.type === 'node') {
87165                   graph.parentWays(entity)
87166                       .forEach(function(parent) {
87167                           parent = parent.removeNode(id);
87168                           graph = graph.replace(parent);
87169
87170                           if (parent.isDegenerate()) {
87171                               graph = actionDeleteWay(parent.id)(graph);
87172                           }
87173                       });
87174               }
87175
87176               graph.parentRelations(entity)
87177                   .forEach(function(parent) {
87178                       parent = parent.removeMembersWithID(id);
87179                       graph = graph.replace(parent);
87180
87181                       if (parent.isDegenerate()) {
87182                           graph = actionDeleteRelation(parent.id)(graph);
87183                       }
87184                   });
87185           }
87186
87187           return graph.revert(id);
87188       };
87189
87190       return action;
87191   }
87192
87193   function actionRotate(rotateIds, pivot, angle, projection) {
87194
87195       var action = function(graph) {
87196           return graph.update(function(graph) {
87197               utilGetAllNodes(rotateIds, graph).forEach(function(node) {
87198                   var point = geoRotate([projection(node.loc)], angle, pivot)[0];
87199                   graph = graph.replace(node.move(projection.invert(point)));
87200               });
87201           });
87202       };
87203
87204       return action;
87205   }
87206
87207   /* Built-in method references for those with the same name as other `lodash` methods. */
87208   var nativeMax$8 = Math.max;
87209
87210   /**
87211    * Gets the index at which the first occurrence of `value` is found in `array`
87212    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
87213    * for equality comparisons. If `fromIndex` is negative, it's used as the
87214    * offset from the end of `array`.
87215    *
87216    * @static
87217    * @memberOf _
87218    * @since 0.1.0
87219    * @category Array
87220    * @param {Array} array The array to inspect.
87221    * @param {*} value The value to search for.
87222    * @param {number} [fromIndex=0] The index to search from.
87223    * @returns {number} Returns the index of the matched value, else `-1`.
87224    * @example
87225    *
87226    * _.indexOf([1, 2, 1, 2], 2);
87227    * // => 1
87228    *
87229    * // Search from the `fromIndex`.
87230    * _.indexOf([1, 2, 1, 2], 2, 2);
87231    * // => 3
87232    */
87233   function indexOf(array, value, fromIndex) {
87234     var length = array == null ? 0 : array.length;
87235     if (!length) {
87236       return -1;
87237     }
87238     var index = fromIndex == null ? 0 : toInteger(fromIndex);
87239     if (index < 0) {
87240       index = nativeMax$8(length + index, 0);
87241     }
87242     return baseIndexOf(array, value, index);
87243   }
87244
87245   // Split a way at the given node.
87246   //
87247   // Optionally, split only the given ways, if multiple ways share
87248   // the given node.
87249   //
87250   // This is the inverse of `iD.actionJoin`.
87251   //
87252   // For testing convenience, accepts an ID to assign to the new way.
87253   // Normally, this will be undefined and the way will automatically
87254   // be assigned a new ID.
87255   //
87256   // Reference:
87257   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
87258   //
87259   function actionSplit(nodeId, newWayIds) {
87260       var _wayIDs;
87261
87262       // If the way is closed, we need to search for a partner node
87263       // to split the way at.
87264       //
87265       // The following looks for a node that is both far away from
87266       // the initial node in terms of way segment length and nearby
87267       // in terms of beeline-distance. This assures that areas get
87268       // split on the most "natural" points (independent of the number
87269       // of nodes).
87270       // For example: bone-shaped areas get split across their waist
87271       // line, circles across the diameter.
87272       function splitArea(nodes, idxA, graph) {
87273           var lengths = new Array(nodes.length);
87274           var length;
87275           var i;
87276           var best = 0;
87277           var idxB;
87278
87279           function wrap(index) {
87280               return utilWrap(index, nodes.length);
87281           }
87282
87283           function dist(nA, nB) {
87284               var locA = graph.entity(nA).loc;
87285               var locB = graph.entity(nB).loc;
87286               var epsilon = 1e-6;
87287               return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
87288           }
87289
87290           // calculate lengths
87291           length = 0;
87292           for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
87293               length += dist(nodes[i], nodes[wrap(i-1)]);
87294               lengths[i] = length;
87295           }
87296
87297           length = 0;
87298           for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
87299               length += dist(nodes[i], nodes[wrap(i+1)]);
87300               if (length < lengths[i])
87301                   lengths[i] = length;
87302           }
87303
87304           // determine best opposite node to split
87305           for (i = 0; i < nodes.length; i++) {
87306               var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
87307               if (cost > best) {
87308                   idxB = i;
87309                   best = cost;
87310               }
87311           }
87312
87313           return idxB;
87314       }
87315
87316
87317       function split(graph, wayA, newWayId) {
87318           var wayB = osmWay({id: newWayId, tags: wayA.tags});   // `wayB` is the NEW way
87319           var origNodes = wayA.nodes.slice();
87320           var nodesA;
87321           var nodesB;
87322           var isArea = wayA.isArea();
87323           var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
87324
87325           if (wayA.isClosed()) {
87326               var nodes = wayA.nodes.slice(0, -1);
87327               var idxA = indexOf(nodes, nodeId);
87328               var idxB = splitArea(nodes, idxA, graph);
87329
87330               if (idxB < idxA) {
87331                   nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
87332                   nodesB = nodes.slice(idxB, idxA + 1);
87333               } else {
87334                   nodesA = nodes.slice(idxA, idxB + 1);
87335                   nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
87336               }
87337           } else {
87338               var idx = indexOf(wayA.nodes, nodeId, 1);
87339               nodesA = wayA.nodes.slice(0, idx + 1);
87340               nodesB = wayA.nodes.slice(idx);
87341           }
87342
87343           wayA = wayA.update({nodes: nodesA});
87344           wayB = wayB.update({nodes: nodesB});
87345
87346           graph = graph.replace(wayA);
87347           graph = graph.replace(wayB);
87348
87349           graph.parentRelations(wayA).forEach(function(relation) {
87350               var member;
87351
87352               // Turn restrictions - make sure:
87353               // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
87354               //    (whichever one is connected to the VIA node/ways)
87355               // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
87356               if (relation.isRestriction()) {
87357                   var f = relation.memberByRole('from');
87358                   var v = relation.membersByRole('via');
87359                   var t = relation.memberByRole('to');
87360                   var i;
87361
87362                   // 1. split a FROM/TO
87363                   if (f.id === wayA.id || t.id === wayA.id) {
87364                       var keepB = false;
87365                       if (v.length === 1 && v[0].type === 'node') {   // check via node
87366                           keepB = wayB.contains(v[0].id);
87367                       } else {                                        // check via way(s)
87368                           for (i = 0; i < v.length; i++) {
87369                               if (v[i].type === 'way') {
87370                                   var wayVia = graph.hasEntity(v[i].id);
87371                                   if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
87372                                       keepB = true;
87373                                       break;
87374                                   }
87375                               }
87376                           }
87377                       }
87378
87379                       if (keepB) {
87380                           relation = relation.replaceMember(wayA, wayB);
87381                           graph = graph.replace(relation);
87382                       }
87383
87384                   // 2. split a VIA
87385                   } else {
87386                       for (i = 0; i < v.length; i++) {
87387                           if (v[i].type === 'way' && v[i].id === wayA.id) {
87388                               member = {
87389                                   id: wayB.id,
87390                                   type: 'way',
87391                                   role: 'via'
87392                               };
87393                               graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
87394                               break;
87395                           }
87396                       }
87397                   }
87398
87399               // All other relations (Routes, Multipolygons, etc):
87400               // 1. Both `wayA` and `wayB` remain in the relation
87401               // 2. But must be inserted as a pair (see `actionAddMember` for details)
87402               } else {
87403                   if (relation === isOuter) {
87404                       graph = graph.replace(relation.mergeTags(wayA.tags));
87405                       graph = graph.replace(wayA.update({tags: {}}));
87406                       graph = graph.replace(wayB.update({tags: {}}));
87407                   }
87408
87409                   member = {
87410                       id: wayB.id,
87411                       type: 'way',
87412                       role: relation.memberById(wayA.id).role
87413                   };
87414
87415                   var insertPair = {
87416                       originalID: wayA.id,
87417                       insertedID: wayB.id,
87418                       nodes: origNodes
87419                   };
87420
87421                   graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
87422               }
87423           });
87424
87425           if (!isOuter && isArea) {
87426               var multipolygon = osmRelation({
87427                   tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
87428                   members: [
87429                       {id: wayA.id, role: 'outer', type: 'way'},
87430                       {id: wayB.id, role: 'outer', type: 'way'}
87431                   ]
87432               });
87433
87434               graph = graph.replace(multipolygon);
87435               graph = graph.replace(wayA.update({tags: {}}));
87436               graph = graph.replace(wayB.update({tags: {}}));
87437           }
87438
87439           return graph;
87440       }
87441
87442
87443       var action = function(graph) {
87444           var candidates = action.ways(graph);
87445           for (var i = 0; i < candidates.length; i++) {
87446               graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
87447           }
87448           return graph;
87449       };
87450
87451
87452       action.ways = function(graph) {
87453           var node = graph.entity(nodeId);
87454           var parents = graph.parentWays(node);
87455           var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
87456
87457           return parents.filter(function(parent) {
87458               if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
87459                   return false;
87460
87461               if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
87462                   return false;
87463
87464               if (parent.isClosed()) {
87465                   return true;
87466               }
87467
87468               for (var i = 1; i < parent.nodes.length - 1; i++) {
87469                   if (parent.nodes[i] === nodeId) {
87470                       return true;
87471                   }
87472               }
87473
87474               return false;
87475           });
87476       };
87477
87478
87479       action.disabled = function(graph) {
87480           var candidates = action.ways(graph);
87481           if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
87482               return 'not_eligible';
87483       };
87484
87485
87486       action.limitWays = function(_) {
87487           if (!arguments.length) return _wayIDs;
87488           _wayIDs = _;
87489           return action;
87490       };
87491
87492
87493       return action;
87494   }
87495
87496   /*
87497    * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
87498    */
87499   function actionStraighten(wayId, projection) {
87500
87501       function positionAlongWay(n, s, e) {
87502           return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
87503                   (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
87504       }
87505
87506
87507       var action = function(graph, t) {
87508           if (t === null || !isFinite(t)) t = 1;
87509           t = Math.min(Math.max(+t, 0), 1);
87510
87511           var way = graph.entity(wayId),
87512               nodes = graph.childNodes(way),
87513               points = nodes.map(function(n) { return projection(n.loc); }),
87514               startPoint = points[0],
87515               endPoint = points[points.length-1],
87516               toDelete = [],
87517               i;
87518
87519           for (i = 1; i < points.length-1; i++) {
87520               var node = nodes[i],
87521                   point = points[i];
87522
87523               if (t < 1 || graph.parentWays(node).length > 1 ||
87524                   graph.parentRelations(node).length ||
87525                   node.hasInterestingTags()) {
87526
87527                   var u = positionAlongWay(point, startPoint, endPoint),
87528                       p = [
87529                           startPoint[0] + u * (endPoint[0] - startPoint[0]),
87530                           startPoint[1] + u * (endPoint[1] - startPoint[1])
87531                       ],
87532                       loc2 = projection.invert(p);
87533
87534                   graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
87535
87536               } else {
87537                   // safe to delete
87538                   if (toDelete.indexOf(node) === -1) {
87539                       toDelete.push(node);
87540                   }
87541               }
87542           }
87543
87544           for (i = 0; i < toDelete.length; i++) {
87545               graph = actionDeleteNode(toDelete[i].id)(graph);
87546           }
87547
87548           return graph;
87549       };
87550
87551
87552       action.disabled = function(graph) {
87553           // check way isn't too bendy
87554           var way = graph.entity(wayId),
87555               nodes = graph.childNodes(way),
87556               points = nodes.map(function(n) { return projection(n.loc); }),
87557               startPoint = points[0],
87558               endPoint = points[points.length-1],
87559               threshold = 0.2 * geoVecLength(startPoint, endPoint),
87560               i;
87561
87562           if (threshold === 0) {
87563               return 'too_bendy';
87564           }
87565
87566           for (i = 1; i < points.length-1; i++) {
87567               var point = points[i],
87568                   u = positionAlongWay(point, startPoint, endPoint),
87569                   p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
87570                   p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
87571                   dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
87572
87573               // to bendy if point is off by 20% of total start/end distance in projected space
87574               if (isNaN(dist) || dist > threshold) {
87575                   return 'too_bendy';
87576               }
87577           }
87578       };
87579
87580
87581       action.transitionable = true;
87582
87583
87584       return action;
87585   }
87586
87587   // `actionUnrestrictTurn` deletes a turn restriction relation.
87588   //
87589   // `turn` must be an `osmTurn` object with a `restrictionID` property.
87590   // see osm/intersection.js, pathToTurn()
87591   //
87592   function actionUnrestrictTurn(turn) {
87593       return function(graph) {
87594           return actionDeleteRelation(turn.restrictionID)(graph);
87595       };
87596   }
87597
87598   /* Reflect the given area around its axis of symmetry */
87599   function actionReflect(reflectIds, projection) {
87600       var useLongAxis = true;
87601
87602
87603       // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
87604       // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
87605       function getSmallestSurroundingRectangle(graph, nodes) {
87606           var points = nodes.map(function(n) { return projection(n.loc); }),
87607               hull = d3_polygonHull(points),
87608               centroid = d3_polygonCentroid(hull),
87609               minArea = Infinity,
87610               ssrExtent = [],
87611               ssrAngle = 0,
87612               c1 = hull[0];
87613
87614           for (var i = 0; i <= hull.length - 1; i++) {
87615               var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
87616                   angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
87617                   poly = geoRotate(hull, -angle, centroid),
87618                   extent = poly.reduce(function(extent, point) {
87619                           return extent.extend(geoExtent$$1(point));
87620                       }, geoExtent$$1()),
87621                   area = extent.area();
87622
87623               if (area < minArea) {
87624                   minArea = area;
87625                   ssrExtent = extent;
87626                   ssrAngle = angle;
87627               }
87628               c1 = c2;
87629           }
87630
87631           return {
87632               poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
87633               angle: ssrAngle
87634           };
87635       }
87636
87637
87638       var action = function(graph, t) {
87639           if (t === null || !isFinite(t)) t = 1;
87640           t = Math.min(Math.max(+t, 0), 1);
87641
87642           var nodes = utilGetAllNodes(reflectIds, graph),
87643               ssr = getSmallestSurroundingRectangle(graph, nodes);
87644
87645           // Choose line pq = axis of symmetry.
87646           // The shape's surrounding rectangle has 2 axes of symmetry.
87647           // Reflect across the longer axis by default.
87648           var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
87649               q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
87650               p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
87651               q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
87652               p, q;
87653
87654           var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
87655           if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
87656               p = p1;
87657               q = q1;
87658           } else {
87659               p = p2;
87660               q = q2;
87661           }
87662
87663           // reflect c across pq
87664           // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
87665           var dx = q[0] - p[0];
87666           var dy = q[1] - p[1];
87667           var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
87668           var b = 2 * dx * dy / (dx * dx + dy * dy);
87669           for (var i = 0; i < nodes.length; i++) {
87670               var node = nodes[i];
87671               var c = projection(node.loc);
87672               var c2 = [
87673                   a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
87674                   b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
87675               ];
87676               var loc2 = projection.invert(c2);
87677               node = node.move(geoVecInterp(node.loc, loc2, t));
87678               graph = graph.replace(node);
87679           }
87680
87681           return graph;
87682       };
87683
87684
87685       action.useLongAxis = function(_) {
87686           if (!arguments.length) return useLongAxis;
87687           useLongAxis = _;
87688           return action;
87689       };
87690
87691
87692       action.transitionable = true;
87693
87694
87695       return action;
87696   }
87697
87698   function actionDetachNode(nodeID) {
87699
87700       var action = function(graph) {
87701           var node = graph.entity(nodeID);
87702
87703           // Create a new node to replace the one we will detach
87704           var replacement = osmNode({ loc: node.loc });
87705           graph = graph.replace(replacement);
87706
87707           // Process each way in turn, updating the graph as we go
87708           graph = graph.parentWays(node)
87709               .reduce(function(accGraph, parentWay) {
87710                   return accGraph.replace(parentWay.replaceNode(nodeID, replacement.id));
87711               }, graph);
87712
87713           // Process any relations too
87714           return graph.parentRelations(node)
87715               .reduce(function(accGraph, parentRel) {
87716                   return accGraph.replace(parentRel.replaceMember(node, replacement));
87717               }, graph);
87718       };
87719
87720
87721       action.disabled = function(graph) {
87722           var node = graph.entity(nodeID);
87723           var parentRels = graph.parentRelations(node);
87724
87725           for (var i = 0; i < parentRels.length; i++) {
87726               var relation = parentRels[i];
87727               if (!relation.isValidRestriction()) continue;
87728
87729               for (var j = 0; j < relation.members.length; j++) {
87730                   var m = relation.members[j];
87731                   if (m.id === nodeID && (m.role === 'via' || m.role === 'location_hint')) {
87732                       return 'restriction';
87733                   }
87734               }
87735           }
87736
87737           return false;
87738       };
87739
87740
87741       return action;
87742   }
87743
87744
87745
87746   var index$6 = /*#__PURE__*/Object.freeze({
87747     d3combobox: d3combobox,
87748     d3keybinding: d3keybinding
87749   });
87750
87751   var Connection = services.osm;
87752
87753   var debug = false;
87754
87755   var iD = /*#__PURE__*/Object.freeze({
87756     Connection: Connection,
87757     debug: debug,
87758     lib: index$6,
87759     d3: index$3,
87760     Context: coreContext,
87761     setAreaKeys: setAreaKeys,
87762     Difference: coreDifference,
87763     Graph: coreGraph$$1,
87764     History: coreHistory,
87765     Tree: coreTree,
87766     geoCross: geoVecCross,
87767     geoInterp: geoVecInterp,
87768     geoRoundCoordinates: geoVecFloor,
87769     geoEuclideanDistance: geoVecLength,
87770     Entity: osmEntity$$1,
87771     Node: osmNode,
87772     Relation: osmRelation,
87773     Way: osmWay,
87774     BackgroundSource: rendererBackgroundSource,
87775     Background: rendererBackground,
87776     Features: rendererFeatures,
87777     Map: rendererMap,
87778     TileLayer: rendererTileLayer,
87779     Detect: utilDetect,
87780     uiPreset: uiPresetEditor,
87781     actionAddEntity: actionAddEntity,
87782     actionAddMember: actionAddMember,
87783     actionAddMidpoint: actionAddMidpoint,
87784     actionAddVertex: actionAddVertex,
87785     actionChangeMember: actionChangeMember,
87786     actionChangePreset: actionChangePreset,
87787     actionChangeTags: actionChangeTags,
87788     actionCircularize: actionCircularize,
87789     actionConnect: actionConnect,
87790     actionCopyEntities: actionCopyEntities,
87791     actionDeleteMember: actionDeleteMember,
87792     actionDeleteMultiple: actionDeleteMultiple,
87793     actionDeleteNode: actionDeleteNode,
87794     actionDeleteRelation: actionDeleteRelation,
87795     actionDeleteWay: actionDeleteWay,
87796     actionDeprecateTags: actionDeprecateTags,
87797     actionDiscardTags: actionDiscardTags,
87798     actionDisconnect: actionDisconnect,
87799     actionJoin: actionJoin,
87800     actionMerge: actionMerge,
87801     actionMergeNodes: actionMergeNodes,
87802     actionMergePolygon: actionMergePolygon,
87803     actionMergeRemoteChanges: actionMergeRemoteChanges,
87804     actionMove: actionMove,
87805     actionMoveNode: actionMoveNode,
87806     actionNoop: actionNoop,
87807     actionOrthogonalize: actionOrthogonalize,
87808     actionRestrictTurn: actionRestrictTurn,
87809     actionReverse: actionReverse,
87810     actionRevert: actionRevert,
87811     actionRotate: actionRotate,
87812     actionSplit: actionSplit,
87813     actionStraighten: actionStraighten,
87814     actionUnrestrictTurn: actionUnrestrictTurn,
87815     actionReflect: actionReflect,
87816     actionDetachNode: actionDetachNode,
87817     behaviorAddWay: behaviorAddWay,
87818     behaviorBreathe: behaviorBreathe,
87819     behaviorCopy: behaviorCopy,
87820     behaviorDrag: behaviorDrag,
87821     behaviorDrawWay: behaviorDrawWay,
87822     behaviorDraw: behaviorDraw,
87823     behaviorEdit: behaviorEdit,
87824     behaviorHash: behaviorHash,
87825     behaviorHover: behaviorHover,
87826     behaviorLasso: behaviorLasso,
87827     behaviorOperation: behaviorOperation,
87828     behaviorPaste: behaviorPaste,
87829     behaviorSelect: behaviorSelect,
87830     behaviorTail: behaviorTail,
87831     coreContext: coreContext,
87832     coreDifference: coreDifference,
87833     coreGraph: coreGraph$$1,
87834     coreHistory: coreHistory,
87835     coreTree: coreTree,
87836     data: data,
87837     dataWikipedia: wikipedia$2,
87838     dataSuggestions: dataSuggestions,
87839     dataAddressFormats: dataAddressFormats,
87840     dataDeprecated: dataDeprecated,
87841     dataDiscarded: dataDiscarded,
87842     dataLocales: dataLocales,
87843     dataPhoneFormats: dataPhoneFormats,
87844     dataShortcuts: dataShortcuts,
87845     dataImperial: dataImperial,
87846     dataDriveLeft: dataDriveLeft,
87847     dataEn: en,
87848     geoExtent: geoExtent$$1,
87849     geoLatToMeters: geoLatToMeters,
87850     geoLonToMeters: geoLonToMeters,
87851     geoMetersToLat: geoMetersToLat,
87852     geoMetersToLon: geoMetersToLon,
87853     geoMetersToOffset: geoMetersToOffset,
87854     geoOffsetToMeters: geoOffsetToMeters,
87855     geoScaleToZoom: geoScaleToZoom,
87856     geoSphericalDistance: geoSphericalDistance,
87857     geoZoomToScale: geoZoomToScale,
87858     geoAngle: geoAngle,
87859     geoChooseEdge: geoChooseEdge,
87860     geoEdgeEqual: geoEdgeEqual,
87861     geoHasLineIntersections: geoHasLineIntersections,
87862     geoHasSelfIntersections: geoHasSelfIntersections,
87863     geoRotate: geoRotate,
87864     geoLineIntersection: geoLineIntersection,
87865     geoPathHasIntersections: geoPathHasIntersections,
87866     geoPathIntersections: geoPathIntersections,
87867     geoPathLength: geoPathLength,
87868     geoPointInPolygon: geoPointInPolygon,
87869     geoPolygonContainsPolygon: geoPolygonContainsPolygon,
87870     geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
87871     geoViewportEdge: geoViewportEdge,
87872     geoRawMercator: geoRawMercator,
87873     geoVecAdd: geoVecAdd,
87874     geoVecAngle: geoVecAngle,
87875     geoVecCross: geoVecCross,
87876     geoVecDot: geoVecDot,
87877     geoVecEqual: geoVecEqual,
87878     geoVecFloor: geoVecFloor,
87879     geoVecInterp: geoVecInterp,
87880     geoVecLength: geoVecLength,
87881     geoVecSubtract: geoVecSubtract,
87882     geoVecScale: geoVecScale,
87883     modeAddArea: modeAddArea$$1,
87884     modeAddLine: modeAddLine$$1,
87885     modeAddPoint: modeAddPoint$$1,
87886     modeAddNote: modeAddNote$$1,
87887     modeBrowse: modeBrowse,
87888     modeDragNode: modeDragNode$$1,
87889     modeDragNote: modeDragNote$$1,
87890     modeDrawArea: modeDrawArea,
87891     modeDrawLine: modeDrawLine,
87892     modeMove: modeMove$$1,
87893     modeRotate: modeRotate$$1,
87894     modeSave: modeSave$$1,
87895     modeSelect: modeSelect,
87896     modeSelectData: modeSelectData$$1,
87897     modeSelectNote: modeSelectNote$$1,
87898     operationCircularize: operationCircularize,
87899     operationContinue: operationContinue,
87900     operationDelete: operationDelete,
87901     operationDisconnect: operationDisconnect,
87902     operationMerge: operationMerge,
87903     operationMove: operationMove,
87904     operationOrthogonalize: operationOrthogonalize,
87905     operationReflectShort: operationReflectShort,
87906     operationReflectLong: operationReflectLong,
87907     operationReverse: operationReverse,
87908     operationRotate: operationRotate,
87909     operationSplit: operationSplit,
87910     operationStraighten: operationStraighten,
87911     operationDetachNode: operationDetachNode,
87912     osmChangeset: osmChangeset,
87913     osmEntity: osmEntity$$1,
87914     osmNode: osmNode,
87915     osmNote: osmNote,
87916     osmRelation: osmRelation,
87917     osmWay: osmWay,
87918     osmIntersection: osmIntersection,
87919     osmTurn: osmTurn,
87920     osmInferRestriction: osmInferRestriction,
87921     osmLanes: osmLanes,
87922     osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
87923     osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
87924     osmJoinWays: osmJoinWays,
87925     osmOneWayTags: osmOneWayTags,
87926     osmPavedTags: osmPavedTags,
87927     osmIsInterestingTag: osmIsInterestingTag,
87928     presetCategory: presetCategory,
87929     presetCollection: presetCollection,
87930     presetField: presetField,
87931     presetPreset: presetPreset,
87932     presetIndex: presetIndex,
87933     rendererBackgroundSource: rendererBackgroundSource,
87934     rendererBackground: rendererBackground,
87935     rendererFeatures: rendererFeatures,
87936     rendererMap: rendererMap,
87937     rendererTileLayer: rendererTileLayer,
87938     services: services,
87939     serviceMapillary: serviceMapillary,
87940     serviceNominatim: serviceNominatim,
87941     serviceOpenstreetcam: serviceOpenstreetcam,
87942     serviceOsm: serviceOsm,
87943     serviceStreetside: serviceStreetside,
87944     serviceTaginfo: serviceTaginfo,
87945     serviceVectorTile: serviceVectorTile,
87946     serviceWikidata: serviceWikidata,
87947     serviceWikipedia: serviceWikipedia,
87948     svgAreas: svgAreas$$1,
87949     svgData: svgData$$1,
87950     svgDebug: svgDebug$$1,
87951     svgDefs: svgDefs,
87952     svgIcon: svgIcon,
87953     svgLabels: svgLabels,
87954     svgLayers: svgLayers,
87955     svgLines: svgLines$$1,
87956     svgMapillaryImages: svgMapillaryImages$$1,
87957     svgMapillarySigns: svgMapillarySigns$$1,
87958     svgMidpoints: svgMidpoints$$1,
87959     svgNotes: svgNotes$$1,
87960     svgOneWaySegments: svgOneWaySegments,
87961     svgOpenstreetcamImages: svgOpenstreetcamImages$$1,
87962     svgOsm: svgOsm,
87963     svgPassiveVertex: svgPassiveVertex,
87964     svgPath: svgPath,
87965     svgPointTransform: svgPointTransform,
87966     svgPoints: svgPoints$$1,
87967     svgRelationMemberTags: svgRelationMemberTags,
87968     svgSegmentWay: svgSegmentWay,
87969     svgStreetside: svgStreetside$$1,
87970     svgTagClasses: svgTagClasses,
87971     svgTurns: svgTurns,
87972     svgVertices: svgVertices$$1,
87973     uiFields: uiFields,
87974     uiFieldDefaultCheck: uiFieldCheck,
87975     uiFieldOnewayCheck: uiFieldCheck,
87976     uiFieldCheck: uiFieldCheck,
87977     uiFieldMultiCombo: uiFieldCombo,
87978     uiFieldNetworkCombo: uiFieldCombo,
87979     uiFieldSemiCombo: uiFieldCombo,
87980     uiFieldTypeCombo: uiFieldCombo,
87981     uiFieldCombo: uiFieldCombo,
87982     uiFieldUrl: uiFieldText,
87983     uiFieldNumber: uiFieldText,
87984     uiFieldTel: uiFieldText,
87985     uiFieldEmail: uiFieldText,
87986     uiFieldText: uiFieldText,
87987     uiFieldAccess: uiFieldAccess,
87988     uiFieldAddress: uiFieldAddress,
87989     uiFieldCycleway: uiFieldCycleway,
87990     uiFieldLanes: uiFieldLanes,
87991     uiFieldLocalized: uiFieldLocalized,
87992     uiFieldMaxspeed: uiFieldMaxspeed,
87993     uiFieldStructureRadio: uiFieldRadio,
87994     uiFieldRadio: uiFieldRadio,
87995     uiFieldRestrictions: uiFieldRestrictions,
87996     uiFieldTextarea: uiFieldTextarea,
87997     uiFieldWikipedia: uiFieldWikipedia,
87998     uiIntro: uiIntro,
87999     uiInfoPanels: uiInfoPanels,
88000     uiPanelBackground: uiPanelBackground,
88001     uiPanelHistory: uiPanelHistory,
88002     uiPanelLocation: uiPanelLocation,
88003     uiPanelMeasurement: uiPanelMeasurement,
88004     uiSettingsCustomBackground: uiSettingsCustomBackground,
88005     uiSettingsCustomData: uiSettingsCustomData,
88006     uiInit: uiInit,
88007     uiAccount: uiAccount,
88008     uiAttribution: uiAttribution,
88009     uiBackground: uiBackground,
88010     uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
88011     uiBackgroundOffset: uiBackgroundOffset,
88012     uiChangesetEditor: uiChangesetEditor,
88013     uiCmd: uiCmd,
88014     uiCommit: uiCommit,
88015     uiCommitChanges: uiCommitChanges,
88016     uiCommitWarnings: uiCommitWarnings,
88017     uiConfirm: uiConfirm,
88018     uiConflicts: uiConflicts,
88019     uiContributors: uiContributors,
88020     uiCurtain: uiCurtain,
88021     uiDataEditor: uiDataEditor$$1,
88022     uiDataHeader: uiDataHeader,
88023     uiDisclosure: uiDisclosure,
88024     uiEditMenu: uiEditMenu,
88025     uiEntityEditor: uiEntityEditor,
88026     uiFeatureInfo: uiFeatureInfo,
88027     uiFeatureList: uiFeatureList,
88028     uiField: uiField,
88029     uiFieldHelp: uiFieldHelp,
88030     uiFlash: uiFlash,
88031     uiFormFields: uiFormFields,
88032     uiFullScreen: uiFullScreen,
88033     uiGeolocate: uiGeolocate,
88034     uiHelp: uiHelp,
88035     uiInfo: uiInfo,
88036     uiInspector: uiInspector,
88037     uiLasso: uiLasso,
88038     uiLoading: uiLoading,
88039     uiMapData: uiMapData,
88040     uiMapInMap: uiMapInMap,
88041     uiModal: uiModal,
88042     uiModes: uiModes,
88043     uiNotice: uiNotice,
88044     uiNoteComments: uiNoteComments,
88045     uiNoteEditor: uiNoteEditor$$1,
88046     uiNoteHeader: uiNoteHeader,
88047     uiNoteReport: uiNoteReport,
88048     uiPresetEditor: uiPresetEditor,
88049     uiPresetIcon: uiPresetIcon,
88050     uiPresetList: uiPresetList,
88051     uiRadialMenu: uiRadialMenu,
88052     uiRawMemberEditor: uiRawMemberEditor,
88053     uiRawMembershipEditor: uiRawMembershipEditor,
88054     uiRawTagEditor: uiRawTagEditor,
88055     uiRestore: uiRestore,
88056     uiSave: uiSave,
88057     uiScale: uiScale,
88058     uiSelectionList: uiSelectionList,
88059     uiSidebar: uiSidebar$$1,
88060     uiSourceSwitch: uiSourceSwitch,
88061     uiSpinner: uiSpinner,
88062     uiSplash: uiSplash,
88063     uiStatus: uiStatus,
88064     uiSuccess: uiSuccess$$1,
88065     uiTagReference: uiTagReference,
88066     uiToggle: uiToggle,
88067     uiTooltipHtml: uiTooltipHtml,
88068     uiUndoRedo: uiUndoRedo,
88069     uiVersion: uiVersion,
88070     uiViewOnOSM: uiViewOnOSM,
88071     uiZoom: uiZoom,
88072     utilAsyncMap: utilAsyncMap,
88073     utilCallWhenIdle: utilCallWhenIdle,
88074     utilCleanTags: utilCleanTags,
88075     utilDisplayName: utilDisplayName,
88076     utilDisplayNameForPath: utilDisplayNameForPath,
88077     utilDisplayType: utilDisplayType,
88078     utilEditDistance: utilEditDistance,
88079     utilEntitySelector: utilEntitySelector,
88080     utilEntityOrMemberSelector: utilEntityOrMemberSelector,
88081     utilFastMouse: utilFastMouse,
88082     utilFunctor: utilFunctor,
88083     utilGetAllNodes: utilGetAllNodes,
88084     utilGetPrototypeOf: utilGetPrototypeOf,
88085     utilGetSetValue: utilGetSetValue,
88086     utilHashcode: utilHashcode,
88087     utilIdleWorker: utilIdleWorker,
88088     utilNoAuto: utilNoAuto,
88089     utilPrefixCSSProperty: utilPrefixCSSProperty,
88090     utilPrefixDOMProperty: utilPrefixDOMProperty,
88091     utilQsString: utilQsString,
88092     utilRebind: utilRebind,
88093     utilSetTransform: utilSetTransform,
88094     utilSessionMutex: utilSessionMutex,
88095     utilStringQs: utilStringQs,
88096     utilSuggestNames: utilSuggestNames,
88097     utilTagText: utilTagText,
88098     utilTiler: utilTiler,
88099     utilTriggerEvent: utilTriggerEvent,
88100     utilWrap: utilWrap,
88101     d3combobox: d3combobox,
88102     d3keybinding: d3keybinding,
88103     validationDeprecatedTag: validationDeprecatedTag,
88104     validationDisconnectedHighway: validationDisconnectedHighway,
88105     validationManyDeletions: validationManyDeletions,
88106     validationMissingTag: validationMissingTag,
88107     validationOldMultipolygon: validationOldMultipolygon,
88108     validationTagSuggestsArea: validationTagSuggestsArea
88109   });
88110
88111   window.iD = iD;
88112
88113 }());
88114 //# sourceMappingURL=iD.js.map